From 9d38010d3fda41acb76c655f3f7172869bac9acb Mon Sep 17 00:00:00 2001 From: Peter <> Date: Fri, 18 Oct 2019 21:52:41 +0400 Subject: [PATCH 1/3] no message --- BUCK | 2 + Telegram-iOS/en.lproj/Localizable.strings | 35 + Wallet/Strings/en.lproj/Localizable.strings | 3 +- submodules/PasswordSetupUI/BUCK | 21 + .../Contents.json | 6 + .../PasswordSetup/Contents.json | 9 + .../TextHidden.imageset/Contents.json | 12 + .../TextHidden.imageset/User.pdf | Bin 0 -> 3988 bytes .../Resources/TwoFactorSetupDone.tgs | Bin 0 -> 21633 bytes .../Resources/TwoFactorSetupHint.tgs | Bin 0 -> 3696 bytes .../Resources/TwoFactorSetupIntro.tgs | Bin 0 -> 13857 bytes .../Resources/TwoFactorSetupMail.tgs | Bin 0 -> 4597 bytes .../Resources/TwoFactorSetupMonkeyClose.tgs | Bin 0 -> 27931 bytes .../Resources/TwoFactorSetupMonkeyIdle.tgs | Bin 0 -> 6088 bytes .../Resources/TwoFactorSetupMonkeyPeek.tgs | Bin 0 -> 18008 bytes .../TwoFactorSetupMonkeyTracking.tgs | Bin 0 -> 12805 bytes .../Sources/ManagedAnimationNode.swift | 256 + .../PasswordSetupUI/Sources/PasswordSetupUI.h | 19 - .../TwoFactorAuthDataInputScreen.swift | 1130 +++ .../Sources/TwoFactorAuthSplashScreen.swift | 207 + .../PrivacyAndSecurityController.swift | 10 +- .../Sources/DefaultDayPresentationTheme.swift | 4 +- .../Sources/PresentationStrings.swift | 7255 +++++++++-------- .../Resources/PresentationStrings.mapping | Bin 135122 -> 136424 bytes .../WalletUI/Resources/WalletStrings.mapping | Bin 6985 -> 7031 bytes .../WalletUI/Sources/WalletStrings.swift | 83 +- .../Sources/WalletWordCheckScreen.swift | 2 +- 27 files changed, 5378 insertions(+), 3676 deletions(-) create mode 100644 submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/Contents.json create mode 100644 submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/PasswordSetup/Contents.json create mode 100644 submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/PasswordSetup/TextHidden.imageset/Contents.json create mode 100644 submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/PasswordSetup/TextHidden.imageset/User.pdf create mode 100644 submodules/PasswordSetupUI/Resources/TwoFactorSetupDone.tgs create mode 100644 submodules/PasswordSetupUI/Resources/TwoFactorSetupHint.tgs create mode 100644 submodules/PasswordSetupUI/Resources/TwoFactorSetupIntro.tgs create mode 100644 submodules/PasswordSetupUI/Resources/TwoFactorSetupMail.tgs create mode 100644 submodules/PasswordSetupUI/Resources/TwoFactorSetupMonkeyClose.tgs create mode 100644 submodules/PasswordSetupUI/Resources/TwoFactorSetupMonkeyIdle.tgs create mode 100644 submodules/PasswordSetupUI/Resources/TwoFactorSetupMonkeyPeek.tgs create mode 100644 submodules/PasswordSetupUI/Resources/TwoFactorSetupMonkeyTracking.tgs create mode 100644 submodules/PasswordSetupUI/Sources/ManagedAnimationNode.swift delete mode 100644 submodules/PasswordSetupUI/Sources/PasswordSetupUI.h create mode 100644 submodules/PasswordSetupUI/Sources/TwoFactorAuthDataInputScreen.swift create mode 100644 submodules/PasswordSetupUI/Sources/TwoFactorAuthSplashScreen.swift diff --git a/BUCK b/BUCK index 3a2d304c68..ae8f19b8f3 100644 --- a/BUCK +++ b/BUCK @@ -49,6 +49,8 @@ resource_dependencies = [ "//submodules/TelegramUI:TelegramUIResources", "//submodules/WalletUI:WalletUIAssets", "//submodules/WalletUI:WalletUIResources", + "//submodules/PasswordSetupUI:PasswordSetupUIResources", + "//submodules/PasswordSetupUI:PasswordSetupUIAssets", "//submodules/OverlayStatusController:OverlayStatusControllerResources", "//:AppResources", "//:AppStringResources", diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index e3079a7b29..2dbcea7ea3 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4973,3 +4973,38 @@ Any member of this group will be able to see messages in the channel."; "Wallet.VoiceOver.Editing.ClearText" = "Clear text"; "Wallet.Receive.ShareInvoiceUrlInfo" = "Share this link with other Gram wallet owners to receive %@ Grams from them."; + +"TwoFactorSetup.Intro.Title" = "Additional Password"; +"TwoFactorSetup.Intro.Text" = "You can set a password that will be\nrequired when you log in on a new device in addition to the code you get via SMS."; +"TwoFactorSetup.Intro.Action" = "Set Additional Password"; + +"TwoFactorSetup.Password.Title" = "Create Password"; +"TwoFactorSetup.Password.PlaceholderPassword" = "Password"; +"TwoFactorSetup.Password.PlaceholderConfirmPassword" = "Re-enter Password"; +"TwoFactorSetup.Password.Action" = "Create Password"; + +"TwoFactorSetup.Email.Title" = "Recovery Email"; +"TwoFactorSetup.Email.Text" = "You can set a recovery email to be able to reset password and restore access\nto your Telegram account."; +"TwoFactorSetup.Email.Placeholder" = "Your email address"; +"TwoFactorSetup.Email.Action" = "Continue"; +"TwoFactorSetup.Email.SkipAction" = "Skip setting email"; +"TwoFactorSetup.Email.SkipConfirmationTitle" = "No, seriously."; +"TwoFactorSetup.Email.SkipConfirmationText" = "If you forget your password, you will lose access to your Telegram account. There will be no way to restore it."; +"TwoFactorSetup.Email.SkipConfirmationSkip" = "Skip"; + +"TwoFactorSetup.EmailVerification.Title" = "Recovery Email"; +"TwoFactorSetup.EmailVerification.Text" = "Please enter code we've just emailed at %@"; +"TwoFactorSetup.EmailVerification.Placeholder" = "Code"; +"TwoFactorSetup.EmailVerification.Action" = "Continue"; +"TwoFactorSetup.EmailVerification.ChangeAction" = "Change Email"; +"TwoFactorSetup.EmailVerification.ResendAction" = "Resend Code"; + +"TwoFactorSetup.Hint.Title" = "Hint"; +"TwoFactorSetup.Hint.Text" = "You can create an optional hint for\nyour password."; +"TwoFactorSetup.Hint.Placeholder" = "Hint (optional)"; +"TwoFactorSetup.Hint.Action" = "Continue"; +"TwoFactorSetup.Hint.SkipAction" = "Skip setting hint"; + +"TwoFactorSetup.Done.Title" = "Password Set!"; +"TwoFactorSetup.Done.Text" = "Now password will be required when you log in on a new device in addition to the code you get via SMS."; +"TwoFactorSetup.Done.Action" = "Return to Settings"; diff --git a/Wallet/Strings/en.lproj/Localizable.strings b/Wallet/Strings/en.lproj/Localizable.strings index 3ed4f0ab7b..3d53c290a9 100644 --- a/Wallet/Strings/en.lproj/Localizable.strings +++ b/Wallet/Strings/en.lproj/Localizable.strings @@ -28,7 +28,7 @@ "Wallet.Info.TransactionTo" = "to"; "Wallet.Info.TransactionFrom" = "from"; "Wallet.Info.Updating" = "updating"; -"Wallet.Info.TransactionBlockchainFee" = "%@ blockchain fee"; +"Wallet.Info.TransactionBlockchainFee" = "%@ blockchain fees"; "Wallet.Info.TransactionPendingHeader" = "Pending"; "Wallet.Qr.ScanCode" = "Scan QR Code"; "Wallet.Qr.Title" = "QR Code"; @@ -192,3 +192,4 @@ "Wallet.Time.PreciseDate_m11" = "Nov %1$@, %2$@ at %3$@"; "Wallet.Time.PreciseDate_m12" = "Dec %1$@, %2$@ at %3$@"; "Wallet.VoiceOver.Editing.ClearText" = "Clear text"; +"Wallet.Receive.ShareInvoiceUrlInfo" = "Share this link with other Gram wallet owners to receive %@ Grams from them."; diff --git a/submodules/PasswordSetupUI/BUCK b/submodules/PasswordSetupUI/BUCK index 4b8336b73c..7045dfb804 100644 --- a/submodules/PasswordSetupUI/BUCK +++ b/submodules/PasswordSetupUI/BUCK @@ -1,5 +1,21 @@ load("//Config:buck_rule_macros.bzl", "static_library") +apple_resource( + name = "PasswordSetupUIResources", + files = glob([ + "Resources/**/*", + ], exclude = ["Resources/**/.*"]), + visibility = ["PUBLIC"], +) + +apple_asset_catalog( + name = "PasswordSetupUIAssets", + dirs = [ + "PasswordSetupUIImages.xcassets", + ], + visibility = ["PUBLIC"], +) + static_library( name = "PasswordSetupUI", srcs = glob([ @@ -18,6 +34,11 @@ static_library( "//submodules/AlertUI:AlertUI", "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/ItemListUI:ItemListUI", + "//submodules/AnimatedStickerNode:AnimatedStickerNode", + "//submodules/AppBundle:AppBundle", + "//submodules/SolidRoundedButtonNode:SolidRoundedButtonNode", + "//submodules/OverlayStatusController:OverlayStatusController", + "//submodules/rlottie:RLottieBinding", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/Contents.json b/submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/Contents.json new file mode 100644 index 0000000000..da4a164c91 --- /dev/null +++ b/submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/PasswordSetup/Contents.json b/submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/PasswordSetup/Contents.json new file mode 100644 index 0000000000..38f0c81fc2 --- /dev/null +++ b/submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/PasswordSetup/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "provides-namespace" : true + } +} \ No newline at end of file diff --git a/submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/PasswordSetup/TextHidden.imageset/Contents.json b/submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/PasswordSetup/TextHidden.imageset/Contents.json new file mode 100644 index 0000000000..75b62ace42 --- /dev/null +++ b/submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/PasswordSetup/TextHidden.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "User.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/PasswordSetup/TextHidden.imageset/User.pdf b/submodules/PasswordSetupUI/PasswordSetupUIImages.xcassets/PasswordSetup/TextHidden.imageset/User.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6ae0b0123455717498ca6f87305a39630213b919 GIT binary patch literal 3988 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 OfBhfVWsMr{k^lgSB@nOx literal 0 HcmV?d00001 diff --git a/submodules/PasswordSetupUI/Resources/TwoFactorSetupIntro.tgs b/submodules/PasswordSetupUI/Resources/TwoFactorSetupIntro.tgs new file mode 100644 index 0000000000000000000000000000000000000000..8538275214026a81fa8b5c21ae38528523394db1 GIT binary patch literal 13857 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 literal 0 HcmV?d00001 diff --git a/submodules/PasswordSetupUI/Resources/TwoFactorSetupMonkeyClose.tgs b/submodules/PasswordSetupUI/Resources/TwoFactorSetupMonkeyClose.tgs new file mode 100644 index 0000000000000000000000000000000000000000..f16eca5adadee936af9805df17f283377f1ad055 GIT binary patch literal 27931 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 literal 0 HcmV?d00001 diff --git a/submodules/PasswordSetupUI/Resources/TwoFactorSetupMonkeyIdle.tgs b/submodules/PasswordSetupUI/Resources/TwoFactorSetupMonkeyIdle.tgs new file mode 100644 index 0000000000000000000000000000000000000000..773ee9676bcc41df544b75cb4572ab8a9fe251e6 GIT binary patch literal 6088 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 CSI_(a literal 0 HcmV?d00001 diff --git a/submodules/PasswordSetupUI/Resources/TwoFactorSetupMonkeyPeek.tgs b/submodules/PasswordSetupUI/Resources/TwoFactorSetupMonkeyPeek.tgs new file mode 100644 index 0000000000000000000000000000000000000000..07cca60eced03eaa6c22a139cfc141b51b1c8ad7 GIT binary patch literal 18008 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 UcE3&S{`$}V4>lR)#@lfM0CKgui~s-t literal 0 HcmV?d00001 diff --git a/submodules/PasswordSetupUI/Resources/TwoFactorSetupMonkeyTracking.tgs b/submodules/PasswordSetupUI/Resources/TwoFactorSetupMonkeyTracking.tgs new file mode 100644 index 0000000000000000000000000000000000000000..ad52d48af38d5bb93542d3b918a6ffacae5f2052 GIT binary patch literal 12805 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 UIImage? { + self.instance.renderFrame(with: Int32(self.frameIndex ?? 0), into: self.renderContext.bytes.assumingMemoryBound(to: UInt8.self), width: Int32(self.renderContext.size.width * self.renderContext.scale), height: Int32(self.renderContext.size.height * self.renderContext.scale), bytesPerRow: Int32(self.renderContext.bytesPerRow)) + return self.renderContext.generateImage() + } +} + +enum ManagedAnimationActionAtEnd { + case pause + case advance + case loop +} + +struct ManagedAnimationTrack: Equatable { + let frameRange: Range +} + +struct ManagedAnimationItem: Equatable { + let name: String + var intro: ManagedAnimationTrack? + var loop: ManagedAnimationTrack? + var outro: ManagedAnimationTrack? +} + +final class ManagedAnimationNode: ASDisplayNode { + let intrinsicSize: CGSize + + private let imageNode: ASImageNode + private let displayLink: CADisplayLink + + private var items: [ManagedAnimationState] = [] + + var currentItemName: String? { + return self.items.first?.item.name + } + + init(size: CGSize) { + self.intrinsicSize = size + + self.imageNode = ASImageNode() + self.imageNode.displayWithoutProcessing = true + self.imageNode.displaysAsynchronously = false + self.imageNode.frame = CGRect(origin: CGPoint(), size: self.intrinsicSize) + + final class DisplayLinkTarget: NSObject { + private let f: () -> Void + + init(_ f: @escaping () -> Void) { + self.f = f + } + + @objc func event() { + self.f() + } + } + var displayLinkUpdate: (() -> Void)? + self.displayLink = CADisplayLink(target: DisplayLinkTarget { + displayLinkUpdate?() + }, selector: #selector(DisplayLinkTarget.event)) + + super.init() + + self.addSubnode(self.imageNode) + + self.displayLink.add(to: RunLoop.main, forMode: .common) + + displayLinkUpdate = { [weak self] in + self?.updateAnimation() + } + } + + private func updateAnimation() { + guard let item = self.items.first else { + return + } + let timestamp = CACurrentMediaTime() + var startTime: Double + let maybeTrackState: ManagedAnimationTrackState? + if let current = item.startTime { + startTime = current + } else { + startTime = timestamp + item.startTime = startTime + } + if let current = item.trackState { + maybeTrackState = current + } else if let _ = item.item.intro { + maybeTrackState = .intro + } else if let _ = item.item.loop { + maybeTrackState = .loop + } else if let _ = item.item.outro { + maybeTrackState = .outro + } else { + maybeTrackState = nil + } + if item.trackState != maybeTrackState { + item.trackState = maybeTrackState + item.startTime = timestamp + startTime = timestamp + } + + guard let trackState = maybeTrackState else { + self.items.removeFirst() + return + } + + var fps = item.fps + + let track: ManagedAnimationTrack + switch trackState { + case .intro: + track = item.item.intro! + case .loop: + track = item.item.loop! + if self.items.count > 1 { + //fps *= 2.0 + } + case .outro: + track = item.item.outro! + } + + let frameIndex: Int + if let (startFrame, endFrame) = item.trackingFrameState { + let duration: Double = 0.3 + var t = (timestamp - startTime) / duration + t = max(0.0, t) + t = min(1.0, t) + let frameOffset = Int(Double(startFrame) * (1.0 - t) + Double(endFrame) * t) + let lowerBound = min(track.frameRange.lowerBound, item.frameCount - 1) + let upperBound = min(track.frameRange.upperBound, item.frameCount) + frameIndex = max(lowerBound, min(upperBound, frameOffset)) + } else { + let frameOffset = Int((timestamp - startTime) * fps) + let lowerBound = min(track.frameRange.lowerBound, item.frameCount - 1) + let upperBound = min(track.frameRange.upperBound, item.frameCount) + if frameOffset >= upperBound - lowerBound { + switch trackState { + case .intro: + if let _ = item.item.loop { + item.trackState = .loop + item.startTime = timestamp + return + } else if let _ = item.item.outro { + item.trackState = .outro + item.startTime = timestamp + return + } else { + self.items.removeFirst() + return + } + case .loop: + if self.items.count > 1 { + if let _ = item.item.outro { + item.trackState = .outro + item.startTime = timestamp + } else { + self.items.removeFirst() + } + return + } else { + item.startTime = timestamp + frameIndex = lowerBound + } + case .outro: + self.items.removeFirst() + return + } + } else { + frameIndex = lowerBound + frameOffset % (upperBound - lowerBound) + } + } + + if item.frameIndex != frameIndex { + item.frameIndex = frameIndex + if let image = item.draw() { + self.imageNode.image = image + } + } + } + + func switchTo(_ item: ManagedAnimationItem, noOutro: Bool = false) { + if let state = ManagedAnimationState(item: item) { + if let last = self.items.last { + if last.item.name == item.name { + return + } + } + if let first = self.items.first { + if noOutro { + first.item.outro = nil + } + } + self.items.append(state) + self.updateAnimation() + } + } + + func trackTo(frameIndex: Int) { + if let first = self.items.first { + first.startTime = CACurrentMediaTime() + first.trackingFrameState = (first.frameIndex ?? 0, frameIndex) + self.updateAnimation() + } + } +} diff --git a/submodules/PasswordSetupUI/Sources/PasswordSetupUI.h b/submodules/PasswordSetupUI/Sources/PasswordSetupUI.h deleted file mode 100644 index 8d30612cf2..0000000000 --- a/submodules/PasswordSetupUI/Sources/PasswordSetupUI.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// PasswordSetupUI.h -// PasswordSetupUI -// -// Created by Peter on 8/12/19. -// Copyright © 2019 Telegram Messenger LLP. All rights reserved. -// - -#import - -//! Project version number for PasswordSetupUI. -FOUNDATION_EXPORT double PasswordSetupUIVersionNumber; - -//! Project version string for PasswordSetupUI. -FOUNDATION_EXPORT const unsigned char PasswordSetupUIVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/submodules/PasswordSetupUI/Sources/TwoFactorAuthDataInputScreen.swift b/submodules/PasswordSetupUI/Sources/TwoFactorAuthDataInputScreen.swift new file mode 100644 index 0000000000..8ed95ba5c8 --- /dev/null +++ b/submodules/PasswordSetupUI/Sources/TwoFactorAuthDataInputScreen.swift @@ -0,0 +1,1130 @@ +import Foundation +import UIKit +import AppBundle +import AsyncDisplayKit +import Display +import SolidRoundedButtonNode +import SwiftSignalKit +import OverlayStatusController +import AccountContext +import TelegramPresentationData +import PresentationDataUtils +import TelegramCore + +public enum TwoFactorDataInputMode { + case password + case emailAddress(password: String) + case emailConfirmation(password: String?, emailPattern: String) + case passwordHint(password: String) +} + +private let animationIdle = ManagedAnimationItem(name: "TwoFactorSetupMonkeyIdle", + intro: nil, + loop: ManagedAnimationTrack(frameRange: 0 ..< 1), + outro: nil +) + +private let animationTracking = ManagedAnimationItem(name: "TwoFactorSetupMonkeyTracking", + intro: nil, + loop: ManagedAnimationTrack(frameRange: 0 ..< Int.max), + outro: nil +) + +private let animationHide = ManagedAnimationItem(name: "TwoFactorSetupMonkeyClose", + intro: ManagedAnimationTrack(frameRange: 0 ..< 41), + loop: ManagedAnimationTrack(frameRange: 40 ..< 41), + outro: ManagedAnimationTrack(frameRange: 60 ..< 99) +) + +private let animationHideNoOutro = ManagedAnimationItem(name: "TwoFactorSetupMonkeyClose", + intro: ManagedAnimationTrack(frameRange: 0 ..< 41), + loop: ManagedAnimationTrack(frameRange: 40 ..< 41), + outro: nil +) + +private let animationHideNoIntro = ManagedAnimationItem(name: "TwoFactorSetupMonkeyClose", + intro: nil, + loop: ManagedAnimationTrack(frameRange: 40 ..< 41), + outro: ManagedAnimationTrack(frameRange: 60 ..< 99) +) + +private let animationHideOutro = ManagedAnimationItem(name: "TwoFactorSetupMonkeyClose", + intro: nil, + loop: nil, + outro: ManagedAnimationTrack(frameRange: 60 ..< 99) +) + +private let animationPeek = ManagedAnimationItem(name: "TwoFactorSetupMonkeyPeek", + intro: ManagedAnimationTrack(frameRange: 0 ..< 14), + loop: ManagedAnimationTrack(frameRange: 13 ..< 14), + outro: ManagedAnimationTrack(frameRange: 14 ..< 34) +) + +private let animationMail = ManagedAnimationItem(name: "TwoFactorSetupMail", + intro: ManagedAnimationTrack(frameRange: 0 ..< Int.max), + loop: ManagedAnimationTrack(frameRange: Int.max - 1 ..< Int.max), + outro: nil +) + +private let animationHint = ManagedAnimationItem(name: "TwoFactorSetupHint", + intro: ManagedAnimationTrack(frameRange: 0 ..< Int.max), + loop: ManagedAnimationTrack(frameRange: Int.max - 1 ..< Int.max), + outro: nil +) + +public final class TwoFactorDataInputScreen: ViewController { + private let context: AccountContext + private var presentationData: PresentationData + private let mode: TwoFactorDataInputMode + + public init(context: AccountContext, mode: TwoFactorDataInputMode) { + self.context = context + self.mode = mode + + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + + let defaultTheme = NavigationBarTheme(rootControllerTheme: self.presentationData.theme) + let navigationBarTheme = NavigationBarTheme(buttonColor: defaultTheme.buttonColor, disabledButtonColor: defaultTheme.disabledButtonColor, primaryTextColor: defaultTheme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultTheme.badgeBackgroundColor, badgeStrokeColor: defaultTheme.badgeStrokeColor, badgeTextColor: defaultTheme.badgeTextColor) + + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: NavigationBarStrings(back: self.presentationData.strings.Wallet_Navigation_Back, close: self.presentationData.strings.Wallet_Navigation_Close))) + + self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style + self.navigationPresentation = .modalInLargeLayout + self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) + self.navigationBar?.intrinsicCanTransitionInline = false + + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Wallet_Navigation_Back, style: .plain, target: nil, action: nil) + } + + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc private func backPressed() { + self.dismiss() + } + + override public func loadDisplayNode() { + self.displayNode = TwoFactorDataInputScreenNode(presentationData: self.presentationData, mode: self.mode, action: { [weak self] in + guard let strongSelf = self else { + return + } + switch strongSelf.mode { + case .password: + let values = (strongSelf.displayNode as! TwoFactorDataInputScreenNode).inputText + if values.count != 2 { + return + } + if values[0] != values[1] { + strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.TwoStepAuth_SetupPasswordConfirmFailed, actions: [ + TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {}) + ]), in: .window(.root)) + return + } + if values[0].isEmpty { + return + } + guard let navigationController = strongSelf.navigationController as? NavigationController else { + return + } + var controllers = navigationController.viewControllers.filter { controller in + if controller is TwoFactorAuthSplashScreen { + return false + } + if controller is TwoFactorDataInputScreen { + return false + } + return true + } + controllers.append(TwoFactorDataInputScreen(context: strongSelf.context, mode: .passwordHint(password: values[0]))) + navigationController.setViewControllers(controllers, animated: true) + case let .emailAddress(password): + guard let text = (strongSelf.displayNode as! TwoFactorDataInputScreenNode).inputText.first, !text.isEmpty else { + return + } + let statusController = OverlayStatusController(theme: strongSelf.presentationData.theme, type: .loading(cancelled: nil)) + strongSelf.present(statusController, in: .window(.root)) + + let _ = (updateTwoStepVerificationEmail(network: strongSelf.context.account.network, currentPassword: password, updatedEmail: text) + |> deliverOnMainQueue).start(next: { [weak statusController] result in + statusController?.dismiss() + + guard let strongSelf = self else { + return + } + + switch result { + case .none: + break + case let .password(password, pendingEmail): + if let pendingEmail = pendingEmail { + guard let navigationController = strongSelf.navigationController as? NavigationController else { + return + } + var controllers = navigationController.viewControllers.filter { controller in + if controller is TwoFactorAuthSplashScreen { + return false + } + if controller is TwoFactorDataInputScreen { + return false + } + return true + } + controllers.append(TwoFactorDataInputScreen(context: strongSelf.context, mode: .emailConfirmation(password: password, emailPattern: text))) + navigationController.setViewControllers(controllers, animated: true) + } else { + guard let navigationController = strongSelf.navigationController as? NavigationController else { + return + } + var controllers = navigationController.viewControllers.filter { controller in + if controller is TwoFactorAuthSplashScreen { + return false + } + if controller is TwoFactorDataInputScreen { + return false + } + return true + } + controllers.append(TwoFactorAuthSplashScreen(context: strongSelf.context, mode: .done)) + navigationController.setViewControllers(controllers, animated: true) + } + } + }, error: { [weak statusController] error in + statusController?.dismiss() + + guard let strongSelf = self else { + return + } + + let presentationData = strongSelf.presentationData + let alertText: String + switch error { + case .generic: + alertText = presentationData.strings.Login_UnknownError + case .invalidEmail: + alertText = presentationData.strings.TwoStepAuth_EmailInvalid + } + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: alertText, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + }) + case .emailConfirmation: + guard let text = (strongSelf.displayNode as! TwoFactorDataInputScreenNode).inputText.first, !text.isEmpty else { + return + } + let statusController = OverlayStatusController(theme: strongSelf.presentationData.theme, type: .loading(cancelled: nil)) + strongSelf.present(statusController, in: .window(.root)) + + let _ = (confirmTwoStepRecoveryEmail(network: strongSelf.context.account.network, code: text) + |> deliverOnMainQueue).start(error: { [weak statusController] error in + statusController?.dismiss() + + guard let strongSelf = self else { + return + } + + let presentationData = strongSelf.presentationData + let text: String + switch error { + case .invalidEmail: + text = presentationData.strings.TwoStepAuth_EmailInvalid + case .invalidCode: + text = presentationData.strings.Login_InvalidCodeError + case .expired: + text = presentationData.strings.TwoStepAuth_EmailCodeExpired + case .flood: + text = presentationData.strings.TwoStepAuth_FloodError + case .generic: + text = presentationData.strings.Login_UnknownError + } + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + }, completed: { [weak statusController] in + statusController?.dismiss() + + guard let strongSelf = self else { + return + } + + guard let navigationController = strongSelf.navigationController as? NavigationController else { + return + } + var controllers = navigationController.viewControllers.filter { controller in + if controller is TwoFactorAuthSplashScreen { + return false + } + if controller is TwoFactorDataInputScreen { + return false + } + return true + } + controllers.append(TwoFactorAuthSplashScreen(context: strongSelf.context, mode: .done)) + navigationController.setViewControllers(controllers, animated: true) + }) + case let .passwordHint(password): + guard let value = (strongSelf.displayNode as! TwoFactorDataInputScreenNode).inputText.first, !value.isEmpty else { + return + } + + strongSelf.setPassword(password: password, hint: value) + } + }, skipAction: { [weak self] in + guard let strongSelf = self else { + return + } + switch strongSelf.mode { + case .emailAddress: + strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.TwoFactorSetup_Email_SkipConfirmationTitle, text: strongSelf.presentationData.strings.TwoFactorSetup_Email_SkipConfirmationText, actions: [ + TextAlertAction(type: .destructiveAction, title: strongSelf.presentationData.strings.TwoFactorSetup_Email_SkipConfirmationSkip, action: { + guard let strongSelf = self else { + return + } + guard let navigationController = strongSelf.navigationController as? NavigationController else { + return + } + var controllers = navigationController.viewControllers.filter { controller in + if controller is TwoFactorAuthSplashScreen { + return false + } + if controller is TwoFactorDataInputScreen { + return false + } + return true + } + controllers.append(TwoFactorAuthSplashScreen(context: strongSelf.context, mode: .done)) + navigationController.setViewControllers(controllers, animated: true) + }), + TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_Cancel, action: {}) + ]), in: .window(.root)) + case let .passwordHint(password): + strongSelf.setPassword(password: password, hint: "") + default: + break + } + }, changeEmailAction: { [weak self] in + guard let strongSelf = self else { + return + } + switch strongSelf.mode { + case let .emailConfirmation(password, _): + if let password = password { + guard let navigationController = strongSelf.navigationController as? NavigationController else { + return + } + var controllers = navigationController.viewControllers.filter { controller in + if controller is TwoFactorAuthSplashScreen { + return false + } + if controller is TwoFactorDataInputScreen { + return false + } + return true + } + controllers.append(TwoFactorDataInputScreen(context: strongSelf.context, mode: .emailAddress(password: password))) + navigationController.setViewControllers(controllers, animated: true) + } else { + } + default: + break + } + }, resendCodeAction: { [weak self] in + guard let strongSelf = self else { + return + } + + let statusController = OverlayStatusController(theme: strongSelf.presentationData.theme, type: .loading(cancelled: nil)) + strongSelf.present(statusController, in: .window(.root)) + + let _ = (resendTwoStepRecoveryEmail(network: strongSelf.context.account.network) + |> deliverOnMainQueue).start(error: { [weak statusController] error in + statusController?.dismiss() + + guard let strongSelf = self else { + return + } + + let text: String + switch error { + case .flood: + text = strongSelf.presentationData.strings.TwoStepAuth_FloodError + case .generic: + text = strongSelf.presentationData.strings.Login_UnknownError + } + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + }, completed: { [weak statusController] in + statusController?.dismiss() + }) + }) + + self.displayNodeDidLoad() + } + + private func setPassword(password: String, hint: String) { + let statusController = OverlayStatusController(theme: self.presentationData.theme, type: .loading(cancelled: nil)) + self.present(statusController, in: .window(.root)) + + let _ = (updateTwoStepVerificationPassword(network: self.context.account.network, currentPassword: nil, updatedPassword: .password(password: password, hint: hint, email: nil)) + |> deliverOnMainQueue).start(next: { [weak self, weak statusController] _ in + statusController?.dismiss() + + guard let strongSelf = self else { + return + } + + guard let navigationController = strongSelf.navigationController as? NavigationController else { + return + } + var controllers = navigationController.viewControllers.filter { controller in + if controller is TwoFactorAuthSplashScreen { + return false + } + if controller is TwoFactorDataInputScreen { + return false + } + return true + } + controllers.append(TwoFactorDataInputScreen(context: strongSelf.context, mode: .emailAddress(password: password))) + navigationController.setViewControllers(controllers, animated: true) + }, error: { [weak self, weak statusController] _ in + statusController?.dismiss() + + guard let strongSelf = self else { + return + } + }) + } + + override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + super.containerLayoutUpdated(layout, transition: transition) + + (self.displayNode as! TwoFactorDataInputScreenNode).containerLayoutUpdated(layout: layout, navigationHeight: self.navigationHeight, transition: transition) + } +} + +private enum TwoFactorDataInputTextNodeType { + case password(confirmation: Bool) + case email + case code + case hint +} + +private func generateClearImage(color: UIColor) -> UIImage? { + return generateImage(CGSize(width: 16.0, height: 16.0), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(color.cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) + context.setBlendMode(.copy) + context.setStrokeColor(UIColor.clear.cgColor) + context.setLineCap(.round) + context.setLineWidth(1.66) + context.move(to: CGPoint(x: 5.5, y: 5.5)) + context.addLine(to: CGPoint(x: 10.5, y: 10.5)) + context.strokePath() + context.move(to: CGPoint(x: size.width - 5.5, y: 5.5)) + context.addLine(to: CGPoint(x: size.width - 10.5, y: 10.5)) + context.strokePath() + }) +} + +private func generateTextHiddenImage(color: UIColor, on: Bool) -> UIImage? { + return generateImage(CGSize(width: 20.0, height: 18.0), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + guard let image = generateTintedImage(image: UIImage(bundleImageName: "PasswordSetup/TextHidden"), color: color) else { + return + } + context.draw(image.cgImage!, in: CGRect(origin: CGPoint(x: floor((size.width - size.width) / 2.0), y: floor((size.height - size.height) / 2.0)), size: size)) + if !on { + context.setLineCap(.round) + + context.setBlendMode(.copy) + context.setStrokeColor(UIColor.clear.cgColor) + context.setLineWidth(4.0) + context.move(to: CGPoint(x: 2.0, y: 3.0)) + context.addLine(to: CGPoint(x: 18.0, y: 17.0)) + context.strokePath() + + context.setBlendMode(.normal) + context.setStrokeColor(color.cgColor) + context.setLineWidth(1.5) + context.move(to: CGPoint(x: 2.0, y: 3.0)) + context.addLine(to: CGPoint(x: 18.0, y: 17.0)) + context.strokePath() + } + }) +} + +private final class TwoFactorDataInputTextNode: ASDisplayNode, UITextFieldDelegate { + private let theme: PresentationTheme + let mode: TwoFactorDataInputTextNodeType + private let focused: (TwoFactorDataInputTextNode) -> Void + private let next: (TwoFactorDataInputTextNode) -> Void + private let updated: (TwoFactorDataInputTextNode) -> Void + private let toggleTextHidden: (TwoFactorDataInputTextNode) -> Void + + private let backgroundNode: ASImageNode + private let inputNode: TextFieldNode + private let hideButtonNode: HighlightableButtonNode + private let clearButtonNode: HighlightableButtonNode + + var text: String { + get { + return self.inputNode.textField.text ?? "" + } set(value) { + self.inputNode.textField.text = value + self.textFieldChanged(self.inputNode.textField) + } + } + + init(theme: PresentationTheme, mode: TwoFactorDataInputTextNodeType, placeholder: String, focused: @escaping (TwoFactorDataInputTextNode) -> Void, next: @escaping (TwoFactorDataInputTextNode) -> Void, updated: @escaping (TwoFactorDataInputTextNode) -> Void, toggleTextHidden: @escaping (TwoFactorDataInputTextNode) -> Void) { + self.theme = theme + self.mode = mode + self.focused = focused + self.next = next + self.updated = updated + self.toggleTextHidden = toggleTextHidden + + self.backgroundNode = ASImageNode() + self.backgroundNode.displaysAsynchronously = false + self.backgroundNode.displayWithoutProcessing = true + self.backgroundNode.image = generateStretchableFilledCircleImage(diameter: 20.0, color: theme.actionSheet.inputBackgroundColor) + + self.inputNode = TextFieldNode() + self.inputNode.textField.font = Font.regular(17.0) + self.inputNode.textField.textColor = theme.actionSheet.inputTextColor + self.inputNode.textField.attributedPlaceholder = NSAttributedString(string: placeholder, font: Font.regular(17.0), textColor: theme.actionSheet.inputPlaceholderColor) + + self.hideButtonNode = HighlightableButtonNode() + + switch mode { + case let .password(confirmation): + self.inputNode.textField.keyboardType = .default + self.inputNode.textField.isSecureTextEntry = true + if confirmation { + self.inputNode.textField.returnKeyType = .done + } else { + self.inputNode.textField.returnKeyType = .next + } + self.hideButtonNode.isHidden = confirmation + case .email: + self.inputNode.textField.keyboardType = .emailAddress + self.inputNode.textField.returnKeyType = .done + self.hideButtonNode.isHidden = true + case .code: + self.inputNode.textField.keyboardType = .numberPad + self.inputNode.textField.returnKeyType = .done + self.hideButtonNode.isHidden = true + case .hint: + self.inputNode.textField.keyboardType = .asciiCapable + self.inputNode.textField.returnKeyType = .done + self.hideButtonNode.isHidden = true + } + + self.inputNode.textField.autocorrectionType = .no + self.inputNode.textField.autocapitalizationType = .none + self.inputNode.textField.spellCheckingType = .no + if #available(iOS 11.0, *) { + self.inputNode.textField.smartQuotesType = .no + self.inputNode.textField.smartDashesType = .no + self.inputNode.textField.smartInsertDeleteType = .no + } + self.inputNode.textField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance + + self.hideButtonNode.setImage(generateTextHiddenImage(color: theme.actionSheet.inputClearButtonColor, on: false), for: []) + + self.clearButtonNode = HighlightableButtonNode() + self.clearButtonNode.setImage(generateClearImage(color: theme.actionSheet.inputClearButtonColor), for: []) + self.clearButtonNode.isHidden = true + + super.init() + + self.addSubnode(self.backgroundNode) + self.addSubnode(self.inputNode) + self.addSubnode(self.hideButtonNode) + + self.inputNode.textField.delegate = self + self.inputNode.textField.addTarget(self, action: #selector(self.textFieldChanged(_:)), for: .editingChanged) + + self.hideButtonNode.addTarget(self, action: #selector(self.hidePressed), forControlEvents: .touchUpInside) + } + + func textFieldDidBeginEditing(_ textField: UITextField) { + let text = self.text + let isEmpty = text.isEmpty + self.focused(self) + } + + func textFieldDidEndEditing(_ textField: UITextField) { + } + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + self.next(self) + return false + } + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + return true + } + + @objc private func textFieldChanged(_ textField: UITextField) { + switch self.mode { + case .password: + break + default: + self.clearButtonNode.isHidden = self.text.isEmpty + } + self.updated(self) + } + + @objc private func hidePressed() { + switch self.mode { + case .password: + self.toggleTextHidden(self) + default: + break + } + } + + func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) { + let leftInset: CGFloat = 16.0 + let rightInset: CGFloat = 38.0 + + transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: size)) + transition.updateFrame(node: self.inputNode, frame: CGRect(origin: CGPoint(x: leftInset, y: 0.0), size: CGSize(width: size.width - leftInset - rightInset, height: size.height))) + transition.updateFrame(node: self.hideButtonNode, frame: CGRect(origin: CGPoint(x: size.width - rightInset - 4.0, y: 0.0), size: CGSize(width: rightInset + 4.0, height: size.height))) + transition.updateFrame(node: self.clearButtonNode, frame: CGRect(origin: CGPoint(x: size.width - rightInset - 4.0, y: 0.0), size: CGSize(width: rightInset + 4.0, height: size.height))) + } + + func focus() { + self.inputNode.textField.becomeFirstResponder() + } + + func updateTextHidden(_ value: Bool) { + self.hideButtonNode.setImage(generateTextHiddenImage(color: self.theme.actionSheet.inputClearButtonColor, on: !value), for: []) + self.inputNode.textField.isSecureTextEntry = value + } +} + +private final class TwoFactorDataInputScreenNode: ViewControllerTracingNode, UIScrollViewDelegate { + private var presentationData: PresentationData + private let mode: TwoFactorDataInputMode + private let action: () -> Void + private let skipAction: () -> Void + private let changeEmailAction: () -> Void + private let resendCodeAction: () -> Void + + private let navigationBackgroundNode: ASDisplayNode + private let navigationSeparatorNode: ASDisplayNode + private let scrollNode: ASScrollNode + private let animationNode: ManagedAnimationNode + private let titleNode: ImmediateTextNode + private let textNode: ImmediateTextNode + private let skipActionTitleNode: ImmediateTextNode + private let skipActionButtonNode: HighlightTrackingButtonNode + private let changeEmailActionTitleNode: ImmediateTextNode + private let changeEmailActionButtonNode: HighlightTrackingButtonNode + private let resendCodeActionTitleNode: ImmediateTextNode + private let resendCodeActionButtonNode: HighlightTrackingButtonNode + private let inputNodes: [TwoFactorDataInputTextNode] + private let buttonNode: SolidRoundedButtonNode + + private var navigationHeight: CGFloat? + + var inputText: [String] { + return self.inputNodes.map { $0.text } + } + + init(presentationData: PresentationData, mode: TwoFactorDataInputMode, action: @escaping () -> Void, skipAction: @escaping () -> Void, changeEmailAction: @escaping () -> Void, resendCodeAction: @escaping () -> Void) { + self.presentationData = presentationData + self.mode = mode + self.action = action + self.skipAction = skipAction + self.changeEmailAction = changeEmailAction + self.resendCodeAction = resendCodeAction + + self.navigationBackgroundNode = ASDisplayNode() + self.navigationBackgroundNode.backgroundColor = self.presentationData.theme.rootController.navigationBar.backgroundColor + self.navigationBackgroundNode.alpha = 0.0 + self.navigationSeparatorNode = ASDisplayNode() + self.navigationSeparatorNode.backgroundColor = self.presentationData.theme.rootController.navigationBar.separatorColor + + self.scrollNode = ASScrollNode() + self.scrollNode.canCancelAllTouchesInViews = true + + self.animationNode = ManagedAnimationNode(size: CGSize(width: 136.0, height: 136.0)) + + let title: String + let text: NSAttributedString + let buttonText: String + let skipActionText: String + let changeEmailActionText: String + let resendCodeActionText: String + + var inputNodes: [TwoFactorDataInputTextNode] = [] + var next: ((TwoFactorDataInputTextNode) -> Void)? + var focused: ((TwoFactorDataInputTextNode) -> Void)? + var updated: ((TwoFactorDataInputTextNode) -> Void)? + var toggleTextHidden: ((TwoFactorDataInputTextNode) -> Void)? + + switch mode { + case .password: + self.animationNode.switchTo(animationIdle) + + title = presentationData.strings.TwoFactorSetup_Password_Title + text = NSAttributedString(string: "", font: Font.regular(16.0), textColor: presentationData.theme.list.itemPrimaryTextColor) + buttonText = presentationData.strings.TwoFactorSetup_Password_Action + skipActionText = "" + changeEmailActionText = "" + resendCodeActionText = "" + inputNodes = [ + TwoFactorDataInputTextNode(theme: presentationData.theme, mode: .password(confirmation: false), placeholder: presentationData.strings.TwoFactorSetup_Password_PlaceholderPassword, focused: { node in + focused?(node) + }, next: { node in + next?(node) + }, updated: { node in + updated?(node) + }, toggleTextHidden: { node in + toggleTextHidden?(node) + }), + TwoFactorDataInputTextNode(theme: presentationData.theme, mode: .password(confirmation: true), placeholder: presentationData.strings.TwoFactorSetup_Password_PlaceholderConfirmPassword, focused: { node in + focused?(node) + }, next: { node in + next?(node) + }, updated: { node in + updated?(node) + }, toggleTextHidden: { node in + toggleTextHidden?(node) + }) + ] + case .emailAddress: + self.animationNode.switchTo(animationTracking) + + title = presentationData.strings.TwoFactorSetup_Email_Title + text = NSAttributedString(string: presentationData.strings.TwoFactorSetup_Email_Text, font: Font.regular(16.0), textColor: presentationData.theme.list.itemPrimaryTextColor) + buttonText = presentationData.strings.TwoFactorSetup_Email_Action + skipActionText = presentationData.strings.TwoFactorSetup_Email_SkipAction + changeEmailActionText = "" + resendCodeActionText = "" + inputNodes = [ + TwoFactorDataInputTextNode(theme: presentationData.theme, mode: .email, placeholder: presentationData.strings.TwoFactorSetup_Email_Placeholder, focused: { node in + focused?(node) + }, next: { node in + next?(node) + }, updated: { node in + updated?(node) + }, toggleTextHidden: { node in + toggleTextHidden?(node) + }), + ] + case let .emailConfirmation(_, emailPattern): + self.animationNode.switchTo(animationMail) + + title = presentationData.strings.TwoFactorSetup_EmailVerification_Title + let (rawText, ranges) = presentationData.strings.TwoFactorSetup_EmailVerification_Text(emailPattern) + + let string = NSMutableAttributedString() + string.append(NSAttributedString(string: rawText, font: Font.regular(16.0), textColor: presentationData.theme.list.itemPrimaryTextColor)) + for (_, range) in ranges { + string.addAttribute(.font, value: Font.semibold(16.0), range: range) + } + + text = string + + buttonText = presentationData.strings.TwoFactorSetup_EmailVerification_Action + skipActionText = "" + changeEmailActionText = presentationData.strings.TwoFactorSetup_EmailVerification_ChangeAction + resendCodeActionText = presentationData.strings.TwoFactorSetup_EmailVerification_ResendAction + inputNodes = [ + TwoFactorDataInputTextNode(theme: presentationData.theme, mode: .code, placeholder: presentationData.strings.TwoFactorSetup_EmailVerification_Placeholder, focused: { node in + focused?(node) + }, next: { node in + next?(node) + }, updated: { node in + updated?(node) + }, toggleTextHidden: { node in + toggleTextHidden?(node) + }), + ] + case .passwordHint: + self.animationNode.switchTo(animationHint) + + title = presentationData.strings.TwoFactorSetup_Hint_Title + + text = NSAttributedString(string: presentationData.strings.TwoFactorSetup_Hint_Text, font: Font.regular(16.0), textColor: presentationData.theme.list.itemPrimaryTextColor) + + buttonText = presentationData.strings.TwoFactorSetup_Hint_Action + skipActionText = presentationData.strings.TwoFactorSetup_Hint_SkipAction + changeEmailActionText = "" + resendCodeActionText = "" + inputNodes = [ + TwoFactorDataInputTextNode(theme: presentationData.theme, mode: .hint, placeholder: presentationData.strings.TwoFactorSetup_Hint_Placeholder, focused: { node in + focused?(node) + }, next: { node in + next?(node) + }, updated: { node in + updated?(node) + }, toggleTextHidden: { node in + toggleTextHidden?(node) + }), + ] + } + + self.titleNode = ImmediateTextNode() + self.titleNode.displaysAsynchronously = false + self.titleNode.attributedText = NSAttributedString(string: title, font: Font.bold(28.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor) + self.titleNode.maximumNumberOfLines = 0 + self.titleNode.textAlignment = .center + + self.textNode = ImmediateTextNode() + self.textNode.displaysAsynchronously = false + self.textNode.attributedText = text + self.textNode.maximumNumberOfLines = 0 + self.textNode.lineSpacing = 0.1 + self.textNode.textAlignment = .center + + self.skipActionTitleNode = ImmediateTextNode() + self.skipActionTitleNode.isUserInteractionEnabled = false + self.skipActionTitleNode.displaysAsynchronously = false + self.skipActionTitleNode.attributedText = NSAttributedString(string: skipActionText, font: Font.regular(16.0), textColor: self.presentationData.theme.list.itemAccentColor) + self.skipActionButtonNode = HighlightTrackingButtonNode() + self.skipActionTitleNode.isHidden = skipActionText.isEmpty + self.skipActionButtonNode.isHidden = skipActionText.isEmpty + + self.changeEmailActionTitleNode = ImmediateTextNode() + self.changeEmailActionTitleNode.isUserInteractionEnabled = false + self.changeEmailActionTitleNode.displaysAsynchronously = false + self.changeEmailActionTitleNode.attributedText = NSAttributedString(string: changeEmailActionText, font: Font.regular(16.0), textColor: self.presentationData.theme.list.itemAccentColor) + self.changeEmailActionButtonNode = HighlightTrackingButtonNode() + self.changeEmailActionButtonNode.isHidden = changeEmailActionText.isEmpty + self.changeEmailActionButtonNode.isHidden = changeEmailActionText.isEmpty + + self.resendCodeActionTitleNode = ImmediateTextNode() + self.resendCodeActionTitleNode.isUserInteractionEnabled = false + self.resendCodeActionTitleNode.displaysAsynchronously = false + self.resendCodeActionTitleNode.attributedText = NSAttributedString(string: resendCodeActionText, font: Font.regular(16.0), textColor: self.presentationData.theme.list.itemAccentColor) + self.resendCodeActionButtonNode = HighlightTrackingButtonNode() + self.resendCodeActionTitleNode.isHidden = resendCodeActionText.isEmpty + self.resendCodeActionButtonNode.isHidden = resendCodeActionText.isEmpty + + self.inputNodes = inputNodes + + self.buttonNode = SolidRoundedButtonNode(title: buttonText, theme: SolidRoundedButtonTheme(backgroundColor: self.presentationData.theme.list.itemCheckColors.fillColor, foregroundColor: self.presentationData.theme.list.itemCheckColors.foregroundColor), height: 50.0, cornerRadius: 10.0, gloss: false) + + super.init() + + self.backgroundColor = self.presentationData.theme.list.plainBackgroundColor + + self.addSubnode(self.scrollNode) + + self.scrollNode.addSubnode(self.animationNode) + self.scrollNode.addSubnode(self.titleNode) + self.scrollNode.addSubnode(self.textNode) + self.scrollNode.addSubnode(self.skipActionTitleNode) + self.scrollNode.addSubnode(self.skipActionButtonNode) + self.scrollNode.addSubnode(self.changeEmailActionTitleNode) + self.scrollNode.addSubnode(self.changeEmailActionButtonNode) + self.scrollNode.addSubnode(self.resendCodeActionTitleNode) + self.scrollNode.addSubnode(self.resendCodeActionButtonNode) + self.scrollNode.addSubnode(self.buttonNode) + + for (inputNode) in self.inputNodes { + self.scrollNode.addSubnode(inputNode) + } + + self.navigationBackgroundNode.addSubnode(self.navigationSeparatorNode) + self.addSubnode(self.navigationBackgroundNode) + + self.buttonNode.pressed = { + action() + } + + self.skipActionButtonNode.highligthedChanged = { [weak self] highlighted in + guard let strongSelf = self else { + return + } + if highlighted { + strongSelf.skipActionTitleNode.layer.removeAnimation(forKey: "opacity") + strongSelf.skipActionTitleNode.alpha = 0.4 + } else { + strongSelf.skipActionTitleNode.alpha = 1.0 + strongSelf.skipActionTitleNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2) + } + } + self.skipActionButtonNode.addTarget(self, action: #selector(self.skipActionPressed), forControlEvents: .touchUpInside) + + self.changeEmailActionButtonNode.highligthedChanged = { [weak self] highlighted in + guard let strongSelf = self else { + return + } + if highlighted { + strongSelf.changeEmailActionTitleNode.layer.removeAnimation(forKey: "opacity") + strongSelf.changeEmailActionTitleNode.alpha = 0.4 + } else { + strongSelf.changeEmailActionTitleNode.alpha = 1.0 + strongSelf.changeEmailActionTitleNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2) + } + } + self.changeEmailActionButtonNode.addTarget(self, action: #selector(self.changeEmailActionPressed), forControlEvents: .touchUpInside) + + self.resendCodeActionButtonNode.highligthedChanged = { [weak self] highlighted in + guard let strongSelf = self else { + return + } + if highlighted { + strongSelf.resendCodeActionTitleNode.layer.removeAnimation(forKey: "opacity") + strongSelf.resendCodeActionTitleNode.alpha = 0.4 + } else { + strongSelf.resendCodeActionTitleNode.alpha = 1.0 + strongSelf.resendCodeActionTitleNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2) + } + } + self.resendCodeActionButtonNode.addTarget(self, action: #selector(self.resendCodeActionPressed), forControlEvents: .touchUpInside) + + next = { [weak self] node in + guard let strongSelf = self else { + return + } + + } + focused = { [weak self] node in + DispatchQueue.main.async { + guard let strongSelf = self else { + return + } + } + } + var textHidden = true + let updateAnimations: () -> Void = { [weak self] in + guard let strongSelf = self else { + return + } + let hasText = strongSelf.inputNodes.contains(where: { !$0.text.isEmpty }) + switch strongSelf.mode { + case .password: + if !hasText { + if strongSelf.animationNode.currentItemName == animationPeek.name { + strongSelf.animationNode.switchTo(animationHideOutro) + strongSelf.animationNode.switchTo(animationIdle) + } else { + strongSelf.animationNode.switchTo(animationIdle) + } + } else if textHidden { + if strongSelf.animationNode.currentItemName == animationPeek.name { + strongSelf.animationNode.switchTo(animationHideNoIntro) + } else { + strongSelf.animationNode.switchTo(animationHide) + } + } else { + if strongSelf.animationNode.currentItemName != animationPeek.name { + if strongSelf.animationNode.currentItemName == animationHide.name { + strongSelf.animationNode.switchTo(animationPeek, noOutro: true) + } else if strongSelf.animationNode.currentItemName == animationIdle.name { + strongSelf.animationNode.switchTo(animationHideNoOutro) + strongSelf.animationNode.switchTo(animationPeek) + } else { + strongSelf.animationNode.switchTo(animationPeek, noOutro: strongSelf.animationNode.currentItemName == animationHide.name) + } + } + } + case .emailAddress: + let textLength = strongSelf.inputNodes[0].text.count + let maxWidth = strongSelf.inputNodes[0].bounds.width + if textLength == 0 || maxWidth.isZero { + strongSelf.animationNode.trackTo(frameIndex: 0) + } else { + let textNode = ImmediateTextNode() + textNode.attributedText = NSAttributedString(string: strongSelf.inputNodes[0].text, font: Font.regular(17.0), textColor: .black) + let textSize = textNode.updateLayout(CGSize(width: 1000.0, height: 100.0)) + + let maxTextLength = 20 + let lowerBound = 14 + let upperBound = 160 + var trackingOffset = textSize.width / maxWidth + trackingOffset = max(0.0, min(1.0, trackingOffset)) + let frameIndex = lowerBound + Int(trackingOffset * CGFloat(upperBound - lowerBound)) + strongSelf.animationNode.trackTo(frameIndex: frameIndex) + } + default: + break + } + } + updated = { [weak self] _ in + guard let strongSelf = self else { + return + } + switch strongSelf.mode { + case .emailAddress: + let hasText = strongSelf.inputNodes.contains(where: { !$0.text.isEmpty }) + strongSelf.buttonNode.isHidden = !hasText + strongSelf.skipActionTitleNode.isHidden = hasText + strongSelf.skipActionButtonNode.isHidden = hasText + case .emailConfirmation: + let hasText = strongSelf.inputNodes.contains(where: { !$0.text.isEmpty }) + strongSelf.buttonNode.isHidden = !hasText + strongSelf.changeEmailActionTitleNode.isHidden = hasText + strongSelf.changeEmailActionButtonNode.isHidden = hasText + strongSelf.resendCodeActionTitleNode.isHidden = hasText + strongSelf.resendCodeActionButtonNode.isHidden = hasText + case .passwordHint: + let hasText = strongSelf.inputNodes.contains(where: { !$0.text.isEmpty }) + strongSelf.buttonNode.isHidden = !hasText + strongSelf.skipActionTitleNode.isHidden = hasText + strongSelf.skipActionButtonNode.isHidden = hasText + case .password: + break + } + updateAnimations() + } + toggleTextHidden = { [weak self] _ in + guard let strongSelf = self else { + return + } + switch strongSelf.mode { + case .password: + textHidden = !textHidden + for node in strongSelf.inputNodes { + node.updateTextHidden(textHidden) + } + default: + break + } + updateAnimations() + } + self.inputNodes.first.flatMap { updated?($0) } + } + + @objc private func skipActionPressed() { + self.skipAction() + } + + @objc private func changeEmailActionPressed() { + self.changeEmailAction() + } + + @objc private func resendCodeActionPressed() { + self.resendCodeAction() + } + + override func didLoad() { + super.didLoad() + + self.scrollNode.view.keyboardDismissMode = .none + self.scrollNode.view.delaysContentTouches = false + self.scrollNode.view.canCancelContentTouches = true + //self.scrollNode.view.disablesInteractiveTransitionGestureRecognizer = true + self.scrollNode.view.alwaysBounceVertical = false + self.scrollNode.view.showsVerticalScrollIndicator = false + self.scrollNode.view.showsHorizontalScrollIndicator = false + if #available(iOSApplicationExtension 11.0, iOS 11.0, *) { + self.scrollNode.view.contentInsetAdjustmentBehavior = .never + } + self.scrollNode.view.delegate = self + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + } + + func containerLayoutUpdated(layout: ContainerViewLayout, navigationHeight: CGFloat, transition: ContainedViewLayoutTransition) { + self.navigationHeight = navigationHeight + + let contentAreaSize = layout.size + let availableAreaSize = CGSize(width: layout.size.width, height: layout.size.height - layout.insets(options: [.input]).bottom) + + let sideInset: CGFloat = 32.0 + let buttonSideInset: CGFloat = 48.0 + let iconSpacing: CGFloat = 2.0 + let titleSpacing: CGFloat = 19.0 + let titleInputSpacing: CGFloat = 26.0 + let textSpacing: CGFloat = 30.0 + let buttonHeight: CGFloat = 50.0 + let buttonSpacing: CGFloat = 20.0 + let rowSpacing: CGFloat = 20.0 + + transition.updateFrame(node: self.navigationBackgroundNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: contentAreaSize.width, height: navigationHeight))) + transition.updateFrame(node: self.navigationSeparatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: navigationHeight), size: CGSize(width: contentAreaSize.width, height: UIScreenPixel))) + + transition.updateFrame(node: self.scrollNode, frame: CGRect(origin: CGPoint(), size: contentAreaSize)) + + let iconSize: CGSize = self.animationNode.intrinsicSize + + let titleSize = self.titleNode.updateLayout(CGSize(width: contentAreaSize.width - sideInset * 2.0, height: contentAreaSize.height)) + let textSize = self.textNode.updateLayout(CGSize(width: contentAreaSize.width - sideInset * 2.0, height: contentAreaSize.height)) + let skipActionSize = self.skipActionTitleNode.updateLayout(CGSize(width: contentAreaSize.width - sideInset * 2.0, height: contentAreaSize.height)) + let changeEmailActionSize = self.changeEmailActionTitleNode.updateLayout(CGSize(width: contentAreaSize.width - sideInset * 2.0, height: contentAreaSize.height)) + let resendCodeActionSize = self.resendCodeActionTitleNode.updateLayout(CGSize(width: contentAreaSize.width - sideInset * 2.0, height: contentAreaSize.height)) + + var calculatedContentHeight = iconSize.height + iconSpacing + titleSize.height + if textSize.width.isZero { + calculatedContentHeight += titleInputSpacing + } else { + calculatedContentHeight += titleSpacing + textSize.height + textSpacing + } + for i in 0 ..< self.inputNodes.count { + if i != 0 { + calculatedContentHeight += rowSpacing + } + calculatedContentHeight += 50.0 + } + calculatedContentHeight += buttonHeight + buttonSpacing + + var contentHeight: CGFloat = 0.0 + + let insets = layout.insets(options: [.input]) + let areaHeight = layout.size.height - insets.top - insets.bottom + let contentVerticalOrigin = max(layout.statusBarHeight ?? 0.0, floor((areaHeight - calculatedContentHeight) / 2.0)) + + let iconFrame = CGRect(origin: CGPoint(x: floor((contentAreaSize.width - iconSize.width) / 2.0), y: contentVerticalOrigin), size: iconSize) + transition.updateFrame(node: self.animationNode, frame: iconFrame) + let titleFrame = CGRect(origin: CGPoint(x: floor((contentAreaSize.width - titleSize.width) / 2.0), y: iconFrame.maxY + iconSpacing), size: titleSize) + transition.updateFrameAdditive(node: self.titleNode, frame: titleFrame) + let textFrame: CGRect + if textSize.width.isZero { + textFrame = CGRect(origin: CGPoint(x: floor((contentAreaSize.width - textSize.width) / 2.0), y: titleFrame.maxY), size: textSize) + } else { + textFrame = CGRect(origin: CGPoint(x: floor((contentAreaSize.width - textSize.width) / 2.0), y: titleFrame.maxY + titleSpacing), size: textSize) + } + transition.updateFrameAdditive(node: self.textNode, frame: textFrame) + + contentHeight = textFrame.maxY + if textSize.width.isZero { + contentHeight += titleInputSpacing + } else { + contentHeight += textSpacing + } + + let rowWidth = contentAreaSize.width - buttonSideInset * 2.0 + + for i in 0 ..< self.inputNodes.count { + let inputNode = self.inputNodes[i] + if i != 0 { + contentHeight += rowSpacing + } + let inputNodeSize = CGSize(width: rowWidth, height: 50.0) + transition.updateFrame(node: inputNode, frame: CGRect(origin: CGPoint(x: buttonSideInset, y: contentHeight), size: inputNodeSize)) + inputNode.updateLayout(size: inputNodeSize, transition: transition) + contentHeight += inputNodeSize.height + } + + let minimalBottomInset: CGFloat = 74.0 + let buttonBottomInset = layout.intrinsicInsets.bottom + minimalBottomInset + let bottomInset = layout.intrinsicInsets.bottom + buttonSpacing + + let buttonWidth = contentAreaSize.width - buttonSideInset * 2.0 + + let maxButtonY = min(areaHeight - buttonSpacing, layout.size.height - buttonBottomInset) - buttonHeight + + let buttonFrame = CGRect(origin: CGPoint(x: floor((contentAreaSize.width - buttonWidth) / 2.0), y: max(contentHeight + buttonSpacing, maxButtonY)), size: CGSize(width: buttonWidth, height: buttonHeight)) + transition.updateFrame(node: self.buttonNode, frame: buttonFrame) + self.buttonNode.updateLayout(width: buttonFrame.width, transition: transition) + transition.updateFrame(node: self.skipActionButtonNode, frame: buttonFrame) + transition.updateFrame(node: self.skipActionTitleNode, frame: CGRect(origin: CGPoint(x: buttonFrame.minX + floor((buttonFrame.width - skipActionSize.width) / 2.0), y: buttonFrame.minY + floor((buttonFrame.height - skipActionSize.height) / 2.0)), size: skipActionSize)) + + transition.updateFrame(node: self.changeEmailActionButtonNode, frame: CGRect(origin: CGPoint(x: buttonFrame.minX, y: buttonFrame.minY), size: CGSize(width: floor(buttonFrame.width / 2.0), height: buttonFrame.height))) + transition.updateFrame(node: self.resendCodeActionButtonNode, frame: CGRect(origin: CGPoint(x: buttonFrame.maxX - floor(buttonFrame.width / 2.0), y: buttonFrame.minY), size: CGSize(width: floor(buttonFrame.width / 2.0), height: buttonFrame.height))) + + transition.updateFrame(node: self.changeEmailActionTitleNode, frame: CGRect(origin: CGPoint(x: buttonFrame.minX, y: buttonFrame.minY + floor((buttonFrame.height - changeEmailActionSize.height) / 2.0)), size: changeEmailActionSize)) + transition.updateFrame(node: self.resendCodeActionTitleNode, frame: CGRect(origin: CGPoint(x: buttonFrame.maxX - resendCodeActionSize.width, y: buttonFrame.minY + floor((buttonFrame.height - resendCodeActionSize.height) / 2.0)), size: resendCodeActionSize)) + + transition.animateView { + self.scrollNode.view.contentInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: layout.insets(options: [.input]).bottom, right: 0.0) + self.scrollNode.view.contentSize = CGSize(width: contentAreaSize.width, height: max(availableAreaSize.height, buttonFrame.maxY + bottomInset)) + } + } +} + diff --git a/submodules/PasswordSetupUI/Sources/TwoFactorAuthSplashScreen.swift b/submodules/PasswordSetupUI/Sources/TwoFactorAuthSplashScreen.swift new file mode 100644 index 0000000000..bcffb2adaf --- /dev/null +++ b/submodules/PasswordSetupUI/Sources/TwoFactorAuthSplashScreen.swift @@ -0,0 +1,207 @@ +import Foundation +import UIKit +import AppBundle +import AsyncDisplayKit +import Display +import SolidRoundedButtonNode +import SwiftSignalKit +import OverlayStatusController +import AnimatedStickerNode +import AccountContext +import TelegramPresentationData +import PresentationDataUtils + +public enum TwoFactorAuthSplashMode { + case intro + case done +} + +public final class TwoFactorAuthSplashScreen: ViewController { + private let context: AccountContext + private var presentationData: PresentationData + private var mode: TwoFactorAuthSplashMode + + public init(context: AccountContext, mode: TwoFactorAuthSplashMode) { + self.context = context + self.mode = mode + + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + + let defaultTheme = NavigationBarTheme(rootControllerTheme: self.presentationData.theme) + let navigationBarTheme = NavigationBarTheme(buttonColor: defaultTheme.buttonColor, disabledButtonColor: defaultTheme.disabledButtonColor, primaryTextColor: defaultTheme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultTheme.badgeBackgroundColor, badgeStrokeColor: defaultTheme.badgeStrokeColor, badgeTextColor: defaultTheme.badgeTextColor) + + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: NavigationBarStrings(back: self.presentationData.strings.Wallet_Intro_NotNow, close: self.presentationData.strings.Wallet_Navigation_Close))) + + self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style + self.navigationPresentation = .modalInLargeLayout + self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) + self.navigationBar?.intrinsicCanTransitionInline = false + + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Wallet_Navigation_Back, style: .plain, target: nil, action: nil) + } + + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + deinit { + } + + override public func loadDisplayNode() { + self.displayNode = TwoFactorAuthSplashScreenNode(context: self.context, presentationData: self.presentationData, mode: self.mode, action: { [weak self] in + guard let strongSelf = self else { + return + } + switch strongSelf.mode { + case .intro: + strongSelf.push(TwoFactorDataInputScreen(context: strongSelf.context, mode: .password)) + case .done: + guard let navigationController = strongSelf.navigationController as? NavigationController else { + return + } + navigationController.filterController(strongSelf, animated: true) + } + }) + + self.displayNodeDidLoad() + } + + override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + super.containerLayoutUpdated(layout, transition: transition) + + (self.displayNode as! TwoFactorAuthSplashScreenNode).containerLayoutUpdated(layout: layout, navigationHeight: self.navigationHeight, transition: transition) + } +} + +private final class TwoFactorAuthSplashScreenNode: ViewControllerTracingNode { + private var presentationData: PresentationData + private let mode: TwoFactorAuthSplashMode + + private var animationSize: CGSize = CGSize() + private var animationOffset: CGPoint = CGPoint() + private let animationNode: AnimatedStickerNode + private let titleNode: ImmediateTextNode + private let textNode: ImmediateTextNode + let buttonNode: SolidRoundedButtonNode + + var inProgress: Bool = false { + didSet { + self.buttonNode.isUserInteractionEnabled = !self.inProgress + self.buttonNode.alpha = self.inProgress ? 0.6 : 1.0 + } + } + + init(context: AccountContext, presentationData: PresentationData, mode: TwoFactorAuthSplashMode, action: @escaping () -> Void) { + self.presentationData = presentationData + self.mode = mode + + self.animationNode = AnimatedStickerNode() + + let title: String + let text: NSAttributedString + let buttonText: String + + let textFont = Font.regular(16.0) + let textColor = self.presentationData.theme.list.itemPrimaryTextColor + + switch mode { + case .intro: + title = self.presentationData.strings.TwoFactorSetup_Intro_Title + text = NSAttributedString(string: self.presentationData.strings.TwoFactorSetup_Intro_Text, font: textFont, textColor: textColor) + buttonText = self.presentationData.strings.TwoFactorSetup_Intro_Action + + if let path = getAppBundle().path(forResource: "TwoFactorSetupIntro", ofType: "tgs") { + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 248, height: 248, playbackMode: .once, mode: .direct) + self.animationSize = CGSize(width: 124.0, height: 124.0) + self.animationNode.visibility = true + } + case .done: + title = self.presentationData.strings.TwoFactorSetup_Done_Title + text = NSAttributedString(string: self.presentationData.strings.TwoFactorSetup_Done_Text, font: textFont, textColor: textColor) + buttonText = self.presentationData.strings.TwoFactorSetup_Done_Action + + if let path = getAppBundle().path(forResource: "TwoFactorSetupDone", ofType: "tgs") { + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 248, height: 248, mode: .direct) + self.animationSize = CGSize(width: 124.0, height: 124.0) + self.animationNode.visibility = true + } + } + + self.titleNode = ImmediateTextNode() + self.titleNode.displaysAsynchronously = false + self.titleNode.attributedText = NSAttributedString(string: title, font: Font.bold(32.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor) + self.titleNode.maximumNumberOfLines = 0 + self.titleNode.textAlignment = .center + + self.textNode = ImmediateTextNode() + self.textNode.displaysAsynchronously = false + self.textNode.attributedText = text + self.textNode.maximumNumberOfLines = 0 + self.textNode.lineSpacing = 0.1 + self.textNode.textAlignment = .center + + self.buttonNode = SolidRoundedButtonNode(title: buttonText, theme: SolidRoundedButtonTheme(backgroundColor: self.presentationData.theme.list.itemCheckColors.fillColor, foregroundColor: self.presentationData.theme.list.itemCheckColors.foregroundColor), height: 50.0, cornerRadius: 10.0, gloss: false) + self.buttonNode.isHidden = buttonText.isEmpty + + super.init() + + self.backgroundColor = self.presentationData.theme.list.plainBackgroundColor + + self.addSubnode(self.animationNode) + self.addSubnode(self.titleNode) + self.addSubnode(self.textNode) + self.addSubnode(self.buttonNode) + + self.buttonNode.pressed = { + action() + } + } + + override func didLoad() { + super.didLoad() + } + + func containerLayoutUpdated(layout: ContainerViewLayout, navigationHeight: CGFloat, transition: ContainedViewLayoutTransition) { + let sideInset: CGFloat = 32.0 + let buttonSideInset: CGFloat = 48.0 + let iconSpacing: CGFloat = 8.0 + let titleSpacing: CGFloat = 19.0 + let buttonHeight: CGFloat = 50.0 + + let iconSize: CGSize = self.animationSize + var iconOffset = CGPoint() + switch self.mode { + case .done: + iconOffset.x = 10.0 + default: + break + } + + let titleSize = self.titleNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: layout.size.height)) + let textSize = self.textNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: layout.size.height)) + + let contentHeight = iconSize.height + iconSpacing + titleSize.height + titleSpacing + textSize.height + var contentVerticalOrigin = floor((layout.size.height - contentHeight - iconSize.height / 2.0) / 2.0) + + let minimalBottomInset: CGFloat = 60.0 + let bottomInset = layout.intrinsicInsets.bottom + minimalBottomInset + + let buttonWidth = layout.size.width - buttonSideInset * 2.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) + self.buttonNode.updateLayout(width: buttonFrame.width, transition: transition) + + var maxContentVerticalOrigin = buttonFrame.minY - 12.0 - contentHeight + + contentVerticalOrigin = min(contentVerticalOrigin, maxContentVerticalOrigin) + + let iconFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - iconSize.width) / 2.0) + self.animationOffset.x, y: contentVerticalOrigin + self.animationOffset.y), size: iconSize).offsetBy(dx: iconOffset.x, dy: iconOffset.y) + self.animationNode.updateLayout(size: iconFrame.size) + transition.updateFrameAdditive(node: self.animationNode, frame: iconFrame) + let titleFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - titleSize.width) / 2.0), y: iconFrame.maxY + iconSpacing), size: titleSize) + transition.updateFrameAdditive(node: self.titleNode, frame: titleFrame) + let textFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - textSize.width) / 2.0), y: titleFrame.maxY + titleSpacing), size: textSize) + transition.updateFrameAdditive(node: self.textNode, frame: textFrame) + } +} diff --git a/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift b/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift index 9729967dc7..fafa6c3fe8 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift @@ -13,6 +13,7 @@ import AccountContext import TelegramNotices import LocalAuth import AppBundle +import PasswordSetupUI private final class PrivacyAndSecurityControllerArguments { let account: Account @@ -639,7 +640,14 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting case .set: break case let .notSet(pendingEmail): - intro = pendingEmail == nil + if pendingEmail == nil { + let controller = TwoFactorAuthSplashScreen(context: context, mode: .intro) + pushControllerImpl?(controller, true) + } else { + + } + //intro = pendingEmail == nil + return } } if intro { diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index 40a6a838cb..4a0cd48d19 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -334,9 +334,9 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr inputBackgroundColor: UIColor(rgb: 0xe9e9e9), inputHollowBackgroundColor: .white, inputBorderColor: UIColor(rgb: 0xe4e4e6), - inputPlaceholderColor: UIColor(rgb: 0x818086), + inputPlaceholderColor: UIColor(rgb: 0x8E8D92), inputTextColor: .black, - inputClearButtonColor: UIColor(rgb: 0x7b7b81), + inputClearButtonColor: UIColor(rgb: 0xBCBCC0), checkContentColor: .white ) diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 6e0a60fa26..9de3627d73 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -444,4231 +444,4262 @@ public final class PresentationStrings: Equatable { public var Passport_Identity_DateOfBirth: String { return self._s[234]! } public var Month_ShortOctober: String { return self._s[235]! } public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[236]! } - public var Notification_CallCanceledShort: String { return self._s[237]! } - public var Passport_Phone_Help: String { return self._s[238]! } - public var Passport_Language_az: String { return self._s[240]! } - public var CreatePoll_TextPlaceholder: String { return self._s[242]! } - public var VoiceOver_Chat_AnonymousPoll: String { return self._s[243]! } - public var Passport_Identity_DocumentNumber: String { return self._s[244]! } - public var PhotoEditor_CurvesRed: String { return self._s[245]! } - public var PhoneNumberHelp_Alert: String { return self._s[247]! } - public var SocksProxySetup_Port: String { return self._s[248]! } - public var Checkout_PayNone: String { return self._s[249]! } - public var AutoDownloadSettings_WiFi: String { return self._s[250]! } - public var GroupInfo_GroupType: String { return self._s[251]! } - public var StickerSettings_ContextHide: String { return self._s[252]! } - public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[253]! } - public var Group_Setup_HistoryTitle: String { return self._s[255]! } - public var Passport_Identity_FilesUploadNew: String { return self._s[256]! } - public var PasscodeSettings_AutoLock: String { return self._s[257]! } - public var Passport_Title: String { return self._s[258]! } - public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[259]! } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[260]! } - public var GroupPermission_NoSendGifs: String { return self._s[261]! } - public var PrivacySettings_PasscodeOn: String { return self._s[262]! } + public var TwoFactorSetup_Done_Text: String { return self._s[237]! } + public var Notification_CallCanceledShort: String { return self._s[238]! } + public var Passport_Phone_Help: String { return self._s[239]! } + public var Passport_Language_az: String { return self._s[241]! } + public var CreatePoll_TextPlaceholder: String { return self._s[243]! } + public var VoiceOver_Chat_AnonymousPoll: String { return self._s[244]! } + public var Passport_Identity_DocumentNumber: String { return self._s[245]! } + public var PhotoEditor_CurvesRed: String { return self._s[246]! } + public var PhoneNumberHelp_Alert: String { return self._s[248]! } + public var SocksProxySetup_Port: String { return self._s[249]! } + public var Checkout_PayNone: String { return self._s[250]! } + public var AutoDownloadSettings_WiFi: String { return self._s[251]! } + public var GroupInfo_GroupType: String { return self._s[252]! } + public var StickerSettings_ContextHide: String { return self._s[253]! } + public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[254]! } + public var Group_Setup_HistoryTitle: String { return self._s[256]! } + public var Passport_Identity_FilesUploadNew: String { return self._s[257]! } + public var PasscodeSettings_AutoLock: String { return self._s[258]! } + public var Passport_Title: String { return self._s[259]! } + public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[260]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[261]! } + public var GroupPermission_NoSendGifs: String { return self._s[262]! } + public var PrivacySettings_PasscodeOn: String { return self._s[263]! } public func Conversation_ScheduleMessage_SendTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[263]!, self._r[263]!, [_0]) + return formatWithArgumentRanges(self._s[264]!, self._r[264]!, [_0]) } - public var State_WaitingForNetwork: String { return self._s[265]! } + public var State_WaitingForNetwork: String { return self._s[266]! } public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[266]!, self._r[266]!, [_0, _1]) + return formatWithArgumentRanges(self._s[267]!, self._r[267]!, [_0, _1]) } - public var Calls_NotNow: String { return self._s[268]! } + public var Calls_NotNow: String { return self._s[269]! } public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[269]!, self._r[269]!, [_0]) + return formatWithArgumentRanges(self._s[270]!, self._r[270]!, [_0]) } - public var UserInfo_SendMessage: String { return self._s[270]! } - public var TwoStepAuth_PasswordSet: String { return self._s[271]! } - public var Passport_DeleteDocument: String { return self._s[272]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[273]! } + public var UserInfo_SendMessage: String { return self._s[271]! } + public var TwoStepAuth_PasswordSet: String { return self._s[272]! } + public var Passport_DeleteDocument: String { return self._s[273]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[274]! } public func PUSH_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[274]!, self._r[274]!, [_1]) + return formatWithArgumentRanges(self._s[275]!, self._r[275]!, [_1]) } - public var GroupRemoved_Remove: String { return self._s[275]! } - public var Passport_FieldIdentity: String { return self._s[276]! } - public var Group_Setup_TypePrivateHelp: String { return self._s[277]! } - public var Conversation_Processing: String { return self._s[280]! } - public var ChatSettings_AutoPlayAnimations: String { return self._s[282]! } - public var AuthSessions_LogOutApplicationsHelp: String { return self._s[285]! } - public var Month_GenFebruary: String { return self._s[286]! } - public var Wallet_Send_NetworkErrorTitle: String { return self._s[287]! } + public var GroupRemoved_Remove: String { return self._s[276]! } + public var Passport_FieldIdentity: String { return self._s[277]! } + public var Group_Setup_TypePrivateHelp: String { return self._s[278]! } + public var Conversation_Processing: String { return self._s[281]! } + public var ChatSettings_AutoPlayAnimations: String { return self._s[283]! } + public var AuthSessions_LogOutApplicationsHelp: String { return self._s[286]! } + public var Month_GenFebruary: String { return self._s[287]! } + public var Wallet_Send_NetworkErrorTitle: String { return self._s[288]! } public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[289]!, self._r[289]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[290]!, self._r[290]!, [_1, _2, _3, _4, _5]) } - public var Passport_Identity_TypeIdentityCard: String { return self._s[290]! } - public var Wallet_Month_ShortJune: String { return self._s[292]! } - public var AutoDownloadSettings_DataUsageMedium: String { return self._s[293]! } - public var GroupInfo_AddParticipant: String { return self._s[294]! } - public var KeyCommand_SendMessage: String { return self._s[295]! } - public var VoiceOver_Chat_YourContact: String { return self._s[297]! } - public var Map_LiveLocationShowAll: String { return self._s[298]! } - public var WallpaperSearch_ColorOrange: String { return self._s[300]! } - public var Appearance_AppIconDefaultX: String { return self._s[301]! } - public var Checkout_Receipt_Title: String { return self._s[302]! } - public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[303]! } - public var WallpaperPreview_PreviewTopText: String { return self._s[304]! } - public var Message_Contact: String { return self._s[305]! } - public var Call_StatusIncoming: String { return self._s[306]! } - public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[307]! } + public var Passport_Identity_TypeIdentityCard: String { return self._s[291]! } + public var Wallet_Month_ShortJune: String { return self._s[293]! } + public var AutoDownloadSettings_DataUsageMedium: String { return self._s[294]! } + public var GroupInfo_AddParticipant: String { return self._s[295]! } + public var KeyCommand_SendMessage: String { return self._s[296]! } + public var VoiceOver_Chat_YourContact: String { return self._s[298]! } + public var Map_LiveLocationShowAll: String { return self._s[299]! } + public var WallpaperSearch_ColorOrange: String { return self._s[301]! } + public var Appearance_AppIconDefaultX: String { return self._s[302]! } + public var Checkout_Receipt_Title: String { return self._s[303]! } + public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[304]! } + public var WallpaperPreview_PreviewTopText: String { return self._s[305]! } + public var Message_Contact: String { return self._s[306]! } + public var Call_StatusIncoming: String { return self._s[307]! } + public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[308]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[308]!, self._r[308]!, [_1]) + return formatWithArgumentRanges(self._s[309]!, self._r[309]!, [_1]) } public func PUSH_ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[310]!, self._r[310]!, [_1]) + return formatWithArgumentRanges(self._s[311]!, self._r[311]!, [_1]) } - public var VoiceOver_Media_PlaybackRate: String { return self._s[311]! } - public var Passport_FieldIdentityDetailsHelp: String { return self._s[312]! } - public var Conversation_ViewChannel: String { return self._s[313]! } + public var VoiceOver_Media_PlaybackRate: String { return self._s[312]! } + public var Passport_FieldIdentityDetailsHelp: String { return self._s[313]! } + public var Conversation_ViewChannel: String { return self._s[314]! } public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[314]!, self._r[314]!, [_0]) + return formatWithArgumentRanges(self._s[315]!, self._r[315]!, [_0]) } - public var Passport_Language_nl: String { return self._s[316]! } - public var Camera_Retake: String { return self._s[317]! } + public var Passport_Language_nl: String { return self._s[317]! } + public var Camera_Retake: String { return self._s[318]! } public func UserInfo_BlockActionTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[318]!, self._r[318]!, [_0]) + return formatWithArgumentRanges(self._s[319]!, self._r[319]!, [_0]) } - public var AuthSessions_LogOutApplications: String { return self._s[319]! } - public var ApplyLanguage_ApplySuccess: String { return self._s[320]! } - public var Tour_Title6: String { return self._s[321]! } - public var Map_ChooseAPlace: String { return self._s[322]! } - public var CallSettings_Never: String { return self._s[324]! } + public var AuthSessions_LogOutApplications: String { return self._s[320]! } + public var ApplyLanguage_ApplySuccess: String { return self._s[321]! } + public var Tour_Title6: String { return self._s[322]! } + public var Map_ChooseAPlace: String { return self._s[323]! } + public var CallSettings_Never: String { return self._s[325]! } public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[325]!, self._r[325]!, [_0]) + return formatWithArgumentRanges(self._s[326]!, self._r[326]!, [_0]) } - public var ChannelRemoved_RemoveInfo: String { return self._s[326]! } + public var ChannelRemoved_RemoveInfo: String { return self._s[327]! } public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[327]!, self._r[327]!, [_0]) + return formatWithArgumentRanges(self._s[328]!, self._r[328]!, [_0]) } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[328]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[329]! } public func Conversation_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[329]!, self._r[329]!, [_0]) + return formatWithArgumentRanges(self._s[330]!, self._r[330]!, [_0]) } - public var GroupInfo_InviteLink_Title: String { return self._s[330]! } + public var GroupInfo_InviteLink_Title: String { return self._s[331]! } public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[331]!, self._r[331]!, [_1, _2]) + return formatWithArgumentRanges(self._s[332]!, self._r[332]!, [_1, _2]) } - public var KeyCommand_ScrollUp: String { return self._s[332]! } - public var ContactInfo_URLLabelHomepage: String { return self._s[333]! } - public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[334]! } + public var KeyCommand_ScrollUp: String { return self._s[333]! } + public var ContactInfo_URLLabelHomepage: String { return self._s[334]! } + public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[335]! } public func Channel_AdminLog_DisabledSlowmode(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[335]!, self._r[335]!, [_0]) - } - public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[336]!, self._r[336]!, [_0]) } - public var CallFeedback_ReasonDistortedSpeech: String { return self._s[337]! } - public var Watch_LastSeen_WithinAWeek: String { return self._s[338]! } - public var ContactList_Context_SendMessage: String { return self._s[340]! } - public var Weekday_Tuesday: String { return self._s[341]! } - public var Wallet_Created_Title: String { return self._s[343]! } - public var ScheduledMessages_Delete: String { return self._s[344]! } - public var UserInfo_StartSecretChat: String { return self._s[345]! } - public var Passport_Identity_FilesTitle: String { return self._s[346]! } - public var Permissions_NotificationsAllow_v0: String { return self._s[347]! } - public var DialogList_DeleteConversationConfirmation: String { return self._s[349]! } - public var ChatList_UndoArchiveRevealedTitle: String { return self._s[350]! } - public var AuthSessions_Sessions: String { return self._s[351]! } + public var TwoFactorSetup_Done_Title: String { return self._s[337]! } + public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[338]!, self._r[338]!, [_0]) + } + public var CallFeedback_ReasonDistortedSpeech: String { return self._s[339]! } + public var Watch_LastSeen_WithinAWeek: String { return self._s[340]! } + public var ContactList_Context_SendMessage: String { return self._s[342]! } + public var Weekday_Tuesday: String { return self._s[343]! } + public var Wallet_Created_Title: String { return self._s[345]! } + public var ScheduledMessages_Delete: String { return self._s[346]! } + public var UserInfo_StartSecretChat: String { return self._s[347]! } + public var Passport_Identity_FilesTitle: String { return self._s[348]! } + public var Permissions_NotificationsAllow_v0: String { return self._s[349]! } + public var DialogList_DeleteConversationConfirmation: String { return self._s[351]! } + public var ChatList_UndoArchiveRevealedTitle: String { return self._s[352]! } + public var AuthSessions_Sessions: String { return self._s[353]! } public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[353]!, self._r[353]!, [_0]) + return formatWithArgumentRanges(self._s[355]!, self._r[355]!, [_0]) } - public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[354]! } - public var Call_StatusWaiting: String { return self._s[355]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[356]! } - public var FastTwoStepSetup_HintHelp: String { return self._s[357]! } - public var WallpaperPreview_CustomColorBottomText: String { return self._s[358]! } - public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[359]! } - public var LogoutOptions_AddAccountText: String { return self._s[360]! } - public var PasscodeSettings_6DigitCode: String { return self._s[361]! } - public var Settings_LogoutConfirmationText: String { return self._s[362]! } - public var Passport_Identity_TypePassport: String { return self._s[364]! } + public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[356]! } + public var Call_StatusWaiting: String { return self._s[357]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[358]! } + public var FastTwoStepSetup_HintHelp: String { return self._s[359]! } + public var WallpaperPreview_CustomColorBottomText: String { return self._s[360]! } + public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[361]! } + public var LogoutOptions_AddAccountText: String { return self._s[362]! } + public var PasscodeSettings_6DigitCode: String { return self._s[363]! } + public var Settings_LogoutConfirmationText: String { return self._s[364]! } + public var Passport_Identity_TypePassport: String { return self._s[366]! } public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[367]!, self._r[367]!, [_1, _2]) + return formatWithArgumentRanges(self._s[369]!, self._r[369]!, [_1, _2]) } - public var SocksProxySetup_SaveProxy: String { return self._s[368]! } - public var AccessDenied_SaveMedia: String { return self._s[369]! } - public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[371]! } - public var Settings_Title: String { return self._s[373]! } - public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[374]! } - public var Contacts_InviteSearchLabel: String { return self._s[376]! } - public var ConvertToSupergroup_Title: String { return self._s[377]! } + public var SocksProxySetup_SaveProxy: String { return self._s[370]! } + public var AccessDenied_SaveMedia: String { return self._s[371]! } + public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[373]! } + public var Settings_Title: String { return self._s[375]! } + public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[376]! } + public var Contacts_InviteSearchLabel: String { return self._s[378]! } + public var ConvertToSupergroup_Title: String { return self._s[379]! } public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[378]!, self._r[378]!, [_0]) + return formatWithArgumentRanges(self._s[380]!, self._r[380]!, [_0]) } - public var InfoPlist_NSSiriUsageDescription: String { return self._s[379]! } + public var TwoFactorSetup_Hint_Text: String { return self._s[381]! } + public var InfoPlist_NSSiriUsageDescription: String { return self._s[382]! } public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[380]!, self._r[380]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[383]!, self._r[383]!, [_1, _2, _3]) } - public var ChatSettings_AutomaticPhotoDownload: String { return self._s[381]! } - public var UserInfo_BotHelp: String { return self._s[382]! } - public var PrivacySettings_LastSeenEverybody: String { return self._s[383]! } - public var Checkout_Name: String { return self._s[384]! } - public var AutoDownloadSettings_DataUsage: String { return self._s[385]! } - public var Channel_BanUser_BlockFor: String { return self._s[386]! } - public var Checkout_ShippingAddress: String { return self._s[387]! } - public var AutoDownloadSettings_MaxVideoSize: String { return self._s[388]! } - public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[389]! } - public var Privacy_Forwards: String { return self._s[390]! } - public var Channel_BanUser_PermissionSendPolls: String { return self._s[391]! } - public var Appearance_ThemeCarouselNewNight: String { return self._s[392]! } + public var ChatSettings_AutomaticPhotoDownload: String { return self._s[384]! } + public var UserInfo_BotHelp: String { return self._s[385]! } + public var PrivacySettings_LastSeenEverybody: String { return self._s[386]! } + public var Checkout_Name: String { return self._s[387]! } + public var AutoDownloadSettings_DataUsage: String { return self._s[388]! } + public var Channel_BanUser_BlockFor: String { return self._s[389]! } + public var Checkout_ShippingAddress: String { return self._s[390]! } + public var AutoDownloadSettings_MaxVideoSize: String { return self._s[391]! } + public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[392]! } + public var Privacy_Forwards: String { return self._s[393]! } + public var Channel_BanUser_PermissionSendPolls: String { return self._s[394]! } + public var Appearance_ThemeCarouselNewNight: String { return self._s[395]! } public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[395]!, self._r[395]!, [_0]) + return formatWithArgumentRanges(self._s[398]!, self._r[398]!, [_0]) } - public var Contacts_SortedByName: String { return self._s[396]! } - public var Group_OwnershipTransfer_Title: String { return self._s[397]! } - public var VoiceOver_Chat_OpenHint: String { return self._s[398]! } - public var Group_LeaveGroup: String { return self._s[399]! } - public var Settings_UsernameEmpty: String { return self._s[400]! } + public var Contacts_SortedByName: String { return self._s[399]! } + public var Group_OwnershipTransfer_Title: String { return self._s[400]! } + public var VoiceOver_Chat_OpenHint: String { return self._s[401]! } + public var Group_LeaveGroup: String { return self._s[402]! } + public var Settings_UsernameEmpty: String { return self._s[403]! } public func Notification_PinnedPollMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[401]!, self._r[401]!, [_0]) + return formatWithArgumentRanges(self._s[404]!, self._r[404]!, [_0]) } public func TwoStepAuth_ConfirmEmailDescription(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[402]!, self._r[402]!, [_1]) + return formatWithArgumentRanges(self._s[405]!, self._r[405]!, [_1]) } public func Channel_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[403]!, self._r[403]!, [_1, _2]) + return formatWithArgumentRanges(self._s[406]!, self._r[406]!, [_1, _2]) } - public var Message_ImageExpired: String { return self._s[404]! } - public var TwoStepAuth_RecoveryFailed: String { return self._s[406]! } - public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[407]! } - public var UserInfo_AddToExisting: String { return self._s[408]! } - public var TwoStepAuth_EnabledSuccess: String { return self._s[409]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[410]! } + public var Message_ImageExpired: String { return self._s[407]! } + public var TwoStepAuth_RecoveryFailed: String { return self._s[409]! } + public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[410]! } + public var UserInfo_AddToExisting: String { return self._s[411]! } + public var TwoStepAuth_EnabledSuccess: String { return self._s[412]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[413]! } public func PUSH_CHANNEL_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[411]!, self._r[411]!, [_1]) + return formatWithArgumentRanges(self._s[414]!, self._r[414]!, [_1]) } - public var Notifications_GroupNotificationsAlert: String { return self._s[412]! } - public var Passport_Language_km: String { return self._s[413]! } - public var SocksProxySetup_AdNoticeHelp: String { return self._s[415]! } - public var VoiceOver_Media_PlaybackPlay: String { return self._s[416]! } - public var Notification_CallMissedShort: String { return self._s[417]! } - public var Wallet_Info_YourBalance: String { return self._s[418]! } - public var ReportPeer_ReasonOther_Send: String { return self._s[419]! } - public var Watch_Compose_Send: String { return self._s[420]! } - public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[423]! } - public var Conversation_HoldForVideo: String { return self._s[424]! } - public var Wallet_TransactionInfo_CommentHeader: String { return self._s[425]! } - public var CheckoutInfo_ErrorCityInvalid: String { return self._s[427]! } - public var Appearance_AutoNightThemeDisabled: String { return self._s[429]! } - public var Channel_LinkItem: String { return self._s[430]! } + public var Notifications_GroupNotificationsAlert: String { return self._s[415]! } + public var Passport_Language_km: String { return self._s[416]! } + public var SocksProxySetup_AdNoticeHelp: String { return self._s[418]! } + public var VoiceOver_Media_PlaybackPlay: String { return self._s[419]! } + public var Notification_CallMissedShort: String { return self._s[420]! } + public var Wallet_Info_YourBalance: String { return self._s[421]! } + public var ReportPeer_ReasonOther_Send: String { return self._s[422]! } + public var Watch_Compose_Send: String { return self._s[423]! } + public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[426]! } + public var TwoFactorSetup_Email_Action: String { return self._s[427]! } + public var Conversation_HoldForVideo: String { return self._s[428]! } + public var Wallet_TransactionInfo_CommentHeader: String { return self._s[429]! } + public var CheckoutInfo_ErrorCityInvalid: String { return self._s[431]! } + public var Appearance_AutoNightThemeDisabled: String { return self._s[433]! } + public var Channel_LinkItem: String { return self._s[434]! } public func PrivacySettings_LastSeenContactsMinusPlus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[431]!, self._r[431]!, [_0, _1]) + return formatWithArgumentRanges(self._s[435]!, self._r[435]!, [_0, _1]) } public func Passport_Identity_NativeNameTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[434]!, self._r[434]!, [_0]) + return formatWithArgumentRanges(self._s[438]!, self._r[438]!, [_0]) } - public var VoiceOver_Recording_StopAndPreview: String { return self._s[435]! } - public var Passport_Language_dv: String { return self._s[436]! } - public var Undo_LeftChannel: String { return self._s[437]! } - public var Notifications_ExceptionsMuted: String { return self._s[438]! } - public var ChatList_UnhideAction: String { return self._s[439]! } - public var Conversation_ContextMenuShare: String { return self._s[440]! } - public var Conversation_ContextMenuStickerPackInfo: String { return self._s[441]! } - public var ShareFileTip_Title: String { return self._s[442]! } - public var NotificationsSound_Chord: String { return self._s[443]! } - public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[444]! } + public var VoiceOver_Recording_StopAndPreview: String { return self._s[439]! } + public var Passport_Language_dv: String { return self._s[440]! } + public var Undo_LeftChannel: String { return self._s[441]! } + public var Notifications_ExceptionsMuted: String { return self._s[442]! } + public var ChatList_UnhideAction: String { return self._s[443]! } + public var Conversation_ContextMenuShare: String { return self._s[444]! } + public var Conversation_ContextMenuStickerPackInfo: String { return self._s[445]! } + public var ShareFileTip_Title: String { return self._s[446]! } + public var NotificationsSound_Chord: String { return self._s[447]! } + public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[448]! } public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[445]!, self._r[445]!, [_1, _2]) + return formatWithArgumentRanges(self._s[449]!, self._r[449]!, [_1, _2]) } - public var Passport_Address_EditTemporaryRegistration: String { return self._s[446]! } + public var Passport_Address_EditTemporaryRegistration: String { return self._s[450]! } public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[447]!, self._r[447]!, [_0]) + return formatWithArgumentRanges(self._s[451]!, self._r[451]!, [_0]) } public func Wallet_Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[448]!, self._r[448]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[452]!, self._r[452]!, [_1, _2, _3]) } - public var Wallpaper_ErrorNotFound: String { return self._s[449]! } - public var Notification_CallOutgoingShort: String { return self._s[451]! } - public var Wallet_WordImport_IncorrectText: String { return self._s[452]! } + public var Wallpaper_ErrorNotFound: String { return self._s[453]! } + public var Notification_CallOutgoingShort: String { return self._s[455]! } + public var Wallet_WordImport_IncorrectText: String { return self._s[456]! } public func Watch_Time_ShortFullAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[453]!, self._r[453]!, [_1, _2]) + return formatWithArgumentRanges(self._s[457]!, self._r[457]!, [_1, _2]) } - public var Passport_Address_TypeUtilityBill: String { return self._s[454]! } - public var Privacy_Forwards_LinkIfAllowed: String { return self._s[455]! } - public var ReportPeer_Report: String { return self._s[456]! } - public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[457]! } - public var GroupInfo_DeactivatedStatus: String { return self._s[458]! } + public var Passport_Address_TypeUtilityBill: String { return self._s[458]! } + public var Privacy_Forwards_LinkIfAllowed: String { return self._s[459]! } + public var ReportPeer_Report: String { return self._s[460]! } + public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[461]! } + public var GroupInfo_DeactivatedStatus: String { return self._s[462]! } public func VoiceOver_Chat_MusicTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[459]!, self._r[459]!, [_1, _2]) + return formatWithArgumentRanges(self._s[463]!, self._r[463]!, [_1, _2]) } - public var StickerPack_Send: String { return self._s[460]! } - public var Login_CodeSentInternal: String { return self._s[461]! } - public var Wallet_Month_GenJanuary: String { return self._s[462]! } - public var GroupInfo_InviteLink_LinkSection: String { return self._s[463]! } + public var StickerPack_Send: String { return self._s[464]! } + public var Login_CodeSentInternal: String { return self._s[465]! } + public var Wallet_Month_GenJanuary: String { return self._s[466]! } + public var GroupInfo_InviteLink_LinkSection: String { return self._s[467]! } public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[464]!, self._r[464]!, [_0]) + return formatWithArgumentRanges(self._s[468]!, self._r[468]!, [_0]) } public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[466]!, self._r[466]!, [_0]) + return formatWithArgumentRanges(self._s[470]!, self._r[470]!, [_0]) } - public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[467]! } + public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[471]! } public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[468]!, self._r[468]!, [_1]) + return formatWithArgumentRanges(self._s[472]!, self._r[472]!, [_1]) } - public var ReportPeer_ReasonViolence: String { return self._s[470]! } - public var Map_Locating: String { return self._s[471]! } + public var ReportPeer_ReasonViolence: String { return self._s[474]! } + public var Map_Locating: String { return self._s[475]! } public func VoiceOver_Chat_VideoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[472]!, self._r[472]!, [_0]) + return formatWithArgumentRanges(self._s[476]!, self._r[476]!, [_0]) } public func PUSH_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[473]!, self._r[473]!, [_1]) + return formatWithArgumentRanges(self._s[477]!, self._r[477]!, [_1]) } - public var AutoDownloadSettings_GroupChats: String { return self._s[475]! } - public var CheckoutInfo_SaveInfo: String { return self._s[476]! } - public var SharedMedia_EmptyLinksText: String { return self._s[478]! } - public var Passport_Address_CityPlaceholder: String { return self._s[479]! } - public var CheckoutInfo_ErrorStateInvalid: String { return self._s[480]! } - public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[481]! } - public var Channel_AdminLog_CanAddAdmins: String { return self._s[483]! } + public var AutoDownloadSettings_GroupChats: String { return self._s[479]! } + public var CheckoutInfo_SaveInfo: String { return self._s[480]! } + public var SharedMedia_EmptyLinksText: String { return self._s[482]! } + public var Passport_Address_CityPlaceholder: String { return self._s[483]! } + public var CheckoutInfo_ErrorStateInvalid: String { return self._s[484]! } + public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[485]! } + public var Channel_AdminLog_CanAddAdmins: String { return self._s[487]! } public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[484]!, self._r[484]!, [_1]) + return formatWithArgumentRanges(self._s[488]!, self._r[488]!, [_1]) } public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[485]!, self._r[485]!, [_0]) + return formatWithArgumentRanges(self._s[489]!, self._r[489]!, [_0]) } - public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[486]! } - public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[487]! } - public var ChangePhoneNumberCode_Code: String { return self._s[488]! } - public var Appearance_CreateTheme: String { return self._s[489]! } + public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[490]! } + public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[491]! } + public var ChangePhoneNumberCode_Code: String { return self._s[492]! } + public var Appearance_CreateTheme: String { return self._s[493]! } public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[490]!, self._r[490]!, [_0]) + return formatWithArgumentRanges(self._s[494]!, self._r[494]!, [_0]) } - public var TwoStepAuth_SetupEmail: String { return self._s[491]! } - public var HashtagSearch_AllChats: String { return self._s[492]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[494]! } + public var TwoStepAuth_SetupEmail: String { return self._s[495]! } + public var HashtagSearch_AllChats: String { return self._s[496]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[498]! } public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[495]!, self._r[495]!, [_0]) + return formatWithArgumentRanges(self._s[499]!, self._r[499]!, [_0]) } - public var PhotoEditor_QualityHigh: String { return self._s[497]! } + public var PhotoEditor_QualityHigh: String { return self._s[501]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[498]!, self._r[498]!, [_0]) + return formatWithArgumentRanges(self._s[502]!, self._r[502]!, [_0]) } - public var ApplyLanguage_ApplyLanguageAction: String { return self._s[499]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[500]! } - public var Message_LiveLocation: String { return self._s[501]! } - public var Cache_LowDiskSpaceText: String { return self._s[502]! } - public var Wallet_Receive_ShareAddress: String { return self._s[503]! } - public var EditTheme_ErrorLinkTaken: String { return self._s[504]! } - public var Conversation_SendMessage: String { return self._s[505]! } - public var AuthSessions_EmptyTitle: String { return self._s[506]! } - public var Privacy_PhoneNumber: String { return self._s[507]! } - public var PeopleNearby_CreateGroup: String { return self._s[508]! } - public var CallSettings_UseLessData: String { return self._s[509]! } - public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[510]! } - public var Stickers_AddToFavorites: String { return self._s[511]! } - public var Wallet_WordImport_Title: String { return self._s[512]! } - public var PhotoEditor_QualityLow: String { return self._s[513]! } - public var Watch_UserInfo_Unblock: String { return self._s[514]! } - public var Settings_Logout: String { return self._s[515]! } + public var ApplyLanguage_ApplyLanguageAction: String { return self._s[503]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[504]! } + public var Message_LiveLocation: String { return self._s[505]! } + public var Cache_LowDiskSpaceText: String { return self._s[506]! } + public var Wallet_Receive_ShareAddress: String { return self._s[507]! } + public var EditTheme_ErrorLinkTaken: String { return self._s[508]! } + public var Conversation_SendMessage: String { return self._s[509]! } + public var AuthSessions_EmptyTitle: String { return self._s[510]! } + public var Privacy_PhoneNumber: String { return self._s[511]! } + public var PeopleNearby_CreateGroup: String { return self._s[512]! } + public var CallSettings_UseLessData: String { return self._s[513]! } + public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[514]! } + public var Stickers_AddToFavorites: String { return self._s[515]! } + public var Wallet_WordImport_Title: String { return self._s[516]! } + public var PhotoEditor_QualityLow: String { return self._s[517]! } + public var Watch_UserInfo_Unblock: String { return self._s[518]! } + public var Settings_Logout: String { return self._s[519]! } public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[516]!, self._r[516]!, [_1]) + return formatWithArgumentRanges(self._s[520]!, self._r[520]!, [_1]) } - public var ContactInfo_PhoneLabelWork: String { return self._s[517]! } - public var ChannelInfo_Stats: String { return self._s[518]! } - public var TextFormat_Link: String { return self._s[519]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[521]! } + public var ChannelInfo_Stats: String { return self._s[522]! } + public var TextFormat_Link: String { return self._s[523]! } public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[520]!, self._r[520]!, [_1, _2]) + return formatWithArgumentRanges(self._s[524]!, self._r[524]!, [_1, _2]) } - public var Wallet_TransactionInfo_Title: String { return self._s[521]! } + public var Wallet_TransactionInfo_Title: String { return self._s[525]! } public func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[522]!, self._r[522]!, [_0]) + return formatWithArgumentRanges(self._s[526]!, self._r[526]!, [_0]) } - public var Watch_Notification_Joined: String { return self._s[523]! } - public var Group_Setup_TypePublicHelp: String { return self._s[524]! } - public var Passport_Scans_UploadNew: String { return self._s[525]! } - public var Checkout_LiabilityAlertTitle: String { return self._s[526]! } - public var DialogList_Title: String { return self._s[529]! } - public var NotificationSettings_ContactJoined: String { return self._s[530]! } - public var GroupInfo_LabelAdmin: String { return self._s[531]! } - public var KeyCommand_ChatInfo: String { return self._s[532]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[533]! } - public var Call_ReportIncludeLog: String { return self._s[534]! } + public var Watch_Notification_Joined: String { return self._s[527]! } + public var Group_Setup_TypePublicHelp: String { return self._s[528]! } + public var Passport_Scans_UploadNew: String { return self._s[529]! } + public var Checkout_LiabilityAlertTitle: String { return self._s[530]! } + public var DialogList_Title: String { return self._s[533]! } + public var NotificationSettings_ContactJoined: String { return self._s[534]! } + public var GroupInfo_LabelAdmin: String { return self._s[535]! } + public var KeyCommand_ChatInfo: String { return self._s[536]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[537]! } + public var Call_ReportIncludeLog: String { return self._s[538]! } public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[537]!, self._r[537]!, [_0]) + return formatWithArgumentRanges(self._s[541]!, self._r[541]!, [_0]) } - public var LocalGroup_IrrelevantWarning: String { return self._s[538]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[539]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[540]! } - public var Message_Sticker: String { return self._s[541]! } - public var LastSeen_JustNow: String { return self._s[543]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[545]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[546]! } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[547]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[548]! } - public var TwoStepAuth_Email: String { return self._s[549]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[550]! } - public var PhotoEditor_BlurToolOff: String { return self._s[551]! } - public var Message_PinnedStickerMessage: String { return self._s[552]! } - public var ContactInfo_PhoneLabelPager: String { return self._s[553]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[554]! } - public var Passport_DiscardMessageTitle: String { return self._s[555]! } - public var Privacy_PaymentsTitle: String { return self._s[556]! } - public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[557]! } - public var Channel_DiscussionGroup_Header: String { return self._s[559]! } - public var VoiceOver_Chat_OptionSelected: String { return self._s[560]! } - public var Appearance_ColorTheme: String { return self._s[561]! } - public var UserInfo_ShareContact: String { return self._s[562]! } - public var Passport_Address_TypePassportRegistration: String { return self._s[563]! } - public var Common_More: String { return self._s[564]! } - public var Watch_Message_Call: String { return self._s[565]! } - public var Profile_EncryptionKey: String { return self._s[568]! } - public var Privacy_TopPeers: String { return self._s[569]! } - public var Conversation_StopPollConfirmation: String { return self._s[570]! } - public var Wallet_Words_NotDoneText: String { return self._s[572]! } - public var Privacy_TopPeersWarning: String { return self._s[574]! } - public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[575]! } - public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[576]! } - public var Wallet_RestoreFailed_EnterWords: String { return self._s[579]! } - public var DialogList_SearchSectionMessages: String { return self._s[580]! } - public var Notifications_ChannelNotifications: String { return self._s[581]! } - public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[582]! } - public var Passport_Language_sk: String { return self._s[583]! } - public var Notification_MessageLifetime1h: String { return self._s[584]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[585]! } - public var Call_ReportSkip: String { return self._s[587]! } - public var Cache_ServiceFiles: String { return self._s[588]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[589]! } - public var VoiceOver_Chat_YourFile: String { return self._s[590]! } - public var Map_Hybrid: String { return self._s[591]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[593]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[595]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[596]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[597]! } - public var SocksProxySetup_ProxyTelegram: String { return self._s[600]! } + public var LocalGroup_IrrelevantWarning: String { return self._s[542]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[543]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[544]! } + public var Message_Sticker: String { return self._s[545]! } + public var LastSeen_JustNow: String { return self._s[547]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[549]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[550]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[551]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[552]! } + public var TwoStepAuth_Email: String { return self._s[553]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[554]! } + public var PhotoEditor_BlurToolOff: String { return self._s[555]! } + public var Message_PinnedStickerMessage: String { return self._s[556]! } + public var ContactInfo_PhoneLabelPager: String { return self._s[557]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[558]! } + public var Passport_DiscardMessageTitle: String { return self._s[559]! } + public var Privacy_PaymentsTitle: String { return self._s[560]! } + public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[561]! } + public var Channel_DiscussionGroup_Header: String { return self._s[563]! } + public var VoiceOver_Chat_OptionSelected: String { return self._s[564]! } + public var Appearance_ColorTheme: String { return self._s[565]! } + public var UserInfo_ShareContact: String { return self._s[566]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[567]! } + public var Common_More: String { return self._s[568]! } + public var Watch_Message_Call: String { return self._s[569]! } + public var Profile_EncryptionKey: String { return self._s[572]! } + public var Privacy_TopPeers: String { return self._s[573]! } + public var Conversation_StopPollConfirmation: String { return self._s[574]! } + public var Wallet_Words_NotDoneText: String { return self._s[576]! } + public var Privacy_TopPeersWarning: String { return self._s[578]! } + public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[579]! } + public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[580]! } + public var Wallet_RestoreFailed_EnterWords: String { return self._s[583]! } + public var DialogList_SearchSectionMessages: String { return self._s[584]! } + public var Notifications_ChannelNotifications: String { return self._s[585]! } + public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[586]! } + public var Passport_Language_sk: String { return self._s[587]! } + public var Notification_MessageLifetime1h: String { return self._s[588]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[589]! } + public var Call_ReportSkip: String { return self._s[591]! } + public var Cache_ServiceFiles: String { return self._s[592]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[593]! } + public var VoiceOver_Chat_YourFile: String { return self._s[594]! } + public var Map_Hybrid: String { return self._s[595]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[597]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[599]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[600]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[601]! } + public var SocksProxySetup_ProxyTelegram: String { return self._s[604]! } public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[601]!, self._r[601]!, [_1]) + return formatWithArgumentRanges(self._s[605]!, self._r[605]!, [_1]) } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[603]! } - public var ScheduledMessages_ScheduledToday: String { return self._s[604]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[607]! } + public var ScheduledMessages_ScheduledToday: String { return self._s[608]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[605]!, self._r[605]!, [_1, _2]) + return formatWithArgumentRanges(self._s[609]!, self._r[609]!, [_1, _2]) } - public var Conversation_LiveLocationYou: String { return self._s[606]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[607]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[608]! } - public var UserInfo_ShareBot: String { return self._s[611]! } + public var Conversation_LiveLocationYou: String { return self._s[610]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[611]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[612]! } + public var UserInfo_ShareBot: String { return self._s[615]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[612]!, self._r[612]!, [_1, _2]) + return formatWithArgumentRanges(self._s[616]!, self._r[616]!, [_1, _2]) } - public var PhotoEditor_ShadowsTint: String { return self._s[613]! } - public var Message_Audio: String { return self._s[614]! } - public var Passport_Language_lt: String { return self._s[615]! } + public var PhotoEditor_ShadowsTint: String { return self._s[617]! } + public var Message_Audio: String { return self._s[618]! } + public var Passport_Language_lt: String { return self._s[619]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[616]!, self._r[616]!, [_0]) + return formatWithArgumentRanges(self._s[620]!, self._r[620]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[617]! } - public var Conversation_FileICloudDrive: String { return self._s[618]! } - public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[619]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[620]! } + public var Permissions_SiriText_v0: String { return self._s[621]! } + public var Conversation_FileICloudDrive: String { return self._s[622]! } + public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[623]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[624]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[621]!, self._r[621]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[625]!, self._r[625]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[622]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[626]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[623]!, self._r[623]!, [_0]) + return formatWithArgumentRanges(self._s[627]!, self._r[627]!, [_0]) } - public var Channel_SignMessages: String { return self._s[624]! } + public var Channel_SignMessages: String { return self._s[628]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[625]!, self._r[625]!, [_1]) + return formatWithArgumentRanges(self._s[629]!, self._r[629]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[626]! } - public var Passport_ScanPassport: String { return self._s[627]! } - public var Watch_Suggestion_Thanks: String { return self._s[628]! } - public var BlockedUsers_AddNew: String { return self._s[629]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[630]! } + public var Passport_ScanPassport: String { return self._s[631]! } + public var Watch_Suggestion_Thanks: String { return self._s[632]! } + public var BlockedUsers_AddNew: String { return self._s[633]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[630]!, self._r[630]!, [_1, _2]) + return formatWithArgumentRanges(self._s[634]!, self._r[634]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[631]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[632]! } - public var Month_GenJuly: String { return self._s[633]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[634]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[636]! } - public var Notification_ChannelInviterSelf: String { return self._s[637]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[638]! } + public var Watch_Message_Invoice: String { return self._s[635]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[636]! } + public var Month_GenJuly: String { return self._s[637]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[638]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[640]! } + public var Notification_ChannelInviterSelf: String { return self._s[641]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[642]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[639]!, self._r[639]!, [_1, _2]) + return formatWithArgumentRanges(self._s[643]!, self._r[643]!, [_1, _2]) } - public var CheckoutInfo_Title: String { return self._s[640]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[641]! } + public var CheckoutInfo_Title: String { return self._s[644]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[645]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[642]!, self._r[642]!, [_0]) + return formatWithArgumentRanges(self._s[646]!, self._r[646]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[643]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[644]! } - public var Passport_Language_de: String { return self._s[645]! } - public var Update_Title: String { return self._s[646]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[647]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[648]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[649]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[650]! } - public var NotificationsSound_Telegraph: String { return self._s[651]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[652]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[653]! } + public var Passport_Identity_MainPage: String { return self._s[647]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[648]! } + public var Passport_Language_de: String { return self._s[649]! } + public var Update_Title: String { return self._s[650]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[651]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[652]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[653]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[654]! } + public var NotificationsSound_Telegraph: String { return self._s[655]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[656]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[657]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[654]!, self._r[654]!, [_0]) - } - public var Stickers_SuggestAll: String { return self._s[655]! } - public var Conversation_ForwardTitle: String { return self._s[656]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[657]! } - public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[658]!, self._r[658]!, [_0]) } - public var Calls_NewCall: String { return self._s[659]! } - public var Call_StatusEnded: String { return self._s[660]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[661]! } - public var Settings_ProxyConnected: String { return self._s[662]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[663]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[664]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[665]! } - public var Passport_PasswordPlaceholder: String { return self._s[666]! } - public var Message_PinnedInvoice: String { return self._s[667]! } - public var Passport_Identity_IssueDate: String { return self._s[668]! } - public var Passport_Language_pl: String { return self._s[669]! } + public var Stickers_SuggestAll: String { return self._s[659]! } + public var Conversation_ForwardTitle: String { return self._s[660]! } + public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[661]! } + public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[662]!, self._r[662]!, [_0]) + } + public var Calls_NewCall: String { return self._s[663]! } + public var Call_StatusEnded: String { return self._s[664]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[665]! } + public var Settings_ProxyConnected: String { return self._s[666]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[667]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[668]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[669]! } + public var Passport_PasswordPlaceholder: String { return self._s[670]! } + public var Message_PinnedInvoice: String { return self._s[671]! } + public var Passport_Identity_IssueDate: String { return self._s[672]! } + public var Passport_Language_pl: String { return self._s[673]! } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[670]!, self._r[670]!, [_0]) + return formatWithArgumentRanges(self._s[674]!, self._r[674]!, [_0]) } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[671]! } - public var Call_StatusConnecting: String { return self._s[672]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[675]! } + public var Call_StatusConnecting: String { return self._s[676]! } public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[673]!, self._r[673]!, [_0]) + return formatWithArgumentRanges(self._s[677]!, self._r[677]!, [_0]) } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[675]! } - public var Common_Edit: String { return self._s[676]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[677]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[679]! } + public var Common_Edit: String { return self._s[680]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[681]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[678]!, self._r[678]!, [_0]) + return formatWithArgumentRanges(self._s[682]!, self._r[682]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[679]! } - public var PrivateDataSettings_Title: String { return self._s[680]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[681]! } - public var ChatList_Read: String { return self._s[682]! } - public var Wallet_WordImport_Text: String { return self._s[683]! } - public var Undo_ChatClearedForBothSides: String { return self._s[684]! } - public var GroupPermission_SectionTitle: String { return self._s[685]! } + public var GroupInfo_ChatAdmins: String { return self._s[683]! } + public var PrivateDataSettings_Title: String { return self._s[684]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[685]! } + public var ChatList_Read: String { return self._s[686]! } + public var Wallet_WordImport_Text: String { return self._s[687]! } + public var Undo_ChatClearedForBothSides: String { return self._s[688]! } + public var GroupPermission_SectionTitle: String { return self._s[689]! } + public var TwoFactorSetup_Intro_Title: String { return self._s[691]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[687]!, self._r[687]!, [_1, _2]) + return formatWithArgumentRanges(self._s[692]!, self._r[692]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[688]! } - public var Update_UpdateApp: String { return self._s[689]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[690]! } - public var Settings_Appearance: String { return self._s[691]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[695]! } - public var Watch_Location_Access: String { return self._s[696]! } - public var ShareMenu_CopyShareLink: String { return self._s[698]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[699]! } - public var Conversation_Theme: String { return self._s[701]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[693]! } + public var Update_UpdateApp: String { return self._s[694]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[695]! } + public var Settings_Appearance: String { return self._s[696]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[700]! } + public var Watch_Location_Access: String { return self._s[701]! } + public var ShareMenu_CopyShareLink: String { return self._s[703]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[704]! } + public var Conversation_Theme: String { return self._s[706]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[702]!, self._r[702]!, [_0]) + return formatWithArgumentRanges(self._s[707]!, self._r[707]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[703]! } - public var Weekday_ShortWednesday: String { return self._s[704]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[705]! } - public var Undo_LeftGroup: String { return self._s[708]! } - public var Wallet_RestoreFailed_Text: String { return self._s[709]! } - public var Conversation_LinkDialogCopy: String { return self._s[710]! } - public var Wallet_TransactionInfo_NoAddress: String { return self._s[712]! } - public var Wallet_Navigation_Back: String { return self._s[713]! } - public var KeyCommand_FocusOnInputField: String { return self._s[714]! } - public var Contacts_SelectAll: String { return self._s[715]! } - public var Preview_SaveToCameraRoll: String { return self._s[716]! } - public var PrivacySettings_PasscodeOff: String { return self._s[717]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[718]! } - public var Wallpaper_Title: String { return self._s[719]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[720]! } - public var AccessDenied_Camera: String { return self._s[721]! } - public var Watch_Compose_CurrentLocation: String { return self._s[722]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[724]! } + public var Notifications_ClassicTones: String { return self._s[708]! } + public var Weekday_ShortWednesday: String { return self._s[709]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[710]! } + public var Undo_LeftGroup: String { return self._s[713]! } + public var Wallet_RestoreFailed_Text: String { return self._s[714]! } + public var Conversation_LinkDialogCopy: String { return self._s[715]! } + public var Wallet_TransactionInfo_NoAddress: String { return self._s[717]! } + public var Wallet_Navigation_Back: String { return self._s[718]! } + public var KeyCommand_FocusOnInputField: String { return self._s[719]! } + public var Contacts_SelectAll: String { return self._s[720]! } + public var Preview_SaveToCameraRoll: String { return self._s[721]! } + public var PrivacySettings_PasscodeOff: String { return self._s[722]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[723]! } + public var Wallpaper_Title: String { return self._s[724]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[725]! } + public var AccessDenied_Camera: String { return self._s[726]! } + public var Watch_Compose_CurrentLocation: String { return self._s[727]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[729]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[725]!, self._r[725]!, [_0]) + return formatWithArgumentRanges(self._s[730]!, self._r[730]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[726]! } - public var Passport_Language_ro: String { return self._s[727]! } - public var EditTheme_UploadNewTheme: String { return self._s[728]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[729]! } - public var Wallet_Intro_Terms: String { return self._s[730]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[731]! } + public var Passport_Language_ro: String { return self._s[732]! } + public var EditTheme_UploadNewTheme: String { return self._s[733]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[734]! } + public var Wallet_Intro_Terms: String { return self._s[735]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[731]!, self._r[731]!, [_0]) + return formatWithArgumentRanges(self._s[736]!, self._r[736]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[732]! } - public var State_ConnectingToProxy: String { return self._s[733]! } - public var Calls_RatingTitle: String { return self._s[734]! } - public var Generic_ErrorMoreInfo: String { return self._s[735]! } - public var Appearance_PreviewReplyText: String { return self._s[736]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[737]! } + public var Login_CancelPhoneVerification: String { return self._s[737]! } + public var State_ConnectingToProxy: String { return self._s[738]! } + public var Calls_RatingTitle: String { return self._s[739]! } + public var Generic_ErrorMoreInfo: String { return self._s[740]! } + public var Appearance_PreviewReplyText: String { return self._s[741]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[742]! } public func Wallet_Send_Balance(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[738]!, self._r[738]!, [_0]) + return formatWithArgumentRanges(self._s[743]!, self._r[743]!, [_0]) } - public var SharedMedia_CategoryLinks: String { return self._s[739]! } - public var Calls_Missed: String { return self._s[740]! } - public var Cache_Photos: String { return self._s[744]! } - public var GroupPermission_NoAddMembers: String { return self._s[745]! } - public var ScheduledMessages_Title: String { return self._s[746]! } + public var SharedMedia_CategoryLinks: String { return self._s[744]! } + public var Calls_Missed: String { return self._s[745]! } + public var Cache_Photos: String { return self._s[749]! } + public var GroupPermission_NoAddMembers: String { return self._s[750]! } + public var ScheduledMessages_Title: String { return self._s[751]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[747]!, self._r[747]!, [_0]) + return formatWithArgumentRanges(self._s[752]!, self._r[752]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[748]! } - public var Settings_ProxyDisabled: String { return self._s[749]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[753]! } + public var Settings_ProxyDisabled: String { return self._s[754]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[750]!, self._r[750]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[755]!, self._r[755]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[751]!, self._r[751]!, [_0]) - } - public var ChatList_Context_RemoveFromRecents: String { return self._s[753]! } - public var Appearance_Title: String { return self._s[754]! } - public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[756]!, self._r[756]!, [_0]) } - public var Conversation_WalletRequiredText: String { return self._s[757]! } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[758]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[759]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[760]! } - public var Preview_DeletePhoto: String { return self._s[761]! } - public var Appearance_AppIconFilledX: String { return self._s[762]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[763]! } + public var ChatList_Context_RemoveFromRecents: String { return self._s[758]! } + public var Appearance_Title: String { return self._s[759]! } + public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[761]!, self._r[761]!, [_0]) + } + public var Conversation_WalletRequiredText: String { return self._s[762]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[763]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[764]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[765]! } + public var Preview_DeletePhoto: String { return self._s[766]! } + public var Appearance_AppIconFilledX: String { return self._s[767]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[768]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[764]!, self._r[764]!, [_0]) + return formatWithArgumentRanges(self._s[769]!, self._r[769]!, [_0]) } - public var Coub_TapForSound: String { return self._s[766]! } - public var Map_LocatingError: String { return self._s[767]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[769]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[770]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[771]! } + public var Coub_TapForSound: String { return self._s[771]! } + public var Map_LocatingError: String { return self._s[772]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[774]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[775]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[776]! } public func Wallet_Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[772]!, self._r[772]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[777]!, self._r[777]!, [_1, _2, _3]) } - public var Passport_ForgottenPassword: String { return self._s[773]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[774]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[775]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[777]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[778]! } - public var Message_Location: String { return self._s[779]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[780]! } - public var Channel_Management_Title: String { return self._s[781]! } - public var DialogList_SearchSectionDialogs: String { return self._s[783]! } - public var Compose_NewChannel_Members: String { return self._s[784]! } + public var Passport_ForgottenPassword: String { return self._s[778]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[779]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[780]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[782]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[783]! } + public var Message_Location: String { return self._s[784]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[785]! } + public var Channel_Management_Title: String { return self._s[786]! } + public var DialogList_SearchSectionDialogs: String { return self._s[788]! } + public var Compose_NewChannel_Members: String { return self._s[789]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[785]!, self._r[785]!, [_0]) + return formatWithArgumentRanges(self._s[790]!, self._r[790]!, [_0]) } - public var GroupInfo_Location: String { return self._s[786]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[787]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[788]! } - public var PhotoEditor_WarmthTool: String { return self._s[789]! } - public var Passport_Language_tr: String { return self._s[790]! } + public var GroupInfo_Location: String { return self._s[791]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[792]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[793]! } + public var PhotoEditor_WarmthTool: String { return self._s[794]! } + public var Passport_Language_tr: String { return self._s[795]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[791]!, self._r[791]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[796]!, self._r[796]!, [_1, _2, _3]) } - public var Login_ResetAccountProtected_Reset: String { return self._s[793]! } - public var Watch_PhotoView_Title: String { return self._s[794]! } - public var Passport_Phone_Delete: String { return self._s[795]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[796]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[797]! } - public var GroupInfo_Permissions: String { return self._s[798]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[799]! } - public var Profile_ShareContactButton: String { return self._s[800]! } - public var ChatSettings_Other: String { return self._s[801]! } - public var UserInfo_NotificationsDisabled: String { return self._s[802]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[803]! } - public var LastSeen_WithinAMonth: String { return self._s[804]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[805]! } - public var Conversation_ReportGroupLocation: String { return self._s[806]! } - public var Conversation_EncryptionCanceled: String { return self._s[807]! } - public var MediaPicker_GroupDescription: String { return self._s[808]! } - public var WebSearch_Images: String { return self._s[809]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[798]! } + public var Watch_PhotoView_Title: String { return self._s[799]! } + public var Passport_Phone_Delete: String { return self._s[800]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[801]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[802]! } + public var GroupInfo_Permissions: String { return self._s[803]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[804]! } + public var Profile_ShareContactButton: String { return self._s[805]! } + public var ChatSettings_Other: String { return self._s[806]! } + public var UserInfo_NotificationsDisabled: String { return self._s[807]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[808]! } + public var LastSeen_WithinAMonth: String { return self._s[809]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[810]! } + public var Conversation_ReportGroupLocation: String { return self._s[811]! } + public var Conversation_EncryptionCanceled: String { return self._s[812]! } + public var MediaPicker_GroupDescription: String { return self._s[813]! } + public var WebSearch_Images: String { return self._s[814]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[810]!, self._r[810]!, [_0]) + return formatWithArgumentRanges(self._s[815]!, self._r[815]!, [_0]) } - public var Message_Photo: String { return self._s[811]! } - public var PasscodeSettings_HelpBottom: String { return self._s[812]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[813]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[814]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[815]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[816]! } - public var NotificationsSound_Calypso: String { return self._s[817]! } - public var Map_Map: String { return self._s[818]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[820]! } - public var ChatSettings_TextSizeUnits: String { return self._s[821]! } + public var Message_Photo: String { return self._s[816]! } + public var PasscodeSettings_HelpBottom: String { return self._s[817]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[818]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[819]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[820]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[821]! } + public var NotificationsSound_Calypso: String { return self._s[822]! } + public var Map_Map: String { return self._s[823]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[825]! } + public var ChatSettings_TextSizeUnits: String { return self._s[826]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[822]!, self._r[822]!, [_0]) + return formatWithArgumentRanges(self._s[827]!, self._r[827]!, [_0]) } - public var Common_of: String { return self._s[823]! } - public var Conversation_ForwardContacts: String { return self._s[826]! } + public var Common_of: String { return self._s[828]! } + public var Conversation_ForwardContacts: String { return self._s[831]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[828]!, self._r[828]!, [_0]) + return formatWithArgumentRanges(self._s[833]!, self._r[833]!, [_0]) } - public var Passport_Language_hy: String { return self._s[829]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[830]! } - public var AutoDownloadSettings_Reset: String { return self._s[831]! } - public var Wallet_TransactionInfo_AddressCopied: String { return self._s[832]! } - public var Paint_ClearConfirm: String { return self._s[833]! } - public var Camera_VideoMode: String { return self._s[834]! } + public var Passport_Language_hy: String { return self._s[834]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[835]! } + public var AutoDownloadSettings_Reset: String { return self._s[836]! } + public var Wallet_TransactionInfo_AddressCopied: String { return self._s[837]! } + public var Paint_ClearConfirm: String { return self._s[838]! } + public var Camera_VideoMode: String { return self._s[839]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[835]!, self._r[835]!, [_0]) + return formatWithArgumentRanges(self._s[840]!, self._r[840]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[836]! } - public var Conversation_ViewBackground: String { return self._s[837]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[841]! } + public var Conversation_ViewBackground: String { return self._s[842]! } public func Wallet_Info_TransactionDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[838]!, self._r[838]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[843]!, self._r[843]!, [_1, _2, _3]) } - public var Passport_Language_el: String { return self._s[839]! } - public var PhotoEditor_Original: String { return self._s[840]! } - public var Settings_FAQ_Button: String { return self._s[842]! } - public var Channel_Setup_PublicNoLink: String { return self._s[844]! } - public var Conversation_UnsupportedMedia: String { return self._s[845]! } - public var Conversation_SlideToCancel: String { return self._s[846]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[847]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[848]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[849]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[850]! } - public var AutoNightTheme_NotAvailable: String { return self._s[851]! } - public var Conversation_Owner: String { return self._s[852]! } - public var Common_Create: String { return self._s[853]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[854]! } - public var ContactList_Context_Call: String { return self._s[855]! } - public var Localization_ChooseLanguage: String { return self._s[857]! } - public var ChatList_Context_AddToContacts: String { return self._s[859]! } - public var Settings_Proxy: String { return self._s[861]! } - public var Privacy_TopPeersHelp: String { return self._s[862]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[863]! } - public var Chat_UnsendMyMessages: String { return self._s[864]! } + public var Passport_Language_el: String { return self._s[844]! } + public var PhotoEditor_Original: String { return self._s[845]! } + public var Settings_FAQ_Button: String { return self._s[847]! } + public var Channel_Setup_PublicNoLink: String { return self._s[849]! } + public var Conversation_UnsupportedMedia: String { return self._s[850]! } + public var Conversation_SlideToCancel: String { return self._s[851]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[852]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[853]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[854]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[855]! } + public var AutoNightTheme_NotAvailable: String { return self._s[856]! } + public var Conversation_Owner: String { return self._s[857]! } + public var Common_Create: String { return self._s[858]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[859]! } + public var ContactList_Context_Call: String { return self._s[860]! } + public var Localization_ChooseLanguage: String { return self._s[862]! } + public var ChatList_Context_AddToContacts: String { return self._s[864]! } + public var Settings_Proxy: String { return self._s[866]! } + public var Privacy_TopPeersHelp: String { return self._s[867]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[868]! } + public var Chat_UnsendMyMessages: String { return self._s[869]! } public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[865]!, self._r[865]!, [_0]) + return formatWithArgumentRanges(self._s[870]!, self._r[870]!, [_0]) } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[866]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[871]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[868]!, self._r[868]!, [_0]) + return formatWithArgumentRanges(self._s[873]!, self._r[873]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[869]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[870]! } - public var Cache_Title: String { return self._s[871]! } + public var Contacts_SortedByPresence: String { return self._s[874]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[875]! } + public var Cache_Title: String { return self._s[876]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[872]!, self._r[872]!, [_0]) + return formatWithArgumentRanges(self._s[877]!, self._r[877]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[873]! } - public var Channel_Moderator_Title: String { return self._s[874]! } - public var InstantPage_AutoNightTheme: String { return self._s[876]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[878]! } + public var Channel_Moderator_Title: String { return self._s[879]! } + public var InstantPage_AutoNightTheme: String { return self._s[881]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[879]!, self._r[879]!, [_1]) + return formatWithArgumentRanges(self._s[884]!, self._r[884]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[880]! } - public var Undo_Undo: String { return self._s[882]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[883]! } - public var TwoStepAuth_RemovePassword: String { return self._s[884]! } - public var Common_Delete: String { return self._s[885]! } - public var Contacts_AddPeopleNearby: String { return self._s[887]! } - public var Conversation_ContextMenuDelete: String { return self._s[888]! } - public var SocksProxySetup_Credentials: String { return self._s[889]! } - public var Appearance_EditTheme: String { return self._s[891]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[892]! } - public var Wallet_Send_NetworkErrorText: String { return self._s[893]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[896]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[897]! } - public var Passport_Language_id: String { return self._s[899]! } - public var WallpaperSearch_ColorTeal: String { return self._s[900]! } - public var ChannelIntro_Title: String { return self._s[901]! } + public var Passport_Scans_Upload: String { return self._s[885]! } + public var Undo_Undo: String { return self._s[887]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[888]! } + public var TwoStepAuth_RemovePassword: String { return self._s[889]! } + public var Common_Delete: String { return self._s[890]! } + public var Contacts_AddPeopleNearby: String { return self._s[892]! } + public var Conversation_ContextMenuDelete: String { return self._s[893]! } + public var SocksProxySetup_Credentials: String { return self._s[894]! } + public var Appearance_EditTheme: String { return self._s[896]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[897]! } + public var Wallet_Send_NetworkErrorText: String { return self._s[898]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[901]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[902]! } + public var Passport_Language_id: String { return self._s[904]! } + public var WallpaperSearch_ColorTeal: String { return self._s[905]! } + public var ChannelIntro_Title: String { return self._s[906]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[902]!, self._r[902]!, [_0]) + return formatWithArgumentRanges(self._s[907]!, self._r[907]!, [_0]) } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[904]! } - public var VoiceOver_Chat_Reply: String { return self._s[905]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[906]! } - public var Channel_Info_Description: String { return self._s[907]! } - public var Stickers_FavoriteStickers: String { return self._s[908]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[909]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[910]! } - public var ChatSearch_ResultsTooltip: String { return self._s[911]! } - public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[912]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[913]! } - public var Group_PublicLink_Placeholder: String { return self._s[914]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[915]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[909]! } + public var VoiceOver_Chat_Reply: String { return self._s[910]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[911]! } + public var Channel_Info_Description: String { return self._s[912]! } + public var Stickers_FavoriteStickers: String { return self._s[913]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[914]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[915]! } + public var ChatSearch_ResultsTooltip: String { return self._s[916]! } + public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[917]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[918]! } + public var Group_PublicLink_Placeholder: String { return self._s[919]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[920]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[916]!, self._r[916]!, [_1]) + return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_1]) } - public var TextFormat_Underline: String { return self._s[917]! } + public var TextFormat_Underline: String { return self._s[922]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[918]!, self._r[918]!, [_1, _2]) + return formatWithArgumentRanges(self._s[923]!, self._r[923]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[919]!, self._r[919]!, [_0]) + return formatWithArgumentRanges(self._s[924]!, self._r[924]!, [_0]) } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[920]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[925]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_1, _2]) + return formatWithArgumentRanges(self._s[926]!, self._r[926]!, [_1, _2]) } - public var Wallet_Intro_ImportExisting: String { return self._s[922]! } - public var GroupPermission_Delete: String { return self._s[923]! } - public var Passport_Language_uk: String { return self._s[924]! } - public var StickerPack_HideStickers: String { return self._s[926]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[927]! } + public var Wallet_Intro_ImportExisting: String { return self._s[927]! } + public var GroupPermission_Delete: String { return self._s[928]! } + public var Passport_Language_uk: String { return self._s[929]! } + public var StickerPack_HideStickers: String { return self._s[931]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[932]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[928]!, self._r[928]!, [_1, _2]) + return formatWithArgumentRanges(self._s[933]!, self._r[933]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[929]! } + public var Activity_UploadingVideoMessage: String { return self._s[934]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[930]!, self._r[930]!, [_0]) + return formatWithArgumentRanges(self._s[935]!, self._r[935]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[931]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[932]! } - public var Settings_CallSettings: String { return self._s[933]! } - public var Camera_SquareMode: String { return self._s[934]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[935]! } - public var GroupInfo_SharedMediaNone: String { return self._s[936]! } + public var Channel_TitleInfo: String { return self._s[936]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[937]! } + public var Settings_CallSettings: String { return self._s[938]! } + public var Camera_SquareMode: String { return self._s[939]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[940]! } + public var GroupInfo_SharedMediaNone: String { return self._s[941]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[937]!, self._r[937]!, [_1]) + return formatWithArgumentRanges(self._s[942]!, self._r[942]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[938]! } - public var Application_Update: String { return self._s[940]! } - public var Month_ShortJanuary: String { return self._s[941]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[942]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[943]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[944]! } - public var Passport_Address_Street2Placeholder: String { return self._s[945]! } + public var Bot_GenericBotStatus: String { return self._s[943]! } + public var Application_Update: String { return self._s[945]! } + public var Month_ShortJanuary: String { return self._s[946]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[947]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[948]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[949]! } + public var Passport_Address_Street2Placeholder: String { return self._s[950]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[946]!, self._r[946]!, [_0]) + return formatWithArgumentRanges(self._s[951]!, self._r[951]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[947]! } - public var Appearance_PreviewOutgoingText: String { return self._s[948]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[949]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[951]! } - public var Map_Directions: String { return self._s[952]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[954]! } - public var Appearance_ThemeDay: String { return self._s[955]! } - public var LogoutOptions_LogOut: String { return self._s[956]! } - public var Group_PublicLink_Title: String { return self._s[958]! } - public var Channel_AddBotErrorNoRights: String { return self._s[959]! } - public var Passport_Identity_AddPassport: String { return self._s[960]! } - public var LocalGroup_ButtonTitle: String { return self._s[961]! } - public var Call_Message: String { return self._s[962]! } - public var PhotoEditor_ExposureTool: String { return self._s[963]! } - public var Wallet_Receive_CommentInfo: String { return self._s[965]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[966]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[968]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[969]! } - public var Appearance_Preview: String { return self._s[970]! } - public var Compose_ChannelMembers: String { return self._s[971]! } - public var Conversation_DeleteManyMessages: String { return self._s[972]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[973]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[974]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[975]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[978]! } - public var Conversation_UpdateTelegram: String { return self._s[979]! } - public var EditTheme_Create_TopInfo: String { return self._s[980]! } + public var NetworkUsageSettings_Cellular: String { return self._s[952]! } + public var Appearance_PreviewOutgoingText: String { return self._s[953]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[954]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[956]! } + public var Map_Directions: String { return self._s[957]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[959]! } + public var Appearance_ThemeDay: String { return self._s[960]! } + public var LogoutOptions_LogOut: String { return self._s[961]! } + public var Group_PublicLink_Title: String { return self._s[963]! } + public var Channel_AddBotErrorNoRights: String { return self._s[964]! } + public var Passport_Identity_AddPassport: String { return self._s[965]! } + public var LocalGroup_ButtonTitle: String { return self._s[966]! } + public var Call_Message: String { return self._s[967]! } + public var PhotoEditor_ExposureTool: String { return self._s[968]! } + public var Wallet_Receive_CommentInfo: String { return self._s[970]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[971]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[973]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[974]! } + public var Appearance_Preview: String { return self._s[975]! } + public var Compose_ChannelMembers: String { return self._s[976]! } + public var Conversation_DeleteManyMessages: String { return self._s[977]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[978]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[979]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[980]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[983]! } + public var Conversation_UpdateTelegram: String { return self._s[984]! } + public var EditTheme_Create_TopInfo: String { return self._s[985]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[981]!, self._r[981]!, [_0]) - } - public var Wallet_WordCheck_Continue: String { return self._s[982]! } - public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[983]!, self._r[983]!, [_1]) - } - public var GroupInfo_Administrators_Title: String { return self._s[984]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[985]! } - public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[986]!, self._r[986]!, [_0]) } - public var Tour_Title3: String { return self._s[987]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[988]! } - public var Clipboard_SendPhoto: String { return self._s[992]! } - public var MediaPicker_Videos: String { return self._s[993]! } - public var Passport_Email_Title: String { return self._s[994]! } + public var Wallet_WordCheck_Continue: String { return self._s[987]! } + public var TwoFactorSetup_Hint_Action: String { return self._s[988]! } + public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[989]!, self._r[989]!, [_1]) + } + public var GroupInfo_Administrators_Title: String { return self._s[990]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[991]! } + public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[992]!, self._r[992]!, [_0]) + } + public var Tour_Title3: String { return self._s[993]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[994]! } + public var Clipboard_SendPhoto: String { return self._s[998]! } + public var MediaPicker_Videos: String { return self._s[999]! } + public var Passport_Email_Title: String { return self._s[1000]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[995]!, self._r[995]!, [_0]) + return formatWithArgumentRanges(self._s[1001]!, self._r[1001]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[996]! } - public var Conversation_MessageDialogDelete: String { return self._s[997]! } - public var Privacy_Calls_CustomHelp: String { return self._s[999]! } - public var Message_Wallpaper: String { return self._s[1000]! } - public var MemberSearch_BotSection: String { return self._s[1001]! } - public var GroupInfo_SetSound: String { return self._s[1002]! } - public var Core_ServiceUserStatus: String { return self._s[1003]! } - public var LiveLocationUpdated_JustNow: String { return self._s[1004]! } - public var Call_StatusFailed: String { return self._s[1005]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[1006]! } - public var TwoStepAuth_SetPassword: String { return self._s[1007]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[1008]! } + public var StickerPacksSettings_Title: String { return self._s[1002]! } + public var Conversation_MessageDialogDelete: String { return self._s[1003]! } + public var Privacy_Calls_CustomHelp: String { return self._s[1005]! } + public var Message_Wallpaper: String { return self._s[1006]! } + public var MemberSearch_BotSection: String { return self._s[1007]! } + public var GroupInfo_SetSound: String { return self._s[1008]! } + public var Core_ServiceUserStatus: String { return self._s[1009]! } + public var LiveLocationUpdated_JustNow: String { return self._s[1010]! } + public var Call_StatusFailed: String { return self._s[1011]! } + public var TwoFactorSetup_Email_Placeholder: String { return self._s[1012]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[1013]! } + public var TwoStepAuth_SetPassword: String { return self._s[1014]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[1015]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1010]!, self._r[1010]!, [_0]) + return formatWithArgumentRanges(self._s[1017]!, self._r[1017]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[1011]! } - public var Profile_Username: String { return self._s[1012]! } - public var Bot_DescriptionTitle: String { return self._s[1013]! } - public var MaskStickerSettings_Title: String { return self._s[1014]! } - public var SharedMedia_CategoryOther: String { return self._s[1015]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[1016]! } - public var Common_NotNow: String { return self._s[1017]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[1018]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[1019]! } - public var Map_Location: String { return self._s[1020]! } - public var Invitation_JoinGroup: String { return self._s[1021]! } - public var AutoDownloadSettings_Title: String { return self._s[1023]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[1024]! } - public var Channel_ErrorAddBlocked: String { return self._s[1025]! } - public var Conversation_UnblockUser: String { return self._s[1026]! } - public var EditTheme_Edit_TopInfo: String { return self._s[1027]! } - public var Watch_Bot_Restart: String { return self._s[1028]! } - public var TwoStepAuth_Title: String { return self._s[1029]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[1030]! } - public var Checkout_ShippingMethod: String { return self._s[1031]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1032]! } + public var Calls_SubmitRating: String { return self._s[1018]! } + public var Profile_Username: String { return self._s[1019]! } + public var Bot_DescriptionTitle: String { return self._s[1020]! } + public var MaskStickerSettings_Title: String { return self._s[1021]! } + public var SharedMedia_CategoryOther: String { return self._s[1022]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[1023]! } + public var Common_NotNow: String { return self._s[1024]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[1025]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[1026]! } + public var Map_Location: String { return self._s[1027]! } + public var Invitation_JoinGroup: String { return self._s[1028]! } + public var AutoDownloadSettings_Title: String { return self._s[1030]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[1031]! } + public var Channel_ErrorAddBlocked: String { return self._s[1032]! } + public var Conversation_UnblockUser: String { return self._s[1033]! } + public var EditTheme_Edit_TopInfo: String { return self._s[1034]! } + public var Watch_Bot_Restart: String { return self._s[1035]! } + public var TwoStepAuth_Title: String { return self._s[1036]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[1037]! } + public var Checkout_ShippingMethod: String { return self._s[1038]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1039]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1033]!, self._r[1033]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1040]!, self._r[1040]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1035]!, self._r[1035]!, [_0]) + return formatWithArgumentRanges(self._s[1042]!, self._r[1042]!, [_0]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1036]!, self._r[1036]!, [_0]) + return formatWithArgumentRanges(self._s[1043]!, self._r[1043]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1037]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[1038]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[1039]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[1040]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[1041]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[1042]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[1043]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[1044]! } - public var Checkout_PaymentMethod_Title: String { return self._s[1045]! } - public var SocksProxySetup_Connection: String { return self._s[1046]! } - public var Group_MessagePhotoRemoved: String { return self._s[1047]! } - public var Channel_Stickers_NotFound: String { return self._s[1050]! } - public var Group_About_Help: String { return self._s[1051]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[1052]! } - public var PeopleNearby_Title: String { return self._s[1054]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1044]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[1045]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[1046]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[1047]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[1048]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[1049]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[1050]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[1051]! } + public var Checkout_PaymentMethod_Title: String { return self._s[1052]! } + public var SocksProxySetup_Connection: String { return self._s[1053]! } + public var Group_MessagePhotoRemoved: String { return self._s[1054]! } + public var Channel_Stickers_NotFound: String { return self._s[1057]! } + public var Group_About_Help: String { return self._s[1058]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[1059]! } + public var PeopleNearby_Title: String { return self._s[1061]! } public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1055]!, self._r[1055]!, [_1]) + return formatWithArgumentRanges(self._s[1062]!, self._r[1062]!, [_1]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1057]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1058]! } - public var SocksProxySetup_Password: String { return self._s[1059]! } - public var Notifications_PermissionsEnable: String { return self._s[1060]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[1062]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1064]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1065]! } + public var SocksProxySetup_Password: String { return self._s[1066]! } + public var Notifications_PermissionsEnable: String { return self._s[1067]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[1069]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1063]!, self._r[1063]!, [_1]) + return formatWithArgumentRanges(self._s[1070]!, self._r[1070]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1065]!, self._r[1065]!, [_0]) + return formatWithArgumentRanges(self._s[1072]!, self._r[1072]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[1066]! } - public var ArchivedPacksAlert_Title: String { return self._s[1067]! } - public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[1068]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1073]! } + public var ArchivedPacksAlert_Title: String { return self._s[1074]! } + public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[1075]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1069]!, self._r[1069]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1076]!, self._r[1076]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1070]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1072]! } - public var Conversation_StatusTyping: String { return self._s[1073]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1074]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1075]! } - public var UserInfo_CreateNewContact: String { return self._s[1076]! } - public var Passport_Identity_FrontSide: String { return self._s[1077]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1078]! } - public var Calls_CallTabTitle: String { return self._s[1079]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1080]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1077]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1079]! } + public var Conversation_StatusTyping: String { return self._s[1080]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1081]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1082]! } + public var UserInfo_CreateNewContact: String { return self._s[1083]! } + public var Passport_Identity_FrontSide: String { return self._s[1084]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1085]! } + public var Calls_CallTabTitle: String { return self._s[1086]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1087]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1082]!, self._r[1082]!, [_0]) + return formatWithArgumentRanges(self._s[1089]!, self._r[1089]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1083]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1084]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1085]! } - public var Wallet_Completed_Text: String { return self._s[1086]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1087]! } - public var Paint_Stickers: String { return self._s[1088]! } - public var Privacy_GroupsAndChannels: String { return self._s[1089]! } - public var ChatList_Context_Delete: String { return self._s[1091]! } - public var UserInfo_AddContact: String { return self._s[1092]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1090]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1091]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1092]! } + public var Wallet_Completed_Text: String { return self._s[1093]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1094]! } + public var Paint_Stickers: String { return self._s[1095]! } + public var Privacy_GroupsAndChannels: String { return self._s[1096]! } + public var ChatList_Context_Delete: String { return self._s[1098]! } + public var UserInfo_AddContact: String { return self._s[1099]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1093]!, self._r[1093]!, [_0]) + return formatWithArgumentRanges(self._s[1100]!, self._r[1100]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1095]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1102]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1097]!, self._r[1097]!, [_0]) + return formatWithArgumentRanges(self._s[1104]!, self._r[1104]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1098]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1099]! } - public var BlockedUsers_BlockUser: String { return self._s[1100]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1101]! } - public var MediaPicker_UngroupDescription: String { return self._s[1102]! } - public var Watch_NoConnection: String { return self._s[1103]! } - public var Month_GenSeptember: String { return self._s[1104]! } - public var Conversation_ViewGroup: String { return self._s[1106]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1109]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1110]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1111]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1112]! } - public var Wallet_WordCheck_IncorrectHeader: String { return self._s[1113]! } - public var MediaPicker_CameraRoll: String { return self._s[1115]! } - public var Month_GenAugust: String { return self._s[1116]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1117]! } - public var SharedMedia_EmptyText: String { return self._s[1118]! } - public var Map_ShareLiveLocation: String { return self._s[1119]! } - public var Calls_All: String { return self._s[1120]! } - public var Appearance_ThemeNight: String { return self._s[1123]! } - public var Conversation_HoldForAudio: String { return self._s[1124]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1127]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1128]! } - public var SocksProxySetup_Secret: String { return self._s[1129]! } + public var DialogList_NoMessagesTitle: String { return self._s[1105]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1106]! } + public var BlockedUsers_BlockUser: String { return self._s[1107]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1108]! } + public var MediaPicker_UngroupDescription: String { return self._s[1109]! } + public var Watch_NoConnection: String { return self._s[1110]! } + public var Month_GenSeptember: String { return self._s[1111]! } + public var Conversation_ViewGroup: String { return self._s[1113]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1116]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1117]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1118]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1119]! } + public var Wallet_WordCheck_IncorrectHeader: String { return self._s[1120]! } + public var MediaPicker_CameraRoll: String { return self._s[1122]! } + public var Month_GenAugust: String { return self._s[1123]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1124]! } + public var SharedMedia_EmptyText: String { return self._s[1125]! } + public var Map_ShareLiveLocation: String { return self._s[1126]! } + public var Calls_All: String { return self._s[1127]! } + public var Appearance_ThemeNight: String { return self._s[1130]! } + public var Conversation_HoldForAudio: String { return self._s[1131]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1134]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1135]! } + public var SocksProxySetup_Secret: String { return self._s[1136]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1130]!, self._r[1130]!, [_0]) + return formatWithArgumentRanges(self._s[1137]!, self._r[1137]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1132]! } - public var Conversation_Location: String { return self._s[1133]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1139]! } + public var Conversation_Location: String { return self._s[1140]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1134]!, self._r[1134]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1141]!, self._r[1141]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1136]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1137]! } - public var Notifications_PermissionsText: String { return self._s[1138]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1139]! } - public var Call_Flip: String { return self._s[1140]! } - public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[1142]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1143]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1144]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1146]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1148]! } - public var Channel_TooMuchBots: String { return self._s[1150]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1151]! } - public var Login_InvalidCodeError: String { return self._s[1152]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1153]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1143]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1144]! } + public var Notifications_PermissionsText: String { return self._s[1145]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1146]! } + public var Call_Flip: String { return self._s[1147]! } + public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[1149]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1150]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1151]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1153]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1155]! } + public var Channel_TooMuchBots: String { return self._s[1157]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1158]! } + public var Login_InvalidCodeError: String { return self._s[1159]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1160]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1154]!, self._r[1154]!, [_0]) + return formatWithArgumentRanges(self._s[1161]!, self._r[1161]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1155]!, self._r[1155]!, [_0]) + return formatWithArgumentRanges(self._s[1162]!, self._r[1162]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1156]! } - public var Call_CallInProgressTitle: String { return self._s[1157]! } - public var Month_ShortSeptember: String { return self._s[1158]! } - public var Watch_ChannelInfo_Title: String { return self._s[1159]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1162]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1163]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1164]! } - public var Wallet_Receive_Title: String { return self._s[1165]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1166]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1167]! } - public var PhotoEditor_CropReset: String { return self._s[1168]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1170]! } - public var Channel_Management_LabelEditor: String { return self._s[1171]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1173]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1174]! } - public var Wallet_Info_WalletCreated: String { return self._s[1175]! } - public var UserInfo_Title: String { return self._s[1176]! } - public var ChatList_HideAction: String { return self._s[1177]! } - public var AccessDenied_Title: String { return self._s[1178]! } - public var DialogList_SearchLabel: String { return self._s[1179]! } - public var Group_Setup_HistoryHidden: String { return self._s[1180]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1181]! } - public var State_Updating: String { return self._s[1183]! } - public var Contacts_TabTitle: String { return self._s[1184]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1186]! } - public var GroupInfo_GroupHistory: String { return self._s[1187]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1188]! } - public var Wallpaper_SetColor: String { return self._s[1189]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1190]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1191]! } - public var Chat_AttachmentLimitReached: String { return self._s[1192]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1193]! } - public var Contacts_NotRegisteredSection: String { return self._s[1194]! } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1163]! } + public var Call_CallInProgressTitle: String { return self._s[1164]! } + public var Month_ShortSeptember: String { return self._s[1165]! } + public var Watch_ChannelInfo_Title: String { return self._s[1166]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1169]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1170]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1171]! } + public var Wallet_Receive_Title: String { return self._s[1172]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1173]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1174]! } + public var PhotoEditor_CropReset: String { return self._s[1175]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1177]! } + public var Channel_Management_LabelEditor: String { return self._s[1178]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1180]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1181]! } + public var Wallet_Info_WalletCreated: String { return self._s[1182]! } + public var UserInfo_Title: String { return self._s[1183]! } + public var ChatList_HideAction: String { return self._s[1184]! } + public var AccessDenied_Title: String { return self._s[1185]! } + public var DialogList_SearchLabel: String { return self._s[1186]! } + public var Group_Setup_HistoryHidden: String { return self._s[1187]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1188]! } + public var State_Updating: String { return self._s[1190]! } + public var Contacts_TabTitle: String { return self._s[1191]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1193]! } + public var GroupInfo_GroupHistory: String { return self._s[1194]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1195]! } + public var Wallpaper_SetColor: String { return self._s[1196]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1197]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1198]! } + public var Chat_AttachmentLimitReached: String { return self._s[1199]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1200]! } + public var Contacts_NotRegisteredSection: String { return self._s[1201]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1195]!, self._r[1195]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1202]!, self._r[1202]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1196]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1197]! } - public var SocksProxySetup_Connecting: String { return self._s[1198]! } - public var ExplicitContent_AlertChannel: String { return self._s[1199]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1200]! } - public var Conversation_Contact: String { return self._s[1201]! } - public var Login_CodeExpired: String { return self._s[1202]! } - public var Passport_DiscardMessageAction: String { return self._s[1203]! } - public var ChatList_Context_Unpin: String { return self._s[1204]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1205]! } + public var Paint_Clear: String { return self._s[1203]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1204]! } + public var SocksProxySetup_Connecting: String { return self._s[1205]! } + public var ExplicitContent_AlertChannel: String { return self._s[1206]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1207]! } + public var Conversation_Contact: String { return self._s[1208]! } + public var Login_CodeExpired: String { return self._s[1209]! } + public var Passport_DiscardMessageAction: String { return self._s[1210]! } + public var ChatList_Context_Unpin: String { return self._s[1211]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1212]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1206]!, self._r[1206]!, [_0]) + return formatWithArgumentRanges(self._s[1213]!, self._r[1213]!, [_0]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1207]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1208]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1214]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1215]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1209]!, self._r[1209]!, [_0]) + return formatWithArgumentRanges(self._s[1216]!, self._r[1216]!, [_0]) } - public var Month_ShortApril: String { return self._s[1210]! } - public var AuthSessions_CurrentSession: String { return self._s[1211]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1214]! } - public var Wallet_Navigation_Cancel: String { return self._s[1216]! } - public var WallpaperPreview_CropTopText: String { return self._s[1217]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1218]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1219]! } + public var Month_ShortApril: String { return self._s[1217]! } + public var AuthSessions_CurrentSession: String { return self._s[1218]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1221]! } + public var Wallet_Navigation_Cancel: String { return self._s[1223]! } + public var WallpaperPreview_CropTopText: String { return self._s[1224]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1225]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1226]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1220]!, self._r[1220]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1227]!, self._r[1227]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1221]! } - public var Channel_Setup_TypePrivate: String { return self._s[1223]! } - public var Forward_ChannelReadOnly: String { return self._s[1226]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1227]! } - public var AddContact_SharedContactException: String { return self._s[1228]! } - public var UserInfo_BotPrivacy: String { return self._s[1230]! } - public var Wallet_CreateInvoice_Title: String { return self._s[1231]! } - public var Notification_PassportValueEmail: String { return self._s[1232]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1233]! } - public var GroupPermission_NewTitle: String { return self._s[1234]! } - public var CallFeedback_ReasonDropped: String { return self._s[1235]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1236]! } - public var Channel_SignMessages_Help: String { return self._s[1238]! } - public var Undo_ChatDeleted: String { return self._s[1240]! } - public var Conversation_ChatBackground: String { return self._s[1241]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1228]! } + public var Channel_Setup_TypePrivate: String { return self._s[1230]! } + public var Forward_ChannelReadOnly: String { return self._s[1233]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1234]! } + public var AddContact_SharedContactException: String { return self._s[1235]! } + public var UserInfo_BotPrivacy: String { return self._s[1237]! } + public var Wallet_CreateInvoice_Title: String { return self._s[1238]! } + public var Notification_PassportValueEmail: String { return self._s[1239]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1240]! } + public var GroupPermission_NewTitle: String { return self._s[1241]! } + public var CallFeedback_ReasonDropped: String { return self._s[1242]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1243]! } + public var Channel_SignMessages_Help: String { return self._s[1245]! } + public var Undo_ChatDeleted: String { return self._s[1247]! } + public var Conversation_ChatBackground: String { return self._s[1248]! } public func Wallet_WordCheck_Text(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1242]!, self._r[1242]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1249]!, self._r[1249]!, [_1, _2, _3]) } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1243]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1244]! } - public var Passport_Language_pt: String { return self._s[1245]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1246]! } - public var NotificationsSound_Popcorn: String { return self._s[1249]! } - public var AutoNightTheme_Disabled: String { return self._s[1250]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1251]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1252]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1253]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1254]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1250]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1251]! } + public var Passport_Language_pt: String { return self._s[1252]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1253]! } + public var NotificationsSound_Popcorn: String { return self._s[1256]! } + public var AutoNightTheme_Disabled: String { return self._s[1257]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1258]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1259]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1260]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1261]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1255]!, self._r[1255]!, [_0]) + return formatWithArgumentRanges(self._s[1262]!, self._r[1262]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1256]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1257]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1259]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1263]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1264]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1266]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1260]!, self._r[1260]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1267]!, self._r[1267]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1263]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1264]! } - public var Compose_NewEncryptedChat: String { return self._s[1265]! } - public var Login_CodeFloodError: String { return self._s[1266]! } - public var Calls_TabTitle: String { return self._s[1267]! } - public var Privacy_ProfilePhoto: String { return self._s[1268]! } - public var Passport_Language_he: String { return self._s[1269]! } + public var SocksProxySetup_Hostname: String { return self._s[1270]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1271]! } + public var Compose_NewEncryptedChat: String { return self._s[1272]! } + public var Login_CodeFloodError: String { return self._s[1273]! } + public var Calls_TabTitle: String { return self._s[1274]! } + public var Privacy_ProfilePhoto: String { return self._s[1275]! } + public var Passport_Language_he: String { return self._s[1276]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1270]!, self._r[1270]!, [_0]) + return formatWithArgumentRanges(self._s[1277]!, self._r[1277]!, [_0]) } - public var GroupPermission_Title: String { return self._s[1271]! } + public var GroupPermission_Title: String { return self._s[1278]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1272]!, self._r[1272]!, [_0]) + return formatWithArgumentRanges(self._s[1279]!, self._r[1279]!, [_0]) } - public var Wallet_TransactionInfo_SenderHeader: String { return self._s[1273]! } - public var GroupPermission_NoChangeInfo: String { return self._s[1274]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1275]! } - public var Tour_Text1: String { return self._s[1276]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1277]! } - public var Month_ShortFebruary: String { return self._s[1278]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1279]! } + public var Wallet_TransactionInfo_SenderHeader: String { return self._s[1280]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1281]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1282]! } + public var Tour_Text1: String { return self._s[1283]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1284]! } + public var Month_ShortFebruary: String { return self._s[1285]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1286]! } public func Wallet_Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1280]!, self._r[1280]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_1, _2, _3]) } - public var NotificationsSound_Glass: String { return self._s[1281]! } - public var Appearance_ThemeNightBlue: String { return self._s[1282]! } - public var CheckoutInfo_Pay: String { return self._s[1283]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1285]! } - public var Call_CallAgain: String { return self._s[1287]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1288]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1289]! } - public var Passport_InvalidPasswordError: String { return self._s[1290]! } - public var Watch_Message_Game: String { return self._s[1291]! } - public var Stickers_Install: String { return self._s[1292]! } - public var VoiceOver_Chat_Message: String { return self._s[1293]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1294]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1296]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1297]! } - public var AuthSessions_OtherSessions: String { return self._s[1298]! } - public var Channel_Username_Help: String { return self._s[1299]! } - public var Camera_Title: String { return self._s[1300]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1302]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1303]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1304]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1305]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1306]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1307]! } - public var ScheduledMessages_DeleteMany: String { return self._s[1308]! } - public var Conversation_RestrictedStickers: String { return self._s[1309]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1311]! } - public var UserInfo_TelegramCall: String { return self._s[1313]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1314]! } - public var CreatePoll_OptionsHeader: String { return self._s[1315]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1316]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1317]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1318]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1319]! } + public var NotificationsSound_Glass: String { return self._s[1288]! } + public var Appearance_ThemeNightBlue: String { return self._s[1289]! } + public var CheckoutInfo_Pay: String { return self._s[1290]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1292]! } + public var Call_CallAgain: String { return self._s[1294]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1295]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1296]! } + public var Passport_InvalidPasswordError: String { return self._s[1297]! } + public var Watch_Message_Game: String { return self._s[1298]! } + public var Stickers_Install: String { return self._s[1299]! } + public var VoiceOver_Chat_Message: String { return self._s[1300]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1301]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1303]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1304]! } + public var AuthSessions_OtherSessions: String { return self._s[1305]! } + public var Channel_Username_Help: String { return self._s[1306]! } + public var Camera_Title: String { return self._s[1307]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1309]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1310]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1311]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1312]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1313]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1314]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1315]! } + public var Conversation_RestrictedStickers: String { return self._s[1316]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1318]! } + public var UserInfo_TelegramCall: String { return self._s[1320]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1321]! } + public var CreatePoll_OptionsHeader: String { return self._s[1322]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1323]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1324]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1325]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1326]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1320]!, self._r[1320]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1327]!, self._r[1327]!, [_1, _2, _3]) } - public var Wallet_Month_GenAugust: String { return self._s[1321]! } - public var Settings_SaveEditedPhotos: String { return self._s[1322]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1323]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1324]! } - public var Conversation_MessageDialogRetry: String { return self._s[1325]! } - public var ChatList_Context_MarkAsUnread: String { return self._s[1326]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1327]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1328]! } - public var Group_Setup_TypeHeader: String { return self._s[1329]! } - public var Paint_RecentStickers: String { return self._s[1330]! } - public var PhotoEditor_GrainTool: String { return self._s[1331]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1332]! } - public var EmptyGroupInfo_Line4: String { return self._s[1333]! } - public var Watch_AuthRequired: String { return self._s[1335]! } + public var Wallet_Month_GenAugust: String { return self._s[1328]! } + public var Settings_SaveEditedPhotos: String { return self._s[1329]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1330]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1331]! } + public var Conversation_MessageDialogRetry: String { return self._s[1332]! } + public var ChatList_Context_MarkAsUnread: String { return self._s[1333]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1334]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1335]! } + public var Group_Setup_TypeHeader: String { return self._s[1336]! } + public var Paint_RecentStickers: String { return self._s[1337]! } + public var PhotoEditor_GrainTool: String { return self._s[1338]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1339]! } + public var EmptyGroupInfo_Line4: String { return self._s[1340]! } + public var Watch_AuthRequired: String { return self._s[1342]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1336]!, self._r[1336]!, [_0]) + return formatWithArgumentRanges(self._s[1343]!, self._r[1343]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1337]! } - public var ChannelIntro_Text: String { return self._s[1338]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1339]! } - public var GroupPermission_NoSendMedia: String { return self._s[1340]! } - public var Calls_AddTab: String { return self._s[1341]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1342]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1343]! } - public var Conversation_WalletRequiredSetup: String { return self._s[1344]! } - public var Notification_MessageLifetime1d: String { return self._s[1345]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1346]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1347]! } - public var Passport_Identity_GenderFemale: String { return self._s[1348]! } - public var BlockedUsers_BlockTitle: String { return self._s[1349]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1344]! } + public var ChannelIntro_Text: String { return self._s[1345]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1346]! } + public var GroupPermission_NoSendMedia: String { return self._s[1347]! } + public var Calls_AddTab: String { return self._s[1348]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1349]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1350]! } + public var Conversation_WalletRequiredSetup: String { return self._s[1351]! } + public var Notification_MessageLifetime1d: String { return self._s[1352]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1353]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1354]! } + public var Passport_Identity_GenderFemale: String { return self._s[1355]! } + public var BlockedUsers_BlockTitle: String { return self._s[1356]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1350]!, self._r[1350]!, [_1]) + return formatWithArgumentRanges(self._s[1357]!, self._r[1357]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1351]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1352]! } - public var Settings_Context_Logout: String { return self._s[1353]! } - public var Wallet_Info_UnknownTransaction: String { return self._s[1354]! } - public var ChatList_ArchiveAction: String { return self._s[1355]! } - public var AutoNightTheme_Scheduled: String { return self._s[1356]! } + public var Weekday_Yesterday: String { return self._s[1358]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1359]! } + public var Settings_Context_Logout: String { return self._s[1360]! } + public var Wallet_Info_UnknownTransaction: String { return self._s[1361]! } + public var ChatList_ArchiveAction: String { return self._s[1362]! } + public var AutoNightTheme_Scheduled: String { return self._s[1363]! } + public var TwoFactorSetup_Email_SkipAction: String { return self._s[1364]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1357]!, self._r[1357]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1365]!, self._r[1365]!, [_1, _2, _3, _4, _5, _6]) } - public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1358]! } - public var Wallet_Receive_CreateInvoice: String { return self._s[1359]! } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1360]! } + public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1366]! } + public var Wallet_Receive_CreateInvoice: String { return self._s[1367]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1368]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1361]!, self._r[1361]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1362]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1363]! } + public var CreatePoll_Create: String { return self._s[1370]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1371]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1364]!, self._r[1364]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1372]!, self._r[1372]!, [_1, _2]) } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1365]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1366]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1368]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1373]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1374]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1376]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_1]) + return formatWithArgumentRanges(self._s[1377]!, self._r[1377]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1370]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1371]! } + public var Preview_OpenInInstagram: String { return self._s[1378]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1379]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1372]!, self._r[1372]!, [_1, _2, _3]) - } - public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1373]!, self._r[1373]!, [_1, _2]) - } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1374]! } - public var ArchivedChats_IntroText3: String { return self._s[1375]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1376]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1377]! } - public var Wallet_Month_GenSeptember: String { return self._s[1378]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1379]! } - public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1380]!, self._r[1380]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1382]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1383]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1384]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1385]! } - public var Gif_NoGifsFound: String { return self._s[1386]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1387]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1388]! } - public var EditTheme_Preview: String { return self._s[1389]! } - public var GroupInfo_ActionPromote: String { return self._s[1390]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1391]! } - public var GroupInfo_Permissions_Title: String { return self._s[1392]! } - public var Permissions_ContactsText_v0: String { return self._s[1393]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1394]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1395]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1398]! } - public var Passport_FieldEmailHelp: String { return self._s[1399]! } - public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1400]!, self._r[1400]!, [_0]) + public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1381]!, self._r[1381]!, [_1, _2]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1401]! } - public var Weekday_ShortSaturday: String { return self._s[1402]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1403]! } - public var Watch_Conversation_UserInfo: String { return self._s[1404]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1405]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1406]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1407]! } - public var PhotoEditor_VignetteTool: String { return self._s[1408]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1409]! } - public var Passport_Language_et: String { return self._s[1410]! } - public var AppUpgrade_Running: String { return self._s[1411]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1413]! } - public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1414]! } - public var Passport_Language_bg: String { return self._s[1415]! } - public var Stickers_NoStickersFound: String { return self._s[1417]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1382]! } + public var ArchivedChats_IntroText3: String { return self._s[1383]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1384]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1385]! } + public var Wallet_Month_GenSeptember: String { return self._s[1386]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1387]! } + public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1388]!, self._r[1388]!, [_1, _2, _3]) + } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1390]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1391]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1392]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1393]! } + public var Gif_NoGifsFound: String { return self._s[1394]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1395]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1396]! } + public var EditTheme_Preview: String { return self._s[1397]! } + public var GroupInfo_ActionPromote: String { return self._s[1398]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1399]! } + public var GroupInfo_Permissions_Title: String { return self._s[1400]! } + public var Permissions_ContactsText_v0: String { return self._s[1401]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1402]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1403]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1406]! } + public var Passport_FieldEmailHelp: String { return self._s[1407]! } + public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1408]!, self._r[1408]!, [_0]) + } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1409]! } + public var Weekday_ShortSaturday: String { return self._s[1410]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1411]! } + public var Watch_Conversation_UserInfo: String { return self._s[1412]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1413]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1414]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1415]! } + public var PhotoEditor_VignetteTool: String { return self._s[1416]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1417]! } + public var Passport_Language_et: String { return self._s[1418]! } + public var AppUpgrade_Running: String { return self._s[1419]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1421]! } + public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1422]! } + public var Passport_Language_bg: String { return self._s[1423]! } + public var Stickers_NoStickersFound: String { return self._s[1425]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1419]!, self._r[1419]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1427]!, self._r[1427]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1420]!, self._r[1420]!, [_0]) + return formatWithArgumentRanges(self._s[1428]!, self._r[1428]!, [_0]) } - public var Wallet_Month_GenJuly: String { return self._s[1421]! } - public var Wallet_Receive_AddressHeader: String { return self._s[1422]! } - public var Wallet_Send_AmountText: String { return self._s[1423]! } - public var Settings_About: String { return self._s[1424]! } + public var Wallet_Month_GenJuly: String { return self._s[1429]! } + public var Wallet_Receive_AddressHeader: String { return self._s[1430]! } + public var Wallet_Send_AmountText: String { return self._s[1431]! } + public var Settings_About: String { return self._s[1432]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1425]!, self._r[1425]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1433]!, self._r[1433]!, [_0, _1, _2]) } - public var ChatList_Context_MarkAsRead: String { return self._s[1427]! } - public var KeyCommand_NewMessage: String { return self._s[1428]! } - public var Group_ErrorAddBlocked: String { return self._s[1429]! } + public var ChatList_Context_MarkAsRead: String { return self._s[1435]! } + public var KeyCommand_NewMessage: String { return self._s[1436]! } + public var Group_ErrorAddBlocked: String { return self._s[1437]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1430]!, self._r[1430]!, [_0]) + return formatWithArgumentRanges(self._s[1438]!, self._r[1438]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1431]! } - public var ReportGroupLocation_Title: String { return self._s[1432]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1433]! } - public var Cache_ClearProgress: String { return self._s[1434]! } + public var Map_LocationTitle: String { return self._s[1439]! } + public var ReportGroupLocation_Title: String { return self._s[1440]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1441]! } + public var Cache_ClearProgress: String { return self._s[1442]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1435]!, self._r[1435]!, [_0]) + return formatWithArgumentRanges(self._s[1443]!, self._r[1443]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1436]! } - public var Passport_UpdateRequiredError: String { return self._s[1437]! } - public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[1438]! } + public var GroupRemoved_AddToGroup: String { return self._s[1444]! } + public var Passport_UpdateRequiredError: String { return self._s[1445]! } + public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[1446]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1439]!, self._r[1439]!, [_1]) + return formatWithArgumentRanges(self._s[1447]!, self._r[1447]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1441]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1442]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1443]! } - public var Passport_Language_ka: String { return self._s[1444]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1449]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1450]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1451]! } + public var Passport_Language_ka: String { return self._s[1452]! } public func Wallet_Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1445]!, self._r[1445]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1453]!, self._r[1453]!, [_1, _2, _3]) } - public var Call_Decline: String { return self._s[1446]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1447]! } + public var Call_Decline: String { return self._s[1454]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1455]! } + public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1458]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1450]!, self._r[1450]!, [_0]) + return formatWithArgumentRanges(self._s[1459]!, self._r[1459]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1451]! } - public var EditTheme_EditTitle: String { return self._s[1452]! } + public var CallFeedback_Send: String { return self._s[1460]! } + public var EditTheme_EditTitle: String { return self._s[1461]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1453]!, self._r[1453]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1462]!, self._r[1462]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1454]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1463]! } public func Wallet_Updated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1456]!, self._r[1456]!, [_0]) + return formatWithArgumentRanges(self._s[1465]!, self._r[1465]!, [_0]) } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1457]! } - public var Passport_DeletePassport: String { return self._s[1458]! } - public var Appearance_AppIconFilled: String { return self._s[1459]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1460]! } - public var Month_ShortDecember: String { return self._s[1461]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1463]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1466]! } + public var Passport_DeletePassport: String { return self._s[1467]! } + public var Appearance_AppIconFilled: String { return self._s[1468]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1469]! } + public var Month_ShortDecember: String { return self._s[1470]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1472]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1464]!, self._r[1464]!, [_0]) + return formatWithArgumentRanges(self._s[1473]!, self._r[1473]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1465]! } - public var Conversation_EncryptedDescription1: String { return self._s[1466]! } - public var Conversation_EncryptedDescription2: String { return self._s[1467]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1468]! } - public var Conversation_EncryptedDescription3: String { return self._s[1470]! } - public var PhotoEditor_SharpenTool: String { return self._s[1471]! } + public var Channel_Stickers_Searching: String { return self._s[1474]! } + public var Conversation_EncryptedDescription1: String { return self._s[1475]! } + public var Conversation_EncryptedDescription2: String { return self._s[1476]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1477]! } + public var Conversation_EncryptedDescription3: String { return self._s[1479]! } + public var PhotoEditor_SharpenTool: String { return self._s[1480]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1472]!, self._r[1472]!, [_0]) - } - public var Conversation_EncryptedDescription4: String { return self._s[1474]! } - public var Channel_Members_AddMembers: String { return self._s[1475]! } - public var Wallpaper_Search: String { return self._s[1476]! } - public var Weekday_Friday: String { return self._s[1477]! } - public var Privacy_ContactsSync: String { return self._s[1478]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1479]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1480]! } - public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1481]!, self._r[1481]!, [_0]) } - public var GroupInfo_Permissions_Removed: String { return self._s[1482]! } - public var Passport_Identity_GenderMale: String { return self._s[1483]! } + public var Conversation_EncryptedDescription4: String { return self._s[1483]! } + public var Channel_Members_AddMembers: String { return self._s[1484]! } + public var Wallpaper_Search: String { return self._s[1485]! } + public var Weekday_Friday: String { return self._s[1486]! } + public var Privacy_ContactsSync: String { return self._s[1487]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1488]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1489]! } + public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1490]!, self._r[1490]!, [_0]) + } + public var GroupInfo_Permissions_Removed: String { return self._s[1491]! } + public var Passport_Identity_GenderMale: String { return self._s[1492]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1484]!, self._r[1484]!, [_0]) + return formatWithArgumentRanges(self._s[1493]!, self._r[1493]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1485]! } - public var Conversation_JumpToDate: String { return self._s[1486]! } - public var Contacts_GlobalSearch: String { return self._s[1487]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1488]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1489]! } - public var Profile_MessageLifetime1d: String { return self._s[1490]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1494]! } + public var Conversation_JumpToDate: String { return self._s[1495]! } + public var Contacts_GlobalSearch: String { return self._s[1496]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1497]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1498]! } + public var Profile_MessageLifetime1d: String { return self._s[1499]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1491]!, self._r[1491]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1494]! } + public var StickerPack_BuiltinPackName: String { return self._s[1503]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1495]!, self._r[1495]!, [_1, _2]) - } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1496]! } - public var Passport_InfoTitle: String { return self._s[1498]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1499]! } - public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1503]!, self._r[1503]!, [_0]) - } - public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1504]!, self._r[1504]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1505]! } - public var Profile_BotInfo: String { return self._s[1506]! } - public var Watch_Compose_CreateMessage: String { return self._s[1507]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1508]! } - public var Month_ShortNovember: String { return self._s[1509]! } - public var Conversation_ScamWarning: String { return self._s[1510]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1511]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1512]! } - public var NotificationsSound_Chime: String { return self._s[1513]! } - public var Passport_Language_ko: String { return self._s[1515]! } - public var InviteText_URL: String { return self._s[1516]! } - public var TextFormat_Monospace: String { return self._s[1517]! } - public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1518]!, self._r[1518]!, [_1, _2, _3]) + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1505]! } + public var Passport_InfoTitle: String { return self._s[1507]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1508]! } + public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1512]!, self._r[1512]!, [_0]) } - public var EditTheme_Edit_BottomInfo: String { return self._s[1519]! } + public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1513]!, self._r[1513]!, [_1, _2]) + } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1514]! } + public var Profile_BotInfo: String { return self._s[1515]! } + public var Watch_Compose_CreateMessage: String { return self._s[1516]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1517]! } + public var Month_ShortNovember: String { return self._s[1518]! } + public var Conversation_ScamWarning: String { return self._s[1519]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1520]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1521]! } + public var NotificationsSound_Chime: String { return self._s[1522]! } + public var Passport_Language_ko: String { return self._s[1524]! } + public var InviteText_URL: String { return self._s[1525]! } + public var TextFormat_Monospace: String { return self._s[1526]! } + public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1527]!, self._r[1527]!, [_1, _2, _3]) + } + public var EditTheme_Edit_BottomInfo: String { return self._s[1528]! } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1520]!, self._r[1520]!, [_0]) + return formatWithArgumentRanges(self._s[1529]!, self._r[1529]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1521]!, self._r[1521]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1530]!, self._r[1530]!, [_1, _2]) } - public var Wallet_Words_Title: String { return self._s[1522]! } - public var Wallet_Month_ShortMay: String { return self._s[1523]! } - public var EditTheme_CreateTitle: String { return self._s[1525]! } - public var Passport_InfoLearnMore: String { return self._s[1526]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1527]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1528]! } - public var Your_card_has_expired: String { return self._s[1529]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1530]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1531]! } - public var Conversation_Report: String { return self._s[1535]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1536]! } - public var Notification_MessageLifetime1m: String { return self._s[1537]! } - public var Privacy_ContactsTitle: String { return self._s[1538]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1539]! } - public var Wallet_WordCheck_Title: String { return self._s[1540]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1541]! } - public var Channel_Members_Title: String { return self._s[1542]! } - public var Map_OpenInWaze: String { return self._s[1543]! } - public var Login_PhoneBannedError: String { return self._s[1544]! } + public var Wallet_Words_Title: String { return self._s[1531]! } + public var Wallet_Month_ShortMay: String { return self._s[1532]! } + public var EditTheme_CreateTitle: String { return self._s[1534]! } + public var Passport_InfoLearnMore: String { return self._s[1535]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1536]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1537]! } + public var Your_card_has_expired: String { return self._s[1538]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1539]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1540]! } + public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[1544]! } + public var Conversation_Report: String { return self._s[1545]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1546]! } + public var Notification_MessageLifetime1m: String { return self._s[1547]! } + public var Privacy_ContactsTitle: String { return self._s[1548]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1549]! } + public var Wallet_WordCheck_Title: String { return self._s[1550]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1551]! } + public var Channel_Members_Title: String { return self._s[1552]! } + public var Map_OpenInWaze: String { return self._s[1553]! } + public var Login_PhoneBannedError: String { return self._s[1554]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1545]!, self._r[1545]!, [_0]) + return formatWithArgumentRanges(self._s[1555]!, self._r[1555]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1546]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1547]! } - public var Common_OK: String { return self._s[1548]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1549]! } - public var Wallet_Words_NotDoneResponse: String { return self._s[1550]! } - public var Cache_Music: String { return self._s[1551]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1552]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1553]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1554]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1556]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1557]! } + public var Common_OK: String { return self._s[1558]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1559]! } + public var Wallet_Words_NotDoneResponse: String { return self._s[1560]! } + public var Cache_Music: String { return self._s[1561]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1562]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1563]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1564]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1555]!, self._r[1555]!, [_1]) + return formatWithArgumentRanges(self._s[1565]!, self._r[1565]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1556]!, self._r[1556]!, [_0]) + return formatWithArgumentRanges(self._s[1566]!, self._r[1566]!, [_0]) } + public var TwoFactorSetup_Done_Action: String { return self._s[1567]! } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1557]!, self._r[1557]!, [_0]) + return formatWithArgumentRanges(self._s[1568]!, self._r[1568]!, [_0]) } - public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[1558]! } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1560]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1561]! } - public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[1563]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1564]! } - public var State_ConnectingToProxyInfo: String { return self._s[1565]! } - public var Message_VideoMessage: String { return self._s[1567]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1568]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1569]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1570]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1571]! } + public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[1569]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1571]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1572]! } + public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[1574]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1575]! } + public var State_ConnectingToProxyInfo: String { return self._s[1576]! } + public var Message_VideoMessage: String { return self._s[1578]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1579]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1580]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1581]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1582]! } public func Wallet_Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1572]!, self._r[1572]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1583]!, self._r[1583]!, [_1, _2, _3]) } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1573]! } - public var Activity_RecordingAudio: String { return self._s[1574]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1575]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1576]! } - public var Wallet_Info_Address: String { return self._s[1577]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1584]! } + public var Activity_RecordingAudio: String { return self._s[1585]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1586]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1587]! } + public var Wallet_Info_Address: String { return self._s[1588]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1579]!, self._r[1579]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1590]!, self._r[1590]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1583]!, self._r[1583]!, [_0]) + return formatWithArgumentRanges(self._s[1594]!, self._r[1594]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1584]! } - public var UserInfo_AddPhone: String { return self._s[1585]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1586]! } + public var Conversation_ApplyLocalization: String { return self._s[1595]! } + public var TwoFactorSetup_Intro_Action: String { return self._s[1596]! } + public var UserInfo_AddPhone: String { return self._s[1597]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1598]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1587]!, self._r[1587]!, [_0]) + return formatWithArgumentRanges(self._s[1599]!, self._r[1599]!, [_0]) } - public var Passport_Scans: String { return self._s[1589]! } - public var BlockedUsers_Unblock: String { return self._s[1590]! } + public var Passport_Scans: String { return self._s[1601]! } + public var BlockedUsers_Unblock: String { return self._s[1602]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1591]!, self._r[1591]!, [_1]) + return formatWithArgumentRanges(self._s[1603]!, self._r[1603]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1592]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1593]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1594]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1595]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1596]! } + public var Channel_Management_LabelCreator: String { return self._s[1604]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1605]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1606]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1607]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1608]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1597]!, self._r[1597]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1609]!, self._r[1609]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1598]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1599]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1600]! } - public var ChannelIntro_CreateChannel: String { return self._s[1601]! } - public var Conversation_UnreadMessages: String { return self._s[1602]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1603]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1604]! } - public var Theme_Context_Apply: String { return self._s[1605]! } - public var Notification_GroupActivated: String { return self._s[1606]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1607]! } - public var Wallet_Intro_CreateWallet: String { return self._s[1608]! } + public var Login_PhoneNumberHelp: String { return self._s[1610]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1611]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1612]! } + public var ChannelIntro_CreateChannel: String { return self._s[1613]! } + public var Conversation_UnreadMessages: String { return self._s[1614]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1615]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1616]! } + public var Theme_Context_Apply: String { return self._s[1617]! } + public var Notification_GroupActivated: String { return self._s[1618]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1619]! } + public var Wallet_Intro_CreateWallet: String { return self._s[1620]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1609]!, self._r[1609]!, [_0]) + return formatWithArgumentRanges(self._s[1621]!, self._r[1621]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1610]!, self._r[1610]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1622]!, self._r[1622]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1612]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1624]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1613]!, self._r[1613]!, [_0]) + return formatWithArgumentRanges(self._s[1625]!, self._r[1625]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1614]! } - public var CallFeedback_AddComment: String { return self._s[1615]! } + public var Undo_DeletedChannel: String { return self._s[1626]! } + public var CallFeedback_AddComment: String { return self._s[1627]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1616]!, self._r[1616]!, [_0]) + return formatWithArgumentRanges(self._s[1628]!, self._r[1628]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1617]! } + public var Document_TargetConfirmationFormat: String { return self._s[1629]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1618]!, self._r[1618]!, [_0]) + return formatWithArgumentRanges(self._s[1630]!, self._r[1630]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1619]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1631]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1620]!, self._r[1620]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1632]!, self._r[1632]!, [_1, _2, _3, _4]) } - public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[1621]! } - public var Theme_ErrorNotFound: String { return self._s[1622]! } - public var Contacts_SortByName: String { return self._s[1623]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1624]! } + public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[1633]! } + public var Theme_ErrorNotFound: String { return self._s[1634]! } + public var Contacts_SortByName: String { return self._s[1635]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1636]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1626]!, self._r[1626]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1638]!, self._r[1638]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1627]! } - public var ScheduledMessages_EditTime: String { return self._s[1628]! } - public var Conversation_ClearSelfHistory: String { return self._s[1629]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1630]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1631]! } - public var Stickers_SuggestNone: String { return self._s[1632]! } - public var ChatSettings_Cache: String { return self._s[1633]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1634]! } - public var Media_ShareThisPhoto: String { return self._s[1635]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1636]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1637]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1638]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1639]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1640]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1641]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1639]! } + public var ScheduledMessages_EditTime: String { return self._s[1640]! } + public var Conversation_ClearSelfHistory: String { return self._s[1641]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1642]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1643]! } + public var Stickers_SuggestNone: String { return self._s[1644]! } + public var ChatSettings_Cache: String { return self._s[1645]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1646]! } + public var Media_ShareThisPhoto: String { return self._s[1647]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1648]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1649]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1650]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1651]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1652]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1653]! } public func Wallet_SecureStorageReset_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1642]!, self._r[1642]!, [_0]) + return formatWithArgumentRanges(self._s[1654]!, self._r[1654]!, [_0]) } - public var Permissions_CellularDataTitle_v0: String { return self._s[1643]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1645]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1646]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1647]! } - public var Map_OpenIn: String { return self._s[1648]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1655]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1657]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1658]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1659]! } + public var Map_OpenIn: String { return self._s[1660]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1651]!, self._r[1651]!, [_1]) + return formatWithArgumentRanges(self._s[1663]!, self._r[1663]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1652]!, self._r[1652]!, [_0]) + return formatWithArgumentRanges(self._s[1664]!, self._r[1664]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1653]! } - public var MessagePoll_LabelClosed: String { return self._s[1654]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1656]! } - public var Wallet_Send_SendAnyway: String { return self._s[1657]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1658]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1659]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1660]! } - public var Login_SelectCountry_Title: String { return self._s[1661]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1662]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1665]! } + public var MessagePoll_LabelClosed: String { return self._s[1666]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1668]! } + public var Wallet_Send_SendAnyway: String { return self._s[1669]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1670]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1671]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1672]! } + public var Login_SelectCountry_Title: String { return self._s[1673]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1674]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1663]!, self._r[1663]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1675]!, self._r[1675]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1664]! } - public var Watch_Suggestion_BRB: String { return self._s[1665]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1666]! } - public var Contacts_PermissionsTitle: String { return self._s[1667]! } - public var Conversation_RestrictedInline: String { return self._s[1668]! } - public var StickerPack_ViewPack: String { return self._s[1670]! } - public var Wallet_UnknownError: String { return self._s[1671]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1676]! } + public var Watch_Suggestion_BRB: String { return self._s[1677]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1678]! } + public var Contacts_PermissionsTitle: String { return self._s[1679]! } + public var Conversation_RestrictedInline: String { return self._s[1680]! } + public var StickerPack_ViewPack: String { return self._s[1682]! } + public var Wallet_UnknownError: String { return self._s[1683]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1672]!, self._r[1672]!, [_0]) + return formatWithArgumentRanges(self._s[1684]!, self._r[1684]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1674]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1677]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1679]! } - public var Channel_Info_Stickers: String { return self._s[1680]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1681]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1682]! } - public var Passport_DeletePersonalDetails: String { return self._s[1683]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1684]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1685]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1686]! } - public var Conversation_SearchNoResults: String { return self._s[1688]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1689]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1690]! } - public var Login_Code: String { return self._s[1691]! } - public var EditTheme_Create_BottomInfo: String { return self._s[1692]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1693]! } - public var Weekday_ShortThursday: String { return self._s[1694]! } - public var Resolve_ErrorNotFound: String { return self._s[1696]! } - public var LastSeen_Offline: String { return self._s[1697]! } - public var PeopleNearby_NoMembers: String { return self._s[1698]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1699]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1700]! } - public var GroupInfo_Title: String { return self._s[1702]! } - public var NotificationsSound_Note: String { return self._s[1703]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1704]! } - public var Watch_Message_Poll: String { return self._s[1705]! } - public var Privacy_Calls: String { return self._s[1706]! } + public var Compose_NewChannel: String { return self._s[1686]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1689]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1691]! } + public var Channel_Info_Stickers: String { return self._s[1692]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1693]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1694]! } + public var Passport_DeletePersonalDetails: String { return self._s[1695]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1696]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1697]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1698]! } + public var Conversation_SearchNoResults: String { return self._s[1700]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1701]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1702]! } + public var Login_Code: String { return self._s[1703]! } + public var EditTheme_Create_BottomInfo: String { return self._s[1704]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1705]! } + public var Weekday_ShortThursday: String { return self._s[1706]! } + public var Resolve_ErrorNotFound: String { return self._s[1708]! } + public var LastSeen_Offline: String { return self._s[1709]! } + public var PeopleNearby_NoMembers: String { return self._s[1710]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1711]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1712]! } + public var GroupInfo_Title: String { return self._s[1714]! } + public var NotificationsSound_Note: String { return self._s[1715]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1716]! } + public var Watch_Message_Poll: String { return self._s[1717]! } + public var Privacy_Calls: String { return self._s[1718]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1707]!, self._r[1707]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1719]!, self._r[1719]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1708]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1709]! } - public var Notifications_Reset: String { return self._s[1710]! } - public var Conversation_Pin: String { return self._s[1711]! } - public var Passport_Language_lv: String { return self._s[1712]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1713]! } - public var BlockedUsers_Info: String { return self._s[1714]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1716]! } - public var Watch_Conversation_Unblock: String { return self._s[1718]! } + public var Month_ShortAugust: String { return self._s[1720]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1721]! } + public var Notifications_Reset: String { return self._s[1722]! } + public var Conversation_Pin: String { return self._s[1723]! } + public var Passport_Language_lv: String { return self._s[1724]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1725]! } + public var BlockedUsers_Info: String { return self._s[1726]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1728]! } + public var Watch_Conversation_Unblock: String { return self._s[1730]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1719]!, self._r[1719]!, [_0]) + return formatWithArgumentRanges(self._s[1731]!, self._r[1731]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1720]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1721]! } + public var CloudStorage_Title: String { return self._s[1732]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1733]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1722]!, self._r[1722]!, [_0]) + return formatWithArgumentRanges(self._s[1734]!, self._r[1734]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1723]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1724]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1725]! } - public var Passport_Address_EditBankStatement: String { return self._s[1726]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1735]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1736]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1737]! } + public var Passport_Address_EditBankStatement: String { return self._s[1738]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1727]!, self._r[1727]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1739]!, self._r[1739]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1728]! } - public var ShareMenu_Comment: String { return self._s[1729]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1730]! } - public var Notifications_PermissionsTitle: String { return self._s[1731]! } - public var GroupPermission_NoSendLinks: String { return self._s[1732]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1733]! } - public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1734]! } - public var Settings_Support: String { return self._s[1735]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1736]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1737]! } - public var Privacy_Forwards_Preview: String { return self._s[1738]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1739]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1740]! } - public var Common_Select: String { return self._s[1742]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1743]! } - public var WallpaperSearch_ColorGray: String { return self._s[1746]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1747]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1748]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1749]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1750]! } - public var Widget_AuthRequired: String { return self._s[1751]! } - public var Camera_FlashOn: String { return self._s[1752]! } - public var Conversation_ContextMenuLookUp: String { return self._s[1753]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1754]! } - public var Watch_Suggestion_OK: String { return self._s[1755]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1740]! } + public var ShareMenu_Comment: String { return self._s[1741]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1742]! } + public var Notifications_PermissionsTitle: String { return self._s[1743]! } + public var GroupPermission_NoSendLinks: String { return self._s[1744]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1745]! } + public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1746]! } + public var Settings_Support: String { return self._s[1747]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1748]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1749]! } + public var Privacy_Forwards_Preview: String { return self._s[1750]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1751]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1752]! } + public var Common_Select: String { return self._s[1754]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1755]! } + public var WallpaperSearch_ColorGray: String { return self._s[1758]! } + public var TwoFactorSetup_Password_PlaceholderPassword: String { return self._s[1759]! } + public var TwoFactorSetup_Hint_SkipAction: String { return self._s[1760]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1761]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1762]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1763]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1764]! } + public var Widget_AuthRequired: String { return self._s[1765]! } + public var Camera_FlashOn: String { return self._s[1766]! } + public var Conversation_ContextMenuLookUp: String { return self._s[1767]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1768]! } + public var Watch_Suggestion_OK: String { return self._s[1769]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1757]!, self._r[1757]!, [_0]) + return formatWithArgumentRanges(self._s[1771]!, self._r[1771]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1759]!, self._r[1759]!, [_0]) + return formatWithArgumentRanges(self._s[1773]!, self._r[1773]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1760]! } - public var DialogList_AdLabel: String { return self._s[1761]! } - public var WatchRemote_NotificationText: String { return self._s[1762]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1763]! } - public var Conversation_ReportSpam: String { return self._s[1764]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1765]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1767]! } - public var PhoneLabel_Title: String { return self._s[1768]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1769]! } - public var Settings_ChangePhoneNumber: String { return self._s[1770]! } - public var Notifications_ExceptionsTitle: String { return self._s[1771]! } - public var Notifications_AlertTones: String { return self._s[1772]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1773]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1774]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1775]! } - public var VoiceOver_Chat_Photo: String { return self._s[1777]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1778]! } - public var ReportPeer_ReasonOther: String { return self._s[1779]! } - public var ChatList_Context_JoinChannel: String { return self._s[1780]! } - public var KeyCommand_ScrollDown: String { return self._s[1782]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1783]! } + public var TextFormat_Strikethrough: String { return self._s[1774]! } + public var DialogList_AdLabel: String { return self._s[1775]! } + public var WatchRemote_NotificationText: String { return self._s[1776]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1777]! } + public var Conversation_ReportSpam: String { return self._s[1778]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1779]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1781]! } + public var PhoneLabel_Title: String { return self._s[1782]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1783]! } + public var Settings_ChangePhoneNumber: String { return self._s[1784]! } + public var Notifications_ExceptionsTitle: String { return self._s[1785]! } + public var Notifications_AlertTones: String { return self._s[1786]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1787]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1788]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1789]! } + public var VoiceOver_Chat_Photo: String { return self._s[1791]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1792]! } + public var ReportPeer_ReasonOther: String { return self._s[1793]! } + public var ChatList_Context_JoinChannel: String { return self._s[1794]! } + public var KeyCommand_ScrollDown: String { return self._s[1796]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1797]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1784]!, self._r[1784]!, [_0]) + return formatWithArgumentRanges(self._s[1798]!, self._r[1798]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1785]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1786]! } - public var AuthSessions_LogOut: String { return self._s[1787]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1788]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1789]! } - public var Passport_Phone_Title: String { return self._s[1790]! } - public var ContactList_Context_StartSecretChat: String { return self._s[1791]! } - public var Settings_PhoneNumber: String { return self._s[1792]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1799]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1800]! } + public var AuthSessions_LogOut: String { return self._s[1801]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1802]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1803]! } + public var Passport_Phone_Title: String { return self._s[1804]! } + public var ContactList_Context_StartSecretChat: String { return self._s[1805]! } + public var Settings_PhoneNumber: String { return self._s[1806]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1793]!, self._r[1793]!, [_0]) + return formatWithArgumentRanges(self._s[1807]!, self._r[1807]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1794]! } - public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[1795]! } - public var WebSearch_SearchNoResults: String { return self._s[1796]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1798]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1799]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1800]! } - public var PhotoEditor_CurvesTool: String { return self._s[1801]! } - public var Checkout_PaymentMethod: String { return self._s[1803]! } + public var NotificationsSound_Alert: String { return self._s[1808]! } + public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[1809]! } + public var WebSearch_SearchNoResults: String { return self._s[1810]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1812]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1813]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1814]! } + public var PhotoEditor_CurvesTool: String { return self._s[1815]! } + public var Checkout_PaymentMethod: String { return self._s[1817]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1804]!, self._r[1804]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1818]!, self._r[1818]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1805]! } - public var Camera_PhotoMode: String { return self._s[1808]! } - public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1809]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1811]! } - public var CallSettings_OnMobile: String { return self._s[1812]! } - public var Tour_Text2: String { return self._s[1813]! } + public var Contacts_AccessDeniedError: String { return self._s[1819]! } + public var Camera_PhotoMode: String { return self._s[1822]! } + public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1823]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1825]! } + public var CallSettings_OnMobile: String { return self._s[1826]! } + public var Tour_Text2: String { return self._s[1827]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1814]!, self._r[1814]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1828]!, self._r[1828]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1816]! } - public var Permissions_Skip: String { return self._s[1817]! } - public var Wallet_Words_NotDoneOk: String { return self._s[1818]! } - public var SecretImage_Title: String { return self._s[1819]! } - public var Watch_MessageView_Title: String { return self._s[1820]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1821]! } - public var AttachmentMenu_Poll: String { return self._s[1822]! } + public var DialogList_EncryptionProcessing: String { return self._s[1830]! } + public var Permissions_Skip: String { return self._s[1831]! } + public var Wallet_Words_NotDoneOk: String { return self._s[1832]! } + public var SecretImage_Title: String { return self._s[1833]! } + public var Watch_MessageView_Title: String { return self._s[1834]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1835]! } + public var AttachmentMenu_Poll: String { return self._s[1836]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1823]!, self._r[1823]!, [_0]) + return formatWithArgumentRanges(self._s[1837]!, self._r[1837]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1824]!, self._r[1824]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1838]!, self._r[1838]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1825]! } - public var WallpaperPreview_Title: String { return self._s[1826]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1827]! } - public var Settings_ProxyConnecting: String { return self._s[1828]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1830]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1831]! } - public var Wallet_Intro_Title: String { return self._s[1832]! } - public var Profile_MessageLifetime5s: String { return self._s[1833]! } - public var Username_InvalidCharacters: String { return self._s[1834]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1835]! } - public var ScheduledMessages_ClearAll: String { return self._s[1836]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1837]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1838]! } - public var Settings_AddAccount: String { return self._s[1839]! } - public var Notification_CreatedChannel: String { return self._s[1842]! } + public var Notification_CallCanceled: String { return self._s[1839]! } + public var WallpaperPreview_Title: String { return self._s[1840]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1841]! } + public var Settings_ProxyConnecting: String { return self._s[1842]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1844]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1845]! } + public var Wallet_Intro_Title: String { return self._s[1846]! } + public var TwoFactorSetup_Password_Action: String { return self._s[1847]! } + public var Profile_MessageLifetime5s: String { return self._s[1848]! } + public var Username_InvalidCharacters: String { return self._s[1849]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1850]! } + public var ScheduledMessages_ClearAll: String { return self._s[1851]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1852]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1853]! } + public var Settings_AddAccount: String { return self._s[1854]! } + public var Notification_CreatedChannel: String { return self._s[1857]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1843]!, self._r[1843]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1858]!, self._r[1858]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1845]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1846]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1847]! } - public var Contacts_TopSection: String { return self._s[1848]! } - public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[1849]! } + public var Passcode_AppLockedAlert: String { return self._s[1860]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1861]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1862]! } + public var Contacts_TopSection: String { return self._s[1863]! } + public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[1864]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1850]!, self._r[1850]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1865]!, self._r[1865]!, [_0, _1]) } - public var Wallet_Info_Receive: String { return self._s[1851]! } - public var Wallet_Completed_ViewWallet: String { return self._s[1852]! } + public var Wallet_Info_Receive: String { return self._s[1866]! } + public var Wallet_Completed_ViewWallet: String { return self._s[1867]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1853]!, self._r[1853]!, [_0]) + return formatWithArgumentRanges(self._s[1868]!, self._r[1868]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1854]! } - public var UserInfo_TapToCall: String { return self._s[1855]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1857]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1858]! } - public var Common_Search: String { return self._s[1859]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1860]! } + public var ReportPeer_ReasonSpam: String { return self._s[1869]! } + public var UserInfo_TapToCall: String { return self._s[1870]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1872]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1873]! } + public var Common_Search: String { return self._s[1874]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1875]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1861]!, self._r[1861]!, [_0]) + return formatWithArgumentRanges(self._s[1876]!, self._r[1876]!, [_0]) } - public var Wallet_Month_ShortJuly: String { return self._s[1862]! } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1863]! } - public var Message_InvoiceLabel: String { return self._s[1864]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1865]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1866]! } + public var Wallet_Month_ShortJuly: String { return self._s[1877]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1878]! } + public var Message_InvoiceLabel: String { return self._s[1879]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1880]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1881]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1867]!, self._r[1867]!, [_0]) + return formatWithArgumentRanges(self._s[1882]!, self._r[1882]!, [_0]) } - public var Conversation_Info: String { return self._s[1868]! } - public var Login_InfoDeletePhoto: String { return self._s[1869]! } - public var Passport_Language_vi: String { return self._s[1871]! } - public var UserInfo_ScamUserWarning: String { return self._s[1872]! } - public var Conversation_Search: String { return self._s[1873]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1875]! } - public var ReportPeer_ReasonPornography: String { return self._s[1876]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1877]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1878]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1879]! } - public var Channel_Setup_TypeHeader: String { return self._s[1880]! } - public var AuthSessions_LoggedIn: String { return self._s[1881]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1882]! } - public var Login_SmsRequestState3: String { return self._s[1883]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1884]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1885]! } - public var Join_ChannelsTooMuch: String { return self._s[1886]! } - public var Channel_Edit_LinkItem: String { return self._s[1887]! } - public var Privacy_Calls_P2PNever: String { return self._s[1888]! } - public var Conversation_AddToReadingList: String { return self._s[1890]! } - public var Share_MultipleMessagesDisabled: String { return self._s[1891]! } - public var Message_Animation: String { return self._s[1892]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1893]! } - public var Map_Unknown: String { return self._s[1894]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1895]! } + public var Conversation_Info: String { return self._s[1883]! } + public var Login_InfoDeletePhoto: String { return self._s[1884]! } + public var Passport_Language_vi: String { return self._s[1886]! } + public var UserInfo_ScamUserWarning: String { return self._s[1887]! } + public var Conversation_Search: String { return self._s[1888]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1890]! } + public var ReportPeer_ReasonPornography: String { return self._s[1891]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1892]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1893]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1894]! } + public var Channel_Setup_TypeHeader: String { return self._s[1895]! } + public var AuthSessions_LoggedIn: String { return self._s[1896]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1897]! } + public var Login_SmsRequestState3: String { return self._s[1898]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1899]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1900]! } + public var Join_ChannelsTooMuch: String { return self._s[1901]! } + public var Channel_Edit_LinkItem: String { return self._s[1902]! } + public var Privacy_Calls_P2PNever: String { return self._s[1903]! } + public var Conversation_AddToReadingList: String { return self._s[1905]! } + public var Share_MultipleMessagesDisabled: String { return self._s[1906]! } + public var Message_Animation: String { return self._s[1907]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1908]! } + public var Map_Unknown: String { return self._s[1909]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1910]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1896]!, self._r[1896]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1911]!, self._r[1911]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1897]!, self._r[1897]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1912]!, self._r[1912]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[1898]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1899]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1900]! } + public var Call_StatusRequesting: String { return self._s[1913]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1914]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1915]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1901]!, self._r[1901]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1916]!, self._r[1916]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1902]!, self._r[1902]!, [_0]) + return formatWithArgumentRanges(self._s[1917]!, self._r[1917]!, [_0]) } - public var Update_Skip: String { return self._s[1903]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1904]! } - public var Message_PinnedPollMessage: String { return self._s[1905]! } - public var BlockedUsers_Title: String { return self._s[1906]! } + public var Update_Skip: String { return self._s[1918]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1919]! } + public var Message_PinnedPollMessage: String { return self._s[1920]! } + public var BlockedUsers_Title: String { return self._s[1921]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1907]!, self._r[1907]!, [_1]) + return formatWithArgumentRanges(self._s[1922]!, self._r[1922]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1908]! } - public var NotificationsSound_Bell: String { return self._s[1909]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1910]! } - public var Weekday_Monday: String { return self._s[1911]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1912]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1913]! } - public var ChatSettings_Groups: String { return self._s[1914]! } + public var Username_CheckingUsername: String { return self._s[1923]! } + public var NotificationsSound_Bell: String { return self._s[1924]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1925]! } + public var Weekday_Monday: String { return self._s[1926]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1927]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1928]! } + public var ChatSettings_Groups: String { return self._s[1929]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1915]!, self._r[1915]!, [_0]) - } - public var Your_card_was_declined: String { return self._s[1916]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1918]! } - public var Wallet_Month_ShortApril: String { return self._s[1919]! } - public var ChatList_Unmute: String { return self._s[1920]! } - public var PhotoEditor_CurvesAll: String { return self._s[1921]! } - public var Weekday_ShortTuesday: String { return self._s[1922]! } - public var DialogList_Read: String { return self._s[1923]! } - public var Appearance_AppIconClassic: String { return self._s[1924]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1925]! } - public var Passport_Identity_Gender: String { return self._s[1926]! } - public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1927]!, self._r[1927]!, [_0]) - } - public var Target_SelectGroup: String { return self._s[1928]! } - public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1930]!, self._r[1930]!, [_0]) } - public var Passport_Language_en: String { return self._s[1931]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1932]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1933]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1934]! } - public var ScheduledMessages_SendNow: String { return self._s[1935]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1937]! } - public var Login_InfoHelp: String { return self._s[1938]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1939]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1940]! } + public var Your_card_was_declined: String { return self._s[1931]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1933]! } + public var Wallet_Month_ShortApril: String { return self._s[1934]! } + public var ChatList_Unmute: String { return self._s[1935]! } + public var PhotoEditor_CurvesAll: String { return self._s[1936]! } + public var Weekday_ShortTuesday: String { return self._s[1937]! } + public var DialogList_Read: String { return self._s[1938]! } + public var Appearance_AppIconClassic: String { return self._s[1939]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1940]! } + public var Passport_Identity_Gender: String { return self._s[1941]! } + public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1942]!, self._r[1942]!, [_0]) + } + public var Target_SelectGroup: String { return self._s[1943]! } + public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1945]!, self._r[1945]!, [_0]) + } + public var Passport_Language_en: String { return self._s[1946]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1947]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1948]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1949]! } + public var ScheduledMessages_SendNow: String { return self._s[1950]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1952]! } + public var Login_InfoHelp: String { return self._s[1953]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1954]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1955]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1941]!, self._r[1941]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1956]!, self._r[1956]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1944]! } - public var CreatePoll_Title: String { return self._s[1945]! } - public var Conversation_ViewTheme: String { return self._s[1946]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1947]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1948]! } - public var UserInfo_GroupsInCommon: String { return self._s[1949]! } - public var Call_AudioRouteHide: String { return self._s[1950]! } + public var SocksProxySetup_AddProxy: String { return self._s[1959]! } + public var CreatePoll_Title: String { return self._s[1960]! } + public var Conversation_ViewTheme: String { return self._s[1961]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1962]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1963]! } + public var TwoFactorSetup_Intro_Text: String { return self._s[1964]! } + public var UserInfo_GroupsInCommon: String { return self._s[1965]! } + public var Call_AudioRouteHide: String { return self._s[1966]! } public func Wallet_Info_TransactionDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1952]!, self._r[1952]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1968]!, self._r[1968]!, [_1, _2]) } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1953]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1969]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1954]!, self._r[1954]!, [_0]) + return formatWithArgumentRanges(self._s[1970]!, self._r[1970]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1955]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1956]! } - public var Notifications_Title: String { return self._s[1957]! } - public var Group_Username_InvalidTooShort: String { return self._s[1958]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1959]! } + public var TextFormat_Bold: String { return self._s[1971]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1972]! } + public var Notifications_Title: String { return self._s[1973]! } + public var Group_Username_InvalidTooShort: String { return self._s[1974]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1975]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1960]!, self._r[1960]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1976]!, self._r[1976]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[1962]! } - public var Stickers_SuggestAdded: String { return self._s[1963]! } - public var Login_CountryCode: String { return self._s[1964]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1965]! } - public var Map_GetDirections: String { return self._s[1966]! } - public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[1967]! } - public var Login_PhoneFloodError: String { return self._s[1968]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[1978]! } + public var Stickers_SuggestAdded: String { return self._s[1979]! } + public var Login_CountryCode: String { return self._s[1980]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1981]! } + public var Map_GetDirections: String { return self._s[1982]! } + public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[1983]! } + public var Login_PhoneFloodError: String { return self._s[1984]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1969]!, self._r[1969]!, [_0]) + return formatWithArgumentRanges(self._s[1985]!, self._r[1985]!, [_0]) } public func Wallet_Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1970]!, self._r[1970]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1986]!, self._r[1986]!, [_1, _2, _3]) } - public var Settings_SetUsername: String { return self._s[1972]! } - public var Group_Location_ChangeLocation: String { return self._s[1973]! } - public var Notification_GroupInviterSelf: String { return self._s[1974]! } - public var InstantPage_TapToOpenLink: String { return self._s[1975]! } + public var Settings_SetUsername: String { return self._s[1988]! } + public var Group_Location_ChangeLocation: String { return self._s[1989]! } + public var Notification_GroupInviterSelf: String { return self._s[1990]! } + public var InstantPage_TapToOpenLink: String { return self._s[1991]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1976]!, self._r[1976]!, [_0]) + return formatWithArgumentRanges(self._s[1992]!, self._r[1992]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1977]! } - public var SecretChat_Title: String { return self._s[1978]! } - public var Group_UpgradeNoticeText1: String { return self._s[1979]! } - public var AuthSessions_Title: String { return self._s[1980]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1993]! } + public var SecretChat_Title: String { return self._s[1994]! } + public var Group_UpgradeNoticeText1: String { return self._s[1995]! } + public var AuthSessions_Title: String { return self._s[1996]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1981]!, self._r[1981]!, [_0]) + return formatWithArgumentRanges(self._s[1997]!, self._r[1997]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1982]! } - public var Channel_About_Title: String { return self._s[1983]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1984]! } + public var PhotoEditor_CropAuto: String { return self._s[1998]! } + public var Channel_About_Title: String { return self._s[1999]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[2000]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1986]!, self._r[1986]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2002]!, self._r[2002]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[1987]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1989]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1990]! } + public var VoiceOver_MessageContextReport: String { return self._s[2003]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[2005]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[2006]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1991]!, self._r[1991]!, [_1]) + return formatWithArgumentRanges(self._s[2007]!, self._r[2007]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1993]!, self._r[1993]!, [_0]) - } - public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1994]!, self._r[1994]!, [_0]) - } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1995]! } - public var Presence_online: String { return self._s[1998]! } - public var PasscodeSettings_Title: String { return self._s[1999]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[2000]! } - public var Web_OpenExternal: String { return self._s[2001]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[2003]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[2004]! } - public var LocalGroup_Title: String { return self._s[2005]! } - public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2006]!, self._r[2006]!, [_0]) - } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2007]! } - public var Map_YouAreHere: String { return self._s[2008]! } - public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2009]!, self._r[2009]!, [_0]) } - public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { + public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2010]!, self._r[2010]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2011]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2012]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[2011]! } + public var Presence_online: String { return self._s[2014]! } + public var PasscodeSettings_Title: String { return self._s[2015]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[2016]! } + public var Web_OpenExternal: String { return self._s[2017]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[2019]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[2020]! } + public var LocalGroup_Title: String { return self._s[2021]! } + public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2022]!, self._r[2022]!, [_0]) + } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2023]! } + public var Map_YouAreHere: String { return self._s[2024]! } + public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2025]!, self._r[2025]!, [_0]) + } + public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2026]!, self._r[2026]!, [_0]) + } + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2027]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2028]! } public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2013]!, self._r[2013]!, [_0]) + return formatWithArgumentRanges(self._s[2029]!, self._r[2029]!, [_0]) } public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2014]!, self._r[2014]!, [_0]) + return formatWithArgumentRanges(self._s[2030]!, self._r[2030]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[2015]! } - public var Bot_Start: String { return self._s[2016]! } + public var SocksProxySetup_Username: String { return self._s[2031]! } + public var Bot_Start: String { return self._s[2032]! } public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2017]!, self._r[2017]!, [_0]) + return formatWithArgumentRanges(self._s[2033]!, self._r[2033]!, [_0]) } public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2018]!, self._r[2018]!, [_0]) + return formatWithArgumentRanges(self._s[2034]!, self._r[2034]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[2019]! } - public var AccentColor_Title: String { return self._s[2021]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2022]! } + public var Contacts_SortByPresence: String { return self._s[2035]! } + public var AccentColor_Title: String { return self._s[2037]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2038]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2023]!, self._r[2023]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2039]!, self._r[2039]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2024]!, self._r[2024]!, [_0]) + return formatWithArgumentRanges(self._s[2040]!, self._r[2040]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2025]!, self._r[2025]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2041]!, self._r[2041]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[2026]! } - public var Login_InfoAvatarPhoto: String { return self._s[2027]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2028]! } - public var Tour_Title4: String { return self._s[2029]! } - public var Passport_Identity_Translation: String { return self._s[2030]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[2031]! } - public var Login_TermsOfServiceLabel: String { return self._s[2033]! } - public var Passport_Language_it: String { return self._s[2034]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[2035]! } - public var Passport_Identity_SelfieHelp: String { return self._s[2036]! } - public var Conversation_ClearAll: String { return self._s[2038]! } - public var Wallet_Send_UninitializedText: String { return self._s[2040]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[2041]! } - public var TwoStepAuth_FloodError: String { return self._s[2042]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[2042]! } + public var Login_InfoAvatarPhoto: String { return self._s[2043]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2044]! } + public var Tour_Title4: String { return self._s[2045]! } + public var Passport_Identity_Translation: String { return self._s[2046]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[2047]! } + public var Login_TermsOfServiceLabel: String { return self._s[2049]! } + public var Passport_Language_it: String { return self._s[2050]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[2051]! } + public var Passport_Identity_SelfieHelp: String { return self._s[2052]! } + public var Conversation_ClearAll: String { return self._s[2054]! } + public var Wallet_Send_UninitializedText: String { return self._s[2056]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[2057]! } + public var TwoStepAuth_FloodError: String { return self._s[2058]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2043]!, self._r[2043]!, [_1]) + return formatWithArgumentRanges(self._s[2059]!, self._r[2059]!, [_1]) } - public var Paint_Delete: String { return self._s[2044]! } + public var Paint_Delete: String { return self._s[2060]! } public func Wallet_Sent_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2045]!, self._r[2045]!, [_0]) + return formatWithArgumentRanges(self._s[2061]!, self._r[2061]!, [_0]) } - public var Privacy_AddNewPeer: String { return self._s[2046]! } + public var Privacy_AddNewPeer: String { return self._s[2062]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2047]!, self._r[2047]!, [_1]) + return formatWithArgumentRanges(self._s[2063]!, self._r[2063]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[2048]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[2064]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2049]!, self._r[2049]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2065]!, self._r[2065]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[2050]! } + public var Message_PinnedAudioMessage: String { return self._s[2066]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2051]!, self._r[2051]!, [_0]) + return formatWithArgumentRanges(self._s[2067]!, self._r[2067]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[2052]! } - public var Notifications_GroupNotificationsSound: String { return self._s[2053]! } - public var Wallet_Month_GenNovember: String { return self._s[2054]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[2055]! } - public var Conversation_MessageEditedLabel: String { return self._s[2056]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[2057]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[2058]! } + public var Notification_Mute1hMin: String { return self._s[2068]! } + public var Notifications_GroupNotificationsSound: String { return self._s[2069]! } + public var Wallet_Month_GenNovember: String { return self._s[2070]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[2071]! } + public var Conversation_MessageEditedLabel: String { return self._s[2072]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[2073]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[2074]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2059]!, self._r[2059]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[2075]!, self._r[2075]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[2060]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[2076]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2061]!, self._r[2061]!, [_1]) + return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[2062]! } - public var Month_GenOctober: String { return self._s[2063]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[2064]! } - public var EnterPasscode_EnterPasscode: String { return self._s[2065]! } - public var MediaPicker_TimerTooltip: String { return self._s[2067]! } - public var SharedMedia_TitleAll: String { return self._s[2068]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[2071]! } - public var Conversation_RestrictedMedia: String { return self._s[2072]! } - public var AccessDenied_PhotosRestricted: String { return self._s[2073]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[2075]! } - public var ChangePhoneNumberCode_Called: String { return self._s[2076]! } + public var AccessDenied_LocationTracking: String { return self._s[2078]! } + public var Month_GenOctober: String { return self._s[2079]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[2080]! } + public var EnterPasscode_EnterPasscode: String { return self._s[2081]! } + public var MediaPicker_TimerTooltip: String { return self._s[2083]! } + public var SharedMedia_TitleAll: String { return self._s[2084]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[2087]! } + public var Conversation_RestrictedMedia: String { return self._s[2088]! } + public var AccessDenied_PhotosRestricted: String { return self._s[2089]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[2091]! } + public var ChangePhoneNumberCode_Called: String { return self._s[2092]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_0]) + return formatWithArgumentRanges(self._s[2093]!, self._r[2093]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[2080]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[2082]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[2083]! } + public var Conversation_SavedMessages: String { return self._s[2096]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[2098]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[2099]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2085]!, self._r[2085]!, [_0]) + return formatWithArgumentRanges(self._s[2101]!, self._r[2101]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[2086]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[2102]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2087]!, self._r[2087]!, [_0]) + return formatWithArgumentRanges(self._s[2103]!, self._r[2103]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[2088]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2089]! } + public var ReportPeer_AlertSuccess: String { return self._s[2104]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2105]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2090]!, self._r[2090]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2106]!, self._r[2106]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[2091]! } - public var PhotoEditor_FadeTool: String { return self._s[2092]! } - public var Privacy_ContactsReset: String { return self._s[2093]! } + public var Checkout_PasswordEntry_Title: String { return self._s[2107]! } + public var PhotoEditor_FadeTool: String { return self._s[2108]! } + public var Privacy_ContactsReset: String { return self._s[2109]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2095]!, self._r[2095]!, [_0]) + return formatWithArgumentRanges(self._s[2111]!, self._r[2111]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[2096]! } - public var ChatList_Mute: String { return self._s[2097]! } + public var Message_PinnedVideoMessage: String { return self._s[2112]! } + public var ChatList_Mute: String { return self._s[2113]! } public func Wallet_Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2098]!, self._r[2098]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_1, _2, _3]) } - public var Permissions_CellularDataText_v0: String { return self._s[2099]! } - public var ShareMenu_SelectChats: String { return self._s[2102]! } - public var ChatList_Context_Unarchive: String { return self._s[2103]! } - public var MusicPlayer_VoiceNote: String { return self._s[2104]! } - public var Conversation_RestrictedText: String { return self._s[2105]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2106]! } - public var Wallet_Month_GenApril: String { return self._s[2107]! } - public var Wallet_Month_ShortMarch: String { return self._s[2108]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[2109]! } - public var Cache_Videos: String { return self._s[2110]! } - public var PrivacySettings_PhoneNumber: String { return self._s[2111]! } - public var Wallet_Month_GenFebruary: String { return self._s[2112]! } - public var FeatureDisabled_Oops: String { return self._s[2114]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[2115]! } + public var Permissions_CellularDataText_v0: String { return self._s[2115]! } + public var ShareMenu_SelectChats: String { return self._s[2118]! } + public var ChatList_Context_Unarchive: String { return self._s[2119]! } + public var MusicPlayer_VoiceNote: String { return self._s[2120]! } + public var Conversation_RestrictedText: String { return self._s[2121]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2122]! } + public var Wallet_Month_GenApril: String { return self._s[2123]! } + public var Wallet_Month_ShortMarch: String { return self._s[2124]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[2125]! } + public var Cache_Videos: String { return self._s[2126]! } + public var PrivacySettings_PhoneNumber: String { return self._s[2127]! } + public var Wallet_Month_GenFebruary: String { return self._s[2128]! } + public var FeatureDisabled_Oops: String { return self._s[2130]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[2131]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2116]!, self._r[2116]!, [_0]) + return formatWithArgumentRanges(self._s[2132]!, self._r[2132]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[2117]! } - public var GroupPermission_NoSendPolls: String { return self._s[2118]! } - public var Wallet_Qr_ScanCode: String { return self._s[2119]! } - public var Message_VideoExpired: String { return self._s[2121]! } - public var Notifications_Badge: String { return self._s[2122]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[2123]! } - public var Wallet_Receive_AddressCopied: String { return self._s[2124]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[2125]! } - public var Username_InvalidTooShort: String { return self._s[2126]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2127]! } - public var Channel_AdminLog_PinMessages: String { return self._s[2128]! } - public var ArchivedChats_IntroTitle3: String { return self._s[2129]! } + public var Stickers_GroupStickersHelp: String { return self._s[2133]! } + public var GroupPermission_NoSendPolls: String { return self._s[2134]! } + public var Wallet_Qr_ScanCode: String { return self._s[2135]! } + public var Message_VideoExpired: String { return self._s[2137]! } + public var Notifications_Badge: String { return self._s[2138]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[2139]! } + public var Wallet_Receive_AddressCopied: String { return self._s[2140]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[2141]! } + public var Username_InvalidTooShort: String { return self._s[2142]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2143]! } + public var Channel_AdminLog_PinMessages: String { return self._s[2144]! } + public var ArchivedChats_IntroTitle3: String { return self._s[2145]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2130]!, self._r[2130]!, [_1]) + return formatWithArgumentRanges(self._s[2146]!, self._r[2146]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[2131]! } - public var Conversation_DefaultRestrictedText: String { return self._s[2132]! } - public var SharedMedia_CategoryDocs: String { return self._s[2135]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[2147]! } + public var Conversation_DefaultRestrictedText: String { return self._s[2148]! } + public var SharedMedia_CategoryDocs: String { return self._s[2151]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2136]!, self._r[2136]!, [_1]) + return formatWithArgumentRanges(self._s[2152]!, self._r[2152]!, [_1]) } - public var Wallet_Send_UninitializedTitle: String { return self._s[2137]! } - public var Privacy_Forwards_NeverLink: String { return self._s[2139]! } + public var Wallet_Send_UninitializedTitle: String { return self._s[2153]! } + public var Privacy_Forwards_NeverLink: String { return self._s[2155]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2140]!, self._r[2140]!, [_1]) + return formatWithArgumentRanges(self._s[2156]!, self._r[2156]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2141]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2157]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2142]!, self._r[2142]!, [_0]) + return formatWithArgumentRanges(self._s[2158]!, self._r[2158]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[2143]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2144]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[2145]! } - public var Channel_UpdatePhotoItem: String { return self._s[2146]! } - public var GroupInfo_LeftStatus: String { return self._s[2147]! } - public var Watch_MessageView_Forward: String { return self._s[2149]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[2150]! } - public var Cache_ClearEmpty: String { return self._s[2152]! } - public var Localization_LanguageName: String { return self._s[2153]! } - public var WebSearch_GIFs: String { return self._s[2154]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2155]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2156]! } - public var Common_Back: String { return self._s[2157]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2158]! } - public var Wallet_Send_Send: String { return self._s[2159]! } + public var ChatSettings_PrivateChats: String { return self._s[2159]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2160]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[2161]! } + public var Channel_UpdatePhotoItem: String { return self._s[2162]! } + public var GroupInfo_LeftStatus: String { return self._s[2163]! } + public var Watch_MessageView_Forward: String { return self._s[2165]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2166]! } + public var Cache_ClearEmpty: String { return self._s[2168]! } + public var Localization_LanguageName: String { return self._s[2169]! } + public var WebSearch_GIFs: String { return self._s[2170]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2171]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2172]! } + public var Common_Back: String { return self._s[2173]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2174]! } + public var Wallet_Send_Send: String { return self._s[2175]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2160]!, self._r[2160]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2176]!, self._r[2176]!, [_1, _2]) } - public var Wallet_Info_RefreshErrorTitle: String { return self._s[2161]! } - public var Wallet_Month_GenJune: String { return self._s[2162]! } - public var Passport_Email_Help: String { return self._s[2163]! } - public var Watch_Conversation_Reply: String { return self._s[2165]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2167]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2168]! } - public var Channel_BanUser_Unban: String { return self._s[2170]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2171]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2172]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2174]! } - public var Wallet_Send_AddressHeader: String { return self._s[2175]! } - public var Passport_Identity_Name: String { return self._s[2176]! } + public var Wallet_Info_RefreshErrorTitle: String { return self._s[2177]! } + public var Wallet_Month_GenJune: String { return self._s[2178]! } + public var Passport_Email_Help: String { return self._s[2179]! } + public var Watch_Conversation_Reply: String { return self._s[2181]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2183]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2184]! } + public var Channel_BanUser_Unban: String { return self._s[2186]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2187]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2188]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2190]! } + public var Wallet_Send_AddressHeader: String { return self._s[2191]! } + public var Passport_Identity_Name: String { return self._s[2192]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2177]!, self._r[2177]!, [_0]) + return formatWithArgumentRanges(self._s[2193]!, self._r[2193]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2178]! } - public var Conversation_BlockUser: String { return self._s[2179]! } - public var Month_GenJanuary: String { return self._s[2180]! } - public var ChatSettings_TextSize: String { return self._s[2181]! } - public var Notification_PassportValuePhone: String { return self._s[2182]! } - public var Passport_Language_ne: String { return self._s[2183]! } - public var Notification_CallBack: String { return self._s[2184]! } - public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2185]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2186]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2194]! } + public var Conversation_BlockUser: String { return self._s[2195]! } + public var Month_GenJanuary: String { return self._s[2196]! } + public var ChatSettings_TextSize: String { return self._s[2197]! } + public var Notification_PassportValuePhone: String { return self._s[2198]! } + public var Passport_Language_ne: String { return self._s[2199]! } + public var Notification_CallBack: String { return self._s[2200]! } + public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2201]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2202]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2187]!, self._r[2187]!, [_0]) + return formatWithArgumentRanges(self._s[2203]!, self._r[2203]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2188]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2189]! } - public var Stickers_FrequentlyUsed: String { return self._s[2190]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2191]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2193]! } + public var Channel_Info_Management: String { return self._s[2204]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2205]! } + public var Stickers_FrequentlyUsed: String { return self._s[2206]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2207]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2209]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2194]!, self._r[2194]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2210]!, self._r[2210]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[2195]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2196]! } - public var CreatePoll_TextHeader: String { return self._s[2197]! } + public var TwoFactorSetup_Password_Title: String { return self._s[2211]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2212]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2213]! } + public var CreatePoll_TextHeader: String { return self._s[2214]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2198]!, self._r[2198]!, [_0]) + return formatWithArgumentRanges(self._s[2215]!, self._r[2215]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2199]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2200]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2202]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2203]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2204]! } + public var PhotoEditor_QualityMedium: String { return self._s[2216]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2217]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2219]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2220]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2221]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2205]!, self._r[2205]!, [_0]) + return formatWithArgumentRanges(self._s[2222]!, self._r[2222]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2206]!, self._r[2206]!, [_1]) + return formatWithArgumentRanges(self._s[2223]!, self._r[2223]!, [_1]) } - public var LogoutOptions_LogOutWalletInfo: String { return self._s[2207]! } - public var Conversation_LinkDialogOpen: String { return self._s[2209]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2210]! } - public var Settings_Username: String { return self._s[2212]! } - public var Conversation_Block: String { return self._s[2214]! } - public var Wallpaper_Wallpaper: String { return self._s[2215]! } - public var SocksProxySetup_UseProxy: String { return self._s[2217]! } - public var Wallet_Send_Confirmation: String { return self._s[2218]! } - public var EditTheme_UploadEditedTheme: String { return self._s[2219]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2220]! } - public var MessageTimer_Forever: String { return self._s[2221]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2222]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2223]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2224]! } - public var Passport_Language_da: String { return self._s[2225]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2226]! } + public var LogoutOptions_LogOutWalletInfo: String { return self._s[2224]! } + public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[2225]! } + public var Conversation_LinkDialogOpen: String { return self._s[2227]! } + public var TwoFactorSetup_Hint_Title: String { return self._s[2228]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2229]! } + public var Settings_Username: String { return self._s[2231]! } + public var Conversation_Block: String { return self._s[2233]! } + public var Wallpaper_Wallpaper: String { return self._s[2234]! } + public var SocksProxySetup_UseProxy: String { return self._s[2236]! } + public var Wallet_Send_Confirmation: String { return self._s[2237]! } + public var EditTheme_UploadEditedTheme: String { return self._s[2238]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2239]! } + public var MessageTimer_Forever: String { return self._s[2240]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2241]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2242]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2243]! } + public var Passport_Language_da: String { return self._s[2244]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2245]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2227]!, self._r[2227]!, [_0]) + return formatWithArgumentRanges(self._s[2246]!, self._r[2246]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[2228]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2247]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2230]!, self._r[2230]!, [_0]) + return formatWithArgumentRanges(self._s[2249]!, self._r[2249]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2232]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2233]! } - public var Conversation_PinnedPoll: String { return self._s[2234]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2235]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2251]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2252]! } + public var Conversation_PinnedPoll: String { return self._s[2253]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2254]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2236]!, self._r[2236]!, [_1]) + return formatWithArgumentRanges(self._s[2255]!, self._r[2255]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2237]! } - public var Cache_ByPeerHeader: String { return self._s[2238]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2256]! } + public var Cache_ByPeerHeader: String { return self._s[2257]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2239]!, self._r[2239]!, [_0]) + return formatWithArgumentRanges(self._s[2258]!, self._r[2258]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2240]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2243]! } - public var Wallet_Completed_Title: String { return self._s[2244]! } - public var Notification_PinnedMessage: String { return self._s[2245]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2247]! } - public var Contacts_SortBy: String { return self._s[2248]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2259]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2262]! } + public var Wallet_Completed_Title: String { return self._s[2263]! } + public var Notification_PinnedMessage: String { return self._s[2264]! } + public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[2265]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2267]! } + public var Contacts_SortBy: String { return self._s[2268]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2249]!, self._r[2249]!, [_1]) + return formatWithArgumentRanges(self._s[2269]!, self._r[2269]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2251]!, self._r[2251]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2271]!, self._r[2271]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2252]! } - public var Watch_UserInfo_Service: String { return self._s[2253]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2255]! } - public var Conversation_Unpin: String { return self._s[2257]! } - public var CancelResetAccount_Title: String { return self._s[2258]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2259]! } + public var Call_EncryptionKey_Title: String { return self._s[2272]! } + public var Watch_UserInfo_Service: String { return self._s[2273]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2275]! } + public var Conversation_Unpin: String { return self._s[2277]! } + public var CancelResetAccount_Title: String { return self._s[2278]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2279]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2261]!, self._r[2261]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2281]!, self._r[2281]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2262]! } - public var CallSettings_Title: String { return self._s[2263]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2264]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2266]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2267]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2282]! } + public var CallSettings_Title: String { return self._s[2283]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2284]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2286]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2287]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2268]!, self._r[2268]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2288]!, self._r[2288]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2269]! } - public var LoginPassword_PasswordHelp: String { return self._s[2270]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2271]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2272]! } - public var Checkout_TotalPaidAmount: String { return self._s[2273]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2289]! } + public var LoginPassword_PasswordHelp: String { return self._s[2290]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2291]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2292]! } + public var Checkout_TotalPaidAmount: String { return self._s[2293]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2274]!, self._r[2274]!, [_0]) + return formatWithArgumentRanges(self._s[2294]!, self._r[2294]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2275]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2277]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2278]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2295]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2297]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2298]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2279]!, self._r[2279]!, [_1]) + return formatWithArgumentRanges(self._s[2299]!, self._r[2299]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2280]! } - public var Contacts_InviteFriends: String { return self._s[2282]! } - public var Map_ChooseLocationTitle: String { return self._s[2283]! } - public var Conversation_StopPoll: String { return self._s[2285]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2300]! } + public var Contacts_InviteFriends: String { return self._s[2302]! } + public var Map_ChooseLocationTitle: String { return self._s[2303]! } + public var Conversation_StopPoll: String { return self._s[2305]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2286]!, self._r[2286]!, [_0]) + return formatWithArgumentRanges(self._s[2306]!, self._r[2306]!, [_0]) } - public var Call_Camera: String { return self._s[2287]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2288]! } - public var Calls_RatingFeedback: String { return self._s[2289]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2290]! } - public var Wallet_Alert_OK: String { return self._s[2291]! } - public var NotificationsSound_Pulse: String { return self._s[2292]! } - public var Watch_LastSeen_Lately: String { return self._s[2293]! } - public var ReportGroupLocation_Report: String { return self._s[2296]! } - public var Widget_NoUsers: String { return self._s[2297]! } - public var Conversation_UnvotePoll: String { return self._s[2298]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2300]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2301]! } - public var NotificationsSound_Circles: String { return self._s[2302]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2305]! } - public var Wallet_Settings_DeleteWallet: String { return self._s[2306]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2307]! } - public var Proxy_TooltipUnavailable: String { return self._s[2308]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2310]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2312]! } - public var Conversation_FileDropbox: String { return self._s[2313]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2314]! } - public var Tour_Text3: String { return self._s[2316]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2318]! } - public var GroupPermission_NoSendMessages: String { return self._s[2319]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2320]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2321]! } + public var Call_Camera: String { return self._s[2307]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2308]! } + public var Calls_RatingFeedback: String { return self._s[2309]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2310]! } + public var Wallet_Alert_OK: String { return self._s[2311]! } + public var NotificationsSound_Pulse: String { return self._s[2312]! } + public var Watch_LastSeen_Lately: String { return self._s[2313]! } + public var ReportGroupLocation_Report: String { return self._s[2316]! } + public var Widget_NoUsers: String { return self._s[2317]! } + public var Conversation_UnvotePoll: String { return self._s[2318]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2320]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2321]! } + public var NotificationsSound_Circles: String { return self._s[2322]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2325]! } + public var Wallet_Settings_DeleteWallet: String { return self._s[2326]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2327]! } + public var Proxy_TooltipUnavailable: String { return self._s[2328]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2330]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2332]! } + public var Conversation_FileDropbox: String { return self._s[2333]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2334]! } + public var Tour_Text3: String { return self._s[2336]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2338]! } + public var GroupPermission_NoSendMessages: String { return self._s[2339]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2340]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2341]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2323]!, self._r[2323]!, [_0]) + return formatWithArgumentRanges(self._s[2343]!, self._r[2343]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2324]! } - public var Checkout_ShippingOption_Title: String { return self._s[2325]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2326]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2344]! } + public var Checkout_ShippingOption_Title: String { return self._s[2345]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2346]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2327]!, self._r[2327]!, [_0]) + return formatWithArgumentRanges(self._s[2347]!, self._r[2347]!, [_0]) } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2328]!, self._r[2328]!, [_0]) + return formatWithArgumentRanges(self._s[2348]!, self._r[2348]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2329]! } - public var EditTheme_FileReadError: String { return self._s[2330]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2331]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2332]! } - public var AutoDownloadSettings_Photos: String { return self._s[2334]! } - public var Appearance_PreviewIncomingText: String { return self._s[2335]! } - public var ChatList_Context_MarkAllAsRead: String { return self._s[2336]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2337]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2338]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2339]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2340]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2341]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2342]! } - public var Notification_SecretChatScreenshot: String { return self._s[2343]! } - public var AccessDenied_Wallpapers: String { return self._s[2344]! } - public var ChatList_Context_Mute: String { return self._s[2346]! } - public var Passport_Address_City: String { return self._s[2347]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2348]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2349]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2350]! } - public var AccessDenied_LocationDisabled: String { return self._s[2351]! } - public var Group_Location_Title: String { return self._s[2352]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2354]! } - public var GroupInfo_Sound: String { return self._s[2355]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2356]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2357]! } - public var Contacts_Title: String { return self._s[2358]! } - public var EditTheme_ThemeTemplateAlertText: String { return self._s[2359]! } - public var Passport_Language_fr: String { return self._s[2360]! } - public var Notifications_ResetAllNotifications: String { return self._s[2361]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2364]! } - public var Checkout_NewCard_Title: String { return self._s[2365]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2366]! } - public var Conversation_ForwardChats: String { return self._s[2367]! } - public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[2369]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2370]! } - public var Settings_FAQ: String { return self._s[2372]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2373]! } - public var Conversation_ContextMenuForward: String { return self._s[2374]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2377]! } - public var PrivacyPolicy_Title: String { return self._s[2380]! } - public var Notifications_TextTone: String { return self._s[2381]! } - public var Profile_CreateNewContact: String { return self._s[2382]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2383]! } - public var Call_Speaker: String { return self._s[2385]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2386]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2388]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2389]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2349]! } + public var EditTheme_FileReadError: String { return self._s[2350]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2351]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2352]! } + public var AutoDownloadSettings_Photos: String { return self._s[2354]! } + public var Appearance_PreviewIncomingText: String { return self._s[2355]! } + public var ChatList_Context_MarkAllAsRead: String { return self._s[2356]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2357]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2358]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2359]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2360]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2361]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2362]! } + public var Notification_SecretChatScreenshot: String { return self._s[2363]! } + public var AccessDenied_Wallpapers: String { return self._s[2364]! } + public var ChatList_Context_Mute: String { return self._s[2366]! } + public var Passport_Address_City: String { return self._s[2367]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2368]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2369]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2370]! } + public var AccessDenied_LocationDisabled: String { return self._s[2371]! } + public var Group_Location_Title: String { return self._s[2372]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2374]! } + public var GroupInfo_Sound: String { return self._s[2375]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2376]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2377]! } + public var Contacts_Title: String { return self._s[2378]! } + public var EditTheme_ThemeTemplateAlertText: String { return self._s[2379]! } + public var Passport_Language_fr: String { return self._s[2380]! } + public var TwoFactorSetup_EmailVerification_Action: String { return self._s[2381]! } + public var Notifications_ResetAllNotifications: String { return self._s[2382]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2385]! } + public var Checkout_NewCard_Title: String { return self._s[2386]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2387]! } + public var Conversation_ForwardChats: String { return self._s[2388]! } + public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[2390]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2391]! } + public var Settings_FAQ: String { return self._s[2393]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2394]! } + public var Conversation_ContextMenuForward: String { return self._s[2395]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2398]! } + public var PrivacyPolicy_Title: String { return self._s[2401]! } + public var Notifications_TextTone: String { return self._s[2402]! } + public var Profile_CreateNewContact: String { return self._s[2403]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2404]! } + public var TwoFactorSetup_EmailVerification_Title: String { return self._s[2406]! } + public var Call_Speaker: String { return self._s[2407]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2408]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2410]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2411]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2390]!, self._r[2390]!, [_0]) + return formatWithArgumentRanges(self._s[2412]!, self._r[2412]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2391]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2392]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2393]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2394]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2395]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2396]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2397]! } - public var Bot_Unblock: String { return self._s[2398]! } - public var TextFormat_Italic: String { return self._s[2399]! } - public var WallpaperSearch_ColorPink: String { return self._s[2400]! } - public var Settings_About_Help: String { return self._s[2401]! } - public var SearchImages_Title: String { return self._s[2402]! } - public var Weekday_Wednesday: String { return self._s[2403]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2404]! } - public var ExplicitContent_AlertTitle: String { return self._s[2405]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2413]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2414]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2415]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2416]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2417]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2418]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2419]! } + public var Bot_Unblock: String { return self._s[2420]! } + public var TextFormat_Italic: String { return self._s[2421]! } + public var WallpaperSearch_ColorPink: String { return self._s[2422]! } + public var Settings_About_Help: String { return self._s[2423]! } + public var SearchImages_Title: String { return self._s[2424]! } + public var Weekday_Wednesday: String { return self._s[2425]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2426]! } + public var ExplicitContent_AlertTitle: String { return self._s[2427]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2406]!, self._r[2406]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2428]!, self._r[2428]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2407]! } - public var Weekday_Thursday: String { return self._s[2408]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2409]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2410]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2429]! } + public var Weekday_Thursday: String { return self._s[2430]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2431]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2432]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2411]!, self._r[2411]!, [_0]) - } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2412]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2413]! } - public var Passport_RequestedInformation: String { return self._s[2414]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2415]! } - public var Conversation_EncryptionProcessing: String { return self._s[2417]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2418]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2420]! } - public var Channel_Setup_Title: String { return self._s[2421]! } - public var Conversation_SearchPlaceholder: String { return self._s[2422]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2423]! } - public var Checkout_ErrorGeneric: String { return self._s[2424]! } - public var Passport_Language_hu: String { return self._s[2425]! } - public var Wallet_Month_ShortSeptember: String { return self._s[2426]! } - public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2428]!, self._r[2428]!, [_0]) - } - public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2431]!, self._r[2431]!, [_1]) - } - public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2432]! } - public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2433]!, self._r[2433]!, [_0]) } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2434]! } - public var Group_Location_Info: String { return self._s[2435]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2436]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2437]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2434]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2435]! } + public var Passport_RequestedInformation: String { return self._s[2436]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2437]! } + public var Conversation_EncryptionProcessing: String { return self._s[2439]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2440]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2442]! } + public var Channel_Setup_Title: String { return self._s[2443]! } + public var Conversation_SearchPlaceholder: String { return self._s[2444]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2445]! } + public var Checkout_ErrorGeneric: String { return self._s[2446]! } + public var Passport_Language_hu: String { return self._s[2447]! } + public var Wallet_Month_ShortSeptember: String { return self._s[2448]! } + public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2450]!, self._r[2450]!, [_0]) + } + public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2453]!, self._r[2453]!, [_1]) + } + public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2454]! } + public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2455]!, self._r[2455]!, [_0]) + } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2456]! } + public var Group_Location_Info: String { return self._s[2457]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2458]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2459]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2438]!, self._r[2438]!, [_0]) + return formatWithArgumentRanges(self._s[2460]!, self._r[2460]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2439]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2440]! } - public var Appearance_RemoveThemeConfirmation: String { return self._s[2441]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2442]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2461]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2462]! } + public var Appearance_RemoveThemeConfirmation: String { return self._s[2463]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2464]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2443]!, self._r[2443]!, [_0]) + return formatWithArgumentRanges(self._s[2465]!, self._r[2465]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2444]! } - public var Message_PinnedAnimationMessage: String { return self._s[2446]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2448]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2449]! } - public var Wallet_Info_TransactionTo: String { return self._s[2451]! } - public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[2452]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2453]! } - public var Embed_PlayingInPIP: String { return self._s[2454]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2455]! } + public var Passport_Language_cs: String { return self._s[2466]! } + public var Message_PinnedAnimationMessage: String { return self._s[2468]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2470]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2471]! } + public var Wallet_Info_TransactionTo: String { return self._s[2473]! } + public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[2474]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2475]! } + public var Embed_PlayingInPIP: String { return self._s[2476]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2477]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2456]!, self._r[2456]!, [_0]) + return formatWithArgumentRanges(self._s[2478]!, self._r[2478]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2457]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2479]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2458]!, self._r[2458]!, [_1]) + return formatWithArgumentRanges(self._s[2480]!, self._r[2480]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2459]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2460]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2461]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2462]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2463]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2464]! } + public var Notification_PaymentSent: String { return self._s[2481]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2482]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2483]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2484]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2485]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2486]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2467]!, self._r[2467]!, [_1]) + return formatWithArgumentRanges(self._s[2489]!, self._r[2489]!, [_1]) } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2468]!, self._r[2468]!, [_1]) + return formatWithArgumentRanges(self._s[2490]!, self._r[2490]!, [_1]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2469]!, self._r[2469]!, [_1]) + return formatWithArgumentRanges(self._s[2491]!, self._r[2491]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2471]! } - public var PasscodeSettings_HelpTop: String { return self._s[2472]! } - public var Conversation_WalletRequiredTitle: String { return self._s[2473]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2474]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2475]! } - public var EditTheme_ShortLink: String { return self._s[2476]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2477]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2478]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2479]! } - public var Call_Accept: String { return self._s[2481]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2482]! } - public var Month_GenMarch: String { return self._s[2484]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2485]! } - public var LoginPassword_Title: String { return self._s[2486]! } - public var Call_End: String { return self._s[2487]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2488]! } - public var VoiceOver_Chat_Contact: String { return self._s[2489]! } - public var EditTheme_Create_Preview_IncomingText: String { return self._s[2490]! } - public var CallSettings_Always: String { return self._s[2491]! } - public var CallFeedback_Success: String { return self._s[2492]! } - public var TwoStepAuth_SetupHint: String { return self._s[2493]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2493]! } + public var PasscodeSettings_HelpTop: String { return self._s[2494]! } + public var Conversation_WalletRequiredTitle: String { return self._s[2495]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2496]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2497]! } + public var EditTheme_ShortLink: String { return self._s[2498]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2499]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2500]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2501]! } + public var Call_Accept: String { return self._s[2503]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2504]! } + public var Month_GenMarch: String { return self._s[2506]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2507]! } + public var LoginPassword_Title: String { return self._s[2508]! } + public var Call_End: String { return self._s[2509]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2510]! } + public var VoiceOver_Chat_Contact: String { return self._s[2511]! } + public var EditTheme_Create_Preview_IncomingText: String { return self._s[2512]! } + public var CallSettings_Always: String { return self._s[2513]! } + public var CallFeedback_Success: String { return self._s[2514]! } + public var TwoStepAuth_SetupHint: String { return self._s[2515]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2494]!, self._r[2494]!, [_1]) + return formatWithArgumentRanges(self._s[2516]!, self._r[2516]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2495]! } - public var Login_PhoneTitle: String { return self._s[2496]! } - public var Passport_FieldPhoneHelp: String { return self._s[2497]! } - public var Weekday_ShortSunday: String { return self._s[2498]! } - public var Passport_InfoFAQ_URL: String { return self._s[2499]! } - public var ContactInfo_Job: String { return self._s[2501]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2502]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2503]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2504]! } - public var Invite_ChannelsTooMuch: String { return self._s[2505]! } - public var Wallet_Send_ConfirmationConfirm: String { return self._s[2506]! } - public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2507]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2508]! } - public var Wallet_Receive_AmountText: String { return self._s[2509]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2510]! } - public var CallFeedback_ReasonNoise: String { return self._s[2511]! } - public var Appearance_AppIconDefault: String { return self._s[2513]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2514]! } - public var MediaPicker_AddCaption: String { return self._s[2515]! } - public var CallSettings_TabIconDescription: String { return self._s[2516]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2517]! } + public var Login_PhoneTitle: String { return self._s[2518]! } + public var Passport_FieldPhoneHelp: String { return self._s[2519]! } + public var Weekday_ShortSunday: String { return self._s[2520]! } + public var Passport_InfoFAQ_URL: String { return self._s[2521]! } + public var ContactInfo_Job: String { return self._s[2523]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2524]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2525]! } + public var TwoFactorSetup_Email_Text: String { return self._s[2526]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2527]! } + public var Invite_ChannelsTooMuch: String { return self._s[2528]! } + public var Wallet_Send_ConfirmationConfirm: String { return self._s[2529]! } + public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2530]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2531]! } + public var Wallet_Receive_AmountText: String { return self._s[2532]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2533]! } + public var CallFeedback_ReasonNoise: String { return self._s[2534]! } + public var Appearance_AppIconDefault: String { return self._s[2536]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2537]! } + public var MediaPicker_AddCaption: String { return self._s[2538]! } + public var CallSettings_TabIconDescription: String { return self._s[2539]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2517]!, self._r[2517]!, [_0]) + return formatWithArgumentRanges(self._s[2540]!, self._r[2540]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2518]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2519]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2520]! } - public var DialogList_SearchSectionRecent: String { return self._s[2521]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2522]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2525]! } - public var LastSeen_WithinAWeek: String { return self._s[2526]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2527]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2529]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2530]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2541]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2542]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2543]! } + public var DialogList_SearchSectionRecent: String { return self._s[2544]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2545]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2548]! } + public var LastSeen_WithinAWeek: String { return self._s[2549]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2550]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2552]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2553]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2531]!, self._r[2531]!, [_0]) + return formatWithArgumentRanges(self._s[2554]!, self._r[2554]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2532]! } - public var Conversation_StatusLeftGroup: String { return self._s[2533]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2534]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2536]! } - public var GroupPermission_AddSuccess: String { return self._s[2537]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2539]! } - public var Conversation_ContextMenuCopy: String { return self._s[2540]! } - public var AccessDenied_CallMicrophone: String { return self._s[2541]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2555]! } + public var Conversation_StatusLeftGroup: String { return self._s[2556]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2557]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2559]! } + public var GroupPermission_AddSuccess: String { return self._s[2560]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2562]! } + public var Conversation_ContextMenuCopy: String { return self._s[2563]! } + public var AccessDenied_CallMicrophone: String { return self._s[2564]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2542]!, self._r[2542]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2565]!, self._r[2565]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2543]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2544]! } - public var Checkout_PaymentMethod_New: String { return self._s[2545]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2546]! } - public var PhotoEditor_QualityTool: String { return self._s[2547]! } - public var Login_SendCodeViaSms: String { return self._s[2548]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2549]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2550]! } - public var Wallet_Receive_CopyAddress: String { return self._s[2551]! } - public var Login_EmailNotConfiguredError: String { return self._s[2552]! } - public var SocksProxySetup_Status: String { return self._s[2553]! } - public var PrivacyPolicy_Accept: String { return self._s[2554]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2555]! } - public var Appearance_AppIconClassicX: String { return self._s[2556]! } + public var Login_InvalidFirstNameError: String { return self._s[2566]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2567]! } + public var Checkout_PaymentMethod_New: String { return self._s[2568]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2569]! } + public var PhotoEditor_QualityTool: String { return self._s[2570]! } + public var Login_SendCodeViaSms: String { return self._s[2571]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2572]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2573]! } + public var Wallet_Receive_CopyAddress: String { return self._s[2574]! } + public var Login_EmailNotConfiguredError: String { return self._s[2575]! } + public var SocksProxySetup_Status: String { return self._s[2576]! } + public var PrivacyPolicy_Accept: String { return self._s[2577]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2578]! } + public var Appearance_AppIconClassicX: String { return self._s[2579]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2557]!, self._r[2557]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2580]!, self._r[2580]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2558]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2560]! } - public var AutoNightTheme_Automatic: String { return self._s[2561]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2562]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2563]! } - public var Cache_Help: String { return self._s[2564]! } - public var Group_ErrorAccessDenied: String { return self._s[2565]! } - public var Passport_Language_fa: String { return self._s[2566]! } - public var Wallet_Intro_Text: String { return self._s[2567]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2568]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2569]! } - public var PrivacySettings_LastSeen: String { return self._s[2570]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2581]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2583]! } + public var AutoNightTheme_Automatic: String { return self._s[2584]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2585]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2586]! } + public var Cache_Help: String { return self._s[2587]! } + public var Group_ErrorAccessDenied: String { return self._s[2588]! } + public var Passport_Language_fa: String { return self._s[2589]! } + public var Wallet_Intro_Text: String { return self._s[2590]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2591]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2592]! } + public var PrivacySettings_LastSeen: String { return self._s[2593]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2571]!, self._r[2571]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2594]!, self._r[2594]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2575]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2576]! } - public var Profile_About: String { return self._s[2577]! } - public var Channel_About_Placeholder: String { return self._s[2578]! } - public var Login_InfoTitle: String { return self._s[2579]! } + public var Preview_SaveGif: String { return self._s[2598]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2599]! } + public var Profile_About: String { return self._s[2600]! } + public var Channel_About_Placeholder: String { return self._s[2601]! } + public var Login_InfoTitle: String { return self._s[2602]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2580]!, self._r[2580]!, [_0]) + return formatWithArgumentRanges(self._s[2603]!, self._r[2603]!, [_0]) } - public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2581]! } - public var Watch_Suggestion_CantTalk: String { return self._s[2583]! } - public var ContactInfo_Title: String { return self._s[2584]! } - public var Media_ShareThisVideo: String { return self._s[2585]! } - public var Weekday_ShortFriday: String { return self._s[2586]! } - public var AccessDenied_Contacts: String { return self._s[2588]! } - public var Notification_CallIncomingShort: String { return self._s[2589]! } - public var Group_Setup_TypePublic: String { return self._s[2590]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2591]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2592]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2595]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2596]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2597]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2598]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2599]! } + public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2604]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2606]! } + public var ContactInfo_Title: String { return self._s[2607]! } + public var Media_ShareThisVideo: String { return self._s[2608]! } + public var Weekday_ShortFriday: String { return self._s[2609]! } + public var AccessDenied_Contacts: String { return self._s[2611]! } + public var Notification_CallIncomingShort: String { return self._s[2612]! } + public var Group_Setup_TypePublic: String { return self._s[2613]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2614]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2615]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2618]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2619]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2620]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2621]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2622]! } public func Wallet_SecureStorageChanged_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2600]!, self._r[2600]!, [_0]) + return formatWithArgumentRanges(self._s[2623]!, self._r[2623]!, [_0]) } - public var DialogList_Typing: String { return self._s[2601]! } - public var CallFeedback_IncludeLogs: String { return self._s[2603]! } - public var Checkout_Phone: String { return self._s[2605]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2608]! } - public var Privacy_Calls_Integration: String { return self._s[2609]! } - public var Notifications_PermissionsAllow: String { return self._s[2610]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2614]! } - public var Settings_ChatSettings: String { return self._s[2615]! } + public var DialogList_Typing: String { return self._s[2624]! } + public var CallFeedback_IncludeLogs: String { return self._s[2626]! } + public var Checkout_Phone: String { return self._s[2628]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2631]! } + public var Privacy_Calls_Integration: String { return self._s[2632]! } + public var Notifications_PermissionsAllow: String { return self._s[2633]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2637]! } + public var Settings_ChatSettings: String { return self._s[2638]! } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2616]!, self._r[2616]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2639]!, self._r[2639]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2618]! } + public var GroupRemoved_DeleteUser: String { return self._s[2641]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2619]!, self._r[2619]!, [_0]) + return formatWithArgumentRanges(self._s[2642]!, self._r[2642]!, [_0]) } - public var Wallet_TransactionInfo_FeeInfoURL: String { return self._s[2620]! } + public var Wallet_TransactionInfo_FeeInfoURL: String { return self._s[2643]! } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2621]!, self._r[2621]!, [_1]) + return formatWithArgumentRanges(self._s[2644]!, self._r[2644]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2622]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2623]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2625]! } - public var Conversation_Unblock: String { return self._s[2626]! } - public var PrivacySettings_DataSettings: String { return self._s[2627]! } - public var Group_PublicLink_Info: String { return self._s[2628]! } + public var Login_ContinueWithLocalization: String { return self._s[2645]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2646]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2648]! } + public var Conversation_Unblock: String { return self._s[2649]! } + public var PrivacySettings_DataSettings: String { return self._s[2650]! } + public var Group_PublicLink_Info: String { return self._s[2651]! } public func Wallet_Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2629]!, self._r[2629]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2652]!, self._r[2652]!, [_1, _2, _3]) } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2630]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2653]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2631]!, self._r[2631]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2654]!, self._r[2654]!, [_0, _1]) } - public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2633]! } - public var PrivacySettings_Passcode: String { return self._s[2635]! } - public var Call_Mute: String { return self._s[2636]! } - public var Wallet_Weekday_Yesterday: String { return self._s[2637]! } - public var Passport_Language_dz: String { return self._s[2638]! } - public var Wallet_Receive_AmountHeader: String { return self._s[2639]! } - public var Passport_Language_tk: String { return self._s[2640]! } + public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2656]! } + public var PrivacySettings_Passcode: String { return self._s[2658]! } + public var Call_Mute: String { return self._s[2659]! } + public var Wallet_Weekday_Yesterday: String { return self._s[2660]! } + public var Passport_Language_dz: String { return self._s[2661]! } + public var Wallet_Receive_AmountHeader: String { return self._s[2662]! } + public var Passport_Language_tk: String { return self._s[2663]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2641]!, self._r[2641]!, [_0]) + return formatWithArgumentRanges(self._s[2664]!, self._r[2664]!, [_0]) } - public var Settings_Search: String { return self._s[2642]! } - public var Wallet_Month_ShortFebruary: String { return self._s[2643]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2644]! } - public var Conversation_ContextMenuReply: String { return self._s[2645]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2646]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2647]! } - public var Tour_Title1: String { return self._s[2648]! } - public var Wallet_Alert_Cancel: String { return self._s[2649]! } - public var Conversation_ClearGroupHistory: String { return self._s[2651]! } - public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2652]! } - public var WallpaperPreview_Motion: String { return self._s[2653]! } + public var Settings_Search: String { return self._s[2665]! } + public var Wallet_Month_ShortFebruary: String { return self._s[2666]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2667]! } + public var Conversation_ContextMenuReply: String { return self._s[2668]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2669]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2670]! } + public var Tour_Title1: String { return self._s[2671]! } + public var Wallet_Alert_Cancel: String { return self._s[2672]! } + public var Conversation_ClearGroupHistory: String { return self._s[2674]! } + public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2675]! } + public var WallpaperPreview_Motion: String { return self._s[2676]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2654]!, self._r[2654]!, [_0]) + return formatWithArgumentRanges(self._s[2677]!, self._r[2677]!, [_0]) } - public var Call_RateCall: String { return self._s[2655]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2656]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2657]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2658]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2660]! } + public var Call_RateCall: String { return self._s[2678]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2679]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2680]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2681]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2683]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2662]!, self._r[2662]!, [_0]) + return formatWithArgumentRanges(self._s[2685]!, self._r[2685]!, [_0]) } - public var Compose_Create: String { return self._s[2663]! } - public var Contacts_InviteToTelegram: String { return self._s[2664]! } - public var GroupInfo_Notifications: String { return self._s[2665]! } - public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2667]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2668]! } - public var Month_GenApril: String { return self._s[2669]! } - public var Appearance_AutoNightTheme: String { return self._s[2670]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2672]! } - public var Login_CodeSentSms: String { return self._s[2674]! } + public var Compose_Create: String { return self._s[2686]! } + public var Contacts_InviteToTelegram: String { return self._s[2687]! } + public var GroupInfo_Notifications: String { return self._s[2688]! } + public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2690]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2691]! } + public var Month_GenApril: String { return self._s[2692]! } + public var Appearance_AutoNightTheme: String { return self._s[2693]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2695]! } + public var Login_CodeSentSms: String { return self._s[2697]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2675]!, self._r[2675]!, [_0]) + return formatWithArgumentRanges(self._s[2698]!, self._r[2698]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2676]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2677]! } - public var Passport_Language_hr: String { return self._s[2678]! } - public var Common_ActionNotAllowedError: String { return self._s[2679]! } + public var EmptyGroupInfo_Line3: String { return self._s[2699]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2700]! } + public var Passport_Language_hr: String { return self._s[2701]! } + public var Common_ActionNotAllowedError: String { return self._s[2702]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2680]!, self._r[2680]!, [_0]) + return formatWithArgumentRanges(self._s[2703]!, self._r[2703]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2681]! } - public var Wallet_Info_TransactionFrom: String { return self._s[2682]! } - public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2683]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2684]! } - public var Privacy_SecretChatsTitle: String { return self._s[2685]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2687]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2688]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2689]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2690]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2691]! } - public var Preview_DeleteGif: String { return self._s[2692]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2693]! } - public var Group_ErrorNotMutualContact: String { return self._s[2694]! } - public var Notification_MessageLifetime5s: String { return self._s[2695]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2704]! } + public var Wallet_Info_TransactionFrom: String { return self._s[2705]! } + public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2706]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2707]! } + public var Privacy_SecretChatsTitle: String { return self._s[2708]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2710]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2711]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2712]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2713]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2714]! } + public var Preview_DeleteGif: String { return self._s[2715]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2716]! } + public var Group_ErrorNotMutualContact: String { return self._s[2717]! } + public var Notification_MessageLifetime5s: String { return self._s[2718]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2696]!, self._r[2696]!, [_0]) + return formatWithArgumentRanges(self._s[2719]!, self._r[2719]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2697]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2699]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2700]! } - public var Passport_Address_AddBankStatement: String { return self._s[2701]! } - public var Notification_CallIncoming: String { return self._s[2702]! } - public var Wallet_Words_NotDoneTitle: String { return self._s[2703]! } - public var Compose_NewGroupTitle: String { return self._s[2704]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2706]! } - public var Passport_Address_Postcode: String { return self._s[2708]! } + public var VoiceOver_Chat_Video: String { return self._s[2720]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2722]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2723]! } + public var Passport_Address_AddBankStatement: String { return self._s[2724]! } + public var Notification_CallIncoming: String { return self._s[2725]! } + public var Wallet_Words_NotDoneTitle: String { return self._s[2726]! } + public var Compose_NewGroupTitle: String { return self._s[2727]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2729]! } + public var Passport_Address_Postcode: String { return self._s[2731]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2709]!, self._r[2709]!, [_0]) + return formatWithArgumentRanges(self._s[2732]!, self._r[2732]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2710]! } - public var Wallet_Month_ShortOctober: String { return self._s[2711]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2712]! } - public var WallpaperColors_Title: String { return self._s[2713]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2714]! } - public var VoiceOver_MessageContextForward: String { return self._s[2715]! } - public var GroupPermission_Duration: String { return self._s[2716]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2733]! } + public var Wallet_Month_ShortOctober: String { return self._s[2734]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2735]! } + public var WallpaperColors_Title: String { return self._s[2736]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2737]! } + public var VoiceOver_MessageContextForward: String { return self._s[2738]! } + public var GroupPermission_Duration: String { return self._s[2739]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2717]!, self._r[2717]!, [_0]) + return formatWithArgumentRanges(self._s[2740]!, self._r[2740]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2718]! } - public var Username_Placeholder: String { return self._s[2719]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2720]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2721]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2722]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2741]! } + public var Username_Placeholder: String { return self._s[2742]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2743]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2744]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2745]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2724]!, self._r[2724]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2747]!, self._r[2747]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2725]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2726]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2727]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2728]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2729]! } - public var Conversation_ContextMenuMore: String { return self._s[2730]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2731]! } - public var CallSettings_TabIcon: String { return self._s[2732]! } - public var KeyCommand_Find: String { return self._s[2733]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2734]! } - public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2735]! } - public var Message_PinnedGame: String { return self._s[2736]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2737]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2739]! } - public var Login_CallRequestState2: String { return self._s[2741]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2743]! } + public var Passport_PasswordDescription: String { return self._s[2748]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2749]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2750]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2751]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2752]! } + public var Conversation_ContextMenuMore: String { return self._s[2753]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2754]! } + public var CallSettings_TabIcon: String { return self._s[2755]! } + public var KeyCommand_Find: String { return self._s[2756]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2757]! } + public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2758]! } + public var Message_PinnedGame: String { return self._s[2759]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2760]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2762]! } + public var Login_CallRequestState2: String { return self._s[2764]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2766]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2744]!, self._r[2744]!, [_0]) + return formatWithArgumentRanges(self._s[2767]!, self._r[2767]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2746]!, self._r[2746]!, [_0]) + return formatWithArgumentRanges(self._s[2769]!, self._r[2769]!, [_0]) } - public var WallpaperPreview_Blurred: String { return self._s[2747]! } - public var Conversation_InstantPagePreview: String { return self._s[2748]! } + public var WallpaperPreview_Blurred: String { return self._s[2770]! } + public var Conversation_InstantPagePreview: String { return self._s[2771]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2749]!, self._r[2749]!, [_0]) + return formatWithArgumentRanges(self._s[2772]!, self._r[2772]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2752]! } - public var WallpaperSearch_ColorRed: String { return self._s[2753]! } - public var GroupPermission_NoPinMessages: String { return self._s[2754]! } - public var Passport_Language_es: String { return self._s[2755]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2757]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2758]! } + public var SecretTimer_VideoDescription: String { return self._s[2775]! } + public var WallpaperSearch_ColorRed: String { return self._s[2776]! } + public var GroupPermission_NoPinMessages: String { return self._s[2777]! } + public var Passport_Language_es: String { return self._s[2778]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2780]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2781]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2759]!, self._r[2759]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2782]!, self._r[2782]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2760]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2761]! } - public var Watch_UserInfo_Unmute: String { return self._s[2762]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2763]! } - public var AccessDenied_CameraRestricted: String { return self._s[2765]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2783]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2784]! } + public var Watch_UserInfo_Unmute: String { return self._s[2785]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2786]! } + public var AccessDenied_CameraRestricted: String { return self._s[2788]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2766]!, self._r[2766]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2789]!, self._r[2789]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2768]! } - public var Settings_CopyUsername: String { return self._s[2769]! } - public var Contacts_SearchLabel: String { return self._s[2770]! } - public var Map_OpenInYandexNavigator: String { return self._s[2772]! } - public var PasscodeSettings_EncryptData: String { return self._s[2773]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2774]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2775]! } - public var DialogList_AdNoticeAlert: String { return self._s[2776]! } - public var Wallet_Month_GenMay: String { return self._s[2778]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2779]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2780]! } - public var Localization_LanguageCustom: String { return self._s[2781]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2782]! } - public var CallFeedback_Title: String { return self._s[2783]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2786]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2787]! } - public var Wallet_Intro_CreateErrorTitle: String { return self._s[2788]! } - public var Conversation_InfoGroup: String { return self._s[2789]! } - public var Compose_NewMessage: String { return self._s[2790]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2791]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2792]! } - public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[2793]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2794]! } + public var ChatList_ReadAll: String { return self._s[2791]! } + public var Settings_CopyUsername: String { return self._s[2792]! } + public var Contacts_SearchLabel: String { return self._s[2793]! } + public var Map_OpenInYandexNavigator: String { return self._s[2795]! } + public var PasscodeSettings_EncryptData: String { return self._s[2796]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2797]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2798]! } + public var DialogList_AdNoticeAlert: String { return self._s[2799]! } + public var Wallet_Month_GenMay: String { return self._s[2801]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2802]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2803]! } + public var Localization_LanguageCustom: String { return self._s[2804]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2805]! } + public var CallFeedback_Title: String { return self._s[2806]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2809]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2810]! } + public var Wallet_Intro_CreateErrorTitle: String { return self._s[2811]! } + public var Conversation_InfoGroup: String { return self._s[2812]! } + public var Compose_NewMessage: String { return self._s[2813]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2814]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2815]! } + public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[2816]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2817]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2795]!, self._r[2795]!, [_0]) + return formatWithArgumentRanges(self._s[2818]!, self._r[2818]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2796]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2797]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2798]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2799]! } - public var Channel_BlackList_Title: String { return self._s[2800]! } - public var UserInfo_PhoneCall: String { return self._s[2801]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2803]! } - public var Wallet_Month_ShortJanuary: String { return self._s[2804]! } - public var State_connecting: String { return self._s[2805]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2806]! } - public var Wallet_Month_GenMarch: String { return self._s[2807]! } - public var EditTheme_Expand_BottomInfo: String { return self._s[2808]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2819]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2820]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2821]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2822]! } + public var Channel_BlackList_Title: String { return self._s[2823]! } + public var UserInfo_PhoneCall: String { return self._s[2824]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2826]! } + public var Wallet_Month_ShortJanuary: String { return self._s[2827]! } + public var State_connecting: String { return self._s[2828]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2829]! } + public var Wallet_Month_GenMarch: String { return self._s[2830]! } + public var EditTheme_Expand_BottomInfo: String { return self._s[2831]! } public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2809]!, self._r[2809]!, [_0]) + return formatWithArgumentRanges(self._s[2832]!, self._r[2832]!, [_0]) } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2810]!, self._r[2810]!, [_0]) + return formatWithArgumentRanges(self._s[2833]!, self._r[2833]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2811]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2812]! } - public var Passport_Identity_EditPassport: String { return self._s[2813]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2815]! } - public var Localization_EnglishLanguageName: String { return self._s[2816]! } - public var Share_AuthDescription: String { return self._s[2817]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2818]! } - public var Passport_Identity_Surname: String { return self._s[2819]! } - public var Compose_TokenListPlaceholder: String { return self._s[2820]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2821]! } - public var Settings_AboutEmpty: String { return self._s[2822]! } - public var Conversation_Unmute: String { return self._s[2823]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2825]! } - public var Wallet_Sending_Text: String { return self._s[2826]! } + public var Notifications_GroupNotifications: String { return self._s[2834]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2835]! } + public var Passport_Identity_EditPassport: String { return self._s[2836]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2838]! } + public var Localization_EnglishLanguageName: String { return self._s[2839]! } + public var Share_AuthDescription: String { return self._s[2840]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2841]! } + public var Passport_Identity_Surname: String { return self._s[2842]! } + public var Compose_TokenListPlaceholder: String { return self._s[2843]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2844]! } + public var Settings_AboutEmpty: String { return self._s[2845]! } + public var Conversation_Unmute: String { return self._s[2846]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2848]! } + public var Wallet_Sending_Text: String { return self._s[2849]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2827]!, self._r[2827]!, [_1]) + return formatWithArgumentRanges(self._s[2850]!, self._r[2850]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2828]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2830]! } - public var ChatSettings_Appearance: String { return self._s[2831]! } - public var Appearance_PickAccentColor: String { return self._s[2832]! } + public var Login_CodeSentCall: String { return self._s[2851]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2853]! } + public var ChatSettings_Appearance: String { return self._s[2854]! } + public var Appearance_PickAccentColor: String { return self._s[2855]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2833]!, self._r[2833]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2856]!, self._r[2856]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2834]!, self._r[2834]!, [_1]) + return formatWithArgumentRanges(self._s[2857]!, self._r[2857]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2835]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2836]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2837]! } - public var Wallet_Month_GenOctober: String { return self._s[2839]! } - public var ChatAdmins_AdminLabel: String { return self._s[2840]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2841]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2843]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2844]! } - public var Month_GenJune: String { return self._s[2845]! } - public var Watch_Location_Current: String { return self._s[2846]! } - public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[2847]! } - public var Conversation_TitleMute: String { return self._s[2848]! } + public var Notification_CallMissed: String { return self._s[2858]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2859]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2860]! } + public var Wallet_Month_GenOctober: String { return self._s[2862]! } + public var ChatAdmins_AdminLabel: String { return self._s[2863]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2864]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2866]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2867]! } + public var Month_GenJune: String { return self._s[2868]! } + public var Watch_Location_Current: String { return self._s[2869]! } + public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[2870]! } + public var Conversation_TitleMute: String { return self._s[2871]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2849]!, self._r[2849]!, [_1]) + return formatWithArgumentRanges(self._s[2872]!, self._r[2872]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2850]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2873]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2851]!, self._r[2851]!, [_0]) + return formatWithArgumentRanges(self._s[2874]!, self._r[2874]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2852]! } - public var Chat_SlowmodeSendError: String { return self._s[2853]! } - public var MaskStickerSettings_Info: String { return self._s[2854]! } - public var EditTheme_Expand_TopInfo: String { return self._s[2855]! } + public var Call_ReportPlaceholder: String { return self._s[2875]! } + public var Chat_SlowmodeSendError: String { return self._s[2876]! } + public var MaskStickerSettings_Info: String { return self._s[2877]! } + public var EditTheme_Expand_TopInfo: String { return self._s[2878]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2856]!, self._r[2856]!, [_0]) + return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2857]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2859]! } - public var Contacts_ShareTelegram: String { return self._s[2860]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2861]! } - public var Channel_ErrorAccessDenied: String { return self._s[2862]! } - public var UserInfo_ScamBotWarning: String { return self._s[2864]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2865]! } - public var Call_ConnectionErrorTitle: String { return self._s[2866]! } - public var UserInfo_NotificationsEnable: String { return self._s[2867]! } - public var ArchivedChats_IntroText1: String { return self._s[2868]! } - public var Tour_Text4: String { return self._s[2871]! } - public var WallpaperSearch_Recent: String { return self._s[2872]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2873]! } - public var Profile_MessageLifetime2s: String { return self._s[2875]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2876]! } - public var Notification_MessageLifetime2s: String { return self._s[2877]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2880]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2882]! } + public var Contacts_ShareTelegram: String { return self._s[2883]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2884]! } + public var Channel_ErrorAccessDenied: String { return self._s[2885]! } + public var UserInfo_ScamBotWarning: String { return self._s[2887]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2888]! } + public var Call_ConnectionErrorTitle: String { return self._s[2889]! } + public var UserInfo_NotificationsEnable: String { return self._s[2890]! } + public var ArchivedChats_IntroText1: String { return self._s[2891]! } + public var Tour_Text4: String { return self._s[2894]! } + public var WallpaperSearch_Recent: String { return self._s[2895]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2896]! } + public var Profile_MessageLifetime2s: String { return self._s[2898]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2899]! } + public var Notification_MessageLifetime2s: String { return self._s[2900]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2878]!, self._r[2878]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2901]!, self._r[2901]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2879]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2880]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2881]! } + public var Cache_ClearCache: String { return self._s[2902]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2903]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2904]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2885]!, self._r[2885]!, [_0]) + return formatWithArgumentRanges(self._s[2908]!, self._r[2908]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2887]!, self._r[2887]!, [_0]) + return formatWithArgumentRanges(self._s[2910]!, self._r[2910]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2888]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2889]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2890]! } - public var ChatList_UnarchiveAction: String { return self._s[2891]! } - public var AutoNightTheme_Title: String { return self._s[2892]! } - public var InstantPage_FeedbackButton: String { return self._s[2893]! } - public var Passport_FieldAddress: String { return self._s[2894]! } + public var LocalGroup_Text: String { return self._s[2911]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2912]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2913]! } + public var ChatList_UnarchiveAction: String { return self._s[2914]! } + public var AutoNightTheme_Title: String { return self._s[2915]! } + public var InstantPage_FeedbackButton: String { return self._s[2916]! } + public var Passport_FieldAddress: String { return self._s[2917]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2895]!, self._r[2895]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2918]!, self._r[2918]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[2896]! } + public var Month_ShortMarch: String { return self._s[2919]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2897]!, self._r[2897]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2920]!, self._r[2920]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2898]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2899]! } - public var Passport_FloodError: String { return self._s[2900]! } - public var SecretGif_Title: String { return self._s[2901]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2902]! } - public var ChatList_Context_UnhideArchive: String { return self._s[2903]! } - public var Passport_Language_th: String { return self._s[2905]! } - public var Passport_Address_Address: String { return self._s[2906]! } - public var Login_InvalidLastNameError: String { return self._s[2907]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2908]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2909]! } - public var ChatList_Context_Archive: String { return self._s[2910]! } - public var SettingsSearch_FAQ: String { return self._s[2911]! } - public var ShareMenu_Send: String { return self._s[2912]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2914]! } - public var Month_GenNovember: String { return self._s[2916]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2918]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2921]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2922]! } + public var Passport_FloodError: String { return self._s[2923]! } + public var SecretGif_Title: String { return self._s[2924]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2925]! } + public var ChatList_Context_UnhideArchive: String { return self._s[2926]! } + public var Passport_Language_th: String { return self._s[2928]! } + public var Passport_Address_Address: String { return self._s[2929]! } + public var Login_InvalidLastNameError: String { return self._s[2930]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2931]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2932]! } + public var ChatList_Context_Archive: String { return self._s[2933]! } + public var SettingsSearch_FAQ: String { return self._s[2934]! } + public var ShareMenu_Send: String { return self._s[2935]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2937]! } + public var Month_GenNovember: String { return self._s[2939]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2941]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2919]!, self._r[2919]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2942]!, self._r[2942]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2920]! } - public var NotificationsSound_Tritone: String { return self._s[2921]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2923]! } - public var Wallet_ContextMenuCopy: String { return self._s[2925]! } + public var Checkout_Email: String { return self._s[2943]! } + public var NotificationsSound_Tritone: String { return self._s[2944]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2946]! } + public var Wallet_ContextMenuCopy: String { return self._s[2948]! } public func Wallet_Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2927]!, self._r[2927]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2950]!, self._r[2950]!, [_1, _2, _3]) } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2928]!, self._r[2928]!, [_1]) + return formatWithArgumentRanges(self._s[2951]!, self._r[2951]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2929]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2952]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2930]!, self._r[2930]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2953]!, self._r[2953]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2931]! } - public var Notification_Exceptions_Add: String { return self._s[2932]! } - public var DialogList_You: String { return self._s[2933]! } - public var MediaPicker_Send: String { return self._s[2936]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2937]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2938]! } - public var Call_AudioRouteSpeaker: String { return self._s[2939]! } - public var Watch_UserInfo_Title: String { return self._s[2940]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[2941]! } - public var Appearance_AccentColor: String { return self._s[2943]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2954]! } + public var Notification_Exceptions_Add: String { return self._s[2955]! } + public var DialogList_You: String { return self._s[2956]! } + public var MediaPicker_Send: String { return self._s[2959]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2960]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2961]! } + public var Call_AudioRouteSpeaker: String { return self._s[2962]! } + public var Watch_UserInfo_Title: String { return self._s[2963]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[2964]! } + public var Appearance_AccentColor: String { return self._s[2966]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2944]!, self._r[2944]!, [_0]) + return formatWithArgumentRanges(self._s[2967]!, self._r[2967]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2945]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2968]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2946]!, self._r[2946]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2969]!, self._r[2969]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2947]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2948]! } - public var Notification_CallOutgoing: String { return self._s[2949]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2950]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2951]! } - public var Call_RecordingDisabledMessage: String { return self._s[2952]! } - public var Message_Game: String { return self._s[2953]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2954]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2955]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2956]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2957]! } - public var Date_DialogDateFormat: String { return self._s[2958]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2959]! } - public var Notifications_InAppNotifications: String { return self._s[2960]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2970]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2971]! } + public var Notification_CallOutgoing: String { return self._s[2972]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2973]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2974]! } + public var Call_RecordingDisabledMessage: String { return self._s[2975]! } + public var Message_Game: String { return self._s[2976]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2977]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2978]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2979]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2980]! } + public var Date_DialogDateFormat: String { return self._s[2981]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2982]! } + public var Notifications_InAppNotifications: String { return self._s[2983]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2961]!, self._r[2961]!, [_0]) + return formatWithArgumentRanges(self._s[2984]!, self._r[2984]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2962]!, self._r[2962]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2985]!, self._r[2985]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[2963]! } + public var NewContact_Title: String { return self._s[2986]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2964]!, self._r[2964]!, [_0]) + return formatWithArgumentRanges(self._s[2987]!, self._r[2987]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2965]! } + public var Conversation_ViewContactDetails: String { return self._s[2988]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2967]!, self._r[2967]!, [_1]) + return formatWithArgumentRanges(self._s[2990]!, self._r[2990]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2968]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2969]! } - public var PrivacySettings_Title: String { return self._s[2970]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2973]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2974]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[2975]! } - public var Contacts_PhoneNumber: String { return self._s[2976]! } - public var Map_ShowPlaces: String { return self._s[2978]! } - public var ChatAdmins_Title: String { return self._s[2979]! } - public var InstantPage_Reference: String { return self._s[2981]! } - public var Wallet_Info_Updating: String { return self._s[2982]! } - public var ReportGroupLocation_Text: String { return self._s[2983]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2991]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2992]! } + public var PrivacySettings_Title: String { return self._s[2993]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2996]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2997]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[2998]! } + public var Contacts_PhoneNumber: String { return self._s[2999]! } + public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3001]! } + public var Map_ShowPlaces: String { return self._s[3002]! } + public var ChatAdmins_Title: String { return self._s[3003]! } + public var InstantPage_Reference: String { return self._s[3005]! } + public var Wallet_Info_Updating: String { return self._s[3006]! } + public var ReportGroupLocation_Text: String { return self._s[3007]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2984]!, self._r[2984]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3008]!, self._r[3008]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2985]! } - public var Wallet_Intro_TermsUrl: String { return self._s[2986]! } - public var Watch_UserInfo_Block: String { return self._s[2987]! } - public var ChatSettings_Stickers: String { return self._s[2988]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2989]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[2990]! } + public var Camera_FlashOff: String { return self._s[3009]! } + public var Wallet_Intro_TermsUrl: String { return self._s[3010]! } + public var Watch_UserInfo_Block: String { return self._s[3011]! } + public var ChatSettings_Stickers: String { return self._s[3012]! } + public var ChatSettings_DownloadInBackground: String { return self._s[3013]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[3014]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2991]!, self._r[2991]!, [_0]) + return formatWithArgumentRanges(self._s[3015]!, self._r[3015]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2992]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2993]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2994]! } - public var Wallet_Created_ExportErrorTitle: String { return self._s[2995]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2996]! } - public var VoiceOver_MessageContextShare: String { return self._s[2997]! } + public var Settings_ViewPhoto: String { return self._s[3016]! } + public var Login_CheckOtherSessionMessages: String { return self._s[3017]! } + public var AutoDownloadSettings_Cellular: String { return self._s[3018]! } + public var Wallet_Created_ExportErrorTitle: String { return self._s[3019]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3020]! } + public var VoiceOver_MessageContextShare: String { return self._s[3021]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2999]!, self._r[2999]!, [_0]) + return formatWithArgumentRanges(self._s[3023]!, self._r[3023]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[3000]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3001]! } + public var Privacy_DeleteDrafts: String { return self._s[3024]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3025]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3002]!, self._r[3002]!, [_0]) + return formatWithArgumentRanges(self._s[3026]!, self._r[3026]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[3003]! } - public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3004]! } - public var DialogList_SavedMessages: String { return self._s[3005]! } - public var GroupInfo_UpgradeButton: String { return self._s[3006]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3008]! } - public var DialogList_Pin: String { return self._s[3009]! } + public var DialogList_SavedMessagesHelp: String { return self._s[3027]! } + public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3028]! } + public var DialogList_SavedMessages: String { return self._s[3029]! } + public var GroupInfo_UpgradeButton: String { return self._s[3030]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3032]! } + public var DialogList_Pin: String { return self._s[3033]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3010]!, self._r[3010]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3034]!, self._r[3034]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3011]!, self._r[3011]!, [_0]) + return formatWithArgumentRanges(self._s[3035]!, self._r[3035]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[3012]! } - public var UserInfo_NotificationsDisable: String { return self._s[3013]! } - public var Paint_Outlined: String { return self._s[3014]! } - public var Activity_PlayingGame: String { return self._s[3015]! } - public var SearchImages_NoImagesFound: String { return self._s[3016]! } - public var SocksProxySetup_ProxyType: String { return self._s[3017]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[3019]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[3020]! } - public var Settings_AppLanguage: String { return self._s[3021]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[3022]! } - public var Common_ChoosePhoto: String { return self._s[3023]! } - public var CallFeedback_ReasonEcho: String { return self._s[3024]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[3036]! } + public var UserInfo_NotificationsDisable: String { return self._s[3037]! } + public var Paint_Outlined: String { return self._s[3038]! } + public var Activity_PlayingGame: String { return self._s[3039]! } + public var SearchImages_NoImagesFound: String { return self._s[3040]! } + public var SocksProxySetup_ProxyType: String { return self._s[3041]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[3043]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[3044]! } + public var Settings_AppLanguage: String { return self._s[3045]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[3046]! } + public var Common_ChoosePhoto: String { return self._s[3047]! } + public var CallFeedback_ReasonEcho: String { return self._s[3048]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3025]!, self._r[3025]!, [_1]) + return formatWithArgumentRanges(self._s[3049]!, self._r[3049]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[3026]! } - public var Activity_UploadingVideo: String { return self._s[3027]! } - public var Conversation_WalletRequiredNotNow: String { return self._s[3028]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3029]! } - public var NetworkUsageSettings_Wifi: String { return self._s[3030]! } - public var VoiceOver_Editing_ClearText: String { return self._s[3031]! } - public var PUSH_SENDER_YOU: String { return self._s[3032]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[3033]! } - public var Checkout_PayWithTouchId: String { return self._s[3034]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3035]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[3050]! } + public var Activity_UploadingVideo: String { return self._s[3051]! } + public var Conversation_WalletRequiredNotNow: String { return self._s[3052]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3053]! } + public var NetworkUsageSettings_Wifi: String { return self._s[3054]! } + public var VoiceOver_Editing_ClearText: String { return self._s[3055]! } + public var PUSH_SENDER_YOU: String { return self._s[3056]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[3057]! } + public var Checkout_PayWithTouchId: String { return self._s[3058]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3059]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3037]!, self._r[3037]!, [_1]) + return formatWithArgumentRanges(self._s[3061]!, self._r[3061]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[3038]! } + public var Notifications_ExceptionsNone: String { return self._s[3062]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3039]!, self._r[3039]!, [_0]) + return formatWithArgumentRanges(self._s[3063]!, self._r[3063]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3040]!, self._r[3040]!, [_1]) + return formatWithArgumentRanges(self._s[3064]!, self._r[3064]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[3042]! } - public var Passport_Address_Region: String { return self._s[3045]! } - public var ChatList_DeleteChat: String { return self._s[3046]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[3047]! } - public var PhotoEditor_TiltShift: String { return self._s[3048]! } - public var Settings_FAQ_URL: String { return self._s[3049]! } - public var Passport_Language_sl: String { return self._s[3050]! } - public var Settings_PrivacySettings: String { return self._s[3052]! } - public var SharedMedia_TitleLink: String { return self._s[3053]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[3054]! } - public var Settings_SetProfilePhoto: String { return self._s[3055]! } - public var Channel_About_Help: String { return self._s[3056]! } - public var Contacts_PermissionsEnable: String { return self._s[3057]! } - public var Wallet_Sending_Title: String { return self._s[3058]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3059]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[3060]! } - public var CallFeedback_ReasonInterruption: String { return self._s[3062]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[3063]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3064]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3065]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[3066]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[3068]! } - public var Map_OpenInYandexMaps: String { return self._s[3070]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3071]! } - public var VoiceOver_MessageContextReply: String { return self._s[3072]! } - public var PhotoEditor_SaturationTool: String { return self._s[3073]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[3066]! } + public var Passport_Address_Region: String { return self._s[3069]! } + public var ChatList_DeleteChat: String { return self._s[3070]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[3071]! } + public var PhotoEditor_TiltShift: String { return self._s[3072]! } + public var Settings_FAQ_URL: String { return self._s[3073]! } + public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3074]! } + public var Passport_Language_sl: String { return self._s[3075]! } + public var Settings_PrivacySettings: String { return self._s[3077]! } + public var SharedMedia_TitleLink: String { return self._s[3078]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[3079]! } + public var Settings_SetProfilePhoto: String { return self._s[3080]! } + public var Channel_About_Help: String { return self._s[3081]! } + public var Contacts_PermissionsEnable: String { return self._s[3082]! } + public var Wallet_Sending_Title: String { return self._s[3083]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3084]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[3085]! } + public var CallFeedback_ReasonInterruption: String { return self._s[3087]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[3088]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3089]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3090]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[3091]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[3093]! } + public var Map_OpenInYandexMaps: String { return self._s[3095]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3096]! } + public var VoiceOver_MessageContextReply: String { return self._s[3097]! } + public var PhotoEditor_SaturationTool: String { return self._s[3098]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3074]!, self._r[3074]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3099]!, self._r[3099]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3075]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3076]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3077]! } - public var Appearance_TextSize: String { return self._s[3078]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3100]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3101]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3102]! } + public var Appearance_TextSize: String { return self._s[3103]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3079]!, self._r[3079]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3104]!, self._r[3104]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3080]! } - public var Channel_Username_InvalidTooShort: String { return self._s[3082]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3105]! } + public var Channel_Username_InvalidTooShort: String { return self._s[3107]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3083]!, self._r[3083]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3108]!, self._r[3108]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3084]!, self._r[3084]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3109]!, self._r[3109]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[3085]! } - public var Passport_PassportInformation: String { return self._s[3088]! } - public var Theme_Unsupported: String { return self._s[3089]! } - public var WatchRemote_AlertTitle: String { return self._s[3090]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3091]! } - public var ConvertToSupergroup_HelpText: String { return self._s[3093]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[3110]! } + public var Passport_PassportInformation: String { return self._s[3113]! } + public var Theme_Unsupported: String { return self._s[3114]! } + public var WatchRemote_AlertTitle: String { return self._s[3115]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3116]! } + public var ConvertToSupergroup_HelpText: String { return self._s[3118]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3094]!, self._r[3094]!, [_0]) + return formatWithArgumentRanges(self._s[3119]!, self._r[3119]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3095]!, self._r[3095]!, [_1]) + return formatWithArgumentRanges(self._s[3120]!, self._r[3120]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3096]! } - public var Wallet_Navigation_Done: String { return self._s[3098]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3099]! } - public var AccessDenied_CameraDisabled: String { return self._s[3100]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3121]! } + public var Wallet_Navigation_Done: String { return self._s[3123]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3124]! } + public var AccessDenied_CameraDisabled: String { return self._s[3125]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3101]!, self._r[3101]!, [_0]) + return formatWithArgumentRanges(self._s[3126]!, self._r[3126]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[3104]! } + public var PhotoEditor_ContrastTool: String { return self._s[3129]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3105]!, self._r[3105]!, [_1]) + return formatWithArgumentRanges(self._s[3130]!, self._r[3130]!, [_1]) } - public var DialogList_Draft: String { return self._s[3106]! } - public var Privacy_TopPeersDelete: String { return self._s[3108]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[3109]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3110]! } - public var WebSearch_RecentSectionClear: String { return self._s[3111]! } - public var EditTheme_ErrorInvalidCharacters: String { return self._s[3112]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[3114]! } - public var Common_Done: String { return self._s[3116]! } - public var AuthSessions_EmptyText: String { return self._s[3117]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[3118]! } - public var Tour_Title5: String { return self._s[3119]! } - public var Wallet_Settings_Title: String { return self._s[3120]! } + public var DialogList_Draft: String { return self._s[3131]! } + public var Privacy_TopPeersDelete: String { return self._s[3133]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[3134]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3135]! } + public var WebSearch_RecentSectionClear: String { return self._s[3136]! } + public var EditTheme_ErrorInvalidCharacters: String { return self._s[3137]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[3139]! } + public var Common_Done: String { return self._s[3141]! } + public var AuthSessions_EmptyText: String { return self._s[3142]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[3143]! } + public var Tour_Title5: String { return self._s[3144]! } + public var Wallet_Settings_Title: String { return self._s[3145]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3121]!, self._r[3121]!, [_0]) + return formatWithArgumentRanges(self._s[3146]!, self._r[3146]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3122]! } - public var Conversation_LinkDialogSave: String { return self._s[3123]! } - public var GroupInfo_ActionRestrict: String { return self._s[3124]! } - public var Checkout_Title: String { return self._s[3125]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3127]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[3129]! } - public var Notification_RenamedGroup: String { return self._s[3130]! } - public var PeopleNearby_Groups: String { return self._s[3131]! } - public var Checkout_PayWithFaceId: String { return self._s[3132]! } - public var Channel_BanList_BlockedTitle: String { return self._s[3133]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3135]! } - public var Checkout_WebConfirmation_Title: String { return self._s[3136]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[3137]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3147]! } + public var Conversation_LinkDialogSave: String { return self._s[3148]! } + public var GroupInfo_ActionRestrict: String { return self._s[3149]! } + public var Checkout_Title: String { return self._s[3150]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3152]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[3154]! } + public var Notification_RenamedGroup: String { return self._s[3155]! } + public var PeopleNearby_Groups: String { return self._s[3156]! } + public var Checkout_PayWithFaceId: String { return self._s[3157]! } + public var Channel_BanList_BlockedTitle: String { return self._s[3158]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3160]! } + public var Checkout_WebConfirmation_Title: String { return self._s[3161]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[3162]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3138]!, self._r[3138]!, [_0]) - } - public var Profile_AddToExisting: String { return self._s[3140]! } - public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3141]!, self._r[3141]!, [_0, _1]) - } - public var Cache_Files: String { return self._s[3143]! } - public var Permissions_PrivacyPolicy: String { return self._s[3144]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[3145]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3146]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[3148]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3150]! } - public var Calls_NoCallsPlaceholder: String { return self._s[3151]! } - public func Wallet_Receive_ShareInvoiceUrlInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3152]!, self._r[3152]!, [_0]) - } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3153]! } - public var VoiceOver_AttachMedia: String { return self._s[3155]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3156]! } - public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3157]!, self._r[3157]!, [_1, _2, _3]) - } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3158]! } - public var Conversation_SetReminder_Title: String { return self._s[3159]! } - public var Passport_FieldAddressHelp: String { return self._s[3160]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3161]! } - public var PUSH_REMINDER_TITLE: String { return self._s[3162]! } - public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3163]!, self._r[3163]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[3164]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[3165]! } - public var Login_UnknownError: String { return self._s[3166]! } - public var Group_UpgradeNoticeText2: String { return self._s[3169]! } - public var Watch_Compose_AddContact: String { return self._s[3170]! } - public var Web_Error: String { return self._s[3171]! } - public var Gif_Search: String { return self._s[3172]! } - public var Profile_MessageLifetime1h: String { return self._s[3173]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3174]! } - public var Channel_Username_CheckingUsername: String { return self._s[3175]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[3176]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[3177]! } - public var Channel_AboutItem: String { return self._s[3178]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3180]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[3181]! } - public var GroupInfo_SharedMedia: String { return self._s[3182]! } + public var Profile_AddToExisting: String { return self._s[3165]! } + public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3166]!, self._r[3166]!, [_0, _1]) + } + public var Cache_Files: String { return self._s[3168]! } + public var Permissions_PrivacyPolicy: String { return self._s[3169]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[3170]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3171]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[3173]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3175]! } + public var Calls_NoCallsPlaceholder: String { return self._s[3176]! } + public func Wallet_Receive_ShareInvoiceUrlInfo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3177]!, self._r[3177]!, [_0]) + } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3178]! } + public var VoiceOver_AttachMedia: String { return self._s[3180]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3181]! } + public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3182]!, self._r[3182]!, [_1, _2, _3]) + } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3183]! } + public var Conversation_SetReminder_Title: String { return self._s[3184]! } + public var Passport_FieldAddressHelp: String { return self._s[3185]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3186]! } + public var PUSH_REMINDER_TITLE: String { return self._s[3187]! } + public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3188]!, self._r[3188]!, [_0]) + } + public var Channel_AdminLog_EmptyTitle: String { return self._s[3189]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[3190]! } + public var Login_UnknownError: String { return self._s[3191]! } + public var Group_UpgradeNoticeText2: String { return self._s[3194]! } + public var Watch_Compose_AddContact: String { return self._s[3195]! } + public var Web_Error: String { return self._s[3196]! } + public var Gif_Search: String { return self._s[3197]! } + public var Profile_MessageLifetime1h: String { return self._s[3198]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3199]! } + public var Channel_Username_CheckingUsername: String { return self._s[3200]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[3201]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[3202]! } + public var Channel_AboutItem: String { return self._s[3203]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3205]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[3206]! } + public var GroupInfo_SharedMedia: String { return self._s[3207]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3183]!, self._r[3183]!, [_1]) + return formatWithArgumentRanges(self._s[3208]!, self._r[3208]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[3184]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[3209]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3185]!, self._r[3185]!, [_1]) + return formatWithArgumentRanges(self._s[3210]!, self._r[3210]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[3186]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3187]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[3188]! } - public var CreatePoll_AddOption: String { return self._s[3189]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3190]! } - public var Group_UpgradeNoticeHeader: String { return self._s[3191]! } - public var Channel_Management_AddModerator: String { return self._s[3192]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[3193]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[3194]! } - public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3195]! } - public var NotificationsSound_Hello: String { return self._s[3197]! } - public var SocksProxySetup_SavedProxies: String { return self._s[3198]! } - public var Channel_Stickers_Placeholder: String { return self._s[3200]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[3211]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3212]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[3213]! } + public var CreatePoll_AddOption: String { return self._s[3214]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3215]! } + public var Group_UpgradeNoticeHeader: String { return self._s[3216]! } + public var Channel_Management_AddModerator: String { return self._s[3217]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[3218]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[3219]! } + public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3220]! } + public var NotificationsSound_Hello: String { return self._s[3222]! } + public var SocksProxySetup_SavedProxies: String { return self._s[3223]! } + public var Channel_Stickers_Placeholder: String { return self._s[3225]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3201]!, self._r[3201]!, [_0]) + return formatWithArgumentRanges(self._s[3226]!, self._r[3226]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3202]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[3203]! } - public var ContactInfo_BirthdayLabel: String { return self._s[3204]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3205]! } - public var AutoDownloadSettings_Channels: String { return self._s[3206]! } - public var Passport_Language_mn: String { return self._s[3207]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[3210]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3211]! } - public var Passport_Language_ja: String { return self._s[3213]! } - public var Settings_About_Title: String { return self._s[3214]! } - public var Settings_NotificationsAndSounds: String { return self._s[3215]! } - public var ChannelInfo_DeleteGroup: String { return self._s[3216]! } - public var Settings_BlockedUsers: String { return self._s[3217]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3227]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[3228]! } + public var ContactInfo_BirthdayLabel: String { return self._s[3229]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3230]! } + public var AutoDownloadSettings_Channels: String { return self._s[3231]! } + public var Passport_Language_mn: String { return self._s[3232]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[3235]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3236]! } + public var Passport_Language_ja: String { return self._s[3238]! } + public var Settings_About_Title: String { return self._s[3239]! } + public var Settings_NotificationsAndSounds: String { return self._s[3240]! } + public var ChannelInfo_DeleteGroup: String { return self._s[3241]! } + public var Settings_BlockedUsers: String { return self._s[3242]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3218]!, self._r[3218]!, [_0]) + return formatWithArgumentRanges(self._s[3243]!, self._r[3243]!, [_0]) } - public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3219]! } - public var Wallet_Weekday_Today: String { return self._s[3220]! } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3221]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3222]! } - public var Channel_Username_Title: String { return self._s[3223]! } + public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3244]! } + public var Wallet_Weekday_Today: String { return self._s[3245]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3246]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3247]! } + public var Channel_Username_Title: String { return self._s[3248]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3224]!, self._r[3224]!, [_0]) + return formatWithArgumentRanges(self._s[3249]!, self._r[3249]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3226]! } - public var AppleWatch_Title: String { return self._s[3227]! } - public var Activity_RecordingVideoMessage: String { return self._s[3228]! } + public var AttachmentMenu_File: String { return self._s[3251]! } + public var AppleWatch_Title: String { return self._s[3252]! } + public var Activity_RecordingVideoMessage: String { return self._s[3253]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3229]!, self._r[3229]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3254]!, self._r[3254]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[3230]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3231]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3232]! } - public var Common_Next: String { return self._s[3234]! } - public var Channel_Stickers_YourStickers: String { return self._s[3236]! } - public var Message_Theme: String { return self._s[3237]! } - public var Call_AudioRouteHeadphones: String { return self._s[3238]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3240]! } - public var Watch_Contacts_NoResults: String { return self._s[3242]! } - public var PhotoEditor_TintTool: String { return self._s[3245]! } - public var LoginPassword_ResetAccount: String { return self._s[3247]! } - public var Settings_SavedMessages: String { return self._s[3248]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3249]! } - public var Bot_GenericSupportStatus: String { return self._s[3250]! } - public var StickerPack_Add: String { return self._s[3251]! } - public var Checkout_TotalAmount: String { return self._s[3252]! } - public var Your_cards_number_is_invalid: String { return self._s[3253]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3254]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3255]! } + public var Weekday_Saturday: String { return self._s[3255]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3256]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3257]! } + public var Common_Next: String { return self._s[3259]! } + public var Channel_Stickers_YourStickers: String { return self._s[3261]! } + public var Message_Theme: String { return self._s[3262]! } + public var Call_AudioRouteHeadphones: String { return self._s[3263]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3265]! } + public var Watch_Contacts_NoResults: String { return self._s[3267]! } + public var PhotoEditor_TintTool: String { return self._s[3270]! } + public var LoginPassword_ResetAccount: String { return self._s[3272]! } + public var Settings_SavedMessages: String { return self._s[3273]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3274]! } + public var Bot_GenericSupportStatus: String { return self._s[3275]! } + public var StickerPack_Add: String { return self._s[3276]! } + public var Checkout_TotalAmount: String { return self._s[3277]! } + public var Your_cards_number_is_invalid: String { return self._s[3278]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3279]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3280]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3256]!, self._r[3256]!, [_0]) + return formatWithArgumentRanges(self._s[3281]!, self._r[3281]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3257]!, self._r[3257]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3282]!, self._r[3282]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3258]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3283]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3260]!, self._r[3260]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3285]!, self._r[3285]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3261]!, self._r[3261]!, [_0]) + return formatWithArgumentRanges(self._s[3286]!, self._r[3286]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3262]! } - public var StickerPack_Share: String { return self._s[3263]! } - public var Passport_DeleteAddress: String { return self._s[3264]! } - public var Settings_Passport: String { return self._s[3265]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3266]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3267]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3268]! } - public var Contacts_PermissionsText: String { return self._s[3269]! } - public var Group_Setup_HistoryVisible: String { return self._s[3270]! } - public var Wallet_Month_ShortDecember: String { return self._s[3272]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3273]! } - public var SocksProxySetup_Title: String { return self._s[3274]! } - public var Notification_Mute1h: String { return self._s[3275]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3287]! } + public var StickerPack_Share: String { return self._s[3288]! } + public var Passport_DeleteAddress: String { return self._s[3289]! } + public var Settings_Passport: String { return self._s[3290]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3291]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3292]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3293]! } + public var Contacts_PermissionsText: String { return self._s[3294]! } + public var Group_Setup_HistoryVisible: String { return self._s[3295]! } + public var Wallet_Month_ShortDecember: String { return self._s[3297]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3298]! } + public var SocksProxySetup_Title: String { return self._s[3299]! } + public var Notification_Mute1h: String { return self._s[3300]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3276]!, self._r[3276]!, [_0]) + return formatWithArgumentRanges(self._s[3301]!, self._r[3301]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3277]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3302]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3278]!, self._r[3278]!, [_1]) + return formatWithArgumentRanges(self._s[3303]!, self._r[3303]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3279]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3282]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3284]! } - public var DialogList_NoMessagesText: String { return self._s[3285]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3286]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3287]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3289]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3290]! } - public var Common_TakePhotoOrVideo: String { return self._s[3291]! } - public var Wallet_Words_Text: String { return self._s[3292]! } - public var Call_StatusBusy: String { return self._s[3293]! } - public var Conversation_PinnedMessage: String { return self._s[3294]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3295]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3296]! } - public var Undo_ChatCleared: String { return self._s[3297]! } - public var AppleWatch_ReplyPresets: String { return self._s[3298]! } - public var Passport_DiscardMessageDescription: String { return self._s[3300]! } - public var Login_NetworkError: String { return self._s[3301]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3304]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3307]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3309]! } + public var DialogList_NoMessagesText: String { return self._s[3310]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3311]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3312]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3314]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3315]! } + public var Common_TakePhotoOrVideo: String { return self._s[3316]! } + public var Wallet_Words_Text: String { return self._s[3317]! } + public var Call_StatusBusy: String { return self._s[3318]! } + public var Conversation_PinnedMessage: String { return self._s[3319]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3320]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3321]! } + public var Undo_ChatCleared: String { return self._s[3322]! } + public var AppleWatch_ReplyPresets: String { return self._s[3323]! } + public var Passport_DiscardMessageDescription: String { return self._s[3325]! } + public var Login_NetworkError: String { return self._s[3326]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3302]!, self._r[3302]!, [_0]) + return formatWithArgumentRanges(self._s[3327]!, self._r[3327]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3303]!, self._r[3303]!, [_0]) + return formatWithArgumentRanges(self._s[3328]!, self._r[3328]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3304]! } - public var Wallet_WordCheck_ViewWords: String { return self._s[3306]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3307]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3329]! } + public var Wallet_WordCheck_ViewWords: String { return self._s[3331]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3332]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3309]!, self._r[3309]!, [_0]) + return formatWithArgumentRanges(self._s[3334]!, self._r[3334]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3310]! } - public var VoiceOver_Chat_Music: String { return self._s[3311]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3312]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3314]! } - public var ConversationMedia_Title: String { return self._s[3315]! } - public var EncryptionKey_Title: String { return self._s[3317]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3318]! } - public var Notification_Exceptions_AddException: String { return self._s[3319]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3320]! } - public var Profile_MessageLifetime1m: String { return self._s[3321]! } + public var Call_ConnectionErrorMessage: String { return self._s[3335]! } + public var VoiceOver_Chat_Music: String { return self._s[3336]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3337]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3339]! } + public var ConversationMedia_Title: String { return self._s[3340]! } + public var EncryptionKey_Title: String { return self._s[3342]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3343]! } + public var Notification_Exceptions_AddException: String { return self._s[3344]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3345]! } + public var Profile_MessageLifetime1m: String { return self._s[3346]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3322]!, self._r[3322]!, [_1]) + return formatWithArgumentRanges(self._s[3347]!, self._r[3347]!, [_1]) } - public var Month_GenMay: String { return self._s[3323]! } + public var Month_GenMay: String { return self._s[3348]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3324]!, self._r[3324]!, [_0]) + return formatWithArgumentRanges(self._s[3349]!, self._r[3349]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3325]! } - public var Wallet_Send_AddressInfo: String { return self._s[3326]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3327]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3328]! } + public var PeopleNearby_Users: String { return self._s[3350]! } + public var Wallet_Send_AddressInfo: String { return self._s[3351]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3352]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3353]! } public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3330]!, self._r[3330]!, [_0]) + return formatWithArgumentRanges(self._s[3355]!, self._r[3355]!, [_0]) } - public var Conversation_EmptyPlaceholder: String { return self._s[3331]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3332]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3333]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3334]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3335]! } - public var Channel_JoinChannel: String { return self._s[3337]! } - public var Appearance_Animations: String { return self._s[3340]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3356]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3357]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3358]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3359]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3360]! } + public var Channel_JoinChannel: String { return self._s[3362]! } + public var Appearance_Animations: String { return self._s[3365]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3341]!, self._r[3341]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3366]!, self._r[3366]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3343]! } - public var Appearance_ShareTheme: String { return self._s[3344]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3346]! } - public var Passport_Address_Street: String { return self._s[3347]! } - public var Conversation_AddContact: String { return self._s[3348]! } - public var Login_PhonePlaceholder: String { return self._s[3349]! } - public var Channel_Members_InviteLink: String { return self._s[3351]! } - public var Bot_Stop: String { return self._s[3352]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3354]! } - public var Notification_PassportValueAddress: String { return self._s[3355]! } - public var Month_ShortJuly: String { return self._s[3356]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3357]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3358]! } - public var Passport_Identity_ReverseSide: String { return self._s[3359]! } - public var Watch_Stickers_Recents: String { return self._s[3362]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3364]! } - public var Map_SendThisLocation: String { return self._s[3365]! } + public var Stickers_GroupStickers: String { return self._s[3368]! } + public var Appearance_ShareTheme: String { return self._s[3369]! } + public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3370]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3372]! } + public var Passport_Address_Street: String { return self._s[3373]! } + public var Conversation_AddContact: String { return self._s[3374]! } + public var Login_PhonePlaceholder: String { return self._s[3375]! } + public var Channel_Members_InviteLink: String { return self._s[3377]! } + public var Bot_Stop: String { return self._s[3378]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3380]! } + public var Notification_PassportValueAddress: String { return self._s[3381]! } + public var Month_ShortJuly: String { return self._s[3382]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3383]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3384]! } + public var Passport_Identity_ReverseSide: String { return self._s[3385]! } + public var Watch_Stickers_Recents: String { return self._s[3388]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3390]! } + public var Map_SendThisLocation: String { return self._s[3391]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3366]!, self._r[3366]!, [_0]) + return formatWithArgumentRanges(self._s[3392]!, self._r[3392]!, [_0]) } public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3367]!, self._r[3367]!, [_0]) + return formatWithArgumentRanges(self._s[3393]!, self._r[3393]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3368]! } - public var Wallet_Intro_NotNow: String { return self._s[3369]! } + public var ConvertToSupergroup_Note: String { return self._s[3394]! } + public var Wallet_Intro_NotNow: String { return self._s[3395]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3370]!, self._r[3370]!, [_0]) + return formatWithArgumentRanges(self._s[3396]!, self._r[3396]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3371]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3397]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3372]!, self._r[3372]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3398]!, self._r[3398]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3374]! } - public var Wallpaper_SearchShort: String { return self._s[3375]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3377]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3378]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3379]! } + public var Login_CallRequestState3: String { return self._s[3400]! } + public var Wallpaper_SearchShort: String { return self._s[3401]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3403]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3404]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3405]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3380]!, self._r[3380]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3406]!, self._r[3406]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3381]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3385]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3407]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3411]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3386]!, self._r[3386]!, [_0]) + return formatWithArgumentRanges(self._s[3412]!, self._r[3412]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3387]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3388]! } + public var Passport_CorrectErrors: String { return self._s[3413]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3414]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3389]!, self._r[3389]!, [_0]) + return formatWithArgumentRanges(self._s[3415]!, self._r[3415]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3390]! } - public var Channel_DiscussionGroup: String { return self._s[3391]! } + public var Map_SendMyCurrentLocation: String { return self._s[3416]! } + public var Channel_DiscussionGroup: String { return self._s[3417]! } + public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3418]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3392]!, self._r[3392]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3419]!, self._r[3419]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3393]! } - public var Permissions_NotificationsText_v0: String { return self._s[3394]! } - public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3395]! } - public var Appearance_AppIcon: String { return self._s[3396]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3397]! } - public var LoginPassword_FloodError: String { return self._s[3398]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3400]! } + public var SharedMedia_SearchNoResults: String { return self._s[3420]! } + public var Permissions_NotificationsText_v0: String { return self._s[3421]! } + public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3422]! } + public var Appearance_AppIcon: String { return self._s[3423]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3424]! } + public var LoginPassword_FloodError: String { return self._s[3425]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3427]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3401]!, self._r[3401]!, [_0]) + return formatWithArgumentRanges(self._s[3428]!, self._r[3428]!, [_0]) } - public var Passport_Language_bn: String { return self._s[3402]! } + public var Passport_Language_bn: String { return self._s[3429]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3403]!, self._r[3403]!, [_0]) + return formatWithArgumentRanges(self._s[3430]!, self._r[3430]!, [_0]) } - public var ChatList_Context_Pin: String { return self._s[3404]! } + public var ChatList_Context_Pin: String { return self._s[3431]! } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3405]!, self._r[3405]!, [_0]) + return formatWithArgumentRanges(self._s[3432]!, self._r[3432]!, [_0]) } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3406]!, self._r[3406]!, [_0]) + return formatWithArgumentRanges(self._s[3433]!, self._r[3433]!, [_0]) } - public var Wallet_Navigation_Close: String { return self._s[3407]! } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3411]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3413]! } - public var Wallet_Month_GenDecember: String { return self._s[3414]! } - public var Contacts_PermissionsAllow: String { return self._s[3415]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3416]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3417]! } - public var WallpaperPreview_Pattern: String { return self._s[3418]! } - public var Paint_Duplicate: String { return self._s[3419]! } - public var Passport_Address_Country: String { return self._s[3420]! } - public var Notification_RenamedChannel: String { return self._s[3422]! } - public var ChatList_Context_Unmute: String { return self._s[3423]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3424]! } - public var Group_MessagePhotoUpdated: String { return self._s[3425]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3426]! } - public var Conversation_ContextMenuBan: String { return self._s[3427]! } - public var TwoStepAuth_EmailSent: String { return self._s[3428]! } - public var MessagePoll_NoVotes: String { return self._s[3429]! } - public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3430]! } - public var Passport_Language_is: String { return self._s[3431]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3433]! } - public var Tour_Text5: String { return self._s[3434]! } + public var Wallet_Navigation_Close: String { return self._s[3434]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3438]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3440]! } + public var Wallet_Month_GenDecember: String { return self._s[3441]! } + public var Contacts_PermissionsAllow: String { return self._s[3442]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3443]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3444]! } + public var WallpaperPreview_Pattern: String { return self._s[3445]! } + public var Paint_Duplicate: String { return self._s[3446]! } + public var Passport_Address_Country: String { return self._s[3447]! } + public var Notification_RenamedChannel: String { return self._s[3449]! } + public var ChatList_Context_Unmute: String { return self._s[3450]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3451]! } + public var Group_MessagePhotoUpdated: String { return self._s[3452]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3453]! } + public var Conversation_ContextMenuBan: String { return self._s[3454]! } + public var TwoStepAuth_EmailSent: String { return self._s[3455]! } + public var MessagePoll_NoVotes: String { return self._s[3456]! } + public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3457]! } + public var Passport_Language_is: String { return self._s[3458]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3460]! } + public var Tour_Text5: String { return self._s[3461]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3436]!, self._r[3436]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3463]!, self._r[3463]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3437]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3438]! } + public var Undo_SecretChatDeleted: String { return self._s[3464]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3465]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3439]!, self._r[3439]!, [_0]) + return formatWithArgumentRanges(self._s[3466]!, self._r[3466]!, [_0]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3440]! } - public var Paint_Edit: String { return self._s[3442]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3444]! } - public var Undo_DeletedGroup: String { return self._s[3446]! } - public var LoginPassword_ForgotPassword: String { return self._s[3447]! } - public var Wallet_WordImport_IncorrectTitle: String { return self._s[3448]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3449]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3467]! } + public var Paint_Edit: String { return self._s[3469]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3471]! } + public var Undo_DeletedGroup: String { return self._s[3473]! } + public var LoginPassword_ForgotPassword: String { return self._s[3474]! } + public var Wallet_WordImport_IncorrectTitle: String { return self._s[3475]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3476]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3450]!, self._r[3450]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3477]!, self._r[3477]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3451]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3452]! } - public var Passport_Language_uz: String { return self._s[3453]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3454]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3455]! } - public var Map_StopLiveLocation: String { return self._s[3457]! } - public var VoiceOver_MessageContextSend: String { return self._s[3459]! } - public var PasscodeSettings_Help: String { return self._s[3460]! } - public var NotificationsSound_Input: String { return self._s[3461]! } - public var Share_Title: String { return self._s[3464]! } - public var LogoutOptions_Title: String { return self._s[3465]! } - public var Wallet_Send_AddressText: String { return self._s[3466]! } - public var Login_TermsOfServiceAgree: String { return self._s[3467]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3468]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3469]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3470]! } - public var EnterPasscode_EnterTitle: String { return self._s[3471]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3478]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3479]! } + public var Passport_Language_uz: String { return self._s[3480]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3481]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3482]! } + public var Map_StopLiveLocation: String { return self._s[3484]! } + public var VoiceOver_MessageContextSend: String { return self._s[3486]! } + public var PasscodeSettings_Help: String { return self._s[3487]! } + public var NotificationsSound_Input: String { return self._s[3488]! } + public var Share_Title: String { return self._s[3491]! } + public var LogoutOptions_Title: String { return self._s[3492]! } + public var Wallet_Send_AddressText: String { return self._s[3493]! } + public var Login_TermsOfServiceAgree: String { return self._s[3494]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3495]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3496]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3497]! } + public var EnterPasscode_EnterTitle: String { return self._s[3498]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3472]!, self._r[3472]!, [_0]) + return formatWithArgumentRanges(self._s[3499]!, self._r[3499]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3473]! } - public var Conversation_AddToContacts: String { return self._s[3474]! } + public var Settings_CopyPhoneNumber: String { return self._s[3500]! } + public var Conversation_AddToContacts: String { return self._s[3501]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3475]!, self._r[3475]!, [_0]) + return formatWithArgumentRanges(self._s[3502]!, self._r[3502]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[3476]! } + public var NotificationsSound_Keys: String { return self._s[3503]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3477]!, self._r[3477]!, [_0]) + return formatWithArgumentRanges(self._s[3504]!, self._r[3504]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3478]! } - public var Message_Video: String { return self._s[3479]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3480]! } + public var Notification_MessageLifetime1w: String { return self._s[3505]! } + public var Message_Video: String { return self._s[3506]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3507]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3481]!, self._r[3481]!, [_1]) + return formatWithArgumentRanges(self._s[3508]!, self._r[3508]!, [_1]) } - public var Wallet_Receive_AmountInfo: String { return self._s[3484]! } + public var Wallet_Receive_AmountInfo: String { return self._s[3511]! } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3485]!, self._r[3485]!, [_0]) + return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_0]) } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3486]!, self._r[3486]!, [_0]) + return formatWithArgumentRanges(self._s[3513]!, self._r[3513]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3487]! } + public var Passport_Language_mk: String { return self._s[3514]! } public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3488]!, self._r[3488]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3515]!, self._r[3515]!, [_1, _2, _3]) } - public var CreatePoll_CancelConfirmation: String { return self._s[3489]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3491]! } - public var PrivacyPolicy_Decline: String { return self._s[3492]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3493]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3494]! } - public var Permissions_SiriAllow_v0: String { return self._s[3496]! } - public var Wallet_Month_ShortAugust: String { return self._s[3497]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3498]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3516]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3518]! } + public var PrivacyPolicy_Decline: String { return self._s[3519]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3520]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3521]! } + public var Permissions_SiriAllow_v0: String { return self._s[3523]! } + public var Wallet_Month_ShortAugust: String { return self._s[3524]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3525]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3499]!, self._r[3499]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3526]!, self._r[3526]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3500]!, self._r[3500]!, [_0]) + return formatWithArgumentRanges(self._s[3527]!, self._r[3527]!, [_0]) } - public var Paint_Regular: String { return self._s[3501]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3502]! } - public var SocksProxySetup_ShareLink: String { return self._s[3503]! } - public var Wallet_Qr_Title: String { return self._s[3504]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3505]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3507]! } - public var GroupInfo_InviteByLink: String { return self._s[3508]! } - public var MessageTimer_Custom: String { return self._s[3509]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3510]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3512]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3513]! } - public var VoiceOver_Chat_Selected: String { return self._s[3514]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3515]! } - public var Channel_Username_InvalidTaken: String { return self._s[3516]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3517]! } - public var Wallet_WordCheck_TryAgain: String { return self._s[3518]! } - public var Wallet_Info_TransactionPendingHeader: String { return self._s[3519]! } - public var Settings_ChatBackground: String { return self._s[3520]! } - public var Channel_Subscribers_Title: String { return self._s[3521]! } - public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3522]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3523]! } - public var Watch_ConnectionDescription: String { return self._s[3524]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3528]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3529]! } - public var EditProfile_Title: String { return self._s[3530]! } - public var NotificationsSound_Bamboo: String { return self._s[3532]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3534]! } - public var Login_SmsRequestState2: String { return self._s[3535]! } - public var Passport_Language_ar: String { return self._s[3536]! } + public var Paint_Regular: String { return self._s[3528]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3529]! } + public var SocksProxySetup_ShareLink: String { return self._s[3530]! } + public var Wallet_Qr_Title: String { return self._s[3531]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3532]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3534]! } + public var GroupInfo_InviteByLink: String { return self._s[3535]! } + public var MessageTimer_Custom: String { return self._s[3536]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3537]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3539]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3540]! } + public var VoiceOver_Chat_Selected: String { return self._s[3541]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3542]! } + public var Channel_Username_InvalidTaken: String { return self._s[3543]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3544]! } + public var Wallet_WordCheck_TryAgain: String { return self._s[3545]! } + public var Wallet_Info_TransactionPendingHeader: String { return self._s[3546]! } + public var Settings_ChatBackground: String { return self._s[3547]! } + public var Channel_Subscribers_Title: String { return self._s[3548]! } + public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3549]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3550]! } + public var Watch_ConnectionDescription: String { return self._s[3551]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3555]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3556]! } + public var EditProfile_Title: String { return self._s[3557]! } + public var NotificationsSound_Bamboo: String { return self._s[3559]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3561]! } + public var Login_SmsRequestState2: String { return self._s[3562]! } + public var Passport_Language_ar: String { return self._s[3563]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3537]!, self._r[3537]!, [_0]) + return formatWithArgumentRanges(self._s[3564]!, self._r[3564]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3538]! } - public var Wallet_Created_Text: String { return self._s[3539]! } - public var Conversation_MessageDialogEdit: String { return self._s[3540]! } - public var Wallet_Created_Proceed: String { return self._s[3541]! } - public var Wallet_Words_Done: String { return self._s[3542]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3543]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3565]! } + public var Wallet_Created_Text: String { return self._s[3566]! } + public var Conversation_MessageDialogEdit: String { return self._s[3567]! } + public var Wallet_Created_Proceed: String { return self._s[3568]! } + public var Wallet_Words_Done: String { return self._s[3569]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3570]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3544]!, self._r[3544]!, [_1]) + return formatWithArgumentRanges(self._s[3571]!, self._r[3571]!, [_1]) } - public var Common_Close: String { return self._s[3545]! } - public var GroupInfo_PublicLink: String { return self._s[3546]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3547]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3548]! } + public var Common_Close: String { return self._s[3572]! } + public var GroupInfo_PublicLink: String { return self._s[3573]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3574]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3575]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3552]!, self._r[3552]!, [_0]) + return formatWithArgumentRanges(self._s[3579]!, self._r[3579]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3553]! } + public var UserInfo_About_Placeholder: String { return self._s[3580]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3554]!, self._r[3554]!, [_0]) + return formatWithArgumentRanges(self._s[3581]!, self._r[3581]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3555]! } - public var Channel_Info_Banned: String { return self._s[3557]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3582]! } + public var Channel_Info_Banned: String { return self._s[3584]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3558]!, self._r[3558]!, [_0]) + return formatWithArgumentRanges(self._s[3585]!, self._r[3585]!, [_0]) } - public var Appearance_Other: String { return self._s[3559]! } - public var Passport_Language_my: String { return self._s[3560]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3561]! } + public var Appearance_Other: String { return self._s[3586]! } + public var Passport_Language_my: String { return self._s[3587]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3588]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3562]!, self._r[3562]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3589]!, self._r[3589]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3563]! } - public var Preview_CopyAddress: String { return self._s[3564]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3590]! } + public var Preview_CopyAddress: String { return self._s[3591]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3565]!, self._r[3565]!, [_0]) + return formatWithArgumentRanges(self._s[3592]!, self._r[3592]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3566]! } - public var UserInfo_BotSettings: String { return self._s[3567]! } - public var LiveLocation_MenuStopAll: String { return self._s[3569]! } - public var Passport_PasswordCreate: String { return self._s[3570]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3571]! } - public var Message_PinnedLocationMessage: String { return self._s[3572]! } - public var Map_Satellite: String { return self._s[3573]! } - public var Watch_Message_Unsupported: String { return self._s[3574]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3575]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3576]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3593]! } + public var UserInfo_BotSettings: String { return self._s[3594]! } + public var LiveLocation_MenuStopAll: String { return self._s[3596]! } + public var Passport_PasswordCreate: String { return self._s[3597]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3598]! } + public var Message_PinnedLocationMessage: String { return self._s[3599]! } + public var Map_Satellite: String { return self._s[3600]! } + public var Watch_Message_Unsupported: String { return self._s[3601]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3602]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3603]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3577]!, self._r[3577]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3604]!, self._r[3604]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3578]!, self._r[3578]!, [_0]) + return formatWithArgumentRanges(self._s[3605]!, self._r[3605]!, [_0]) } - public var Wallet_WordImport_Continue: String { return self._s[3579]! } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3580]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3581]! } - public var NotificationsSound_None: String { return self._s[3582]! } - public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3583]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3585]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3586]! } + public var Wallet_WordImport_Continue: String { return self._s[3606]! } + public func TwoFactorSetup_EmailVerification_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3607]!, self._r[3607]!, [_0]) + } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3608]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3609]! } + public var NotificationsSound_None: String { return self._s[3610]! } + public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3611]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3613]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3614]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3587]!, self._r[3587]!, [_1]) + return formatWithArgumentRanges(self._s[3615]!, self._r[3615]!, [_1]) } - public var Cache_Indexing: String { return self._s[3588]! } - public var DialogList_RecentTitlePeople: String { return self._s[3590]! } - public var DialogList_EncryptionRejected: String { return self._s[3591]! } - public var GroupInfo_Administrators: String { return self._s[3592]! } - public var Passport_ScanPassportHelp: String { return self._s[3593]! } - public var Application_Name: String { return self._s[3594]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3595]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3597]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3598]! } + public var Cache_Indexing: String { return self._s[3616]! } + public var DialogList_RecentTitlePeople: String { return self._s[3618]! } + public var DialogList_EncryptionRejected: String { return self._s[3619]! } + public var GroupInfo_Administrators: String { return self._s[3620]! } + public var Passport_ScanPassportHelp: String { return self._s[3621]! } + public var Application_Name: String { return self._s[3622]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3623]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3625]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3626]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3599]!, self._r[3599]!, [_0]) + return formatWithArgumentRanges(self._s[3627]!, self._r[3627]!, [_0]) } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3600]!, self._r[3600]!, [_0]) + return formatWithArgumentRanges(self._s[3628]!, self._r[3628]!, [_0]) } public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3601]!, self._r[3601]!, [_0]) + return formatWithArgumentRanges(self._s[3629]!, self._r[3629]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3602]! } - public var Privacy_ChatsTitle: String { return self._s[3603]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3604]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3605]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3606]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3607]! } - public var Group_LinkedChannel: String { return self._s[3608]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3609]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3610]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3611]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3612]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3614]! } - public var Channel_Setup_TypePublic: String { return self._s[3616]! } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3630]! } + public var Privacy_ChatsTitle: String { return self._s[3631]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3632]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3633]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3634]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3635]! } + public var Group_LinkedChannel: String { return self._s[3636]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3637]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3638]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3639]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3640]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3642]! } + public var Channel_Setup_TypePublic: String { return self._s[3644]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3617]!, self._r[3617]!, [_0]) + return formatWithArgumentRanges(self._s[3645]!, self._r[3645]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3619]! } - public var Map_OpenInMaps: String { return self._s[3621]! } + public var Channel_TypeSetup_Title: String { return self._s[3647]! } + public var Map_OpenInMaps: String { return self._s[3649]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3622]!, self._r[3622]!, [_1]) + return formatWithArgumentRanges(self._s[3650]!, self._r[3650]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3624]! } + public var NotificationsSound_Tremolo: String { return self._s[3652]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3625]!, self._r[3625]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3653]!, self._r[3653]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3626]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3627]! } - public var Passport_PasswordHelp: String { return self._s[3628]! } - public var Login_CodeExpiredError: String { return self._s[3629]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3630]! } - public var Conversation_TitleUnmute: String { return self._s[3631]! } - public var Passport_Identity_ScansHelp: String { return self._s[3632]! } - public var Passport_Language_lo: String { return self._s[3633]! } - public var Camera_FlashAuto: String { return self._s[3634]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3635]! } - public var Common_Cancel: String { return self._s[3636]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3637]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3638]! } - public var Appearance_TintAllColors: String { return self._s[3639]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3654]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3655]! } + public var Passport_PasswordHelp: String { return self._s[3656]! } + public var Login_CodeExpiredError: String { return self._s[3657]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3658]! } + public var Conversation_TitleUnmute: String { return self._s[3659]! } + public var Passport_Identity_ScansHelp: String { return self._s[3660]! } + public var Passport_Language_lo: String { return self._s[3661]! } + public var Camera_FlashAuto: String { return self._s[3662]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3663]! } + public var Common_Cancel: String { return self._s[3664]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3665]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3666]! } + public var Appearance_TintAllColors: String { return self._s[3667]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3640]!, self._r[3640]!, [_1]) + return formatWithArgumentRanges(self._s[3668]!, self._r[3668]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3641]! } - public var ChatSettings_Title: String { return self._s[3643]! } - public var Passport_PasswordReset: String { return self._s[3644]! } - public var SocksProxySetup_TypeNone: String { return self._s[3645]! } - public var EditTheme_Title: String { return self._s[3647]! } - public var PhoneNumberHelp_Help: String { return self._s[3648]! } - public var Checkout_EnterPassword: String { return self._s[3649]! } - public var Share_AuthTitle: String { return self._s[3651]! } - public var Activity_UploadingDocument: String { return self._s[3652]! } - public var State_Connecting: String { return self._s[3653]! } - public var Profile_MessageLifetime1w: String { return self._s[3654]! } - public var Conversation_ContextMenuReport: String { return self._s[3655]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3656]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3657]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3669]! } + public var ChatSettings_Title: String { return self._s[3671]! } + public var Passport_PasswordReset: String { return self._s[3672]! } + public var SocksProxySetup_TypeNone: String { return self._s[3673]! } + public var EditTheme_Title: String { return self._s[3675]! } + public var PhoneNumberHelp_Help: String { return self._s[3676]! } + public var Checkout_EnterPassword: String { return self._s[3677]! } + public var Share_AuthTitle: String { return self._s[3679]! } + public var Activity_UploadingDocument: String { return self._s[3680]! } + public var State_Connecting: String { return self._s[3681]! } + public var Profile_MessageLifetime1w: String { return self._s[3682]! } + public var Conversation_ContextMenuReport: String { return self._s[3683]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3684]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3685]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3658]!, self._r[3658]!, [_0]) + return formatWithArgumentRanges(self._s[3686]!, self._r[3686]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3659]! } - public var Wallet_WordImport_CanNotRemember: String { return self._s[3660]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3661]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3662]! } - public var PhotoEditor_Set: String { return self._s[3663]! } - public var EmptyGroupInfo_Title: String { return self._s[3664]! } - public var Login_PadPhoneHelp: String { return self._s[3665]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3667]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3669]! } - public var NotificationsSound_Complete: String { return self._s[3670]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3671]! } - public var Group_Info_AdminLog: String { return self._s[3672]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3673]! } + public var AuthSessions_Terminate: String { return self._s[3687]! } + public var Wallet_WordImport_CanNotRemember: String { return self._s[3688]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3689]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3690]! } + public var PhotoEditor_Set: String { return self._s[3691]! } + public var EmptyGroupInfo_Title: String { return self._s[3692]! } + public var Login_PadPhoneHelp: String { return self._s[3693]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3695]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3697]! } + public var NotificationsSound_Complete: String { return self._s[3698]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3699]! } + public var Group_Info_AdminLog: String { return self._s[3700]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3701]! } public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3674]!, self._r[3674]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3702]!, self._r[3702]!, [_1, _2, _3]) } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3675]! } - public var Conversation_Admin: String { return self._s[3677]! } - public var Conversation_GifTooltip: String { return self._s[3678]! } - public var Passport_NotLoggedInMessage: String { return self._s[3679]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3703]! } + public var Conversation_Admin: String { return self._s[3705]! } + public var Conversation_GifTooltip: String { return self._s[3706]! } + public var Passport_NotLoggedInMessage: String { return self._s[3707]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3681]!, self._r[3681]!, [_0]) + return formatWithArgumentRanges(self._s[3709]!, self._r[3709]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3682]! } - public var SharedMedia_EmptyTitle: String { return self._s[3684]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3686]! } - public var Username_Help: String { return self._s[3687]! } - public var DialogList_LanguageTooltip: String { return self._s[3689]! } - public var Map_LoadError: String { return self._s[3690]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3691]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3692]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3693]! } - public var Notification_Exceptions_NewException: String { return self._s[3694]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3695]! } - public var WatchRemote_AlertText: String { return self._s[3696]! } + public var Profile_MessageLifetimeForever: String { return self._s[3710]! } + public var SharedMedia_EmptyTitle: String { return self._s[3712]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3714]! } + public var Username_Help: String { return self._s[3715]! } + public var DialogList_LanguageTooltip: String { return self._s[3717]! } + public var Map_LoadError: String { return self._s[3718]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3719]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3720]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3721]! } + public var Notification_Exceptions_NewException: String { return self._s[3722]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3723]! } + public var WatchRemote_AlertText: String { return self._s[3724]! } public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3697]!, self._r[3697]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3725]!, self._r[3725]!, [_1, _2]) } - public var ChatSettings_ConnectionType_Title: String { return self._s[3701]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3729]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3702]!, self._r[3702]!, [_0]) + return formatWithArgumentRanges(self._s[3730]!, self._r[3730]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3703]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3704]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3731]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3732]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3705]!, self._r[3705]!, [_0]) + return formatWithArgumentRanges(self._s[3733]!, self._r[3733]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3706]!, self._r[3706]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3734]!, self._r[3734]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3707]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3708]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3710]! } - public var Wallet_Created_ExportErrorText: String { return self._s[3711]! } - public var ChatList_UndoArchiveText1: String { return self._s[3712]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3713]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3714]! } - public var Cache_ClearNone: String { return self._s[3715]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3716]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3717]! } + public var Group_AdminLog_EmptyText: String { return self._s[3735]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3736]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3738]! } + public var Wallet_Created_ExportErrorText: String { return self._s[3739]! } + public var ChatList_UndoArchiveText1: String { return self._s[3740]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3741]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3742]! } + public var Cache_ClearNone: String { return self._s[3743]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3744]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3745]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3718]!, self._r[3718]!, [_0]) + return formatWithArgumentRanges(self._s[3746]!, self._r[3746]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[3719]! } + public var Passport_Identity_Country: String { return self._s[3747]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3720]!, self._r[3720]!, [_0]) + return formatWithArgumentRanges(self._s[3748]!, self._r[3748]!, [_0]) } public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3721]!, self._r[3721]!, [_0]) + return formatWithArgumentRanges(self._s[3749]!, self._r[3749]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3722]! } - public var AccessDenied_Settings: String { return self._s[3723]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3724]! } - public var Month_ShortMay: String { return self._s[3725]! } - public var Compose_NewGroup: String { return self._s[3727]! } - public var Group_Setup_TypePrivate: String { return self._s[3729]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3731]! } - public var Appearance_ThemeDayClassic: String { return self._s[3732]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3733]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3734]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3735]! } - public var Conversation_typing: String { return self._s[3737]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[3738]! } - public var Paint_Masks: String { return self._s[3739]! } - public var Contacts_DeselectAll: String { return self._s[3740]! } + public var Exceptions_AddToExceptions: String { return self._s[3750]! } + public var AccessDenied_Settings: String { return self._s[3751]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3752]! } + public var Month_ShortMay: String { return self._s[3753]! } + public var Compose_NewGroup: String { return self._s[3755]! } + public var Group_Setup_TypePrivate: String { return self._s[3757]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3759]! } + public var Appearance_ThemeDayClassic: String { return self._s[3760]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3761]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3762]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3763]! } + public var Conversation_typing: String { return self._s[3765]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3766]! } + public var Paint_Masks: String { return self._s[3767]! } + public var Contacts_DeselectAll: String { return self._s[3768]! } public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3741]!, self._r[3741]!, [_0]) + return formatWithArgumentRanges(self._s[3769]!, self._r[3769]!, [_0]) } - public var Username_InvalidTaken: String { return self._s[3742]! } - public var Call_StatusNoAnswer: String { return self._s[3743]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3744]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3745]! } - public var Passport_Identity_Selfie: String { return self._s[3746]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3747]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3748]! } - public var Conversation_ClearSecretHistory: String { return self._s[3749]! } - public var PeopleNearby_Description: String { return self._s[3751]! } - public var NetworkUsageSettings_Title: String { return self._s[3752]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3754]! } + public var Username_InvalidTaken: String { return self._s[3770]! } + public var Call_StatusNoAnswer: String { return self._s[3771]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3772]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3773]! } + public var Passport_Identity_Selfie: String { return self._s[3774]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3775]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3776]! } + public var Conversation_ClearSecretHistory: String { return self._s[3777]! } + public var PeopleNearby_Description: String { return self._s[3779]! } + public var NetworkUsageSettings_Title: String { return self._s[3780]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3782]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3756]!, self._r[3756]!, [_0]) + return formatWithArgumentRanges(self._s[3784]!, self._r[3784]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3757]!, self._r[3757]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3785]!, self._r[3785]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3759]! } - public var VoiceOver_Navigation_Search: String { return self._s[3760]! } - public var Map_LiveLocationTitle: String { return self._s[3761]! } - public var Login_InfoAvatarAdd: String { return self._s[3762]! } - public var Passport_Identity_FilesView: String { return self._s[3763]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3764]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3765]! } - public var VoiceOver_Chat_File: String { return self._s[3766]! } - public var Wallet_Settings_DeleteWalletInfo: String { return self._s[3767]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3787]! } + public var VoiceOver_Navigation_Search: String { return self._s[3788]! } + public var Map_LiveLocationTitle: String { return self._s[3789]! } + public var Login_InfoAvatarAdd: String { return self._s[3790]! } + public var Passport_Identity_FilesView: String { return self._s[3791]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3792]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3793]! } + public var VoiceOver_Chat_File: String { return self._s[3794]! } + public var Wallet_Settings_DeleteWalletInfo: String { return self._s[3795]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3768]!, self._r[3768]!, [_0]) + return formatWithArgumentRanges(self._s[3796]!, self._r[3796]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3769]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3770]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3771]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3797]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3798]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3799]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3772]!, self._r[3772]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3800]!, self._r[3800]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3773]! } - public var Wallet_Intro_CreateErrorText: String { return self._s[3774]! } - public var Tour_Title2: String { return self._s[3775]! } - public var Wallet_Sent_ViewWallet: String { return self._s[3776]! } - public var Conversation_FileOpenIn: String { return self._s[3777]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3778]! } - public var Wallet_Send_ErrorInvalidAddress: String { return self._s[3779]! } - public var Wallpaper_Set: String { return self._s[3780]! } - public var Passport_Identity_Translations: String { return self._s[3782]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3801]! } + public var Wallet_Intro_CreateErrorText: String { return self._s[3802]! } + public var Tour_Title2: String { return self._s[3803]! } + public var Wallet_Sent_ViewWallet: String { return self._s[3804]! } + public var Conversation_FileOpenIn: String { return self._s[3805]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3806]! } + public var Wallet_Send_ErrorInvalidAddress: String { return self._s[3807]! } + public var Wallpaper_Set: String { return self._s[3808]! } + public var Passport_Identity_Translations: String { return self._s[3810]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3783]!, self._r[3783]!, [_0]) + return formatWithArgumentRanges(self._s[3811]!, self._r[3811]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[3784]! } + public var Channel_LeaveChannel: String { return self._s[3812]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3785]!, self._r[3785]!, [_1]) + return formatWithArgumentRanges(self._s[3813]!, self._r[3813]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3787]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3788]! } - public var Passport_Email_Delete: String { return self._s[3789]! } - public var Conversation_Mute: String { return self._s[3791]! } - public var Channel_AddBotAsAdmin: String { return self._s[3792]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3794]! } - public var Channel_Management_LabelOwner: String { return self._s[3796]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3815]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3816]! } + public var Passport_Email_Delete: String { return self._s[3817]! } + public var Conversation_Mute: String { return self._s[3819]! } + public var Channel_AddBotAsAdmin: String { return self._s[3820]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3822]! } + public var Channel_Management_LabelOwner: String { return self._s[3824]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3797]!, self._r[3797]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3825]!, self._r[3825]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3798]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3799]! } - public var Common_No: String { return self._s[3800]! } - public var Weekday_Sunday: String { return self._s[3801]! } - public var Notification_Reply: String { return self._s[3802]! } - public var Conversation_ViewMessage: String { return self._s[3803]! } + public var Calls_CallTabDescription: String { return self._s[3826]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3827]! } + public var Common_No: String { return self._s[3828]! } + public var Weekday_Sunday: String { return self._s[3829]! } + public var Notification_Reply: String { return self._s[3830]! } + public var Conversation_ViewMessage: String { return self._s[3831]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3804]!, self._r[3804]!, [_0]) + return formatWithArgumentRanges(self._s[3832]!, self._r[3832]!, [_0]) } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3805]!, self._r[3805]!, [_0]) + return formatWithArgumentRanges(self._s[3833]!, self._r[3833]!, [_0]) } public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3806]!, self._r[3806]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3834]!, self._r[3834]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3807]! } - public var Wallet_Send_Title: String { return self._s[3808]! } - public var Message_PinnedDocumentMessage: String { return self._s[3809]! } - public var Wallet_Info_RefreshErrorText: String { return self._s[3810]! } - public var DialogList_TabTitle: String { return self._s[3812]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3813]! } - public var Passport_FieldEmail: String { return self._s[3814]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3815]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3816]! } - public var Wallet_SecureStorageReset_Title: String { return self._s[3817]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3818]! } - public var Privacy_Calls_P2P: String { return self._s[3819]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3835]! } + public var Wallet_Send_Title: String { return self._s[3836]! } + public var Message_PinnedDocumentMessage: String { return self._s[3837]! } + public var Wallet_Info_RefreshErrorText: String { return self._s[3838]! } + public var DialogList_TabTitle: String { return self._s[3840]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3841]! } + public var Passport_FieldEmail: String { return self._s[3842]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3843]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3844]! } + public var Wallet_SecureStorageReset_Title: String { return self._s[3845]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3846]! } + public var Privacy_Calls_P2P: String { return self._s[3847]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3821]!, self._r[3821]!, [_0]) + return formatWithArgumentRanges(self._s[3849]!, self._r[3849]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3822]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3850]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3823]!, self._r[3823]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3851]!, self._r[3851]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3824]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3825]! } - public var Passport_InfoText: String { return self._s[3826]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3827]! } + public var Stickers_ClearRecent: String { return self._s[3852]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3853]! } + public var TwoFactorSetup_Email_Title: String { return self._s[3854]! } + public var Passport_InfoText: String { return self._s[3855]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3856]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3828]!, self._r[3828]!, [_0]) + return formatWithArgumentRanges(self._s[3857]!, self._r[3857]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3829]!, self._r[3829]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3858]!, self._r[3858]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3830]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[3831]! } - public var VoiceOver_Navigation_Compose: String { return self._s[3832]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3833]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3835]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3836]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3859]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[3860]! } + public var VoiceOver_Navigation_Compose: String { return self._s[3861]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3862]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3864]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3865]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3837]!, self._r[3837]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3866]!, self._r[3866]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3839]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3868]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3841]!, self._r[3841]!, [_0]) + return formatWithArgumentRanges(self._s[3870]!, self._r[3870]!, [_0]) } - public var DialogList_Unread: String { return self._s[3842]! } + public var DialogList_Unread: String { return self._s[3871]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3843]!, self._r[3843]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3872]!, self._r[3872]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3844]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3845]! } + public var User_DeletedAccount: String { return self._s[3873]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3874]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3846]!, self._r[3846]!, [_0]) + return formatWithArgumentRanges(self._s[3875]!, self._r[3875]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3847]! } - public var SharedMedia_CategoryMedia: String { return self._s[3848]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3849]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3850]! } - public var Watch_ChatList_Compose: String { return self._s[3851]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3852]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3853]! } - public var Watch_Microphone_Access: String { return self._s[3854]! } - public var Group_Setup_HistoryHeader: String { return self._s[3855]! } - public var Map_SetThisLocation: String { return self._s[3856]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3857]! } - public var Activity_UploadingPhoto: String { return self._s[3858]! } - public var Conversation_Edit: String { return self._s[3860]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3861]! } - public var Login_TermsOfServiceDecline: String { return self._s[3862]! } - public var Message_PinnedContactMessage: String { return self._s[3863]! } + public var UserInfo_NotificationsDefault: String { return self._s[3876]! } + public var SharedMedia_CategoryMedia: String { return self._s[3877]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3878]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3879]! } + public var Watch_ChatList_Compose: String { return self._s[3880]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3881]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3882]! } + public var Watch_Microphone_Access: String { return self._s[3883]! } + public var Group_Setup_HistoryHeader: String { return self._s[3884]! } + public var Map_SetThisLocation: String { return self._s[3885]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3886]! } + public var Activity_UploadingPhoto: String { return self._s[3887]! } + public var Conversation_Edit: String { return self._s[3889]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3890]! } + public var Login_TermsOfServiceDecline: String { return self._s[3891]! } + public var Message_PinnedContactMessage: String { return self._s[3892]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3864]!, self._r[3864]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3893]!, self._r[3893]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3865]!, self._r[3865]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3894]!, self._r[3894]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3866]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3868]! } - public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[3869]! } + public var Appearance_LargeEmoji: String { return self._s[3895]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3897]! } + public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[3898]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3870]!, self._r[3870]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3899]!, self._r[3899]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3871]! } - public var Message_PinnedPhotoMessage: String { return self._s[3872]! } - public var Passport_FieldPhone: String { return self._s[3873]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3874]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3875]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3877]! } - public var Conversation_Call: String { return self._s[3878]! } - public var Common_TakePhoto: String { return self._s[3880]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3881]! } - public var Wallet_Receive_CommentHeader: String { return self._s[3882]! } - public var Channel_NotificationLoading: String { return self._s[3883]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3900]! } + public var Message_PinnedPhotoMessage: String { return self._s[3901]! } + public var Passport_FieldPhone: String { return self._s[3902]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3903]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3904]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3906]! } + public var Conversation_Call: String { return self._s[3907]! } + public var Common_TakePhoto: String { return self._s[3909]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3910]! } + public var Wallet_Receive_CommentHeader: String { return self._s[3911]! } + public var Channel_NotificationLoading: String { return self._s[3912]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3884]!, self._r[3884]!, [_0]) - } - public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3885]!, self._r[3885]!, [_0]) - } - public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3886]!, self._r[3886]!, [_1]) - } - public var Permissions_SiriTitle_v0: String { return self._s[3887]! } - public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3888]!, self._r[3888]!, [_0]) - } - public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3889]!, self._r[3889]!, [_0]) - } - public var Channel_MessagePhotoRemoved: String { return self._s[3890]! } - public var Wallet_Info_ReceiveGrams: String { return self._s[3891]! } - public var Common_edit: String { return self._s[3892]! } - public var PrivacySettings_AuthSessions: String { return self._s[3893]! } - public var Month_ShortJune: String { return self._s[3894]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3895]! } - public var Call_ReportSend: String { return self._s[3896]! } - public var Watch_LastSeen_JustNow: String { return self._s[3897]! } - public var Notifications_MessageNotifications: String { return self._s[3898]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3899]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3901]! } - public var Group_Status: String { return self._s[3902]! } - public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3903]!, self._r[3903]!, [_0, _1]) - } - public var TextFormat_AddLinkTitle: String { return self._s[3904]! } - public var ShareMenu_ShareTo: String { return self._s[3905]! } - public var Conversation_Moderate_Ban: String { return self._s[3906]! } - public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3907]!, self._r[3907]!, [_0]) - } - public var SharedMedia_ViewInChat: String { return self._s[3908]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3909]! } - public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3910]!, self._r[3910]!, [_1]) - } - public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3911]!, self._r[3911]!, [_1, _2]) - } - public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3913]!, self._r[3913]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3914]! } - public var Appearance_ReduceMotion: String { return self._s[3915]! } - public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3916]!, self._r[3916]!, [_1, _2]) + public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3914]!, self._r[3914]!, [_0]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3917]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3918]! } - public var PhotoEditor_Skip: String { return self._s[3919]! } - public func SharedMedia_Link(_ value: Int32) -> String { + public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3915]!, self._r[3915]!, [_1]) + } + public var Permissions_SiriTitle_v0: String { return self._s[3916]! } + public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3917]!, self._r[3917]!, [_0]) + } + public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3918]!, self._r[3918]!, [_0]) + } + public var Channel_MessagePhotoRemoved: String { return self._s[3919]! } + public var Wallet_Info_ReceiveGrams: String { return self._s[3920]! } + public var Common_edit: String { return self._s[3921]! } + public var PrivacySettings_AuthSessions: String { return self._s[3922]! } + public var Month_ShortJune: String { return self._s[3923]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3924]! } + public var Call_ReportSend: String { return self._s[3925]! } + public var Watch_LastSeen_JustNow: String { return self._s[3926]! } + public var Notifications_MessageNotifications: String { return self._s[3927]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3928]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3930]! } + public var Group_Status: String { return self._s[3931]! } + public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3932]!, self._r[3932]!, [_0, _1]) + } + public var TextFormat_AddLinkTitle: String { return self._s[3933]! } + public var ShareMenu_ShareTo: String { return self._s[3934]! } + public var Conversation_Moderate_Ban: String { return self._s[3935]! } + public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3936]!, self._r[3936]!, [_0]) + } + public var SharedMedia_ViewInChat: String { return self._s[3937]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3938]! } + public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3939]!, self._r[3939]!, [_1]) + } + public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3940]!, self._r[3940]!, [_1, _2]) + } + public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3942]!, self._r[3942]!, [_0]) + } + public var Map_OpenInHereMaps: String { return self._s[3943]! } + public var Appearance_ReduceMotion: String { return self._s[3944]! } + public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3945]!, self._r[3945]!, [_1, _2]) + } + public var Channel_Setup_TypePublicHelp: String { return self._s[3946]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3947]! } + public var PhotoEditor_Skip: String { return self._s[3948]! } + public func PrivacyLastSeenSettings_AddUsers(_ 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 func SharedMedia_Photo(_ 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[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_UserInfo_Mute(_ 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[2 * 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[3 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, _1, _2) } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + 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[5 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Notification_GameScoreSimple(_ 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 MuteExpires_Minutes(_ 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 Call_ShortMinutes(_ 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 Wallet_Updated_HoursAgo(_ 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 Forward_ConfirmMultipleFiles(_ 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 MessagePoll_VotedCount(_ 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 PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, _1, _2) - } - 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[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 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[18 * 6 + Int(form.rawValue)]!, _1, _2) - } - 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[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 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[24 * 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[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 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[28 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public func ForwardedGifs(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[6 * 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[30 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedContacts(_ value: Int32) -> String { + public func MessageTimer_Seconds(_ 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 Theme_UsersCount(_ 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 GroupInfo_ParticipantCount(_ 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 ChatList_DeleteConfirmation(_ 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 Call_Seconds(_ 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 MessageTimer_Minutes(_ 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 StickerPack_StickerCount(_ 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 PasscodeSettings_FailedAttempts(_ 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 PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, _1, _2) - } - 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[40 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[7 * 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[41 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[11 * 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[12 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[13 * 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[14 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_Years(_ 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 ForwardedMessages(_ 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 PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ 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 MessageTimer_Months(_ 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 UserCount(_ 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 PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + 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[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 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[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 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[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 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[33 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedVideos(_ 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 Notifications_Exceptions(_ 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 Watch_LastSeen_MinutesAgo(_ 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 PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedPhotos(_ 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 Conversation_StatusOnline(_ 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 LiveLocationUpdated_MinutesAgo(_ 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 MessageTimer_ShortHours(_ 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 Notification_GameScoreSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func Forward_ConfirmMultipleFiles(_ 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 MessageTimer_ShortMinutes(_ 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[44 * 6 + Int(form.rawValue)]!, stringValue) @@ -4678,21 +4709,22 @@ public final class PresentationStrings: Equatable { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) } - public func Map_ETAMinutes(_ 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[46 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, _1, _2) + public func AttachmentMenu_SendVideo(_ 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 ServiceMessage_GameScoreSimple(_ 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[48 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Hours(_ value: Int32) -> String { + public func MuteExpires_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) @@ -4702,320 +4734,319 @@ public final class PresentationStrings: Equatable { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_File(_ value: Int32) -> String { + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedMessages(_ 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[52 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_SelectedMessages(_ 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[53 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_HoursAgo(_ 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[54 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 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[56 * 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[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 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[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 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[65 * 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_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - 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[67 * 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[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 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[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 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[72 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ 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 AttachmentMenu_SendItem(_ 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 Notification_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 ForwardedPhotos(_ 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 Notifications_ExceptionMuteExpires_Days(_ 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 Media_ShareItem(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ 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 PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ServiceMessage_GameScoreExtended(_ 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 PUSH_CHAT_MESSAGE_ROUNDS(_ 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 AttachmentMenu_SendVideo(_ 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 ChatList_SelectedChats(_ 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 ForwardedAudios(_ 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 MessageTimer_Days(_ 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 QuickSend_Photos(_ 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 ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, _0, _1) - } - 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[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 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[94 * 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[95 * 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[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 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[98 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, _1, _2) } public func Conversation_LiveLocationMembersCount(_ 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) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreExtended(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[57 * 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[101 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_ShortDays(_ 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[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) } public func Conversation_StatusSubscribers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 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[105 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[107 * 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[108 * 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[109 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) } public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddMaskCount(_ 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[112 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 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[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func AttachmentMenu_SendPhoto(_ 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 Map_ETAHours(_ 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 ForwardedLocations(_ 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 LiveLocation_MenuChatsCount(_ 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 PasscodeSettings_FailedAttempts(_ 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 StickerPack_RemoveStickerCount(_ 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 Invitation_Members(_ 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 Call_ShortSeconds(_ 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 PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 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[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 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[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 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[86 * 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[87 * 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[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 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[90 * 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[113 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[91 * 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[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 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[96 * 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[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 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[100 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func SharedMedia_Generic(_ 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 MuteExpires_Days(_ 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_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Media_SharePhoto(_ 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 VoiceOver_Chat_ContactEmailCount(_ 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 ForwardedStickers(_ 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 Conversation_SelectedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Theme_UsersCount(_ 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 LastSeen_MinutesAgo(_ 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 MessageTimer_Weeks(_ 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 StickerPack_AddMaskCount(_ 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 AttachmentMenu_SendPhoto(_ 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[115 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index aa9b693ab147ee26079e2bac291563132d8e8e35..181cd9095213fa21990d15f560eb83fe5d29d4c8 100644 GIT binary patch delta 40748 zcmafc2UwKH7B=(2!0ysvfrah6^p3qN_6pdIeFYR0S)|xvP2x>r*Atz@8qCW0+tb+3{-hwLvxz zCbPw!TbWr`S}QYjjMhGFq&%0M8EA;h#loo$e@D_51KW>Os~2kSv0-pvhx_^ zB?;#MmP9e`FcwQDw~NOi)2fDJ<#kSXuOt`-Hu*kNI-?#x zrA7~_tf+39DIb~v5tCS3$joZwGih#`lV>9{g{}-rjOgX9ZN$`*k~wrV&BgOjWTxm3 zOmscX!1JY`*fEe*@*cAb$sgY6X>4j3P+RVuSzS9#Hr|G=q!(&!8SUGcNT)XIq6bx% z�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�k^VPRn3@y4caodJx`}t)%Eb5qmXH?|kjRTs= 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 diff --git a/submodules/WalletUI/Resources/WalletStrings.mapping b/submodules/WalletUI/Resources/WalletStrings.mapping index 4479b5ec98971caf05c102864672dbaade5fc18e..d05d1c366af4ed81a710d0b52471c23fc5589ebe 100644 GIT binary patch delta 457 zcmYLFO-mb56rC$fNHh{9d6StjOeWEg;v$kl^#@o%T}Tx{D2hZJMT{AV17;<-?xM&6 z(bg({YwJg~sI9i@!i^ijmHYkxt1EF)=pC)NIB?#%@0@q;JFmT~rM(?e1;z2kA1iIj z_1Ppz(j=o2gL(yCi2zNZK}2bKqE*9~@Y4sp6A}7|HIbkhT!=V*!mTjPSvCb39hq#_ za#Bq>CvT@(Y^TK@WmTF(T8YyI+d^2EetQPel!WG(mJ5=ZK|R=l)~ zJEe+N@F!?`Ub?kb*&ITd--FJuFS5o;fbsvm)_kh{DPtYu;VSw(abn;sTuxu`S2jx; ztxT_#XM?l>QVrUKsm6>gK9@hIblCack<@ED_t0e<-D*Pq%Ht%uNXHEoV^b}bcUW;- zi(q{w$1Ap3L)K8wWB4w%yfIJO?fVTST2kI)X5eke@LC0jxwMZiEg>H;Gw~u2^|`<9 v>ff=gCFuvQv=|-YUaO{~hu!Pkte!CT3c3?TADoYS?>XmkzVD;^uA7dEq{`$$Mt61uL~=Zq7!8S3vV_kp zqk%CHjz&e&KOn?tBs}2{#rU@PxpYuNPOhX3;%Wo#WgE@oN%qnLKIJA_M5AKT5_%OE zEn`S&q7}re9LOk@w2G|KF0Jtr6OW~hq~o3JcvkJw0Z&Y%Rb^VMr6Te+x4qMfbI368Q0*+YzRQ{%A*{8~ zF(x%HouH_-(J5XuADuzc-E (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[149]!, self._r[149]!, [_0]) + } + public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[150]! } + public var Wallet_Weekday_Today: String { return self._s[152]! } + public var Wallet_Month_ShortDecember: String { return self._s[153]! } + public var Wallet_Words_Text: String { return self._s[154]! } + public var Wallet_WordCheck_ViewWords: String { return self._s[155]! } + public var Wallet_Send_AddressInfo: String { return self._s[156]! } public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[156]!, self._r[156]!, [_0]) + return formatWithArgumentRanges(self._s[157]!, self._r[157]!, [_0]) } - public var Wallet_Intro_NotNow: String { return self._s[157]! } - public var Wallet_Navigation_Close: String { return self._s[158]! } - public var Wallet_Month_GenDecember: String { return self._s[160]! } - public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[161]! } - public var Wallet_WordImport_IncorrectTitle: String { return self._s[162]! } - public var Wallet_Send_AddressText: String { return self._s[163]! } - public var Wallet_Receive_AmountInfo: String { return self._s[164]! } + public var Wallet_Intro_NotNow: String { return self._s[158]! } + public var Wallet_Navigation_Close: String { return self._s[159]! } + public var Wallet_Month_GenDecember: String { return self._s[161]! } + public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[162]! } + public var Wallet_WordImport_IncorrectTitle: String { return self._s[163]! } + public var Wallet_Send_AddressText: String { return self._s[164]! } + public var Wallet_Receive_AmountInfo: String { return self._s[165]! } public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[165]!, self._r[165]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[166]!, self._r[166]!, [_1, _2, _3]) } - public var Wallet_Month_ShortAugust: String { return self._s[166]! } - public var Wallet_Qr_Title: String { return self._s[167]! } - public var Wallet_WordCheck_TryAgain: String { return self._s[168]! } - public var Wallet_Info_TransactionPendingHeader: String { return self._s[169]! } - public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[170]! } - public var Wallet_Created_Text: String { return self._s[171]! } - public var Wallet_Created_Proceed: String { return self._s[172]! } - public var Wallet_Words_Done: String { return self._s[173]! } - public var Wallet_WordImport_Continue: String { return self._s[174]! } - public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[175]! } - public var Wallet_WordImport_CanNotRemember: String { return self._s[176]! } + public var Wallet_Month_ShortAugust: String { return self._s[167]! } + public var Wallet_Qr_Title: String { return self._s[168]! } + public var Wallet_WordCheck_TryAgain: String { return self._s[169]! } + public var Wallet_Info_TransactionPendingHeader: String { return self._s[170]! } + public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[171]! } + public var Wallet_Created_Text: String { return self._s[172]! } + public var Wallet_Created_Proceed: String { return self._s[173]! } + public var Wallet_Words_Done: String { return self._s[174]! } + public var Wallet_WordImport_Continue: String { return self._s[175]! } + public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[176]! } + public var Wallet_WordImport_CanNotRemember: String { return self._s[177]! } public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[177]!, self._r[177]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[178]!, self._r[178]!, [_1, _2, _3]) } public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[178]!, self._r[178]!, [_1, _2]) + return formatWithArgumentRanges(self._s[179]!, self._r[179]!, [_1, _2]) } - public var Wallet_Created_ExportErrorText: String { return self._s[180]! } + public var Wallet_Created_ExportErrorText: String { return self._s[181]! } public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[181]!, self._r[181]!, [_0]) + return formatWithArgumentRanges(self._s[182]!, self._r[182]!, [_0]) } - public var Wallet_Settings_DeleteWalletInfo: String { return self._s[182]! } - public var Wallet_Intro_CreateErrorText: String { return self._s[183]! } - public var Wallet_Sent_ViewWallet: String { return self._s[184]! } - public var Wallet_Send_ErrorInvalidAddress: String { return self._s[185]! } + public var Wallet_Settings_DeleteWalletInfo: String { return self._s[183]! } + public var Wallet_Intro_CreateErrorText: String { return self._s[184]! } + public var Wallet_Sent_ViewWallet: String { return self._s[185]! } + public var Wallet_Send_ErrorInvalidAddress: String { return self._s[186]! } public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[186]!, self._r[186]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[187]!, self._r[187]!, [_1, _2, _3]) } - public var Wallet_Send_Title: String { return self._s[187]! } - public var Wallet_Info_RefreshErrorText: String { return self._s[188]! } - public var Wallet_SecureStorageReset_Title: String { return self._s[189]! } - public var Wallet_Receive_CommentHeader: String { return self._s[190]! } - public var Wallet_Info_ReceiveGrams: String { return self._s[191]! } + public var Wallet_Send_Title: String { return self._s[188]! } + public var Wallet_Info_RefreshErrorText: String { return self._s[189]! } + public var Wallet_SecureStorageReset_Title: String { return self._s[190]! } + public var Wallet_Receive_CommentHeader: String { return self._s[191]! } + public var Wallet_Info_ReceiveGrams: String { return self._s[192]! } public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator) diff --git a/submodules/WalletUI/Sources/WalletWordCheckScreen.swift b/submodules/WalletUI/Sources/WalletWordCheckScreen.swift index 5058ae767d..86152a7da9 100644 --- a/submodules/WalletUI/Sources/WalletWordCheckScreen.swift +++ b/submodules/WalletUI/Sources/WalletWordCheckScreen.swift @@ -2283,7 +2283,7 @@ private final class WordCheckInputNode: ASDisplayNode, UITextFieldDelegate { self.backgroundNode = ASImageNode() self.backgroundNode.displaysAsynchronously = false self.backgroundNode.displayWithoutProcessing = true - self.backgroundNode.image = generateStretchableFilledCircleImage(diameter: 10.0, color: theme.setup.inputBackgroundColor) + self.backgroundNode.image = generateStretchableFilledCircleImage(diameter: 20.0, color: theme.setup.inputBackgroundColor) self.labelNode = ImmediateTextNode() self.labelNode.attributedText = NSAttributedString(string: "\(index + 1):", font: Font.regular(17.0), textColor: theme.setup.inputPlaceholderColor) From fdaf434c184226a9cb255356654c135ad513325d Mon Sep 17 00:00:00 2001 From: Peter <> Date: Sat, 19 Oct 2019 13:44:11 +0400 Subject: [PATCH 2/3] Update wallet API --- Telegram-iOS/en.lproj/Localizable.strings | 2 +- Wallet/Strings/en.lproj/Localizable.strings | 6 +- .../Sources/PresentationStrings.swift | 6809 +++++++++-------- .../Resources/PresentationStrings.mapping | Bin 136424 -> 136598 bytes submodules/TonBinding/Sources/TON.h | 35 +- submodules/TonBinding/Sources/TON.mm | 149 +- .../WalletCore/Sources/WalletCore.swift | 196 +- .../WalletUI/Sources/WalletSendScreen.swift | 144 +- .../WalletUI/Sources/WalletStrings.swift | 4 +- submodules/ton/BUCK | 1 + submodules/ton/tonlib-src/CMakeLists.txt | 6 + .../ton/tonlib-src/adnl/adnl-ext-client.cpp | 3 + submodules/ton/tonlib-src/adnl/adnl-query.h | 4 + .../ton/tonlib-src/common/int-to-string.hpp | 24 + .../ton/tonlib-src/crypto/CMakeLists.txt | 70 +- .../tonlib-src/crypto/block/block-auto.cpp | 10 +- .../ton/tonlib-src/crypto/block/block-auto.h | 2 +- .../ton/tonlib-src/crypto/block/block.cpp | 13 +- .../ton/tonlib-src/crypto/block/block.h | 11 +- .../ton/tonlib-src/crypto/block/block.tlb | 2 +- .../tonlib-src/crypto/block/check-proof.cpp | 18 +- .../ton/tonlib-src/crypto/block/check-proof.h | 6 +- .../ton/tonlib-src/crypto/block/mc-config.cpp | 134 +- .../ton/tonlib-src/crypto/block/mc-config.h | 49 +- .../tonlib-src/crypto/block/transaction.cpp | 26 +- .../ton/tonlib-src/crypto/block/transaction.h | 27 +- .../ton/tonlib-src/crypto/common/bitstring.h | 2 + .../ton/tonlib-src/crypto/fift/lib/Asm.fif | 45 +- .../ton/tonlib-src/crypto/fift/lib/Fift.fif | 5 +- .../tonlib-src/crypto/fift/lib/TonUtil.fif | 25 + .../ton/tonlib-src/crypto/fift/utils.cpp | 18 +- submodules/ton/tonlib-src/crypto/fift/utils.h | 2 +- .../ton/tonlib-src/crypto/fift/words.cpp | 89 +- .../ton/tonlib-src/crypto/func/abscode.cpp | 3 + .../ton/tonlib-src/crypto/func/analyzer.cpp | 35 +- .../ton/tonlib-src/crypto/func/asmops.cpp | 6 +- .../ton/tonlib-src/crypto/func/builtins.cpp | 101 +- .../ton/tonlib-src/crypto/func/codegen.cpp | 20 +- .../ton/tonlib-src/crypto/func/func.cpp | 30 +- submodules/ton/tonlib-src/crypto/func/func.h | 45 +- .../tonlib-src/crypto/func/gen-abscode.cpp | 46 +- .../ton/tonlib-src/crypto/func/keywords.cpp | 30 +- .../ton/tonlib-src/crypto/func/parse-func.cpp | 134 +- .../ton/tonlib-src/crypto/func/test/a6.fc | 18 +- .../ton/tonlib-src/crypto/func/test/a6_3.fc | 22 + .../ton/tonlib-src/crypto/func/test/b3.fc | 20 + .../ton/tonlib-src/crypto/func/test/w1.fc | 9 + .../ton/tonlib-src/crypto/func/test/w2.fc | 14 + .../ton/tonlib-src/crypto/func/test/w3.fc | 13 + .../ton/tonlib-src/crypto/func/test/w4.fc | 13 + .../ton/tonlib-src/crypto/func/test/w5.fc | 14 + .../ton/tonlib-src/crypto/func/test/w6.fc | 12 + .../ton/tonlib-src/crypto/func/test/w7.fc | 14 + .../tonlib-src/crypto/func/unify-types.cpp | 14 +- .../crypto/smartcont/CreateState.fif | 45 + .../crypto/smartcont/asm-to-cpp.fif | 31 + .../crypto/smartcont/auto/config-code.cpp | 1 + .../crypto/smartcont/auto/config-code.fif | 344 + .../crypto/smartcont/auto/elector-code.cpp | 1 + .../crypto/smartcont/auto/elector-code.fif | 1712 +++++ .../smartcont/auto/highload-wallet-code.cpp | 1 + .../smartcont/auto/highload-wallet-code.fif | 79 + .../auto/highload-wallet-v2-code.cpp | 1 + .../auto/highload-wallet-v2-code.fif | 134 + .../crypto/smartcont/auto/multisig-code.cpp | 1 + .../crypto/smartcont/auto/multisig-code.fif | 502 ++ .../smartcont/auto/restricted-wallet-code.cpp | 1 + .../smartcont/auto/restricted-wallet-code.fif | 144 + .../auto/restricted-wallet2-code.cpp | 1 + .../auto/restricted-wallet2-code.fif | 140 + .../smartcont/auto/simple-wallet-code.cpp | 1 + .../smartcont/auto/simple-wallet-code.fif | 45 + .../smartcont/auto/simple-wallet-ext-code.cpp | 1 + .../smartcont/auto/simple-wallet-ext-code.fif | 104 + .../crypto/smartcont/auto/wallet-code.cpp | 1 + .../crypto/smartcont/auto/wallet-code.fif | 59 + .../crypto/smartcont/config-code.fc | 55 +- .../crypto/smartcont/elector-code.fif | 145 +- .../crypto/smartcont/gen-zerostate-test.fif | 2 +- .../crypto/smartcont/gen-zerostate.fif | 9 +- .../crypto/smartcont/highload-wallet-v2.fif | 2 +- .../crypto/smartcont/highload-wallet.fif | 2 +- .../crypto/smartcont/multisig-code.fc | 265 + .../smartcont/new-highload-wallet-v2.fif | 6 +- .../crypto/smartcont/new-highload-wallet.fif | 6 +- .../crypto/smartcont/new-pinger.fif | 2 +- .../smartcont/new-restricted-wallet.fif | 33 + .../smartcont/new-restricted-wallet2.fif | 47 + .../crypto/smartcont/new-testgiver.fif | 2 +- .../crypto/smartcont/new-wallet-v2.fif | 4 +- .../crypto/smartcont/new-wallet.fif | 2 +- .../crypto/smartcont/recover-stake.fif | 2 +- .../smartcont/restricted-wallet-code.fc | 67 + .../smartcont/restricted-wallet2-code.fc | 69 + .../tonlib-src/crypto/smartcont/show-addr.fif | 2 +- .../smartcont/simple-wallet-ext-code.fc | 67 + .../ton/tonlib-src/crypto/smartcont/stdlib.fc | 49 + .../tonlib-src/crypto/smartcont/testgiver.fif | 2 +- .../crypto/smartcont/update-config-smc.fif | 6 +- .../crypto/smartcont/update-config.fif | 2 +- .../crypto/smartcont/update-elector-smc.fif | 6 +- .../crypto/smartcont/validator-elect-req.fif | 2 +- .../smartcont/validator-elect-signed.fif | 2 +- .../tonlib-src/crypto/smartcont/wallet-v2.fif | 2 +- .../tonlib-src/crypto/smartcont/wallet.fif | 16 +- .../crypto/smc-envelope/GenericAccount.cpp | 99 + .../crypto/smc-envelope/GenericAccount.h | 31 + .../crypto/smc-envelope/MultisigWallet.cpp | 171 + .../crypto/smc-envelope/MultisigWallet.h | 64 + .../crypto/smc-envelope/SmartContract.cpp | 188 + .../crypto/smc-envelope/SmartContract.h | 116 + .../crypto/smc-envelope/SmartContractCode.cpp | 72 + .../crypto/smc-envelope/SmartContractCode.h | 30 + .../crypto/smc-envelope/TestGiver.cpp | 62 + .../crypto/smc-envelope/TestGiver.h | 39 + .../crypto/smc-envelope/TestWallet.cpp | 91 + .../crypto/smc-envelope/TestWallet.h | 48 + .../tonlib-src/crypto/smc-envelope/Wallet.cpp | 100 + .../tonlib-src/crypto/smc-envelope/Wallet.h | 48 + .../ton/tonlib-src/crypto/test/Ed25519.cpp | 75 + .../ton/tonlib-src/crypto/test/fift.cpp | 20 + .../tonlib-src/crypto/test/fift/bug_ufits.fif | 1 + .../tonlib-src/crypto/test/fift/testvm2.fif | 2 +- .../ton/tonlib-src/crypto/test/test-db.cpp | 32 +- .../tonlib-src/crypto/test/test-smartcont.cpp | 524 ++ .../ton/tonlib-src/crypto/test/wycheproof.h | 1160 +++ .../tonlib-src/crypto/vm/cells/CellString.cpp | 64 + .../tonlib-src/crypto/vm/cells/CellString.h | 22 + .../ton/tonlib-src/crypto/vm/continuation.cpp | 30 +- .../ton/tonlib-src/crypto/vm/continuation.h | 62 +- submodules/ton/tonlib-src/crypto/vm/excno.hpp | 17 + .../ton/tonlib-src/crypto/vm/tonops.cpp | 11 +- .../lite-client/lite-client-common.cpp | 22 + .../lite-client/lite-client-common.h | 5 +- .../tonlib-src/lite-client/lite-client.cpp | 30 +- .../ton/tonlib-src/lite-client/lite-client.h | 4 +- .../tdactor/td/actor/PromiseFuture.h | 21 + .../tdactor/td/actor/core/ActorExecutor.cpp | 2 +- .../tdactor/td/actor/core/Scheduler.cpp | 1 + .../tonlib-src/tdnet/td/net/TcpListener.cpp | 52 + .../ton/tonlib-src/tdnet/td/net/TcpListener.h | 19 + .../ton/tonlib-src/tdnet/td/net/UdpServer.cpp | 64 - .../tdutils/td/utils/CancellationToken.h | 5 + .../ton/tonlib-src/tdutils/td/utils/Status.h | 14 + .../ton/tonlib-src/tdutils/td/utils/tests.h | 28 + .../ton/tonlib-src/test/regression-tests.ans | 9 +- .../tl/generate/auto/tl/ton_api.cpp | 54 + .../tonlib-src/tl/generate/auto/tl/ton_api.h | 26 + .../tl/generate/auto/tl/ton_api.hpp | 6 + .../tl/generate/auto/tl/ton_api_json.cpp | 32 + .../tl/generate/auto/tl/ton_api_json.h | 2 + .../tl/generate/auto/tl/tonlib_api.cpp | 380 +- .../tl/generate/auto/tl/tonlib_api.h | 392 +- .../tl/generate/auto/tl/tonlib_api.hpp | 111 + .../tl/generate/auto/tl/tonlib_api_json.cpp | 481 +- .../tl/generate/auto/tl/tonlib_api_json.h | 40 + .../tonlib-src/tl/generate/scheme/ton_api.tl | 3 +- .../tonlib-src/tl/generate/scheme/ton_api.tlo | Bin 54392 -> 54548 bytes .../tl/generate/scheme/tonlib_api.tl | 44 +- .../tl/generate/scheme/tonlib_api.tlo | Bin 13576 -> 15876 bytes .../ton/tonlib-src/tonlib/CMakeLists.txt | 16 +- .../ton/tonlib-src/tonlib/test/offline.cpp | 186 +- .../ton/tonlib-src/tonlib/test/online.cpp | 567 +- .../ton/tonlib-src/tonlib/tonlib/Client.cpp | 8 +- .../tonlib-src/tonlib/tonlib/ExtClient.cpp | 19 + .../ton/tonlib-src/tonlib/tonlib/ExtClient.h | 6 + .../tonlib/tonlib/ExtClientLazy.cpp | 7 + .../tonlib-src/tonlib/tonlib/KeyStorage.cpp | 27 + .../ton/tonlib-src/tonlib/tonlib/KeyStorage.h | 4 + .../ton/tonlib-src/tonlib/tonlib/KeyValue.cpp | 3 +- .../tonlib-src/tonlib/tonlib/LastBlock.cpp | 68 +- .../ton/tonlib-src/tonlib/tonlib/LastBlock.h | 31 +- .../tonlib-src/tonlib/tonlib/LastConfig.cpp | 152 + .../ton/tonlib-src/tonlib/tonlib/LastConfig.h | 70 + .../ton/tonlib-src/tonlib/tonlib/Logging.cpp | 3 +- .../tonlib-src/tonlib/tonlib/TonlibClient.cpp | 1491 ++-- .../tonlib-src/tonlib/tonlib/TonlibClient.h | 102 +- .../tonlib-src/tonlib/tonlib/TonlibError.h | 7 + .../tonlib-src/tonlib/tonlib/tonlib-cli.cpp | 271 +- .../ton/tonlib-src/tonlib/tonlib/utils.cpp | 19 +- .../ton/tonlib-src/tonlib/tonlib/utils.h | 13 +- 181 files changed, 15856 insertions(+), 5015 deletions(-) create mode 100644 submodules/ton/tonlib-src/common/int-to-string.hpp create mode 100644 submodules/ton/tonlib-src/crypto/func/test/a6_3.fc create mode 100644 submodules/ton/tonlib-src/crypto/func/test/b3.fc create mode 100644 submodules/ton/tonlib-src/crypto/func/test/w1.fc create mode 100644 submodules/ton/tonlib-src/crypto/func/test/w2.fc create mode 100644 submodules/ton/tonlib-src/crypto/func/test/w3.fc create mode 100644 submodules/ton/tonlib-src/crypto/func/test/w4.fc create mode 100644 submodules/ton/tonlib-src/crypto/func/test/w5.fc create mode 100644 submodules/ton/tonlib-src/crypto/func/test/w6.fc create mode 100644 submodules/ton/tonlib-src/crypto/func/test/w7.fc create mode 100755 submodules/ton/tonlib-src/crypto/smartcont/asm-to-cpp.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/config-code.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/config-code.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/elector-code.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/elector-code.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-code.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-code.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-v2-code.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-v2-code.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/multisig-code.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/multisig-code.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet-code.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet-code.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet2-code.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet2-code.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-code.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-code.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-ext-code.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-ext-code.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/wallet-code.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/auto/wallet-code.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/highload-wallet-v2.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/highload-wallet.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/multisig-code.fc mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/new-highload-wallet-v2.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/new-highload-wallet.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/new-pinger.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/new-restricted-wallet.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/new-restricted-wallet2.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/new-testgiver.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/new-wallet-v2.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/new-wallet.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/recover-stake.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/restricted-wallet-code.fc create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/restricted-wallet2-code.fc mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/show-addr.fif create mode 100644 submodules/ton/tonlib-src/crypto/smartcont/simple-wallet-ext-code.fc mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/testgiver.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/update-config-smc.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/update-config.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/update-elector-smc.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/validator-elect-req.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/validator-elect-signed.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/wallet-v2.fif mode change 100644 => 100755 submodules/ton/tonlib-src/crypto/smartcont/wallet.fif create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/GenericAccount.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/GenericAccount.h create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/MultisigWallet.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/MultisigWallet.h create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/SmartContract.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/SmartContract.h create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/SmartContractCode.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/SmartContractCode.h create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/TestGiver.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/TestGiver.h create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/TestWallet.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/TestWallet.h create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/Wallet.cpp create mode 100644 submodules/ton/tonlib-src/crypto/smc-envelope/Wallet.h create mode 100644 submodules/ton/tonlib-src/crypto/test/fift/bug_ufits.fif create mode 100644 submodules/ton/tonlib-src/crypto/test/test-smartcont.cpp create mode 100644 submodules/ton/tonlib-src/crypto/test/wycheproof.h create mode 100644 submodules/ton/tonlib-src/crypto/vm/cells/CellString.cpp create mode 100644 submodules/ton/tonlib-src/crypto/vm/cells/CellString.h create mode 100644 submodules/ton/tonlib-src/tonlib/tonlib/LastConfig.cpp create mode 100644 submodules/ton/tonlib-src/tonlib/tonlib/LastConfig.h diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 758c3b0cbf..fb7e2fcc58 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4820,7 +4820,7 @@ Any member of this group will be able to see messages in the channel."; "Wallet.Send.Balance" = "Balance: %@"; "Wallet.Send.AmountText" = "Grams to send"; "Wallet.Send.Confirmation" = "Confirmation"; -"Wallet.Send.ConfirmationText" = "Do you want to send **%1$@** Grams to\n%2$@?"; +"Wallet.Send.ConfirmationText" = "Do you want to send **%1$@** Grams to\n%2$@?\n\nFees: ~%3$@ grams"; "Wallet.Send.ConfirmationConfirm" = "Confirm"; "Wallet.Send.Send" = "Send"; "Wallet.Settings.Title" = "Wallet Settings"; diff --git a/Wallet/Strings/en.lproj/Localizable.strings b/Wallet/Strings/en.lproj/Localizable.strings index 3d53c290a9..7a0d22a74f 100644 --- a/Wallet/Strings/en.lproj/Localizable.strings +++ b/Wallet/Strings/en.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Wallet.Send.Balance" = "Balance: %@"; "Wallet.Send.AmountText" = "Grams to send"; "Wallet.Send.Confirmation" = "Confirmation"; -"Wallet.Send.ConfirmationText" = "Do you want to send **%1$@** Grams to\n%2$@?"; +"Wallet.Send.ConfirmationText" = "Do you want to send **%1$@** Grams to\n%2$@?\n\nFees: ~%3$@ grams"; "Wallet.Send.ConfirmationConfirm" = "Confirm"; "Wallet.Send.Send" = "Send"; "Wallet.Settings.Title" = "Wallet Settings"; @@ -104,11 +104,11 @@ "Wallet.TransactionInfo.SenderHeader" = "SENDER"; "Wallet.TransactionInfo.CopyAddress" = "Copy Wallet Address"; "Wallet.TransactionInfo.AddressCopied" = "Address copied to clipboard."; -"Wallet.TransactionInfo.SendGrams" = "Send Grams"; +"Wallet.TransactionInfo.SendGrams" = "Send Grams to This Address"; "Wallet.TransactionInfo.CommentHeader" = "COMMENT"; "Wallet.TransactionInfo.StorageFeeHeader" = "STORAGE FEE"; "Wallet.TransactionInfo.OtherFeeHeader" = "TRANSACTION FEE"; -"Wallet.TransactionInfo.StorageFeeInfo" = "Blockchain validators collect a tiny fee for storing information about your decentralized wallet. [More info]()"; +"Wallet.TransactionInfo.StorageFeeInfo" = "Blockchain validators collect a tiny fee for storing information about your decentralized wallet and processing your transactions. [More info]()"; "Wallet.TransactionInfo.OtherFeeInfo" = "Blockchain validators collect a tiny fee for processing your decentralized transactions. [More info]()"; "Wallet.TransactionInfo.FeeInfoURL" = "https://telegram.org/wallet/fee"; "Wallet.WordCheck.Title" = "Test Time!"; diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 9de3627d73..ca6f723f56 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -853,4200 +853,4207 @@ public final class PresentationStrings: Equatable { public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[616]!, self._r[616]!, [_1, _2]) } - public var PhotoEditor_ShadowsTint: String { return self._s[617]! } - public var Message_Audio: String { return self._s[618]! } - public var Passport_Language_lt: String { return self._s[619]! } + public var Conversation_ClearCache: String { return self._s[617]! } + public var PhotoEditor_ShadowsTint: String { return self._s[618]! } + public var Message_Audio: String { return self._s[619]! } + public var Passport_Language_lt: String { return self._s[620]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[620]!, self._r[620]!, [_0]) + return formatWithArgumentRanges(self._s[621]!, self._r[621]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[621]! } - public var Conversation_FileICloudDrive: String { return self._s[622]! } - public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[623]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[624]! } + public var Permissions_SiriText_v0: String { return self._s[622]! } + public var Conversation_FileICloudDrive: String { return self._s[623]! } + public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[624]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[625]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[625]!, self._r[625]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[626]!, self._r[626]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[626]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[627]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[627]!, self._r[627]!, [_0]) + return formatWithArgumentRanges(self._s[628]!, self._r[628]!, [_0]) } - public var Channel_SignMessages: String { return self._s[628]! } + public var Channel_SignMessages: String { return self._s[629]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[629]!, self._r[629]!, [_1]) + return formatWithArgumentRanges(self._s[630]!, self._r[630]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[630]! } - public var Passport_ScanPassport: String { return self._s[631]! } - public var Watch_Suggestion_Thanks: String { return self._s[632]! } - public var BlockedUsers_AddNew: String { return self._s[633]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[631]! } + public var Passport_ScanPassport: String { return self._s[632]! } + public var Watch_Suggestion_Thanks: String { return self._s[633]! } + public var BlockedUsers_AddNew: String { return self._s[634]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[634]!, self._r[634]!, [_1, _2]) + return formatWithArgumentRanges(self._s[635]!, self._r[635]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[635]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[636]! } - public var Month_GenJuly: String { return self._s[637]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[638]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[640]! } - public var Notification_ChannelInviterSelf: String { return self._s[641]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[642]! } + public var Watch_Message_Invoice: String { return self._s[636]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[637]! } + public var Month_GenJuly: String { return self._s[638]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[639]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[641]! } + public var Notification_ChannelInviterSelf: String { return self._s[642]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[643]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[643]!, self._r[643]!, [_1, _2]) + return formatWithArgumentRanges(self._s[644]!, self._r[644]!, [_1, _2]) } - public var CheckoutInfo_Title: String { return self._s[644]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[645]! } + public var CheckoutInfo_Title: String { return self._s[645]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[646]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[646]!, self._r[646]!, [_0]) + return formatWithArgumentRanges(self._s[647]!, self._r[647]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[647]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[648]! } - public var Passport_Language_de: String { return self._s[649]! } - public var Update_Title: String { return self._s[650]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[651]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[652]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[653]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[654]! } - public var NotificationsSound_Telegraph: String { return self._s[655]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[656]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[657]! } + public var Passport_Identity_MainPage: String { return self._s[648]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[649]! } + public var Passport_Language_de: String { return self._s[650]! } + public var Update_Title: String { return self._s[651]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[652]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[653]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[654]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[655]! } + public var NotificationsSound_Telegraph: String { return self._s[656]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[657]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[658]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[658]!, self._r[658]!, [_0]) + return formatWithArgumentRanges(self._s[659]!, self._r[659]!, [_0]) } - public var Stickers_SuggestAll: String { return self._s[659]! } - public var Conversation_ForwardTitle: String { return self._s[660]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[661]! } + public var ClearCache_Description: String { return self._s[660]! } + public var Stickers_SuggestAll: String { return self._s[661]! } + public var Conversation_ForwardTitle: String { return self._s[662]! } + public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[663]! } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[662]!, self._r[662]!, [_0]) + return formatWithArgumentRanges(self._s[664]!, self._r[664]!, [_0]) } - public var Calls_NewCall: String { return self._s[663]! } - public var Call_StatusEnded: String { return self._s[664]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[665]! } - public var Settings_ProxyConnected: String { return self._s[666]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[667]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[668]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[669]! } - public var Passport_PasswordPlaceholder: String { return self._s[670]! } - public var Message_PinnedInvoice: String { return self._s[671]! } - public var Passport_Identity_IssueDate: String { return self._s[672]! } - public var Passport_Language_pl: String { return self._s[673]! } + public var Calls_NewCall: String { return self._s[665]! } + public var Call_StatusEnded: String { return self._s[666]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[667]! } + public var Settings_ProxyConnected: String { return self._s[668]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[669]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[670]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[671]! } + public var Passport_PasswordPlaceholder: String { return self._s[672]! } + public var Message_PinnedInvoice: String { return self._s[673]! } + public var Passport_Identity_IssueDate: String { return self._s[674]! } + public var Passport_Language_pl: String { return self._s[675]! } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[674]!, self._r[674]!, [_0]) + return formatWithArgumentRanges(self._s[676]!, self._r[676]!, [_0]) } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[675]! } - public var Call_StatusConnecting: String { return self._s[676]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[677]! } + public var Call_StatusConnecting: String { return self._s[678]! } public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[677]!, self._r[677]!, [_0]) + return formatWithArgumentRanges(self._s[679]!, self._r[679]!, [_0]) } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[679]! } - public var Common_Edit: String { return self._s[680]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[681]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[681]! } + public var Common_Edit: String { return self._s[682]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[683]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[682]!, self._r[682]!, [_0]) + return formatWithArgumentRanges(self._s[684]!, self._r[684]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[683]! } - public var PrivateDataSettings_Title: String { return self._s[684]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[685]! } - public var ChatList_Read: String { return self._s[686]! } - public var Wallet_WordImport_Text: String { return self._s[687]! } - public var Undo_ChatClearedForBothSides: String { return self._s[688]! } - public var GroupPermission_SectionTitle: String { return self._s[689]! } - public var TwoFactorSetup_Intro_Title: String { return self._s[691]! } + public var GroupInfo_ChatAdmins: String { return self._s[685]! } + public var PrivateDataSettings_Title: String { return self._s[686]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[687]! } + public var ChatList_Read: String { return self._s[688]! } + public var Wallet_WordImport_Text: String { return self._s[689]! } + public var Undo_ChatClearedForBothSides: String { return self._s[690]! } + public var GroupPermission_SectionTitle: String { return self._s[691]! } + public var TwoFactorSetup_Intro_Title: String { return self._s[693]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[692]!, self._r[692]!, [_1, _2]) + return formatWithArgumentRanges(self._s[694]!, self._r[694]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[693]! } - public var Update_UpdateApp: String { return self._s[694]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[695]! } - public var Settings_Appearance: String { return self._s[696]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[700]! } - public var Watch_Location_Access: String { return self._s[701]! } - public var ShareMenu_CopyShareLink: String { return self._s[703]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[704]! } - public var Conversation_Theme: String { return self._s[706]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[695]! } + public var Update_UpdateApp: String { return self._s[696]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[697]! } + public var Settings_Appearance: String { return self._s[698]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[702]! } + public var Watch_Location_Access: String { return self._s[703]! } + public var ShareMenu_CopyShareLink: String { return self._s[705]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[706]! } + public var Conversation_Theme: String { return self._s[708]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[707]!, self._r[707]!, [_0]) + return formatWithArgumentRanges(self._s[709]!, self._r[709]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[708]! } - public var Weekday_ShortWednesday: String { return self._s[709]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[710]! } - public var Undo_LeftGroup: String { return self._s[713]! } - public var Wallet_RestoreFailed_Text: String { return self._s[714]! } - public var Conversation_LinkDialogCopy: String { return self._s[715]! } - public var Wallet_TransactionInfo_NoAddress: String { return self._s[717]! } - public var Wallet_Navigation_Back: String { return self._s[718]! } - public var KeyCommand_FocusOnInputField: String { return self._s[719]! } - public var Contacts_SelectAll: String { return self._s[720]! } - public var Preview_SaveToCameraRoll: String { return self._s[721]! } - public var PrivacySettings_PasscodeOff: String { return self._s[722]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[723]! } - public var Wallpaper_Title: String { return self._s[724]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[725]! } - public var AccessDenied_Camera: String { return self._s[726]! } - public var Watch_Compose_CurrentLocation: String { return self._s[727]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[729]! } + public var Notifications_ClassicTones: String { return self._s[710]! } + public var Weekday_ShortWednesday: String { return self._s[711]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[712]! } + public var Undo_LeftGroup: String { return self._s[715]! } + public var Wallet_RestoreFailed_Text: String { return self._s[716]! } + public var Conversation_LinkDialogCopy: String { return self._s[717]! } + public var Wallet_TransactionInfo_NoAddress: String { return self._s[719]! } + public var Wallet_Navigation_Back: String { return self._s[720]! } + public var KeyCommand_FocusOnInputField: String { return self._s[721]! } + public var Contacts_SelectAll: String { return self._s[722]! } + public var Preview_SaveToCameraRoll: String { return self._s[723]! } + public var PrivacySettings_PasscodeOff: String { return self._s[724]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[725]! } + public var Wallpaper_Title: String { return self._s[726]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[727]! } + public var AccessDenied_Camera: String { return self._s[728]! } + public var Watch_Compose_CurrentLocation: String { return self._s[729]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[731]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[730]!, self._r[730]!, [_0]) + return formatWithArgumentRanges(self._s[732]!, self._r[732]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[731]! } - public var Passport_Language_ro: String { return self._s[732]! } - public var EditTheme_UploadNewTheme: String { return self._s[733]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[734]! } - public var Wallet_Intro_Terms: String { return self._s[735]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[733]! } + public var Passport_Language_ro: String { return self._s[734]! } + public var EditTheme_UploadNewTheme: String { return self._s[735]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[736]! } + public var Wallet_Intro_Terms: String { return self._s[737]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[736]!, self._r[736]!, [_0]) + return formatWithArgumentRanges(self._s[738]!, self._r[738]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[737]! } - public var State_ConnectingToProxy: String { return self._s[738]! } - public var Calls_RatingTitle: String { return self._s[739]! } - public var Generic_ErrorMoreInfo: String { return self._s[740]! } - public var Appearance_PreviewReplyText: String { return self._s[741]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[742]! } + public var Login_CancelPhoneVerification: String { return self._s[739]! } + public var State_ConnectingToProxy: String { return self._s[740]! } + public var Calls_RatingTitle: String { return self._s[741]! } + public var Generic_ErrorMoreInfo: String { return self._s[742]! } + public var Appearance_PreviewReplyText: String { return self._s[743]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[744]! } public func Wallet_Send_Balance(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[743]!, self._r[743]!, [_0]) + return formatWithArgumentRanges(self._s[745]!, self._r[745]!, [_0]) } - public var SharedMedia_CategoryLinks: String { return self._s[744]! } - public var Calls_Missed: String { return self._s[745]! } - public var Cache_Photos: String { return self._s[749]! } - public var GroupPermission_NoAddMembers: String { return self._s[750]! } - public var ScheduledMessages_Title: String { return self._s[751]! } + public var SharedMedia_CategoryLinks: String { return self._s[746]! } + public var Calls_Missed: String { return self._s[747]! } + public var Cache_Photos: String { return self._s[751]! } + public var GroupPermission_NoAddMembers: String { return self._s[752]! } + public var ScheduledMessages_Title: String { return self._s[753]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[752]!, self._r[752]!, [_0]) + return formatWithArgumentRanges(self._s[754]!, self._r[754]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[753]! } - public var Settings_ProxyDisabled: String { return self._s[754]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[755]! } + public var Settings_ProxyDisabled: String { return self._s[756]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[755]!, self._r[755]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[757]!, self._r[757]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[756]!, self._r[756]!, [_0]) + return formatWithArgumentRanges(self._s[758]!, self._r[758]!, [_0]) } - public var ChatList_Context_RemoveFromRecents: String { return self._s[758]! } - public var Appearance_Title: String { return self._s[759]! } + public var ChatList_Context_RemoveFromRecents: String { return self._s[760]! } + public var Appearance_Title: String { return self._s[761]! } public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[761]!, self._r[761]!, [_0]) + return formatWithArgumentRanges(self._s[763]!, self._r[763]!, [_0]) } - public var Conversation_WalletRequiredText: String { return self._s[762]! } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[763]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[764]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[765]! } - public var Preview_DeletePhoto: String { return self._s[766]! } - public var Appearance_AppIconFilledX: String { return self._s[767]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[768]! } + public var Conversation_WalletRequiredText: String { return self._s[764]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[765]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[766]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[767]! } + public var Preview_DeletePhoto: String { return self._s[768]! } + public var Appearance_AppIconFilledX: String { return self._s[769]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[770]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[769]!, self._r[769]!, [_0]) + return formatWithArgumentRanges(self._s[771]!, self._r[771]!, [_0]) } - public var Coub_TapForSound: String { return self._s[771]! } - public var Map_LocatingError: String { return self._s[772]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[774]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[775]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[776]! } + public var Coub_TapForSound: String { return self._s[773]! } + public var Map_LocatingError: String { return self._s[774]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[776]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[777]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[778]! } public func Wallet_Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[777]!, self._r[777]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[779]!, self._r[779]!, [_1, _2, _3]) } - public var Passport_ForgottenPassword: String { return self._s[778]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[779]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[780]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[782]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[783]! } - public var Message_Location: String { return self._s[784]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[785]! } - public var Channel_Management_Title: String { return self._s[786]! } - public var DialogList_SearchSectionDialogs: String { return self._s[788]! } - public var Compose_NewChannel_Members: String { return self._s[789]! } + public var Passport_ForgottenPassword: String { return self._s[780]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[781]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[782]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[784]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[785]! } + public var Message_Location: String { return self._s[786]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[787]! } + public var Channel_Management_Title: String { return self._s[788]! } + public var DialogList_SearchSectionDialogs: String { return self._s[790]! } + public var Compose_NewChannel_Members: String { return self._s[791]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[790]!, self._r[790]!, [_0]) + return formatWithArgumentRanges(self._s[792]!, self._r[792]!, [_0]) } - public var GroupInfo_Location: String { return self._s[791]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[792]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[793]! } - public var PhotoEditor_WarmthTool: String { return self._s[794]! } - public var Passport_Language_tr: String { return self._s[795]! } + public var GroupInfo_Location: String { return self._s[793]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[794]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[795]! } + public var PhotoEditor_WarmthTool: String { return self._s[796]! } + public var Passport_Language_tr: String { return self._s[797]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[796]!, self._r[796]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[798]!, self._r[798]!, [_1, _2, _3]) } - public var Login_ResetAccountProtected_Reset: String { return self._s[798]! } - public var Watch_PhotoView_Title: String { return self._s[799]! } - public var Passport_Phone_Delete: String { return self._s[800]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[801]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[802]! } - public var GroupInfo_Permissions: String { return self._s[803]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[804]! } - public var Profile_ShareContactButton: String { return self._s[805]! } - public var ChatSettings_Other: String { return self._s[806]! } - public var UserInfo_NotificationsDisabled: String { return self._s[807]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[808]! } - public var LastSeen_WithinAMonth: String { return self._s[809]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[810]! } - public var Conversation_ReportGroupLocation: String { return self._s[811]! } - public var Conversation_EncryptionCanceled: String { return self._s[812]! } - public var MediaPicker_GroupDescription: String { return self._s[813]! } - public var WebSearch_Images: String { return self._s[814]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[800]! } + public var Watch_PhotoView_Title: String { return self._s[801]! } + public var Passport_Phone_Delete: String { return self._s[802]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[803]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[804]! } + public var GroupInfo_Permissions: String { return self._s[805]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[806]! } + public var Profile_ShareContactButton: String { return self._s[807]! } + public var ChatSettings_Other: String { return self._s[808]! } + public var UserInfo_NotificationsDisabled: String { return self._s[809]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[810]! } + public var LastSeen_WithinAMonth: String { return self._s[811]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[812]! } + public var Conversation_ReportGroupLocation: String { return self._s[813]! } + public var Conversation_EncryptionCanceled: String { return self._s[814]! } + public var MediaPicker_GroupDescription: String { return self._s[815]! } + public var WebSearch_Images: String { return self._s[816]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[815]!, self._r[815]!, [_0]) + return formatWithArgumentRanges(self._s[817]!, self._r[817]!, [_0]) } - public var Message_Photo: String { return self._s[816]! } - public var PasscodeSettings_HelpBottom: String { return self._s[817]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[818]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[819]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[820]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[821]! } - public var NotificationsSound_Calypso: String { return self._s[822]! } - public var Map_Map: String { return self._s[823]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[825]! } - public var ChatSettings_TextSizeUnits: String { return self._s[826]! } + public var Message_Photo: String { return self._s[818]! } + public var PasscodeSettings_HelpBottom: String { return self._s[819]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[820]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[821]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[822]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[823]! } + public var NotificationsSound_Calypso: String { return self._s[824]! } + public var Map_Map: String { return self._s[825]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[827]! } + public var ChatSettings_TextSizeUnits: String { return self._s[828]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[827]!, self._r[827]!, [_0]) + return formatWithArgumentRanges(self._s[829]!, self._r[829]!, [_0]) } - public var Common_of: String { return self._s[828]! } - public var Conversation_ForwardContacts: String { return self._s[831]! } + public var Common_of: String { return self._s[830]! } + public var Conversation_ForwardContacts: String { return self._s[833]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[833]!, self._r[833]!, [_0]) + return formatWithArgumentRanges(self._s[835]!, self._r[835]!, [_0]) } - public var Passport_Language_hy: String { return self._s[834]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[835]! } - public var AutoDownloadSettings_Reset: String { return self._s[836]! } - public var Wallet_TransactionInfo_AddressCopied: String { return self._s[837]! } - public var Paint_ClearConfirm: String { return self._s[838]! } - public var Camera_VideoMode: String { return self._s[839]! } + public var Passport_Language_hy: String { return self._s[836]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[837]! } + public var AutoDownloadSettings_Reset: String { return self._s[838]! } + public var Wallet_TransactionInfo_AddressCopied: String { return self._s[839]! } + public var Paint_ClearConfirm: String { return self._s[840]! } + public var Camera_VideoMode: String { return self._s[841]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[840]!, self._r[840]!, [_0]) + return formatWithArgumentRanges(self._s[842]!, self._r[842]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[841]! } - public var Conversation_ViewBackground: String { return self._s[842]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[843]! } + public var Conversation_ViewBackground: String { return self._s[844]! } public func Wallet_Info_TransactionDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[843]!, self._r[843]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[845]!, self._r[845]!, [_1, _2, _3]) } - public var Passport_Language_el: String { return self._s[844]! } - public var PhotoEditor_Original: String { return self._s[845]! } - public var Settings_FAQ_Button: String { return self._s[847]! } - public var Channel_Setup_PublicNoLink: String { return self._s[849]! } - public var Conversation_UnsupportedMedia: String { return self._s[850]! } - public var Conversation_SlideToCancel: String { return self._s[851]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[852]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[853]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[854]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[855]! } - public var AutoNightTheme_NotAvailable: String { return self._s[856]! } - public var Conversation_Owner: String { return self._s[857]! } - public var Common_Create: String { return self._s[858]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[859]! } - public var ContactList_Context_Call: String { return self._s[860]! } - public var Localization_ChooseLanguage: String { return self._s[862]! } - public var ChatList_Context_AddToContacts: String { return self._s[864]! } - public var Settings_Proxy: String { return self._s[866]! } - public var Privacy_TopPeersHelp: String { return self._s[867]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[868]! } - public var Chat_UnsendMyMessages: String { return self._s[869]! } + public var Passport_Language_el: String { return self._s[846]! } + public var PhotoEditor_Original: String { return self._s[847]! } + public var Settings_FAQ_Button: String { return self._s[849]! } + public var Channel_Setup_PublicNoLink: String { return self._s[851]! } + public var Conversation_UnsupportedMedia: String { return self._s[852]! } + public var Conversation_SlideToCancel: String { return self._s[853]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[854]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[855]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[856]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[857]! } + public var AutoNightTheme_NotAvailable: String { return self._s[858]! } + public var Conversation_Owner: String { return self._s[859]! } + public var Common_Create: String { return self._s[860]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[861]! } + public var ContactList_Context_Call: String { return self._s[862]! } + public var Localization_ChooseLanguage: String { return self._s[864]! } + public var ChatList_Context_AddToContacts: String { return self._s[866]! } + public var Settings_Proxy: String { return self._s[868]! } + public var Privacy_TopPeersHelp: String { return self._s[869]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[870]! } + public var Chat_UnsendMyMessages: String { return self._s[871]! } public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[870]!, self._r[870]!, [_0]) + return formatWithArgumentRanges(self._s[872]!, self._r[872]!, [_0]) } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[871]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[873]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[873]!, self._r[873]!, [_0]) + return formatWithArgumentRanges(self._s[875]!, self._r[875]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[874]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[875]! } - public var Cache_Title: String { return self._s[876]! } + public var Contacts_SortedByPresence: String { return self._s[876]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[877]! } + public var Cache_Title: String { return self._s[878]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[877]!, self._r[877]!, [_0]) + return formatWithArgumentRanges(self._s[879]!, self._r[879]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[878]! } - public var Channel_Moderator_Title: String { return self._s[879]! } - public var InstantPage_AutoNightTheme: String { return self._s[881]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[880]! } + public var Channel_Moderator_Title: String { return self._s[881]! } + public var InstantPage_AutoNightTheme: String { return self._s[883]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[884]!, self._r[884]!, [_1]) + return formatWithArgumentRanges(self._s[886]!, self._r[886]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[885]! } - public var Undo_Undo: String { return self._s[887]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[888]! } - public var TwoStepAuth_RemovePassword: String { return self._s[889]! } - public var Common_Delete: String { return self._s[890]! } - public var Contacts_AddPeopleNearby: String { return self._s[892]! } - public var Conversation_ContextMenuDelete: String { return self._s[893]! } - public var SocksProxySetup_Credentials: String { return self._s[894]! } - public var Appearance_EditTheme: String { return self._s[896]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[897]! } - public var Wallet_Send_NetworkErrorText: String { return self._s[898]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[901]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[902]! } - public var Passport_Language_id: String { return self._s[904]! } - public var WallpaperSearch_ColorTeal: String { return self._s[905]! } - public var ChannelIntro_Title: String { return self._s[906]! } + public var Passport_Scans_Upload: String { return self._s[887]! } + public var Undo_Undo: String { return self._s[889]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[890]! } + public var TwoStepAuth_RemovePassword: String { return self._s[891]! } + public var Common_Delete: String { return self._s[892]! } + public var Contacts_AddPeopleNearby: String { return self._s[894]! } + public var Conversation_ContextMenuDelete: String { return self._s[895]! } + public var SocksProxySetup_Credentials: String { return self._s[896]! } + public var Appearance_EditTheme: String { return self._s[898]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[899]! } + public var Wallet_Send_NetworkErrorText: String { return self._s[900]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[903]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[904]! } + public var Passport_Language_id: String { return self._s[906]! } + public var WallpaperSearch_ColorTeal: String { return self._s[907]! } + public var ChannelIntro_Title: String { return self._s[908]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[907]!, self._r[907]!, [_0]) + return formatWithArgumentRanges(self._s[909]!, self._r[909]!, [_0]) } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[909]! } - public var VoiceOver_Chat_Reply: String { return self._s[910]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[911]! } - public var Channel_Info_Description: String { return self._s[912]! } - public var Stickers_FavoriteStickers: String { return self._s[913]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[914]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[915]! } - public var ChatSearch_ResultsTooltip: String { return self._s[916]! } - public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[917]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[918]! } - public var Group_PublicLink_Placeholder: String { return self._s[919]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[920]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[911]! } + public var VoiceOver_Chat_Reply: String { return self._s[912]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[913]! } + public var Channel_Info_Description: String { return self._s[914]! } + public var Stickers_FavoriteStickers: String { return self._s[915]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[916]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[917]! } + public var ChatSearch_ResultsTooltip: String { return self._s[918]! } + public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[919]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[920]! } + public var Group_PublicLink_Placeholder: String { return self._s[921]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[922]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_1]) + return formatWithArgumentRanges(self._s[923]!, self._r[923]!, [_1]) } - public var TextFormat_Underline: String { return self._s[922]! } + public var TextFormat_Underline: String { return self._s[924]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[923]!, self._r[923]!, [_1, _2]) + return formatWithArgumentRanges(self._s[925]!, self._r[925]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[924]!, self._r[924]!, [_0]) + return formatWithArgumentRanges(self._s[926]!, self._r[926]!, [_0]) } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[925]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[927]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[926]!, self._r[926]!, [_1, _2]) + return formatWithArgumentRanges(self._s[928]!, self._r[928]!, [_1, _2]) } - public var Wallet_Intro_ImportExisting: String { return self._s[927]! } - public var GroupPermission_Delete: String { return self._s[928]! } - public var Passport_Language_uk: String { return self._s[929]! } - public var StickerPack_HideStickers: String { return self._s[931]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[932]! } + public var Wallet_Intro_ImportExisting: String { return self._s[929]! } + public var GroupPermission_Delete: String { return self._s[930]! } + public var Passport_Language_uk: String { return self._s[931]! } + public var StickerPack_HideStickers: String { return self._s[933]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[934]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[933]!, self._r[933]!, [_1, _2]) + return formatWithArgumentRanges(self._s[935]!, self._r[935]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[934]! } + public var Activity_UploadingVideoMessage: String { return self._s[936]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[935]!, self._r[935]!, [_0]) + return formatWithArgumentRanges(self._s[937]!, self._r[937]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[936]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[937]! } - public var Settings_CallSettings: String { return self._s[938]! } - public var Camera_SquareMode: String { return self._s[939]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[940]! } - public var GroupInfo_SharedMediaNone: String { return self._s[941]! } + public var Channel_TitleInfo: String { return self._s[938]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[939]! } + public var Settings_CallSettings: String { return self._s[940]! } + public var Camera_SquareMode: String { return self._s[941]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[942]! } + public var GroupInfo_SharedMediaNone: String { return self._s[943]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[942]!, self._r[942]!, [_1]) + return formatWithArgumentRanges(self._s[944]!, self._r[944]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[943]! } - public var Application_Update: String { return self._s[945]! } - public var Month_ShortJanuary: String { return self._s[946]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[947]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[948]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[949]! } - public var Passport_Address_Street2Placeholder: String { return self._s[950]! } + public var Bot_GenericBotStatus: String { return self._s[945]! } + public var Application_Update: String { return self._s[947]! } + public var Month_ShortJanuary: String { return self._s[948]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[949]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[950]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[951]! } + public var Passport_Address_Street2Placeholder: String { return self._s[952]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[951]!, self._r[951]!, [_0]) + return formatWithArgumentRanges(self._s[953]!, self._r[953]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[952]! } - public var Appearance_PreviewOutgoingText: String { return self._s[953]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[954]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[956]! } - public var Map_Directions: String { return self._s[957]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[959]! } - public var Appearance_ThemeDay: String { return self._s[960]! } - public var LogoutOptions_LogOut: String { return self._s[961]! } - public var Group_PublicLink_Title: String { return self._s[963]! } - public var Channel_AddBotErrorNoRights: String { return self._s[964]! } - public var Passport_Identity_AddPassport: String { return self._s[965]! } - public var LocalGroup_ButtonTitle: String { return self._s[966]! } - public var Call_Message: String { return self._s[967]! } - public var PhotoEditor_ExposureTool: String { return self._s[968]! } - public var Wallet_Receive_CommentInfo: String { return self._s[970]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[971]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[973]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[974]! } - public var Appearance_Preview: String { return self._s[975]! } - public var Compose_ChannelMembers: String { return self._s[976]! } - public var Conversation_DeleteManyMessages: String { return self._s[977]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[978]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[979]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[980]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[983]! } - public var Conversation_UpdateTelegram: String { return self._s[984]! } - public var EditTheme_Create_TopInfo: String { return self._s[985]! } + public var NetworkUsageSettings_Cellular: String { return self._s[954]! } + public var Appearance_PreviewOutgoingText: String { return self._s[955]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[956]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[958]! } + public var Map_Directions: String { return self._s[959]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[961]! } + public var Appearance_ThemeDay: String { return self._s[962]! } + public var LogoutOptions_LogOut: String { return self._s[963]! } + public var Group_PublicLink_Title: String { return self._s[965]! } + public var Channel_AddBotErrorNoRights: String { return self._s[966]! } + public var Passport_Identity_AddPassport: String { return self._s[967]! } + public var LocalGroup_ButtonTitle: String { return self._s[968]! } + public var Call_Message: String { return self._s[969]! } + public var PhotoEditor_ExposureTool: String { return self._s[970]! } + public var Wallet_Receive_CommentInfo: String { return self._s[972]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[973]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[975]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[976]! } + public var Appearance_Preview: String { return self._s[977]! } + public var Compose_ChannelMembers: String { return self._s[978]! } + public var Conversation_DeleteManyMessages: String { return self._s[979]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[980]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[981]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[982]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[985]! } + public var Conversation_UpdateTelegram: String { return self._s[986]! } + public var EditTheme_Create_TopInfo: String { return self._s[987]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[986]!, self._r[986]!, [_0]) + return formatWithArgumentRanges(self._s[988]!, self._r[988]!, [_0]) } - public var Wallet_WordCheck_Continue: String { return self._s[987]! } - public var TwoFactorSetup_Hint_Action: String { return self._s[988]! } + public var Wallet_WordCheck_Continue: String { return self._s[989]! } + public var TwoFactorSetup_Hint_Action: String { return self._s[990]! } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[989]!, self._r[989]!, [_1]) + return formatWithArgumentRanges(self._s[991]!, self._r[991]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[990]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[991]! } + public var GroupInfo_Administrators_Title: String { return self._s[992]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[993]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[992]!, self._r[992]!, [_0]) + return formatWithArgumentRanges(self._s[994]!, self._r[994]!, [_0]) } - public var Tour_Title3: String { return self._s[993]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[994]! } - public var Clipboard_SendPhoto: String { return self._s[998]! } - public var MediaPicker_Videos: String { return self._s[999]! } - public var Passport_Email_Title: String { return self._s[1000]! } + public var Tour_Title3: String { return self._s[995]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[996]! } + public var Clipboard_SendPhoto: String { return self._s[1000]! } + public var MediaPicker_Videos: String { return self._s[1001]! } + public var Passport_Email_Title: String { return self._s[1002]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1001]!, self._r[1001]!, [_0]) + return formatWithArgumentRanges(self._s[1003]!, self._r[1003]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[1002]! } - public var Conversation_MessageDialogDelete: String { return self._s[1003]! } - public var Privacy_Calls_CustomHelp: String { return self._s[1005]! } - public var Message_Wallpaper: String { return self._s[1006]! } - public var MemberSearch_BotSection: String { return self._s[1007]! } - public var GroupInfo_SetSound: String { return self._s[1008]! } - public var Core_ServiceUserStatus: String { return self._s[1009]! } - public var LiveLocationUpdated_JustNow: String { return self._s[1010]! } - public var Call_StatusFailed: String { return self._s[1011]! } - public var TwoFactorSetup_Email_Placeholder: String { return self._s[1012]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[1013]! } - public var TwoStepAuth_SetPassword: String { return self._s[1014]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[1015]! } + public var StickerPacksSettings_Title: String { return self._s[1004]! } + public var Conversation_MessageDialogDelete: String { return self._s[1005]! } + public var Privacy_Calls_CustomHelp: String { return self._s[1007]! } + public var Message_Wallpaper: String { return self._s[1008]! } + public var MemberSearch_BotSection: String { return self._s[1009]! } + public var GroupInfo_SetSound: String { return self._s[1010]! } + public var Core_ServiceUserStatus: String { return self._s[1011]! } + public var LiveLocationUpdated_JustNow: String { return self._s[1012]! } + public var Call_StatusFailed: String { return self._s[1013]! } + public var TwoFactorSetup_Email_Placeholder: String { return self._s[1014]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[1015]! } + public var TwoStepAuth_SetPassword: String { return self._s[1016]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[1017]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1017]!, self._r[1017]!, [_0]) + return formatWithArgumentRanges(self._s[1019]!, self._r[1019]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[1018]! } - public var Profile_Username: String { return self._s[1019]! } - public var Bot_DescriptionTitle: String { return self._s[1020]! } - public var MaskStickerSettings_Title: String { return self._s[1021]! } - public var SharedMedia_CategoryOther: String { return self._s[1022]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[1023]! } - public var Common_NotNow: String { return self._s[1024]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[1025]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[1026]! } - public var Map_Location: String { return self._s[1027]! } - public var Invitation_JoinGroup: String { return self._s[1028]! } - public var AutoDownloadSettings_Title: String { return self._s[1030]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[1031]! } - public var Channel_ErrorAddBlocked: String { return self._s[1032]! } - public var Conversation_UnblockUser: String { return self._s[1033]! } - public var EditTheme_Edit_TopInfo: String { return self._s[1034]! } - public var Watch_Bot_Restart: String { return self._s[1035]! } - public var TwoStepAuth_Title: String { return self._s[1036]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[1037]! } - public var Checkout_ShippingMethod: String { return self._s[1038]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1039]! } + public var Calls_SubmitRating: String { return self._s[1020]! } + public var Profile_Username: String { return self._s[1021]! } + public var Bot_DescriptionTitle: String { return self._s[1022]! } + public var MaskStickerSettings_Title: String { return self._s[1023]! } + public var SharedMedia_CategoryOther: String { return self._s[1024]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[1025]! } + public var Common_NotNow: String { return self._s[1026]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[1027]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[1028]! } + public var Map_Location: String { return self._s[1029]! } + public var Invitation_JoinGroup: String { return self._s[1030]! } + public var AutoDownloadSettings_Title: String { return self._s[1032]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[1033]! } + public var Channel_ErrorAddBlocked: String { return self._s[1034]! } + public var Conversation_UnblockUser: String { return self._s[1035]! } + public var EditTheme_Edit_TopInfo: String { return self._s[1036]! } + public var Watch_Bot_Restart: String { return self._s[1037]! } + public var TwoStepAuth_Title: String { return self._s[1038]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[1039]! } + public var Checkout_ShippingMethod: String { return self._s[1040]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1041]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1040]!, self._r[1040]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1042]!, self._r[1042]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1042]!, self._r[1042]!, [_0]) + return formatWithArgumentRanges(self._s[1044]!, self._r[1044]!, [_0]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1043]!, self._r[1043]!, [_0]) + return formatWithArgumentRanges(self._s[1045]!, self._r[1045]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1044]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[1045]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[1046]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[1047]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[1048]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[1049]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[1050]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[1051]! } - public var Checkout_PaymentMethod_Title: String { return self._s[1052]! } - public var SocksProxySetup_Connection: String { return self._s[1053]! } - public var Group_MessagePhotoRemoved: String { return self._s[1054]! } - public var Channel_Stickers_NotFound: String { return self._s[1057]! } - public var Group_About_Help: String { return self._s[1058]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[1059]! } - public var PeopleNearby_Title: String { return self._s[1061]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1046]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[1047]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[1048]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[1049]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[1050]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[1051]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[1052]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[1053]! } + public var Checkout_PaymentMethod_Title: String { return self._s[1054]! } + public var SocksProxySetup_Connection: String { return self._s[1055]! } + public var Group_MessagePhotoRemoved: String { return self._s[1056]! } + public var Channel_Stickers_NotFound: String { return self._s[1059]! } + public var Group_About_Help: String { return self._s[1060]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[1061]! } + public var PeopleNearby_Title: String { return self._s[1063]! } public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1062]!, self._r[1062]!, [_1]) + return formatWithArgumentRanges(self._s[1064]!, self._r[1064]!, [_1]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1064]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1065]! } - public var SocksProxySetup_Password: String { return self._s[1066]! } - public var Notifications_PermissionsEnable: String { return self._s[1067]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[1069]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1066]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1067]! } + public var SocksProxySetup_Password: String { return self._s[1068]! } + public var Notifications_PermissionsEnable: String { return self._s[1069]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[1071]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1070]!, self._r[1070]!, [_1]) + return formatWithArgumentRanges(self._s[1072]!, self._r[1072]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1072]!, self._r[1072]!, [_0]) + return formatWithArgumentRanges(self._s[1074]!, self._r[1074]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[1073]! } - public var ArchivedPacksAlert_Title: String { return self._s[1074]! } - public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[1075]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1075]! } + public var ArchivedPacksAlert_Title: String { return self._s[1076]! } + public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[1077]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1076]!, self._r[1076]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1078]!, self._r[1078]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1077]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1079]! } - public var Conversation_StatusTyping: String { return self._s[1080]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1081]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1082]! } - public var UserInfo_CreateNewContact: String { return self._s[1083]! } - public var Passport_Identity_FrontSide: String { return self._s[1084]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1085]! } - public var Calls_CallTabTitle: String { return self._s[1086]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1087]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1079]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1081]! } + public var Conversation_StatusTyping: String { return self._s[1082]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1083]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1084]! } + public var UserInfo_CreateNewContact: String { return self._s[1085]! } + public var Passport_Identity_FrontSide: String { return self._s[1086]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1087]! } + public var Calls_CallTabTitle: String { return self._s[1088]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1089]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1089]!, self._r[1089]!, [_0]) + return formatWithArgumentRanges(self._s[1091]!, self._r[1091]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1090]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1091]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1092]! } - public var Wallet_Completed_Text: String { return self._s[1093]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1094]! } - public var Paint_Stickers: String { return self._s[1095]! } - public var Privacy_GroupsAndChannels: String { return self._s[1096]! } - public var ChatList_Context_Delete: String { return self._s[1098]! } - public var UserInfo_AddContact: String { return self._s[1099]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1092]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1093]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1094]! } + public var Wallet_Completed_Text: String { return self._s[1095]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1096]! } + public var Paint_Stickers: String { return self._s[1097]! } + public var Privacy_GroupsAndChannels: String { return self._s[1098]! } + public var ChatList_Context_Delete: String { return self._s[1100]! } + public var UserInfo_AddContact: String { return self._s[1101]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1100]!, self._r[1100]!, [_0]) + return formatWithArgumentRanges(self._s[1102]!, self._r[1102]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1102]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1104]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1104]!, self._r[1104]!, [_0]) + return formatWithArgumentRanges(self._s[1106]!, self._r[1106]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1105]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1106]! } - public var BlockedUsers_BlockUser: String { return self._s[1107]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1108]! } - public var MediaPicker_UngroupDescription: String { return self._s[1109]! } - public var Watch_NoConnection: String { return self._s[1110]! } - public var Month_GenSeptember: String { return self._s[1111]! } - public var Conversation_ViewGroup: String { return self._s[1113]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1116]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1117]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1118]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1119]! } - public var Wallet_WordCheck_IncorrectHeader: String { return self._s[1120]! } - public var MediaPicker_CameraRoll: String { return self._s[1122]! } - public var Month_GenAugust: String { return self._s[1123]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1124]! } - public var SharedMedia_EmptyText: String { return self._s[1125]! } - public var Map_ShareLiveLocation: String { return self._s[1126]! } - public var Calls_All: String { return self._s[1127]! } - public var Appearance_ThemeNight: String { return self._s[1130]! } - public var Conversation_HoldForAudio: String { return self._s[1131]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1134]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1135]! } - public var SocksProxySetup_Secret: String { return self._s[1136]! } + public var DialogList_NoMessagesTitle: String { return self._s[1107]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1108]! } + public var BlockedUsers_BlockUser: String { return self._s[1109]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1110]! } + public var MediaPicker_UngroupDescription: String { return self._s[1111]! } + public var Watch_NoConnection: String { return self._s[1112]! } + public var Month_GenSeptember: String { return self._s[1113]! } + public var Conversation_ViewGroup: String { return self._s[1115]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1118]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1119]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1120]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1121]! } + public var Wallet_WordCheck_IncorrectHeader: String { return self._s[1122]! } + public var MediaPicker_CameraRoll: String { return self._s[1124]! } + public var Month_GenAugust: String { return self._s[1125]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1126]! } + public var SharedMedia_EmptyText: String { return self._s[1127]! } + public var Map_ShareLiveLocation: String { return self._s[1128]! } + public var Calls_All: String { return self._s[1129]! } + public var Appearance_ThemeNight: String { return self._s[1132]! } + public var Conversation_HoldForAudio: String { return self._s[1133]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1136]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1137]! } + public var SocksProxySetup_Secret: String { return self._s[1138]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1137]!, self._r[1137]!, [_0]) + return formatWithArgumentRanges(self._s[1139]!, self._r[1139]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1139]! } - public var Conversation_Location: String { return self._s[1140]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1141]! } + public var Conversation_Location: String { return self._s[1142]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1141]!, self._r[1141]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1143]!, self._r[1143]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1143]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1144]! } - public var Notifications_PermissionsText: String { return self._s[1145]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1146]! } - public var Call_Flip: String { return self._s[1147]! } - public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[1149]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1150]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1151]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1153]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1155]! } - public var Channel_TooMuchBots: String { return self._s[1157]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1158]! } - public var Login_InvalidCodeError: String { return self._s[1159]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1160]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1145]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1146]! } + public var Notifications_PermissionsText: String { return self._s[1147]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1148]! } + public var Call_Flip: String { return self._s[1149]! } + public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[1151]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1152]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1153]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1155]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1157]! } + public var Channel_TooMuchBots: String { return self._s[1159]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1160]! } + public var Login_InvalidCodeError: String { return self._s[1161]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1162]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1161]!, self._r[1161]!, [_0]) + return formatWithArgumentRanges(self._s[1163]!, self._r[1163]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1162]!, self._r[1162]!, [_0]) + return formatWithArgumentRanges(self._s[1164]!, self._r[1164]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1163]! } - public var Call_CallInProgressTitle: String { return self._s[1164]! } - public var Month_ShortSeptember: String { return self._s[1165]! } - public var Watch_ChannelInfo_Title: String { return self._s[1166]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1169]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1170]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1171]! } - public var Wallet_Receive_Title: String { return self._s[1172]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1173]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1174]! } - public var PhotoEditor_CropReset: String { return self._s[1175]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1177]! } - public var Channel_Management_LabelEditor: String { return self._s[1178]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1180]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1181]! } - public var Wallet_Info_WalletCreated: String { return self._s[1182]! } - public var UserInfo_Title: String { return self._s[1183]! } - public var ChatList_HideAction: String { return self._s[1184]! } - public var AccessDenied_Title: String { return self._s[1185]! } - public var DialogList_SearchLabel: String { return self._s[1186]! } - public var Group_Setup_HistoryHidden: String { return self._s[1187]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1188]! } - public var State_Updating: String { return self._s[1190]! } - public var Contacts_TabTitle: String { return self._s[1191]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1193]! } - public var GroupInfo_GroupHistory: String { return self._s[1194]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1195]! } - public var Wallpaper_SetColor: String { return self._s[1196]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1197]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1198]! } - public var Chat_AttachmentLimitReached: String { return self._s[1199]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1200]! } - public var Contacts_NotRegisteredSection: String { return self._s[1201]! } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1165]! } + public var Call_CallInProgressTitle: String { return self._s[1166]! } + public var Month_ShortSeptember: String { return self._s[1167]! } + public var Watch_ChannelInfo_Title: String { return self._s[1168]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1171]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1172]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1173]! } + public var Wallet_Receive_Title: String { return self._s[1174]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1175]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1176]! } + public var PhotoEditor_CropReset: String { return self._s[1177]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1179]! } + public var Channel_Management_LabelEditor: String { return self._s[1180]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1182]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1183]! } + public var Wallet_Info_WalletCreated: String { return self._s[1184]! } + public var UserInfo_Title: String { return self._s[1185]! } + public var ChatList_HideAction: String { return self._s[1186]! } + public var AccessDenied_Title: String { return self._s[1187]! } + public var DialogList_SearchLabel: String { return self._s[1188]! } + public var Group_Setup_HistoryHidden: String { return self._s[1189]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1190]! } + public var State_Updating: String { return self._s[1192]! } + public var Contacts_TabTitle: String { return self._s[1193]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1195]! } + public var GroupInfo_GroupHistory: String { return self._s[1196]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1197]! } + public var Wallpaper_SetColor: String { return self._s[1198]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1199]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1200]! } + public var Chat_AttachmentLimitReached: String { return self._s[1201]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1202]! } + public var Contacts_NotRegisteredSection: String { return self._s[1203]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1202]!, self._r[1202]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1204]!, self._r[1204]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1203]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1204]! } - public var SocksProxySetup_Connecting: String { return self._s[1205]! } - public var ExplicitContent_AlertChannel: String { return self._s[1206]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1207]! } - public var Conversation_Contact: String { return self._s[1208]! } - public var Login_CodeExpired: String { return self._s[1209]! } - public var Passport_DiscardMessageAction: String { return self._s[1210]! } - public var ChatList_Context_Unpin: String { return self._s[1211]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1212]! } + public var Paint_Clear: String { return self._s[1205]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1206]! } + public var SocksProxySetup_Connecting: String { return self._s[1207]! } + public var ExplicitContent_AlertChannel: String { return self._s[1208]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1209]! } + public var Conversation_Contact: String { return self._s[1210]! } + public var Login_CodeExpired: String { return self._s[1211]! } + public var Passport_DiscardMessageAction: String { return self._s[1212]! } + public var ChatList_Context_Unpin: String { return self._s[1213]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1214]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1213]!, self._r[1213]!, [_0]) + return formatWithArgumentRanges(self._s[1215]!, self._r[1215]!, [_0]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1214]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1215]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1216]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1217]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1216]!, self._r[1216]!, [_0]) + return formatWithArgumentRanges(self._s[1218]!, self._r[1218]!, [_0]) } - public var Month_ShortApril: String { return self._s[1217]! } - public var AuthSessions_CurrentSession: String { return self._s[1218]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1221]! } - public var Wallet_Navigation_Cancel: String { return self._s[1223]! } - public var WallpaperPreview_CropTopText: String { return self._s[1224]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1225]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1226]! } + public var Month_ShortApril: String { return self._s[1219]! } + public var AuthSessions_CurrentSession: String { return self._s[1220]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1223]! } + public var Wallet_Navigation_Cancel: String { return self._s[1225]! } + public var WallpaperPreview_CropTopText: String { return self._s[1226]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1227]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1228]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1227]!, self._r[1227]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1229]!, self._r[1229]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1228]! } - public var Channel_Setup_TypePrivate: String { return self._s[1230]! } - public var Forward_ChannelReadOnly: String { return self._s[1233]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1234]! } - public var AddContact_SharedContactException: String { return self._s[1235]! } - public var UserInfo_BotPrivacy: String { return self._s[1237]! } - public var Wallet_CreateInvoice_Title: String { return self._s[1238]! } - public var Notification_PassportValueEmail: String { return self._s[1239]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1240]! } - public var GroupPermission_NewTitle: String { return self._s[1241]! } - public var CallFeedback_ReasonDropped: String { return self._s[1242]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1243]! } - public var Channel_SignMessages_Help: String { return self._s[1245]! } - public var Undo_ChatDeleted: String { return self._s[1247]! } - public var Conversation_ChatBackground: String { return self._s[1248]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1230]! } + public var Channel_Setup_TypePrivate: String { return self._s[1232]! } + public var Forward_ChannelReadOnly: String { return self._s[1235]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1236]! } + public var AddContact_SharedContactException: String { return self._s[1237]! } + public var UserInfo_BotPrivacy: String { return self._s[1239]! } + public var Wallet_CreateInvoice_Title: String { return self._s[1240]! } + public var Notification_PassportValueEmail: String { return self._s[1241]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1242]! } + public var GroupPermission_NewTitle: String { return self._s[1243]! } + public var CallFeedback_ReasonDropped: String { return self._s[1244]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1245]! } + public var Channel_SignMessages_Help: String { return self._s[1247]! } + public var Undo_ChatDeleted: String { return self._s[1249]! } + public var Conversation_ChatBackground: String { return self._s[1250]! } public func Wallet_WordCheck_Text(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1249]!, self._r[1249]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1251]!, self._r[1251]!, [_1, _2, _3]) } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1250]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1251]! } - public var Passport_Language_pt: String { return self._s[1252]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1253]! } - public var NotificationsSound_Popcorn: String { return self._s[1256]! } - public var AutoNightTheme_Disabled: String { return self._s[1257]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1258]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1259]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1260]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1261]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1252]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1253]! } + public var Passport_Language_pt: String { return self._s[1254]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1255]! } + public var NotificationsSound_Popcorn: String { return self._s[1258]! } + public var AutoNightTheme_Disabled: String { return self._s[1259]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1260]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1261]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1262]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1263]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1262]!, self._r[1262]!, [_0]) + return formatWithArgumentRanges(self._s[1264]!, self._r[1264]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1263]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1264]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1266]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1265]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1266]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1268]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1267]!, self._r[1267]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1269]!, self._r[1269]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1270]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1271]! } - public var Compose_NewEncryptedChat: String { return self._s[1272]! } - public var Login_CodeFloodError: String { return self._s[1273]! } - public var Calls_TabTitle: String { return self._s[1274]! } - public var Privacy_ProfilePhoto: String { return self._s[1275]! } - public var Passport_Language_he: String { return self._s[1276]! } + public var SocksProxySetup_Hostname: String { return self._s[1272]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1273]! } + public var Compose_NewEncryptedChat: String { return self._s[1274]! } + public var Login_CodeFloodError: String { return self._s[1275]! } + public var Calls_TabTitle: String { return self._s[1276]! } + public var Privacy_ProfilePhoto: String { return self._s[1277]! } + public var Passport_Language_he: String { return self._s[1278]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1277]!, self._r[1277]!, [_0]) - } - public var GroupPermission_Title: String { return self._s[1278]! } - public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1279]!, self._r[1279]!, [_0]) } - public var Wallet_TransactionInfo_SenderHeader: String { return self._s[1280]! } - public var GroupPermission_NoChangeInfo: String { return self._s[1281]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1282]! } - public var Tour_Text1: String { return self._s[1283]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1284]! } - public var Month_ShortFebruary: String { return self._s[1285]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1286]! } + public var GroupPermission_Title: String { return self._s[1280]! } + public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1281]!, self._r[1281]!, [_0]) + } + public var Wallet_TransactionInfo_SenderHeader: String { return self._s[1282]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1283]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1284]! } + public var Tour_Text1: String { return self._s[1285]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1286]! } + public var Month_ShortFebruary: String { return self._s[1287]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1288]! } public func Wallet_Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1289]!, self._r[1289]!, [_1, _2, _3]) } - public var NotificationsSound_Glass: String { return self._s[1288]! } - public var Appearance_ThemeNightBlue: String { return self._s[1289]! } - public var CheckoutInfo_Pay: String { return self._s[1290]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1292]! } - public var Call_CallAgain: String { return self._s[1294]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1295]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1296]! } - public var Passport_InvalidPasswordError: String { return self._s[1297]! } - public var Watch_Message_Game: String { return self._s[1298]! } - public var Stickers_Install: String { return self._s[1299]! } - public var VoiceOver_Chat_Message: String { return self._s[1300]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1301]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1303]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1304]! } - public var AuthSessions_OtherSessions: String { return self._s[1305]! } - public var Channel_Username_Help: String { return self._s[1306]! } - public var Camera_Title: String { return self._s[1307]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1309]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1310]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1311]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1312]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1313]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1314]! } - public var ScheduledMessages_DeleteMany: String { return self._s[1315]! } - public var Conversation_RestrictedStickers: String { return self._s[1316]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1318]! } - public var UserInfo_TelegramCall: String { return self._s[1320]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1321]! } - public var CreatePoll_OptionsHeader: String { return self._s[1322]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1323]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1324]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1325]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1326]! } + public var NotificationsSound_Glass: String { return self._s[1290]! } + public var Appearance_ThemeNightBlue: String { return self._s[1291]! } + public var CheckoutInfo_Pay: String { return self._s[1292]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1294]! } + public var Call_CallAgain: String { return self._s[1296]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1297]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1298]! } + public var Passport_InvalidPasswordError: String { return self._s[1299]! } + public var Watch_Message_Game: String { return self._s[1300]! } + public var Stickers_Install: String { return self._s[1301]! } + public var VoiceOver_Chat_Message: String { return self._s[1302]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1303]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1305]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1306]! } + public var AuthSessions_OtherSessions: String { return self._s[1307]! } + public var Channel_Username_Help: String { return self._s[1308]! } + public var Camera_Title: String { return self._s[1309]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1311]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1312]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1313]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1314]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1315]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1316]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1317]! } + public var Conversation_RestrictedStickers: String { return self._s[1318]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1320]! } + public var UserInfo_TelegramCall: String { return self._s[1322]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1323]! } + public var CreatePoll_OptionsHeader: String { return self._s[1324]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1325]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1326]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1327]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1328]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1327]!, self._r[1327]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1329]!, self._r[1329]!, [_1, _2, _3]) } - public var Wallet_Month_GenAugust: String { return self._s[1328]! } - public var Settings_SaveEditedPhotos: String { return self._s[1329]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1330]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1331]! } - public var Conversation_MessageDialogRetry: String { return self._s[1332]! } - public var ChatList_Context_MarkAsUnread: String { return self._s[1333]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1334]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1335]! } - public var Group_Setup_TypeHeader: String { return self._s[1336]! } - public var Paint_RecentStickers: String { return self._s[1337]! } - public var PhotoEditor_GrainTool: String { return self._s[1338]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1339]! } - public var EmptyGroupInfo_Line4: String { return self._s[1340]! } - public var Watch_AuthRequired: String { return self._s[1342]! } + public var Wallet_Month_GenAugust: String { return self._s[1330]! } + public var Settings_SaveEditedPhotos: String { return self._s[1331]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1332]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1333]! } + public var Conversation_MessageDialogRetry: String { return self._s[1334]! } + public var ChatList_Context_MarkAsUnread: String { return self._s[1335]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1336]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1337]! } + public var Group_Setup_TypeHeader: String { return self._s[1338]! } + public var Paint_RecentStickers: String { return self._s[1339]! } + public var PhotoEditor_GrainTool: String { return self._s[1340]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1341]! } + public var EmptyGroupInfo_Line4: String { return self._s[1342]! } + public var Watch_AuthRequired: String { return self._s[1344]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1343]!, self._r[1343]!, [_0]) + return formatWithArgumentRanges(self._s[1345]!, self._r[1345]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1344]! } - public var ChannelIntro_Text: String { return self._s[1345]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1346]! } - public var GroupPermission_NoSendMedia: String { return self._s[1347]! } - public var Calls_AddTab: String { return self._s[1348]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1349]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1350]! } - public var Conversation_WalletRequiredSetup: String { return self._s[1351]! } - public var Notification_MessageLifetime1d: String { return self._s[1352]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1353]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1354]! } - public var Passport_Identity_GenderFemale: String { return self._s[1355]! } - public var BlockedUsers_BlockTitle: String { return self._s[1356]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1346]! } + public var ChannelIntro_Text: String { return self._s[1347]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1348]! } + public var GroupPermission_NoSendMedia: String { return self._s[1349]! } + public var Calls_AddTab: String { return self._s[1350]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1351]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1352]! } + public var Conversation_WalletRequiredSetup: String { return self._s[1353]! } + public var Notification_MessageLifetime1d: String { return self._s[1354]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1355]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1356]! } + public var Passport_Identity_GenderFemale: String { return self._s[1357]! } + public var BlockedUsers_BlockTitle: String { return self._s[1358]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1357]!, self._r[1357]!, [_1]) + return formatWithArgumentRanges(self._s[1359]!, self._r[1359]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1358]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1359]! } - public var Settings_Context_Logout: String { return self._s[1360]! } - public var Wallet_Info_UnknownTransaction: String { return self._s[1361]! } - public var ChatList_ArchiveAction: String { return self._s[1362]! } - public var AutoNightTheme_Scheduled: String { return self._s[1363]! } - public var TwoFactorSetup_Email_SkipAction: String { return self._s[1364]! } + public var Weekday_Yesterday: String { return self._s[1360]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1361]! } + public var Settings_Context_Logout: String { return self._s[1362]! } + public var Wallet_Info_UnknownTransaction: String { return self._s[1363]! } + public var ChatList_ArchiveAction: String { return self._s[1364]! } + public var AutoNightTheme_Scheduled: String { return self._s[1365]! } + public var TwoFactorSetup_Email_SkipAction: String { return self._s[1366]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1365]!, self._r[1365]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1367]!, self._r[1367]!, [_1, _2, _3, _4, _5, _6]) } - public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1366]! } - public var Wallet_Receive_CreateInvoice: String { return self._s[1367]! } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1368]! } + public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1368]! } + public var Wallet_Receive_CreateInvoice: String { return self._s[1369]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1370]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1371]!, self._r[1371]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1370]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1371]! } + public var CreatePoll_Create: String { return self._s[1372]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1373]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1372]!, self._r[1372]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1374]!, self._r[1374]!, [_1, _2]) } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1373]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1374]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1376]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1375]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1376]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1378]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1377]!, self._r[1377]!, [_1]) + return formatWithArgumentRanges(self._s[1379]!, self._r[1379]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1378]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1379]! } + public var Preview_OpenInInstagram: String { return self._s[1380]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1381]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1380]!, self._r[1380]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1382]!, self._r[1382]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1381]!, self._r[1381]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1383]!, self._r[1383]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1382]! } - public var ArchivedChats_IntroText3: String { return self._s[1383]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1384]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1385]! } - public var Wallet_Month_GenSeptember: String { return self._s[1386]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1387]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1384]! } + public var ArchivedChats_IntroText3: String { return self._s[1385]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1386]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1387]! } + public var Wallet_Month_GenSeptember: String { return self._s[1388]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1389]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1388]!, self._r[1388]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1390]!, self._r[1390]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1390]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1391]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1392]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1393]! } - public var Gif_NoGifsFound: String { return self._s[1394]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1395]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1396]! } - public var EditTheme_Preview: String { return self._s[1397]! } - public var GroupInfo_ActionPromote: String { return self._s[1398]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1399]! } - public var GroupInfo_Permissions_Title: String { return self._s[1400]! } - public var Permissions_ContactsText_v0: String { return self._s[1401]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1402]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1403]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1406]! } - public var Passport_FieldEmailHelp: String { return self._s[1407]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1392]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1393]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1394]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1395]! } + public var Gif_NoGifsFound: String { return self._s[1396]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1397]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1398]! } + public var EditTheme_Preview: String { return self._s[1399]! } + public var GroupInfo_ActionPromote: String { return self._s[1400]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1401]! } + public var GroupInfo_Permissions_Title: String { return self._s[1402]! } + public var Permissions_ContactsText_v0: String { return self._s[1403]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1404]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1405]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1408]! } + public var Passport_FieldEmailHelp: String { return self._s[1409]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1408]!, self._r[1408]!, [_0]) + return formatWithArgumentRanges(self._s[1410]!, self._r[1410]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1409]! } - public var Weekday_ShortSaturday: String { return self._s[1410]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1411]! } - public var Watch_Conversation_UserInfo: String { return self._s[1412]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1413]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1414]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1415]! } - public var PhotoEditor_VignetteTool: String { return self._s[1416]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1417]! } - public var Passport_Language_et: String { return self._s[1418]! } - public var AppUpgrade_Running: String { return self._s[1419]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1421]! } - public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1422]! } - public var Passport_Language_bg: String { return self._s[1423]! } - public var Stickers_NoStickersFound: String { return self._s[1425]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1411]! } + public var Weekday_ShortSaturday: String { return self._s[1412]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1413]! } + public var Watch_Conversation_UserInfo: String { return self._s[1414]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1415]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1416]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1417]! } + public var PhotoEditor_VignetteTool: String { return self._s[1418]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1419]! } + public var Passport_Language_et: String { return self._s[1420]! } + public var AppUpgrade_Running: String { return self._s[1421]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1423]! } + public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1424]! } + public var Passport_Language_bg: String { return self._s[1425]! } + public var Stickers_NoStickersFound: String { return self._s[1427]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1427]!, self._r[1427]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1429]!, self._r[1429]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1428]!, self._r[1428]!, [_0]) + return formatWithArgumentRanges(self._s[1430]!, self._r[1430]!, [_0]) } - public var Wallet_Month_GenJuly: String { return self._s[1429]! } - public var Wallet_Receive_AddressHeader: String { return self._s[1430]! } - public var Wallet_Send_AmountText: String { return self._s[1431]! } - public var Settings_About: String { return self._s[1432]! } + public var Wallet_Month_GenJuly: String { return self._s[1431]! } + public var Wallet_Receive_AddressHeader: String { return self._s[1432]! } + public var Wallet_Send_AmountText: String { return self._s[1433]! } + public var Settings_About: String { return self._s[1434]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1433]!, self._r[1433]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1435]!, self._r[1435]!, [_0, _1, _2]) } - public var ChatList_Context_MarkAsRead: String { return self._s[1435]! } - public var KeyCommand_NewMessage: String { return self._s[1436]! } - public var Group_ErrorAddBlocked: String { return self._s[1437]! } + public var ChatList_Context_MarkAsRead: String { return self._s[1437]! } + public var KeyCommand_NewMessage: String { return self._s[1438]! } + public var Group_ErrorAddBlocked: String { return self._s[1439]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1438]!, self._r[1438]!, [_0]) + return formatWithArgumentRanges(self._s[1440]!, self._r[1440]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1439]! } - public var ReportGroupLocation_Title: String { return self._s[1440]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1441]! } - public var Cache_ClearProgress: String { return self._s[1442]! } + public var Map_LocationTitle: String { return self._s[1441]! } + public var ReportGroupLocation_Title: String { return self._s[1442]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1443]! } + public var Cache_ClearProgress: String { return self._s[1444]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1443]!, self._r[1443]!, [_0]) + return formatWithArgumentRanges(self._s[1445]!, self._r[1445]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1444]! } - public var Passport_UpdateRequiredError: String { return self._s[1445]! } - public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[1446]! } + public var GroupRemoved_AddToGroup: String { return self._s[1446]! } + public var Passport_UpdateRequiredError: String { return self._s[1447]! } + public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[1448]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1447]!, self._r[1447]!, [_1]) + return formatWithArgumentRanges(self._s[1449]!, self._r[1449]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1449]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1450]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1451]! } - public var Passport_Language_ka: String { return self._s[1452]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1451]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1452]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1453]! } + public var Passport_Language_ka: String { return self._s[1454]! } public func Wallet_Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1453]!, self._r[1453]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1455]!, self._r[1455]!, [_1, _2, _3]) } - public var Call_Decline: String { return self._s[1454]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1455]! } - public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1458]! } + public var Call_Decline: String { return self._s[1456]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1457]! } + public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1460]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1459]!, self._r[1459]!, [_0]) + return formatWithArgumentRanges(self._s[1461]!, self._r[1461]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1460]! } - public var EditTheme_EditTitle: String { return self._s[1461]! } + public var CallFeedback_Send: String { return self._s[1462]! } + public var EditTheme_EditTitle: String { return self._s[1463]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1462]!, self._r[1462]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1464]!, self._r[1464]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1463]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1465]! } public func Wallet_Updated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1465]!, self._r[1465]!, [_0]) + return formatWithArgumentRanges(self._s[1467]!, self._r[1467]!, [_0]) } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1466]! } - public var Passport_DeletePassport: String { return self._s[1467]! } - public var Appearance_AppIconFilled: String { return self._s[1468]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1469]! } - public var Month_ShortDecember: String { return self._s[1470]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1472]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1468]! } + public var Passport_DeletePassport: String { return self._s[1469]! } + public var Appearance_AppIconFilled: String { return self._s[1470]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1471]! } + public var Month_ShortDecember: String { return self._s[1472]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1474]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1473]!, self._r[1473]!, [_0]) + return formatWithArgumentRanges(self._s[1475]!, self._r[1475]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1474]! } - public var Conversation_EncryptedDescription1: String { return self._s[1475]! } - public var Conversation_EncryptedDescription2: String { return self._s[1476]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1477]! } - public var Conversation_EncryptedDescription3: String { return self._s[1479]! } - public var PhotoEditor_SharpenTool: String { return self._s[1480]! } + public var Channel_Stickers_Searching: String { return self._s[1476]! } + public var Conversation_EncryptedDescription1: String { return self._s[1477]! } + public var Conversation_EncryptedDescription2: String { return self._s[1478]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1479]! } + public var Conversation_EncryptedDescription3: String { return self._s[1481]! } + public var PhotoEditor_SharpenTool: String { return self._s[1482]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1481]!, self._r[1481]!, [_0]) + return formatWithArgumentRanges(self._s[1483]!, self._r[1483]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1483]! } - public var Channel_Members_AddMembers: String { return self._s[1484]! } - public var Wallpaper_Search: String { return self._s[1485]! } - public var Weekday_Friday: String { return self._s[1486]! } - public var Privacy_ContactsSync: String { return self._s[1487]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1488]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1489]! } + public var Conversation_EncryptedDescription4: String { return self._s[1485]! } + public var Channel_Members_AddMembers: String { return self._s[1486]! } + public var Wallpaper_Search: String { return self._s[1487]! } + public var Weekday_Friday: String { return self._s[1488]! } + public var Privacy_ContactsSync: String { return self._s[1489]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1490]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1491]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1490]!, self._r[1490]!, [_0]) + return formatWithArgumentRanges(self._s[1492]!, self._r[1492]!, [_0]) } - public var GroupInfo_Permissions_Removed: String { return self._s[1491]! } - public var Passport_Identity_GenderMale: String { return self._s[1492]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1493]! } + public var Passport_Identity_GenderMale: String { return self._s[1494]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1493]!, self._r[1493]!, [_0]) + return formatWithArgumentRanges(self._s[1495]!, self._r[1495]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1494]! } - public var Conversation_JumpToDate: String { return self._s[1495]! } - public var Contacts_GlobalSearch: String { return self._s[1496]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1497]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1498]! } - public var Profile_MessageLifetime1d: String { return self._s[1499]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1496]! } + public var Conversation_JumpToDate: String { return self._s[1497]! } + public var Contacts_GlobalSearch: String { return self._s[1498]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1499]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1500]! } + public var Profile_MessageLifetime1d: String { return self._s[1501]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1502]!, self._r[1502]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1503]! } + public var StickerPack_BuiltinPackName: String { return self._s[1505]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1504]!, self._r[1504]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1506]!, self._r[1506]!, [_1, _2]) } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1505]! } - public var Passport_InfoTitle: String { return self._s[1507]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1508]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1507]! } + public var Passport_InfoTitle: String { return self._s[1509]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1510]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1512]!, self._r[1512]!, [_0]) + return formatWithArgumentRanges(self._s[1514]!, self._r[1514]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1513]!, self._r[1513]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1515]!, self._r[1515]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1514]! } - public var Profile_BotInfo: String { return self._s[1515]! } - public var Watch_Compose_CreateMessage: String { return self._s[1516]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1517]! } - public var Month_ShortNovember: String { return self._s[1518]! } - public var Conversation_ScamWarning: String { return self._s[1519]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1520]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1521]! } - public var NotificationsSound_Chime: String { return self._s[1522]! } - public var Passport_Language_ko: String { return self._s[1524]! } - public var InviteText_URL: String { return self._s[1525]! } - public var TextFormat_Monospace: String { return self._s[1526]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1516]! } + public var Profile_BotInfo: String { return self._s[1517]! } + public var Watch_Compose_CreateMessage: String { return self._s[1518]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1519]! } + public var Month_ShortNovember: String { return self._s[1520]! } + public var Conversation_ScamWarning: String { return self._s[1521]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1522]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1523]! } + public var NotificationsSound_Chime: String { return self._s[1524]! } + public var Passport_Language_ko: String { return self._s[1526]! } + public var InviteText_URL: String { return self._s[1527]! } + public var TextFormat_Monospace: String { return self._s[1528]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1527]!, self._r[1527]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1529]!, self._r[1529]!, [_1, _2, _3]) } - public var EditTheme_Edit_BottomInfo: String { return self._s[1528]! } + public var EditTheme_Edit_BottomInfo: String { return self._s[1530]! } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1529]!, self._r[1529]!, [_0]) + return formatWithArgumentRanges(self._s[1531]!, self._r[1531]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1530]!, self._r[1530]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1532]!, self._r[1532]!, [_1, _2]) } - public var Wallet_Words_Title: String { return self._s[1531]! } - public var Wallet_Month_ShortMay: String { return self._s[1532]! } - public var EditTheme_CreateTitle: String { return self._s[1534]! } - public var Passport_InfoLearnMore: String { return self._s[1535]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1536]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1537]! } - public var Your_card_has_expired: String { return self._s[1538]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1539]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1540]! } - public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[1544]! } - public var Conversation_Report: String { return self._s[1545]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1546]! } - public var Notification_MessageLifetime1m: String { return self._s[1547]! } - public var Privacy_ContactsTitle: String { return self._s[1548]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1549]! } - public var Wallet_WordCheck_Title: String { return self._s[1550]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1551]! } - public var Channel_Members_Title: String { return self._s[1552]! } - public var Map_OpenInWaze: String { return self._s[1553]! } - public var Login_PhoneBannedError: String { return self._s[1554]! } + public var Wallet_Words_Title: String { return self._s[1533]! } + public var Wallet_Month_ShortMay: String { return self._s[1534]! } + public var EditTheme_CreateTitle: String { return self._s[1536]! } + public var Passport_InfoLearnMore: String { return self._s[1537]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1538]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1539]! } + public var Your_card_has_expired: String { return self._s[1540]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1541]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1542]! } + public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[1546]! } + public var Conversation_Report: String { return self._s[1547]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1548]! } + public var Notification_MessageLifetime1m: String { return self._s[1549]! } + public var Privacy_ContactsTitle: String { return self._s[1550]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1551]! } + public var Wallet_WordCheck_Title: String { return self._s[1552]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1553]! } + public var Channel_Members_Title: String { return self._s[1554]! } + public var Map_OpenInWaze: String { return self._s[1555]! } + public var Login_PhoneBannedError: String { return self._s[1556]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1555]!, self._r[1555]!, [_0]) + return formatWithArgumentRanges(self._s[1557]!, self._r[1557]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1556]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1557]! } - public var Common_OK: String { return self._s[1558]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1559]! } - public var Wallet_Words_NotDoneResponse: String { return self._s[1560]! } - public var Cache_Music: String { return self._s[1561]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1562]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1563]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1564]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1558]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1559]! } + public var Common_OK: String { return self._s[1560]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1561]! } + public var Wallet_Words_NotDoneResponse: String { return self._s[1562]! } + public var Cache_Music: String { return self._s[1563]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1564]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1565]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1566]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1565]!, self._r[1565]!, [_1]) + return formatWithArgumentRanges(self._s[1567]!, self._r[1567]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1566]!, self._r[1566]!, [_0]) - } - public var TwoFactorSetup_Done_Action: String { return self._s[1567]! } - public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1568]!, self._r[1568]!, [_0]) } - public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[1569]! } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1571]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1572]! } - public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[1574]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1575]! } - public var State_ConnectingToProxyInfo: String { return self._s[1576]! } - public var Message_VideoMessage: String { return self._s[1578]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1579]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1580]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1581]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1582]! } - public func Wallet_Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1583]!, self._r[1583]!, [_1, _2, _3]) + public var TwoFactorSetup_Done_Action: String { return self._s[1569]! } + public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1570]!, self._r[1570]!, [_0]) } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1584]! } - public var Activity_RecordingAudio: String { return self._s[1585]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1586]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1587]! } - public var Wallet_Info_Address: String { return self._s[1588]! } + public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[1571]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1573]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1574]! } + public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[1576]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1577]! } + public var State_ConnectingToProxyInfo: String { return self._s[1578]! } + public var Message_VideoMessage: String { return self._s[1580]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1581]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1582]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1583]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1584]! } + public func Wallet_Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1585]!, self._r[1585]!, [_1, _2, _3]) + } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1586]! } + public var Activity_RecordingAudio: String { return self._s[1587]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1588]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1589]! } + public var Wallet_Info_Address: String { return self._s[1590]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1590]!, self._r[1590]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1592]!, self._r[1592]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1594]!, self._r[1594]!, [_0]) + return formatWithArgumentRanges(self._s[1596]!, self._r[1596]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1595]! } - public var TwoFactorSetup_Intro_Action: String { return self._s[1596]! } - public var UserInfo_AddPhone: String { return self._s[1597]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1598]! } + public var Conversation_ApplyLocalization: String { return self._s[1597]! } + public var TwoFactorSetup_Intro_Action: String { return self._s[1598]! } + public var UserInfo_AddPhone: String { return self._s[1599]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1600]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1599]!, self._r[1599]!, [_0]) + return formatWithArgumentRanges(self._s[1601]!, self._r[1601]!, [_0]) } - public var Passport_Scans: String { return self._s[1601]! } - public var BlockedUsers_Unblock: String { return self._s[1602]! } + public var Passport_Scans: String { return self._s[1603]! } + public var BlockedUsers_Unblock: String { return self._s[1604]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1603]!, self._r[1603]!, [_1]) + return formatWithArgumentRanges(self._s[1605]!, self._r[1605]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1604]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1605]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1606]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1607]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1608]! } + public var Channel_Management_LabelCreator: String { return self._s[1606]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1607]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1608]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1609]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1610]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1609]!, self._r[1609]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1611]!, self._r[1611]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1610]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1611]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1612]! } - public var ChannelIntro_CreateChannel: String { return self._s[1613]! } - public var Conversation_UnreadMessages: String { return self._s[1614]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1615]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1616]! } - public var Theme_Context_Apply: String { return self._s[1617]! } - public var Notification_GroupActivated: String { return self._s[1618]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1619]! } - public var Wallet_Intro_CreateWallet: String { return self._s[1620]! } + public var Login_PhoneNumberHelp: String { return self._s[1612]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1613]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1614]! } + public var ChannelIntro_CreateChannel: String { return self._s[1615]! } + public var Conversation_UnreadMessages: String { return self._s[1616]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1617]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1618]! } + public var Theme_Context_Apply: String { return self._s[1619]! } + public var Notification_GroupActivated: String { return self._s[1620]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1621]! } + public var Wallet_Intro_CreateWallet: String { return self._s[1622]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1621]!, self._r[1621]!, [_0]) + return formatWithArgumentRanges(self._s[1623]!, self._r[1623]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1622]!, self._r[1622]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1624]!, self._r[1624]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1624]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1626]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1625]!, self._r[1625]!, [_0]) + return formatWithArgumentRanges(self._s[1627]!, self._r[1627]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1626]! } - public var CallFeedback_AddComment: String { return self._s[1627]! } + public var Undo_DeletedChannel: String { return self._s[1628]! } + public var CallFeedback_AddComment: String { return self._s[1629]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1628]!, self._r[1628]!, [_0]) - } - public var Document_TargetConfirmationFormat: String { return self._s[1629]! } - public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1630]!, self._r[1630]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1631]! } + public var Document_TargetConfirmationFormat: String { return self._s[1631]! } + public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1632]!, self._r[1632]!, [_0]) + } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1633]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1632]!, self._r[1632]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1634]!, self._r[1634]!, [_1, _2, _3, _4]) } - public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[1633]! } - public var Theme_ErrorNotFound: String { return self._s[1634]! } - public var Contacts_SortByName: String { return self._s[1635]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1636]! } + public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[1635]! } + public var Theme_ErrorNotFound: String { return self._s[1636]! } + public var Contacts_SortByName: String { return self._s[1637]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1638]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1638]!, self._r[1638]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1640]!, self._r[1640]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1639]! } - public var ScheduledMessages_EditTime: String { return self._s[1640]! } - public var Conversation_ClearSelfHistory: String { return self._s[1641]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1642]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1643]! } - public var Stickers_SuggestNone: String { return self._s[1644]! } - public var ChatSettings_Cache: String { return self._s[1645]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1646]! } - public var Media_ShareThisPhoto: String { return self._s[1647]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1648]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1649]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1650]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1651]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1652]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1653]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1641]! } + public var ScheduledMessages_EditTime: String { return self._s[1642]! } + public var Conversation_ClearSelfHistory: String { return self._s[1643]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1644]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1645]! } + public var Stickers_SuggestNone: String { return self._s[1646]! } + public var ChatSettings_Cache: String { return self._s[1647]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1648]! } + public var Media_ShareThisPhoto: String { return self._s[1649]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1650]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1651]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1652]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1653]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1654]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1655]! } public func Wallet_SecureStorageReset_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1654]!, self._r[1654]!, [_0]) + return formatWithArgumentRanges(self._s[1656]!, self._r[1656]!, [_0]) } - public var Permissions_CellularDataTitle_v0: String { return self._s[1655]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1657]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1658]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1659]! } - public var Map_OpenIn: String { return self._s[1660]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1657]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1659]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1660]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1661]! } + public var Map_OpenIn: String { return self._s[1662]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1663]!, self._r[1663]!, [_1]) + return formatWithArgumentRanges(self._s[1665]!, self._r[1665]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1664]!, self._r[1664]!, [_0]) + return formatWithArgumentRanges(self._s[1666]!, self._r[1666]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1665]! } - public var MessagePoll_LabelClosed: String { return self._s[1666]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1668]! } - public var Wallet_Send_SendAnyway: String { return self._s[1669]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1670]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1671]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1672]! } - public var Login_SelectCountry_Title: String { return self._s[1673]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1674]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1667]! } + public var MessagePoll_LabelClosed: String { return self._s[1668]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1670]! } + public var Wallet_Send_SendAnyway: String { return self._s[1671]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1672]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1673]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1674]! } + public var Login_SelectCountry_Title: String { return self._s[1675]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1676]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1675]!, self._r[1675]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1677]!, self._r[1677]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1676]! } - public var Watch_Suggestion_BRB: String { return self._s[1677]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1678]! } - public var Contacts_PermissionsTitle: String { return self._s[1679]! } - public var Conversation_RestrictedInline: String { return self._s[1680]! } - public var StickerPack_ViewPack: String { return self._s[1682]! } - public var Wallet_UnknownError: String { return self._s[1683]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1678]! } + public var Watch_Suggestion_BRB: String { return self._s[1679]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1680]! } + public var Contacts_PermissionsTitle: String { return self._s[1681]! } + public var Conversation_RestrictedInline: String { return self._s[1682]! } + public var StickerPack_ViewPack: String { return self._s[1684]! } + public var Wallet_UnknownError: String { return self._s[1685]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1684]!, self._r[1684]!, [_0]) + return formatWithArgumentRanges(self._s[1686]!, self._r[1686]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1686]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1689]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1691]! } - public var Channel_Info_Stickers: String { return self._s[1692]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1693]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1694]! } - public var Passport_DeletePersonalDetails: String { return self._s[1695]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1696]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1697]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1698]! } - public var Conversation_SearchNoResults: String { return self._s[1700]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1701]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1702]! } - public var Login_Code: String { return self._s[1703]! } - public var EditTheme_Create_BottomInfo: String { return self._s[1704]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1705]! } - public var Weekday_ShortThursday: String { return self._s[1706]! } - public var Resolve_ErrorNotFound: String { return self._s[1708]! } - public var LastSeen_Offline: String { return self._s[1709]! } - public var PeopleNearby_NoMembers: String { return self._s[1710]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1711]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1712]! } - public var GroupInfo_Title: String { return self._s[1714]! } - public var NotificationsSound_Note: String { return self._s[1715]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1716]! } - public var Watch_Message_Poll: String { return self._s[1717]! } - public var Privacy_Calls: String { return self._s[1718]! } + public var Compose_NewChannel: String { return self._s[1688]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1691]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1693]! } + public var Channel_Info_Stickers: String { return self._s[1694]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1695]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1696]! } + public var Passport_DeletePersonalDetails: String { return self._s[1697]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1698]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1699]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1700]! } + public var Conversation_SearchNoResults: String { return self._s[1702]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1703]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1704]! } + public var Login_Code: String { return self._s[1705]! } + public var EditTheme_Create_BottomInfo: String { return self._s[1706]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1707]! } + public var Weekday_ShortThursday: String { return self._s[1708]! } + public var Resolve_ErrorNotFound: String { return self._s[1710]! } + public var LastSeen_Offline: String { return self._s[1711]! } + public var PeopleNearby_NoMembers: String { return self._s[1712]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1713]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1714]! } + public var GroupInfo_Title: String { return self._s[1716]! } + public var NotificationsSound_Note: String { return self._s[1717]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1718]! } + public var Watch_Message_Poll: String { return self._s[1719]! } + public var Privacy_Calls: String { return self._s[1720]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1719]!, self._r[1719]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1721]!, self._r[1721]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1720]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1721]! } - public var Notifications_Reset: String { return self._s[1722]! } - public var Conversation_Pin: String { return self._s[1723]! } - public var Passport_Language_lv: String { return self._s[1724]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1725]! } - public var BlockedUsers_Info: String { return self._s[1726]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1728]! } - public var Watch_Conversation_Unblock: String { return self._s[1730]! } + public var Month_ShortAugust: String { return self._s[1722]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1723]! } + public var Notifications_Reset: String { return self._s[1724]! } + public var Conversation_Pin: String { return self._s[1725]! } + public var Passport_Language_lv: String { return self._s[1726]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1727]! } + public var BlockedUsers_Info: String { return self._s[1728]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1730]! } + public var Watch_Conversation_Unblock: String { return self._s[1732]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1731]!, self._r[1731]!, [_0]) + return formatWithArgumentRanges(self._s[1733]!, self._r[1733]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1732]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1733]! } + public var CloudStorage_Title: String { return self._s[1734]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1735]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1734]!, self._r[1734]!, [_0]) + return formatWithArgumentRanges(self._s[1736]!, self._r[1736]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1735]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1736]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1737]! } - public var Passport_Address_EditBankStatement: String { return self._s[1738]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1737]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1738]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1739]! } + public var Passport_Address_EditBankStatement: String { return self._s[1740]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1739]!, self._r[1739]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1741]!, self._r[1741]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1740]! } - public var ShareMenu_Comment: String { return self._s[1741]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1742]! } - public var Notifications_PermissionsTitle: String { return self._s[1743]! } - public var GroupPermission_NoSendLinks: String { return self._s[1744]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1745]! } - public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1746]! } - public var Settings_Support: String { return self._s[1747]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1748]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1749]! } - public var Privacy_Forwards_Preview: String { return self._s[1750]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1751]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1752]! } - public var Common_Select: String { return self._s[1754]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1755]! } - public var WallpaperSearch_ColorGray: String { return self._s[1758]! } - public var TwoFactorSetup_Password_PlaceholderPassword: String { return self._s[1759]! } - public var TwoFactorSetup_Hint_SkipAction: String { return self._s[1760]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1761]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1762]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1763]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1764]! } - public var Widget_AuthRequired: String { return self._s[1765]! } - public var Camera_FlashOn: String { return self._s[1766]! } - public var Conversation_ContextMenuLookUp: String { return self._s[1767]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1768]! } - public var Watch_Suggestion_OK: String { return self._s[1769]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1742]! } + public var ShareMenu_Comment: String { return self._s[1743]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1744]! } + public var Notifications_PermissionsTitle: String { return self._s[1745]! } + public var GroupPermission_NoSendLinks: String { return self._s[1746]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1747]! } + public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1748]! } + public var Settings_Support: String { return self._s[1749]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1750]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1751]! } + public var Privacy_Forwards_Preview: String { return self._s[1752]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1753]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1754]! } + public var Common_Select: String { return self._s[1756]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1757]! } + public var WallpaperSearch_ColorGray: String { return self._s[1760]! } + public var TwoFactorSetup_Password_PlaceholderPassword: String { return self._s[1761]! } + public var TwoFactorSetup_Hint_SkipAction: String { return self._s[1762]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1763]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1764]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1765]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1766]! } + public var Widget_AuthRequired: String { return self._s[1767]! } + public var Camera_FlashOn: String { return self._s[1768]! } + public var Conversation_ContextMenuLookUp: String { return self._s[1769]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1770]! } + public var Watch_Suggestion_OK: String { return self._s[1771]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1771]!, self._r[1771]!, [_0]) - } - public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1773]!, self._r[1773]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1774]! } - public var DialogList_AdLabel: String { return self._s[1775]! } - public var WatchRemote_NotificationText: String { return self._s[1776]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1777]! } - public var Conversation_ReportSpam: String { return self._s[1778]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1779]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1781]! } - public var PhoneLabel_Title: String { return self._s[1782]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1783]! } - public var Settings_ChangePhoneNumber: String { return self._s[1784]! } - public var Notifications_ExceptionsTitle: String { return self._s[1785]! } - public var Notifications_AlertTones: String { return self._s[1786]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1787]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1788]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1789]! } - public var VoiceOver_Chat_Photo: String { return self._s[1791]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1792]! } - public var ReportPeer_ReasonOther: String { return self._s[1793]! } - public var ChatList_Context_JoinChannel: String { return self._s[1794]! } - public var KeyCommand_ScrollDown: String { return self._s[1796]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1797]! } + public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1775]!, self._r[1775]!, [_0]) + } + public var TextFormat_Strikethrough: String { return self._s[1776]! } + public var DialogList_AdLabel: String { return self._s[1777]! } + public var WatchRemote_NotificationText: String { return self._s[1778]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1779]! } + public var Conversation_ReportSpam: String { return self._s[1780]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1781]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1783]! } + public var PhoneLabel_Title: String { return self._s[1784]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1785]! } + public var Settings_ChangePhoneNumber: String { return self._s[1786]! } + public var Notifications_ExceptionsTitle: String { return self._s[1787]! } + public var Notifications_AlertTones: String { return self._s[1788]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1789]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1790]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1791]! } + public var VoiceOver_Chat_Photo: String { return self._s[1793]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1794]! } + public var ReportPeer_ReasonOther: String { return self._s[1795]! } + public var ChatList_Context_JoinChannel: String { return self._s[1796]! } + public var KeyCommand_ScrollDown: String { return self._s[1798]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1799]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1798]!, self._r[1798]!, [_0]) + return formatWithArgumentRanges(self._s[1800]!, self._r[1800]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1799]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1800]! } - public var AuthSessions_LogOut: String { return self._s[1801]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1802]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1803]! } - public var Passport_Phone_Title: String { return self._s[1804]! } - public var ContactList_Context_StartSecretChat: String { return self._s[1805]! } - public var Settings_PhoneNumber: String { return self._s[1806]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1801]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1802]! } + public var AuthSessions_LogOut: String { return self._s[1803]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1804]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1805]! } + public var Passport_Phone_Title: String { return self._s[1806]! } + public var ContactList_Context_StartSecretChat: String { return self._s[1807]! } + public var Settings_PhoneNumber: String { return self._s[1808]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1807]!, self._r[1807]!, [_0]) + return formatWithArgumentRanges(self._s[1809]!, self._r[1809]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1808]! } - public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[1809]! } - public var WebSearch_SearchNoResults: String { return self._s[1810]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1812]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1813]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1814]! } - public var PhotoEditor_CurvesTool: String { return self._s[1815]! } - public var Checkout_PaymentMethod: String { return self._s[1817]! } + public var NotificationsSound_Alert: String { return self._s[1810]! } + public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[1811]! } + public var WebSearch_SearchNoResults: String { return self._s[1812]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1814]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1815]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1816]! } + public var PhotoEditor_CurvesTool: String { return self._s[1817]! } + public var Checkout_PaymentMethod: String { return self._s[1819]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1818]!, self._r[1818]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1820]!, self._r[1820]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1819]! } - public var Camera_PhotoMode: String { return self._s[1822]! } - public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1823]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1825]! } - public var CallSettings_OnMobile: String { return self._s[1826]! } - public var Tour_Text2: String { return self._s[1827]! } + public var Contacts_AccessDeniedError: String { return self._s[1821]! } + public var Camera_PhotoMode: String { return self._s[1824]! } + public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1825]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1827]! } + public var CallSettings_OnMobile: String { return self._s[1828]! } + public var Tour_Text2: String { return self._s[1829]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1828]!, self._r[1828]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1830]!, self._r[1830]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1830]! } - public var Permissions_Skip: String { return self._s[1831]! } - public var Wallet_Words_NotDoneOk: String { return self._s[1832]! } - public var SecretImage_Title: String { return self._s[1833]! } - public var Watch_MessageView_Title: String { return self._s[1834]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1835]! } - public var AttachmentMenu_Poll: String { return self._s[1836]! } + public var DialogList_EncryptionProcessing: String { return self._s[1832]! } + public var Permissions_Skip: String { return self._s[1833]! } + public var Wallet_Words_NotDoneOk: String { return self._s[1834]! } + public var SecretImage_Title: String { return self._s[1835]! } + public var Watch_MessageView_Title: String { return self._s[1836]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1837]! } + public var AttachmentMenu_Poll: String { return self._s[1838]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1837]!, self._r[1837]!, [_0]) + return formatWithArgumentRanges(self._s[1839]!, self._r[1839]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1838]!, self._r[1838]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1840]!, self._r[1840]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1839]! } - public var WallpaperPreview_Title: String { return self._s[1840]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1841]! } - public var Settings_ProxyConnecting: String { return self._s[1842]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1844]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1845]! } - public var Wallet_Intro_Title: String { return self._s[1846]! } - public var TwoFactorSetup_Password_Action: String { return self._s[1847]! } - public var Profile_MessageLifetime5s: String { return self._s[1848]! } - public var Username_InvalidCharacters: String { return self._s[1849]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1850]! } - public var ScheduledMessages_ClearAll: String { return self._s[1851]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1852]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1853]! } - public var Settings_AddAccount: String { return self._s[1854]! } - public var Notification_CreatedChannel: String { return self._s[1857]! } + public var Notification_CallCanceled: String { return self._s[1841]! } + public var WallpaperPreview_Title: String { return self._s[1842]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1843]! } + public var Settings_ProxyConnecting: String { return self._s[1844]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1846]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1847]! } + public var Wallet_Intro_Title: String { return self._s[1848]! } + public var TwoFactorSetup_Password_Action: String { return self._s[1849]! } + public var Profile_MessageLifetime5s: String { return self._s[1850]! } + public var Username_InvalidCharacters: String { return self._s[1851]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1852]! } + public var ScheduledMessages_ClearAll: String { return self._s[1853]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1854]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1855]! } + public var Settings_AddAccount: String { return self._s[1856]! } + public var Notification_CreatedChannel: String { return self._s[1859]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1858]!, self._r[1858]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1860]!, self._r[1860]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1860]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1861]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1862]! } - public var Contacts_TopSection: String { return self._s[1863]! } - public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[1864]! } + public var Passcode_AppLockedAlert: String { return self._s[1862]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1863]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1864]! } + public var Contacts_TopSection: String { return self._s[1865]! } + public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[1866]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1865]!, self._r[1865]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1867]!, self._r[1867]!, [_0, _1]) } - public var Wallet_Info_Receive: String { return self._s[1866]! } - public var Wallet_Completed_ViewWallet: String { return self._s[1867]! } + public var Wallet_Info_Receive: String { return self._s[1868]! } + public var Wallet_Completed_ViewWallet: String { return self._s[1869]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1868]!, self._r[1868]!, [_0]) + return formatWithArgumentRanges(self._s[1870]!, self._r[1870]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1869]! } - public var UserInfo_TapToCall: String { return self._s[1870]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1872]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1873]! } - public var Common_Search: String { return self._s[1874]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1875]! } + public var ReportPeer_ReasonSpam: String { return self._s[1871]! } + public var UserInfo_TapToCall: String { return self._s[1872]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1874]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1875]! } + public var Common_Search: String { return self._s[1876]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1877]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1876]!, self._r[1876]!, [_0]) + return formatWithArgumentRanges(self._s[1878]!, self._r[1878]!, [_0]) } - public var Wallet_Month_ShortJuly: String { return self._s[1877]! } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1878]! } - public var Message_InvoiceLabel: String { return self._s[1879]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1880]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1881]! } + public var Wallet_Month_ShortJuly: String { return self._s[1879]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1880]! } + public var Message_InvoiceLabel: String { return self._s[1881]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1882]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1883]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1882]!, self._r[1882]!, [_0]) + return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_0]) } - public var Conversation_Info: String { return self._s[1883]! } - public var Login_InfoDeletePhoto: String { return self._s[1884]! } - public var Passport_Language_vi: String { return self._s[1886]! } - public var UserInfo_ScamUserWarning: String { return self._s[1887]! } - public var Conversation_Search: String { return self._s[1888]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1890]! } - public var ReportPeer_ReasonPornography: String { return self._s[1891]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1892]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1893]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1894]! } - public var Channel_Setup_TypeHeader: String { return self._s[1895]! } - public var AuthSessions_LoggedIn: String { return self._s[1896]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1897]! } - public var Login_SmsRequestState3: String { return self._s[1898]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1899]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1900]! } - public var Join_ChannelsTooMuch: String { return self._s[1901]! } - public var Channel_Edit_LinkItem: String { return self._s[1902]! } - public var Privacy_Calls_P2PNever: String { return self._s[1903]! } - public var Conversation_AddToReadingList: String { return self._s[1905]! } - public var Share_MultipleMessagesDisabled: String { return self._s[1906]! } - public var Message_Animation: String { return self._s[1907]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1908]! } - public var Map_Unknown: String { return self._s[1909]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1910]! } + public var Conversation_Info: String { return self._s[1885]! } + public var Login_InfoDeletePhoto: String { return self._s[1886]! } + public var Passport_Language_vi: String { return self._s[1888]! } + public var UserInfo_ScamUserWarning: String { return self._s[1889]! } + public var Conversation_Search: String { return self._s[1890]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1892]! } + public var ReportPeer_ReasonPornography: String { return self._s[1893]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1894]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1895]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1896]! } + public var Channel_Setup_TypeHeader: String { return self._s[1897]! } + public var AuthSessions_LoggedIn: String { return self._s[1898]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1899]! } + public var Login_SmsRequestState3: String { return self._s[1900]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1901]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1902]! } + public var Join_ChannelsTooMuch: String { return self._s[1903]! } + public var Channel_Edit_LinkItem: String { return self._s[1904]! } + public var Privacy_Calls_P2PNever: String { return self._s[1905]! } + public var Conversation_AddToReadingList: String { return self._s[1907]! } + public var Share_MultipleMessagesDisabled: String { return self._s[1908]! } + public var Message_Animation: String { return self._s[1909]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1910]! } + public var Map_Unknown: String { return self._s[1911]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1912]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1911]!, self._r[1911]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1913]!, self._r[1913]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1912]!, self._r[1912]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1914]!, self._r[1914]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[1913]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1914]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1915]! } + public var Call_StatusRequesting: String { return self._s[1915]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1916]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1917]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1916]!, self._r[1916]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1918]!, self._r[1918]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1917]!, self._r[1917]!, [_0]) + return formatWithArgumentRanges(self._s[1919]!, self._r[1919]!, [_0]) } - public var Update_Skip: String { return self._s[1918]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1919]! } - public var Message_PinnedPollMessage: String { return self._s[1920]! } - public var BlockedUsers_Title: String { return self._s[1921]! } + public var Update_Skip: String { return self._s[1920]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1921]! } + public var Message_PinnedPollMessage: String { return self._s[1922]! } + public var BlockedUsers_Title: String { return self._s[1923]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1922]!, self._r[1922]!, [_1]) + return formatWithArgumentRanges(self._s[1924]!, self._r[1924]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1923]! } - public var NotificationsSound_Bell: String { return self._s[1924]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1925]! } - public var Weekday_Monday: String { return self._s[1926]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1927]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1928]! } - public var ChatSettings_Groups: String { return self._s[1929]! } + public var Username_CheckingUsername: String { return self._s[1925]! } + public var NotificationsSound_Bell: String { return self._s[1926]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1927]! } + public var Weekday_Monday: String { return self._s[1928]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1929]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1930]! } + public var ChatSettings_Groups: String { return self._s[1931]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1930]!, self._r[1930]!, [_0]) + return formatWithArgumentRanges(self._s[1932]!, self._r[1932]!, [_0]) } - public var Your_card_was_declined: String { return self._s[1931]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1933]! } - public var Wallet_Month_ShortApril: String { return self._s[1934]! } - public var ChatList_Unmute: String { return self._s[1935]! } - public var PhotoEditor_CurvesAll: String { return self._s[1936]! } - public var Weekday_ShortTuesday: String { return self._s[1937]! } - public var DialogList_Read: String { return self._s[1938]! } - public var Appearance_AppIconClassic: String { return self._s[1939]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1940]! } - public var Passport_Identity_Gender: String { return self._s[1941]! } + public var Your_card_was_declined: String { return self._s[1933]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1935]! } + public var Wallet_Month_ShortApril: String { return self._s[1936]! } + public var ChatList_Unmute: String { return self._s[1937]! } + public var PhotoEditor_CurvesAll: String { return self._s[1938]! } + public var Weekday_ShortTuesday: String { return self._s[1939]! } + public var DialogList_Read: String { return self._s[1940]! } + public var Appearance_AppIconClassic: String { return self._s[1941]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1942]! } + public var Passport_Identity_Gender: String { return self._s[1943]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1942]!, self._r[1942]!, [_0]) + return formatWithArgumentRanges(self._s[1944]!, self._r[1944]!, [_0]) } - public var Target_SelectGroup: String { return self._s[1943]! } + public var Target_SelectGroup: String { return self._s[1945]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1945]!, self._r[1945]!, [_0]) + return formatWithArgumentRanges(self._s[1947]!, self._r[1947]!, [_0]) } - public var Passport_Language_en: String { return self._s[1946]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1947]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1948]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1949]! } - public var ScheduledMessages_SendNow: String { return self._s[1950]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1952]! } - public var Login_InfoHelp: String { return self._s[1953]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1954]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1955]! } + public var Passport_Language_en: String { return self._s[1948]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1949]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1950]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1951]! } + public var ScheduledMessages_SendNow: String { return self._s[1952]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1954]! } + public var Login_InfoHelp: String { return self._s[1955]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1956]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1957]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1956]!, self._r[1956]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1958]!, self._r[1958]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1959]! } - public var CreatePoll_Title: String { return self._s[1960]! } - public var Conversation_ViewTheme: String { return self._s[1961]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1962]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1963]! } - public var TwoFactorSetup_Intro_Text: String { return self._s[1964]! } - public var UserInfo_GroupsInCommon: String { return self._s[1965]! } - public var Call_AudioRouteHide: String { return self._s[1966]! } + public var SocksProxySetup_AddProxy: String { return self._s[1961]! } + public var CreatePoll_Title: String { return self._s[1962]! } + public var Conversation_ViewTheme: String { return self._s[1963]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1964]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1965]! } + public var TwoFactorSetup_Intro_Text: String { return self._s[1966]! } + public var UserInfo_GroupsInCommon: String { return self._s[1967]! } + public var Call_AudioRouteHide: String { return self._s[1968]! } public func Wallet_Info_TransactionDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1968]!, self._r[1968]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1970]!, self._r[1970]!, [_1, _2]) } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1969]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1971]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1970]!, self._r[1970]!, [_0]) + return formatWithArgumentRanges(self._s[1972]!, self._r[1972]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1971]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1972]! } - public var Notifications_Title: String { return self._s[1973]! } - public var Group_Username_InvalidTooShort: String { return self._s[1974]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1975]! } + public var TextFormat_Bold: String { return self._s[1973]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1974]! } + public var Notifications_Title: String { return self._s[1975]! } + public var Group_Username_InvalidTooShort: String { return self._s[1976]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1977]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1976]!, self._r[1976]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1978]!, self._r[1978]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[1978]! } - public var Stickers_SuggestAdded: String { return self._s[1979]! } - public var Login_CountryCode: String { return self._s[1980]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1981]! } - public var Map_GetDirections: String { return self._s[1982]! } - public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[1983]! } - public var Login_PhoneFloodError: String { return self._s[1984]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[1980]! } + public var Stickers_SuggestAdded: String { return self._s[1981]! } + public var Login_CountryCode: String { return self._s[1982]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1983]! } + public var Map_GetDirections: String { return self._s[1984]! } + public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[1985]! } + public var Login_PhoneFloodError: String { return self._s[1986]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1985]!, self._r[1985]!, [_0]) + return formatWithArgumentRanges(self._s[1987]!, self._r[1987]!, [_0]) } public func Wallet_Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1986]!, self._r[1986]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1988]!, self._r[1988]!, [_1, _2, _3]) } - public var Settings_SetUsername: String { return self._s[1988]! } - public var Group_Location_ChangeLocation: String { return self._s[1989]! } - public var Notification_GroupInviterSelf: String { return self._s[1990]! } - public var InstantPage_TapToOpenLink: String { return self._s[1991]! } + public var Settings_SetUsername: String { return self._s[1990]! } + public var Group_Location_ChangeLocation: String { return self._s[1991]! } + public var Notification_GroupInviterSelf: String { return self._s[1992]! } + public var InstantPage_TapToOpenLink: String { return self._s[1993]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1992]!, self._r[1992]!, [_0]) + return formatWithArgumentRanges(self._s[1994]!, self._r[1994]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1993]! } - public var SecretChat_Title: String { return self._s[1994]! } - public var Group_UpgradeNoticeText1: String { return self._s[1995]! } - public var AuthSessions_Title: String { return self._s[1996]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1995]! } + public var SecretChat_Title: String { return self._s[1996]! } + public var Group_UpgradeNoticeText1: String { return self._s[1997]! } + public var AuthSessions_Title: String { return self._s[1998]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1997]!, self._r[1997]!, [_0]) + return formatWithArgumentRanges(self._s[1999]!, self._r[1999]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1998]! } - public var Channel_About_Title: String { return self._s[1999]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[2000]! } + public var PhotoEditor_CropAuto: String { return self._s[2000]! } + public var Channel_About_Title: String { return self._s[2001]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[2002]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2002]!, self._r[2002]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2004]!, self._r[2004]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[2003]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[2005]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[2006]! } + public var VoiceOver_MessageContextReport: String { return self._s[2005]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[2007]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[2008]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2007]!, self._r[2007]!, [_1]) + return formatWithArgumentRanges(self._s[2009]!, self._r[2009]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2009]!, self._r[2009]!, [_0]) + return formatWithArgumentRanges(self._s[2011]!, self._r[2011]!, [_0]) } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2010]!, self._r[2010]!, [_0]) + return formatWithArgumentRanges(self._s[2012]!, self._r[2012]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[2011]! } - public var Presence_online: String { return self._s[2014]! } - public var PasscodeSettings_Title: String { return self._s[2015]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[2016]! } - public var Web_OpenExternal: String { return self._s[2017]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[2019]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[2020]! } - public var LocalGroup_Title: String { return self._s[2021]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[2013]! } + public var Presence_online: String { return self._s[2016]! } + public var PasscodeSettings_Title: String { return self._s[2017]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[2018]! } + public var Web_OpenExternal: String { return self._s[2019]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[2021]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[2022]! } + public var LocalGroup_Title: String { return self._s[2023]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2022]!, self._r[2022]!, [_0]) + return formatWithArgumentRanges(self._s[2024]!, self._r[2024]!, [_0]) } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2023]! } - public var Map_YouAreHere: String { return self._s[2024]! } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2025]! } + public var Map_YouAreHere: String { return self._s[2026]! } public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2025]!, self._r[2025]!, [_0]) + return formatWithArgumentRanges(self._s[2027]!, self._r[2027]!, [_0]) } public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2026]!, self._r[2026]!, [_0]) + return formatWithArgumentRanges(self._s[2028]!, self._r[2028]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2027]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2028]! } + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2029]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2030]! } public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2029]!, self._r[2029]!, [_0]) + return formatWithArgumentRanges(self._s[2031]!, self._r[2031]!, [_0]) } public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2030]!, self._r[2030]!, [_0]) + return formatWithArgumentRanges(self._s[2032]!, self._r[2032]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[2031]! } - public var Bot_Start: String { return self._s[2032]! } + public var SocksProxySetup_Username: String { return self._s[2033]! } + public var Bot_Start: String { return self._s[2034]! } public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2033]!, self._r[2033]!, [_0]) + return formatWithArgumentRanges(self._s[2035]!, self._r[2035]!, [_0]) } public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2034]!, self._r[2034]!, [_0]) + return formatWithArgumentRanges(self._s[2036]!, self._r[2036]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[2035]! } - public var AccentColor_Title: String { return self._s[2037]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2038]! } + public var Contacts_SortByPresence: String { return self._s[2037]! } + public var AccentColor_Title: String { return self._s[2039]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2040]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2039]!, self._r[2039]!, [_1, _2]) - } - public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2040]!, self._r[2040]!, [_0]) - } - public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2041]!, self._r[2041]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[2042]! } - public var Login_InfoAvatarPhoto: String { return self._s[2043]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2044]! } - public var Tour_Title4: String { return self._s[2045]! } - public var Passport_Identity_Translation: String { return self._s[2046]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[2047]! } - public var Login_TermsOfServiceLabel: String { return self._s[2049]! } - public var Passport_Language_it: String { return self._s[2050]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[2051]! } - public var Passport_Identity_SelfieHelp: String { return self._s[2052]! } - public var Conversation_ClearAll: String { return self._s[2054]! } - public var Wallet_Send_UninitializedText: String { return self._s[2056]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[2057]! } - public var TwoStepAuth_FloodError: String { return self._s[2058]! } + public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2042]!, self._r[2042]!, [_0]) + } + public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2043]!, self._r[2043]!, [_1, _2]) + } + public var Passport_Email_EnterOtherEmail: String { return self._s[2044]! } + public var Login_InfoAvatarPhoto: String { return self._s[2045]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2046]! } + public var Tour_Title4: String { return self._s[2047]! } + public var Passport_Identity_Translation: String { return self._s[2048]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[2049]! } + public var Login_TermsOfServiceLabel: String { return self._s[2051]! } + public var Passport_Language_it: String { return self._s[2052]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[2053]! } + public var Passport_Identity_SelfieHelp: String { return self._s[2054]! } + public var Conversation_ClearAll: String { return self._s[2056]! } + public var Wallet_Send_UninitializedText: String { return self._s[2058]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[2059]! } + public var TwoStepAuth_FloodError: String { return self._s[2060]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2059]!, self._r[2059]!, [_1]) + return formatWithArgumentRanges(self._s[2061]!, self._r[2061]!, [_1]) } - public var Paint_Delete: String { return self._s[2060]! } + public var Paint_Delete: String { return self._s[2062]! } public func Wallet_Sent_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2061]!, self._r[2061]!, [_0]) + return formatWithArgumentRanges(self._s[2063]!, self._r[2063]!, [_0]) } - public var Privacy_AddNewPeer: String { return self._s[2062]! } + public var Privacy_AddNewPeer: String { return self._s[2064]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2063]!, self._r[2063]!, [_1]) + return formatWithArgumentRanges(self._s[2065]!, self._r[2065]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[2064]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[2066]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2065]!, self._r[2065]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2067]!, self._r[2067]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[2066]! } + public var Message_PinnedAudioMessage: String { return self._s[2068]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2067]!, self._r[2067]!, [_0]) + return formatWithArgumentRanges(self._s[2069]!, self._r[2069]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[2068]! } - public var Notifications_GroupNotificationsSound: String { return self._s[2069]! } - public var Wallet_Month_GenNovember: String { return self._s[2070]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[2071]! } - public var Conversation_MessageEditedLabel: String { return self._s[2072]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[2073]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[2074]! } + public var Notification_Mute1hMin: String { return self._s[2070]! } + public var Notifications_GroupNotificationsSound: String { return self._s[2071]! } + public var Wallet_Month_GenNovember: String { return self._s[2072]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[2073]! } + public var Conversation_MessageEditedLabel: String { return self._s[2074]! } + public func ClearCache_Success(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2075]!, self._r[2075]!, [_0]) + } + public var Notification_Exceptions_AlwaysOff: String { return self._s[2076]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[2077]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2075]!, self._r[2075]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[2078]!, self._r[2078]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[2076]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[2079]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_1]) + return formatWithArgumentRanges(self._s[2080]!, self._r[2080]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[2078]! } - public var Month_GenOctober: String { return self._s[2079]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[2080]! } - public var EnterPasscode_EnterPasscode: String { return self._s[2081]! } - public var MediaPicker_TimerTooltip: String { return self._s[2083]! } - public var SharedMedia_TitleAll: String { return self._s[2084]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[2087]! } - public var Conversation_RestrictedMedia: String { return self._s[2088]! } - public var AccessDenied_PhotosRestricted: String { return self._s[2089]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[2091]! } - public var ChangePhoneNumberCode_Called: String { return self._s[2092]! } + public var AccessDenied_LocationTracking: String { return self._s[2081]! } + public var Month_GenOctober: String { return self._s[2082]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[2083]! } + public var EnterPasscode_EnterPasscode: String { return self._s[2084]! } + public var MediaPicker_TimerTooltip: String { return self._s[2086]! } + public var SharedMedia_TitleAll: String { return self._s[2087]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[2090]! } + public var Conversation_RestrictedMedia: String { return self._s[2091]! } + public var AccessDenied_PhotosRestricted: String { return self._s[2092]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[2094]! } + public var ChangePhoneNumberCode_Called: String { return self._s[2095]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2093]!, self._r[2093]!, [_0]) + return formatWithArgumentRanges(self._s[2096]!, self._r[2096]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[2096]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[2098]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[2099]! } + public var Conversation_SavedMessages: String { return self._s[2099]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[2101]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[2102]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2101]!, self._r[2101]!, [_0]) + return formatWithArgumentRanges(self._s[2104]!, self._r[2104]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[2102]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[2105]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2103]!, self._r[2103]!, [_0]) + return formatWithArgumentRanges(self._s[2106]!, self._r[2106]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[2104]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2105]! } + public var ReportPeer_AlertSuccess: String { return self._s[2107]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2108]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2106]!, self._r[2106]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2109]!, self._r[2109]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[2107]! } - public var PhotoEditor_FadeTool: String { return self._s[2108]! } - public var Privacy_ContactsReset: String { return self._s[2109]! } + public var Checkout_PasswordEntry_Title: String { return self._s[2110]! } + public var PhotoEditor_FadeTool: String { return self._s[2111]! } + public var Privacy_ContactsReset: String { return self._s[2112]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2111]!, self._r[2111]!, [_0]) + return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[2112]! } - public var ChatList_Mute: String { return self._s[2113]! } + public var Message_PinnedVideoMessage: String { return self._s[2115]! } + public var ChatList_Mute: String { return self._s[2116]! } public func Wallet_Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2117]!, self._r[2117]!, [_1, _2, _3]) } - public var Permissions_CellularDataText_v0: String { return self._s[2115]! } - public var ShareMenu_SelectChats: String { return self._s[2118]! } - public var ChatList_Context_Unarchive: String { return self._s[2119]! } - public var MusicPlayer_VoiceNote: String { return self._s[2120]! } - public var Conversation_RestrictedText: String { return self._s[2121]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2122]! } - public var Wallet_Month_GenApril: String { return self._s[2123]! } - public var Wallet_Month_ShortMarch: String { return self._s[2124]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[2125]! } - public var Cache_Videos: String { return self._s[2126]! } - public var PrivacySettings_PhoneNumber: String { return self._s[2127]! } - public var Wallet_Month_GenFebruary: String { return self._s[2128]! } - public var FeatureDisabled_Oops: String { return self._s[2130]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[2131]! } + public var Permissions_CellularDataText_v0: String { return self._s[2118]! } + public var ShareMenu_SelectChats: String { return self._s[2121]! } + public var ChatList_Context_Unarchive: String { return self._s[2122]! } + public var MusicPlayer_VoiceNote: String { return self._s[2123]! } + public var Conversation_RestrictedText: String { return self._s[2124]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2125]! } + public var Wallet_Month_GenApril: String { return self._s[2126]! } + public var Wallet_Month_ShortMarch: String { return self._s[2127]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[2128]! } + public var Cache_Videos: String { return self._s[2129]! } + public var PrivacySettings_PhoneNumber: String { return self._s[2130]! } + public var Wallet_Month_GenFebruary: String { return self._s[2131]! } + public var FeatureDisabled_Oops: String { return self._s[2133]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[2134]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2132]!, self._r[2132]!, [_0]) + return formatWithArgumentRanges(self._s[2135]!, self._r[2135]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[2133]! } - public var GroupPermission_NoSendPolls: String { return self._s[2134]! } - public var Wallet_Qr_ScanCode: String { return self._s[2135]! } - public var Message_VideoExpired: String { return self._s[2137]! } - public var Notifications_Badge: String { return self._s[2138]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[2139]! } - public var Wallet_Receive_AddressCopied: String { return self._s[2140]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[2141]! } - public var Username_InvalidTooShort: String { return self._s[2142]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2143]! } - public var Channel_AdminLog_PinMessages: String { return self._s[2144]! } - public var ArchivedChats_IntroTitle3: String { return self._s[2145]! } + public var Stickers_GroupStickersHelp: String { return self._s[2136]! } + public var GroupPermission_NoSendPolls: String { return self._s[2137]! } + public var Wallet_Qr_ScanCode: String { return self._s[2138]! } + public var Message_VideoExpired: String { return self._s[2140]! } + public var Notifications_Badge: String { return self._s[2141]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[2142]! } + public var Wallet_Receive_AddressCopied: String { return self._s[2143]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[2144]! } + public var Username_InvalidTooShort: String { return self._s[2145]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2146]! } + public var Channel_AdminLog_PinMessages: String { return self._s[2147]! } + public var ArchivedChats_IntroTitle3: String { return self._s[2148]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2146]!, self._r[2146]!, [_1]) + return formatWithArgumentRanges(self._s[2149]!, self._r[2149]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[2147]! } - public var Conversation_DefaultRestrictedText: String { return self._s[2148]! } - public var SharedMedia_CategoryDocs: String { return self._s[2151]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[2150]! } + public var Conversation_DefaultRestrictedText: String { return self._s[2151]! } + public var SharedMedia_CategoryDocs: String { return self._s[2154]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2152]!, self._r[2152]!, [_1]) + return formatWithArgumentRanges(self._s[2155]!, self._r[2155]!, [_1]) } - public var Wallet_Send_UninitializedTitle: String { return self._s[2153]! } - public var Privacy_Forwards_NeverLink: String { return self._s[2155]! } + public var Wallet_Send_UninitializedTitle: String { return self._s[2156]! } + public var Privacy_Forwards_NeverLink: String { return self._s[2158]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2156]!, self._r[2156]!, [_1]) + return formatWithArgumentRanges(self._s[2159]!, self._r[2159]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2157]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2160]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2158]!, self._r[2158]!, [_0]) + return formatWithArgumentRanges(self._s[2161]!, self._r[2161]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[2159]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2160]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[2161]! } - public var Channel_UpdatePhotoItem: String { return self._s[2162]! } - public var GroupInfo_LeftStatus: String { return self._s[2163]! } - public var Watch_MessageView_Forward: String { return self._s[2165]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[2166]! } - public var Cache_ClearEmpty: String { return self._s[2168]! } - public var Localization_LanguageName: String { return self._s[2169]! } - public var WebSearch_GIFs: String { return self._s[2170]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2171]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2172]! } - public var Common_Back: String { return self._s[2173]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2174]! } - public var Wallet_Send_Send: String { return self._s[2175]! } + public var ChatSettings_PrivateChats: String { return self._s[2162]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2163]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[2164]! } + public var Channel_UpdatePhotoItem: String { return self._s[2165]! } + public var GroupInfo_LeftStatus: String { return self._s[2166]! } + public var Watch_MessageView_Forward: String { return self._s[2168]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2169]! } + public var Cache_ClearEmpty: String { return self._s[2171]! } + public var Localization_LanguageName: String { return self._s[2172]! } + public var WebSearch_GIFs: String { return self._s[2173]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2174]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2175]! } + public var Common_Back: String { return self._s[2176]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2177]! } + public var Wallet_Send_Send: String { return self._s[2178]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2176]!, self._r[2176]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2179]!, self._r[2179]!, [_1, _2]) } - public var Wallet_Info_RefreshErrorTitle: String { return self._s[2177]! } - public var Wallet_Month_GenJune: String { return self._s[2178]! } - public var Passport_Email_Help: String { return self._s[2179]! } - public var Watch_Conversation_Reply: String { return self._s[2181]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2183]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2184]! } - public var Channel_BanUser_Unban: String { return self._s[2186]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2187]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2188]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2190]! } - public var Wallet_Send_AddressHeader: String { return self._s[2191]! } - public var Passport_Identity_Name: String { return self._s[2192]! } + public var Wallet_Info_RefreshErrorTitle: String { return self._s[2180]! } + public var Wallet_Month_GenJune: String { return self._s[2181]! } + public var Passport_Email_Help: String { return self._s[2182]! } + public var Watch_Conversation_Reply: String { return self._s[2184]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2186]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2187]! } + public var Channel_BanUser_Unban: String { return self._s[2189]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2190]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2191]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2193]! } + public var Wallet_Send_AddressHeader: String { return self._s[2194]! } + public var Passport_Identity_Name: String { return self._s[2195]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2193]!, self._r[2193]!, [_0]) + return formatWithArgumentRanges(self._s[2196]!, self._r[2196]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2194]! } - public var Conversation_BlockUser: String { return self._s[2195]! } - public var Month_GenJanuary: String { return self._s[2196]! } - public var ChatSettings_TextSize: String { return self._s[2197]! } - public var Notification_PassportValuePhone: String { return self._s[2198]! } - public var Passport_Language_ne: String { return self._s[2199]! } - public var Notification_CallBack: String { return self._s[2200]! } - public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2201]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2202]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2197]! } + public var Conversation_BlockUser: String { return self._s[2198]! } + public var Month_GenJanuary: String { return self._s[2199]! } + public var ChatSettings_TextSize: String { return self._s[2200]! } + public var Notification_PassportValuePhone: String { return self._s[2201]! } + public var Passport_Language_ne: String { return self._s[2202]! } + public var Notification_CallBack: String { return self._s[2203]! } + public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2204]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2205]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2203]!, self._r[2203]!, [_0]) + return formatWithArgumentRanges(self._s[2206]!, self._r[2206]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2204]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2205]! } - public var Stickers_FrequentlyUsed: String { return self._s[2206]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2207]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2209]! } + public var Channel_Info_Management: String { return self._s[2207]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2208]! } + public var Stickers_FrequentlyUsed: String { return self._s[2209]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2210]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2212]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2210]!, self._r[2210]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2213]!, self._r[2213]!, [_1, "\(_2)"]) } - public var TwoFactorSetup_Password_Title: String { return self._s[2211]! } - public var Passport_Address_EditResidentialAddress: String { return self._s[2212]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2213]! } - public var CreatePoll_TextHeader: String { return self._s[2214]! } + public var TwoFactorSetup_Password_Title: String { return self._s[2214]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2215]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2216]! } + public var CreatePoll_TextHeader: String { return self._s[2217]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2215]!, self._r[2215]!, [_0]) + return formatWithArgumentRanges(self._s[2218]!, self._r[2218]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2216]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2217]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2219]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2220]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2221]! } + public var PhotoEditor_QualityMedium: String { return self._s[2219]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2220]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2222]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2223]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2224]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2222]!, self._r[2222]!, [_0]) + return formatWithArgumentRanges(self._s[2225]!, self._r[2225]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2223]!, self._r[2223]!, [_1]) + return formatWithArgumentRanges(self._s[2226]!, self._r[2226]!, [_1]) } - public var LogoutOptions_LogOutWalletInfo: String { return self._s[2224]! } - public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[2225]! } - public var Conversation_LinkDialogOpen: String { return self._s[2227]! } - public var TwoFactorSetup_Hint_Title: String { return self._s[2228]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2229]! } - public var Settings_Username: String { return self._s[2231]! } - public var Conversation_Block: String { return self._s[2233]! } - public var Wallpaper_Wallpaper: String { return self._s[2234]! } - public var SocksProxySetup_UseProxy: String { return self._s[2236]! } - public var Wallet_Send_Confirmation: String { return self._s[2237]! } - public var EditTheme_UploadEditedTheme: String { return self._s[2238]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2239]! } - public var MessageTimer_Forever: String { return self._s[2240]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2241]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2242]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2243]! } - public var Passport_Language_da: String { return self._s[2244]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2245]! } + public var LogoutOptions_LogOutWalletInfo: String { return self._s[2227]! } + public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[2228]! } + public var Conversation_LinkDialogOpen: String { return self._s[2230]! } + public var TwoFactorSetup_Hint_Title: String { return self._s[2231]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2232]! } + public var Settings_Username: String { return self._s[2234]! } + public var Conversation_Block: String { return self._s[2236]! } + public var Wallpaper_Wallpaper: String { return self._s[2237]! } + public var SocksProxySetup_UseProxy: String { return self._s[2239]! } + public var Wallet_Send_Confirmation: String { return self._s[2240]! } + public var EditTheme_UploadEditedTheme: String { return self._s[2241]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2242]! } + public var MessageTimer_Forever: String { return self._s[2243]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2244]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2245]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2246]! } + public var Passport_Language_da: String { return self._s[2247]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2248]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2246]!, self._r[2246]!, [_0]) - } - public var Passport_Address_EditPassportRegistration: String { return self._s[2247]! } - public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2249]!, self._r[2249]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2251]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2252]! } - public var Conversation_PinnedPoll: String { return self._s[2253]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2254]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2250]! } + public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2252]!, self._r[2252]!, [_0]) + } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2254]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2255]! } + public var Conversation_PinnedPoll: String { return self._s[2256]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2257]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2255]!, self._r[2255]!, [_1]) + return formatWithArgumentRanges(self._s[2258]!, self._r[2258]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2256]! } - public var Cache_ByPeerHeader: String { return self._s[2257]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2259]! } + public var Cache_ByPeerHeader: String { return self._s[2260]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2258]!, self._r[2258]!, [_0]) + return formatWithArgumentRanges(self._s[2261]!, self._r[2261]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2259]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2262]! } - public var Wallet_Completed_Title: String { return self._s[2263]! } - public var Notification_PinnedMessage: String { return self._s[2264]! } - public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[2265]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2267]! } - public var Contacts_SortBy: String { return self._s[2268]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2262]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2265]! } + public var Wallet_Completed_Title: String { return self._s[2266]! } + public var Notification_PinnedMessage: String { return self._s[2267]! } + public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[2268]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2270]! } + public var Contacts_SortBy: String { return self._s[2271]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2269]!, self._r[2269]!, [_1]) + return formatWithArgumentRanges(self._s[2272]!, self._r[2272]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2271]!, self._r[2271]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2274]!, self._r[2274]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2272]! } - public var Watch_UserInfo_Service: String { return self._s[2273]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2275]! } - public var Conversation_Unpin: String { return self._s[2277]! } - public var CancelResetAccount_Title: String { return self._s[2278]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2279]! } + public var Call_EncryptionKey_Title: String { return self._s[2275]! } + public var Watch_UserInfo_Service: String { return self._s[2276]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2278]! } + public var Conversation_Unpin: String { return self._s[2280]! } + public var CancelResetAccount_Title: String { return self._s[2281]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2282]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2281]!, self._r[2281]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2284]!, self._r[2284]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2282]! } - public var CallSettings_Title: String { return self._s[2283]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2284]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2286]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2287]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2285]! } + public var CallSettings_Title: String { return self._s[2286]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2287]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2289]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2290]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2288]!, self._r[2288]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2291]!, self._r[2291]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2289]! } - public var LoginPassword_PasswordHelp: String { return self._s[2290]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2291]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2292]! } - public var Checkout_TotalPaidAmount: String { return self._s[2293]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2292]! } + public var LoginPassword_PasswordHelp: String { return self._s[2293]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2294]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2295]! } + public var Checkout_TotalPaidAmount: String { return self._s[2296]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2294]!, self._r[2294]!, [_0]) + return formatWithArgumentRanges(self._s[2297]!, self._r[2297]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2295]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2297]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2298]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2298]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2300]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2301]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2299]!, self._r[2299]!, [_1]) + return formatWithArgumentRanges(self._s[2302]!, self._r[2302]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2300]! } - public var Contacts_InviteFriends: String { return self._s[2302]! } - public var Map_ChooseLocationTitle: String { return self._s[2303]! } - public var Conversation_StopPoll: String { return self._s[2305]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2303]! } + public var Contacts_InviteFriends: String { return self._s[2305]! } + public var Map_ChooseLocationTitle: String { return self._s[2306]! } + public var Conversation_StopPoll: String { return self._s[2308]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2306]!, self._r[2306]!, [_0]) + return formatWithArgumentRanges(self._s[2309]!, self._r[2309]!, [_0]) } - public var Call_Camera: String { return self._s[2307]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2308]! } - public var Calls_RatingFeedback: String { return self._s[2309]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2310]! } - public var Wallet_Alert_OK: String { return self._s[2311]! } - public var NotificationsSound_Pulse: String { return self._s[2312]! } - public var Watch_LastSeen_Lately: String { return self._s[2313]! } - public var ReportGroupLocation_Report: String { return self._s[2316]! } - public var Widget_NoUsers: String { return self._s[2317]! } - public var Conversation_UnvotePoll: String { return self._s[2318]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2320]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2321]! } - public var NotificationsSound_Circles: String { return self._s[2322]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2325]! } - public var Wallet_Settings_DeleteWallet: String { return self._s[2326]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2327]! } - public var Proxy_TooltipUnavailable: String { return self._s[2328]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2330]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2332]! } - public var Conversation_FileDropbox: String { return self._s[2333]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2334]! } - public var Tour_Text3: String { return self._s[2336]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2338]! } - public var GroupPermission_NoSendMessages: String { return self._s[2339]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2340]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2341]! } + public var Call_Camera: String { return self._s[2310]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2311]! } + public var Calls_RatingFeedback: String { return self._s[2312]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2313]! } + public var Wallet_Alert_OK: String { return self._s[2314]! } + public var NotificationsSound_Pulse: String { return self._s[2315]! } + public var Watch_LastSeen_Lately: String { return self._s[2316]! } + public var ReportGroupLocation_Report: String { return self._s[2319]! } + public var Widget_NoUsers: String { return self._s[2320]! } + public var Conversation_UnvotePoll: String { return self._s[2321]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2323]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2324]! } + public var NotificationsSound_Circles: String { return self._s[2325]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2328]! } + public var Wallet_Settings_DeleteWallet: String { return self._s[2329]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2330]! } + public var Proxy_TooltipUnavailable: String { return self._s[2331]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2333]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2335]! } + public var Conversation_FileDropbox: String { return self._s[2336]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2337]! } + public var Tour_Text3: String { return self._s[2339]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2341]! } + public var GroupPermission_NoSendMessages: String { return self._s[2342]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2343]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2344]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2343]!, self._r[2343]!, [_0]) + return formatWithArgumentRanges(self._s[2346]!, self._r[2346]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2344]! } - public var Checkout_ShippingOption_Title: String { return self._s[2345]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2346]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2347]! } + public var Checkout_ShippingOption_Title: String { return self._s[2348]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2349]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2347]!, self._r[2347]!, [_0]) + return formatWithArgumentRanges(self._s[2350]!, self._r[2350]!, [_0]) } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2348]!, self._r[2348]!, [_0]) + return formatWithArgumentRanges(self._s[2351]!, self._r[2351]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2349]! } - public var EditTheme_FileReadError: String { return self._s[2350]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2351]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2352]! } - public var AutoDownloadSettings_Photos: String { return self._s[2354]! } - public var Appearance_PreviewIncomingText: String { return self._s[2355]! } - public var ChatList_Context_MarkAllAsRead: String { return self._s[2356]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2357]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2358]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2359]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2360]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2361]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2362]! } - public var Notification_SecretChatScreenshot: String { return self._s[2363]! } - public var AccessDenied_Wallpapers: String { return self._s[2364]! } - public var ChatList_Context_Mute: String { return self._s[2366]! } - public var Passport_Address_City: String { return self._s[2367]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2368]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2369]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2370]! } - public var AccessDenied_LocationDisabled: String { return self._s[2371]! } - public var Group_Location_Title: String { return self._s[2372]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2374]! } - public var GroupInfo_Sound: String { return self._s[2375]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2376]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2377]! } - public var Contacts_Title: String { return self._s[2378]! } - public var EditTheme_ThemeTemplateAlertText: String { return self._s[2379]! } - public var Passport_Language_fr: String { return self._s[2380]! } - public var TwoFactorSetup_EmailVerification_Action: String { return self._s[2381]! } - public var Notifications_ResetAllNotifications: String { return self._s[2382]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2385]! } - public var Checkout_NewCard_Title: String { return self._s[2386]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2387]! } - public var Conversation_ForwardChats: String { return self._s[2388]! } - public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[2390]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2391]! } - public var Settings_FAQ: String { return self._s[2393]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2394]! } - public var Conversation_ContextMenuForward: String { return self._s[2395]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2398]! } - public var PrivacyPolicy_Title: String { return self._s[2401]! } - public var Notifications_TextTone: String { return self._s[2402]! } - public var Profile_CreateNewContact: String { return self._s[2403]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2404]! } - public var TwoFactorSetup_EmailVerification_Title: String { return self._s[2406]! } - public var Call_Speaker: String { return self._s[2407]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2408]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2410]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2411]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2352]! } + public var EditTheme_FileReadError: String { return self._s[2353]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2354]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2355]! } + public var AutoDownloadSettings_Photos: String { return self._s[2357]! } + public var Appearance_PreviewIncomingText: String { return self._s[2358]! } + public var ChatList_Context_MarkAllAsRead: String { return self._s[2359]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2360]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2361]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2362]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2363]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2364]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2365]! } + public var Notification_SecretChatScreenshot: String { return self._s[2366]! } + public var AccessDenied_Wallpapers: String { return self._s[2367]! } + public var ChatList_Context_Mute: String { return self._s[2369]! } + public var Passport_Address_City: String { return self._s[2370]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2371]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2372]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2373]! } + public var AccessDenied_LocationDisabled: String { return self._s[2374]! } + public var Group_Location_Title: String { return self._s[2375]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2377]! } + public var GroupInfo_Sound: String { return self._s[2378]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2379]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2380]! } + public var Contacts_Title: String { return self._s[2381]! } + public var EditTheme_ThemeTemplateAlertText: String { return self._s[2382]! } + public var Passport_Language_fr: String { return self._s[2383]! } + public var TwoFactorSetup_EmailVerification_Action: String { return self._s[2384]! } + public var Notifications_ResetAllNotifications: String { return self._s[2385]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2388]! } + public var Checkout_NewCard_Title: String { return self._s[2389]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2390]! } + public var Conversation_ForwardChats: String { return self._s[2391]! } + public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[2393]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2394]! } + public var Settings_FAQ: String { return self._s[2396]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2397]! } + public var Conversation_ContextMenuForward: String { return self._s[2398]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2401]! } + public var PrivacyPolicy_Title: String { return self._s[2404]! } + public var Notifications_TextTone: String { return self._s[2405]! } + public var Profile_CreateNewContact: String { return self._s[2406]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2407]! } + public var TwoFactorSetup_EmailVerification_Title: String { return self._s[2409]! } + public var Call_Speaker: String { return self._s[2410]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2411]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2413]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2414]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2412]!, self._r[2412]!, [_0]) + return formatWithArgumentRanges(self._s[2415]!, self._r[2415]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2413]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2414]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2415]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2416]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2417]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2418]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2419]! } - public var Bot_Unblock: String { return self._s[2420]! } - public var TextFormat_Italic: String { return self._s[2421]! } - public var WallpaperSearch_ColorPink: String { return self._s[2422]! } - public var Settings_About_Help: String { return self._s[2423]! } - public var SearchImages_Title: String { return self._s[2424]! } - public var Weekday_Wednesday: String { return self._s[2425]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2426]! } - public var ExplicitContent_AlertTitle: String { return self._s[2427]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2416]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2417]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2418]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2419]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2420]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2421]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2422]! } + public var Bot_Unblock: String { return self._s[2423]! } + public var TextFormat_Italic: String { return self._s[2424]! } + public var WallpaperSearch_ColorPink: String { return self._s[2425]! } + public var Settings_About_Help: String { return self._s[2426]! } + public var SearchImages_Title: String { return self._s[2427]! } + public var Weekday_Wednesday: String { return self._s[2428]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2429]! } + public var ExplicitContent_AlertTitle: String { return self._s[2430]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2428]!, self._r[2428]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2431]!, self._r[2431]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2429]! } - public var Weekday_Thursday: String { return self._s[2430]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2431]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2432]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2432]! } + public var Weekday_Thursday: String { return self._s[2433]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2434]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2435]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2433]!, self._r[2433]!, [_0]) + return formatWithArgumentRanges(self._s[2436]!, self._r[2436]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2434]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2435]! } - public var Passport_RequestedInformation: String { return self._s[2436]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2437]! } - public var Conversation_EncryptionProcessing: String { return self._s[2439]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2440]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2442]! } - public var Channel_Setup_Title: String { return self._s[2443]! } - public var Conversation_SearchPlaceholder: String { return self._s[2444]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2445]! } - public var Checkout_ErrorGeneric: String { return self._s[2446]! } - public var Passport_Language_hu: String { return self._s[2447]! } - public var Wallet_Month_ShortSeptember: String { return self._s[2448]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2437]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2438]! } + public var Passport_RequestedInformation: String { return self._s[2439]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2440]! } + public var Conversation_EncryptionProcessing: String { return self._s[2442]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2443]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2445]! } + public var Channel_Setup_Title: String { return self._s[2446]! } + public var Conversation_SearchPlaceholder: String { return self._s[2447]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2448]! } + public var Checkout_ErrorGeneric: String { return self._s[2449]! } + public var Passport_Language_hu: String { return self._s[2450]! } + public var Wallet_Month_ShortSeptember: String { return self._s[2451]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2450]!, self._r[2450]!, [_0]) + return formatWithArgumentRanges(self._s[2453]!, self._r[2453]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2453]!, self._r[2453]!, [_1]) + return formatWithArgumentRanges(self._s[2456]!, self._r[2456]!, [_1]) } - public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2454]! } + public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2457]! } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2455]!, self._r[2455]!, [_0]) + return formatWithArgumentRanges(self._s[2458]!, self._r[2458]!, [_0]) } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2456]! } - public var Group_Location_Info: String { return self._s[2457]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2458]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2459]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2459]! } + public var Group_Location_Info: String { return self._s[2460]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2461]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2462]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2460]!, self._r[2460]!, [_0]) + return formatWithArgumentRanges(self._s[2463]!, self._r[2463]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2461]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2462]! } - public var Appearance_RemoveThemeConfirmation: String { return self._s[2463]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2464]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2464]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2465]! } + public var Appearance_RemoveThemeConfirmation: String { return self._s[2466]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2467]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2465]!, self._r[2465]!, [_0]) + return formatWithArgumentRanges(self._s[2468]!, self._r[2468]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2466]! } - public var Message_PinnedAnimationMessage: String { return self._s[2468]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2470]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2471]! } - public var Wallet_Info_TransactionTo: String { return self._s[2473]! } - public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[2474]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2475]! } - public var Embed_PlayingInPIP: String { return self._s[2476]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2477]! } + public var Passport_Language_cs: String { return self._s[2469]! } + public var Message_PinnedAnimationMessage: String { return self._s[2471]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2473]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2474]! } + public var Wallet_Info_TransactionTo: String { return self._s[2476]! } + public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[2477]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2478]! } + public var Embed_PlayingInPIP: String { return self._s[2479]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2480]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2478]!, self._r[2478]!, [_0]) + return formatWithArgumentRanges(self._s[2481]!, self._r[2481]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2479]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2482]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2480]!, self._r[2480]!, [_1]) + return formatWithArgumentRanges(self._s[2483]!, self._r[2483]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2481]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2482]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2483]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2484]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2485]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2486]! } + public var Notification_PaymentSent: String { return self._s[2484]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2485]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2486]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2487]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2488]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2489]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2489]!, self._r[2489]!, [_1]) + return formatWithArgumentRanges(self._s[2492]!, self._r[2492]!, [_1]) } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2490]!, self._r[2490]!, [_1]) + return formatWithArgumentRanges(self._s[2493]!, self._r[2493]!, [_1]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2491]!, self._r[2491]!, [_1]) + return formatWithArgumentRanges(self._s[2494]!, self._r[2494]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2493]! } - public var PasscodeSettings_HelpTop: String { return self._s[2494]! } - public var Conversation_WalletRequiredTitle: String { return self._s[2495]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2496]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2497]! } - public var EditTheme_ShortLink: String { return self._s[2498]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2499]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2500]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2501]! } - public var Call_Accept: String { return self._s[2503]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2504]! } - public var Month_GenMarch: String { return self._s[2506]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2507]! } - public var LoginPassword_Title: String { return self._s[2508]! } - public var Call_End: String { return self._s[2509]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2510]! } - public var VoiceOver_Chat_Contact: String { return self._s[2511]! } - public var EditTheme_Create_Preview_IncomingText: String { return self._s[2512]! } - public var CallSettings_Always: String { return self._s[2513]! } - public var CallFeedback_Success: String { return self._s[2514]! } - public var TwoStepAuth_SetupHint: String { return self._s[2515]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2496]! } + public var PasscodeSettings_HelpTop: String { return self._s[2497]! } + public var Conversation_WalletRequiredTitle: String { return self._s[2498]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2499]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2500]! } + public var EditTheme_ShortLink: String { return self._s[2501]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2502]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2503]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2504]! } + public var Call_Accept: String { return self._s[2506]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2507]! } + public var Month_GenMarch: String { return self._s[2509]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2510]! } + public var LoginPassword_Title: String { return self._s[2511]! } + public var Call_End: String { return self._s[2512]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2513]! } + public var VoiceOver_Chat_Contact: String { return self._s[2514]! } + public var EditTheme_Create_Preview_IncomingText: String { return self._s[2515]! } + public var CallSettings_Always: String { return self._s[2516]! } + public var CallFeedback_Success: String { return self._s[2517]! } + public var TwoStepAuth_SetupHint: String { return self._s[2518]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2516]!, self._r[2516]!, [_1]) + return formatWithArgumentRanges(self._s[2519]!, self._r[2519]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2517]! } - public var Login_PhoneTitle: String { return self._s[2518]! } - public var Passport_FieldPhoneHelp: String { return self._s[2519]! } - public var Weekday_ShortSunday: String { return self._s[2520]! } - public var Passport_InfoFAQ_URL: String { return self._s[2521]! } - public var ContactInfo_Job: String { return self._s[2523]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2524]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2525]! } - public var TwoFactorSetup_Email_Text: String { return self._s[2526]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2527]! } - public var Invite_ChannelsTooMuch: String { return self._s[2528]! } - public var Wallet_Send_ConfirmationConfirm: String { return self._s[2529]! } - public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2530]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2531]! } - public var Wallet_Receive_AmountText: String { return self._s[2532]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2533]! } - public var CallFeedback_ReasonNoise: String { return self._s[2534]! } - public var Appearance_AppIconDefault: String { return self._s[2536]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2537]! } - public var MediaPicker_AddCaption: String { return self._s[2538]! } - public var CallSettings_TabIconDescription: String { return self._s[2539]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2520]! } + public var Login_PhoneTitle: String { return self._s[2521]! } + public var Passport_FieldPhoneHelp: String { return self._s[2522]! } + public var Weekday_ShortSunday: String { return self._s[2523]! } + public var Passport_InfoFAQ_URL: String { return self._s[2524]! } + public var ContactInfo_Job: String { return self._s[2526]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2527]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2528]! } + public var TwoFactorSetup_Email_Text: String { return self._s[2529]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2530]! } + public var Invite_ChannelsTooMuch: String { return self._s[2531]! } + public var Wallet_Send_ConfirmationConfirm: String { return self._s[2532]! } + public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2533]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2534]! } + public var Wallet_Receive_AmountText: String { return self._s[2535]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2536]! } + public var CallFeedback_ReasonNoise: String { return self._s[2537]! } + public var Appearance_AppIconDefault: String { return self._s[2539]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2540]! } + public var MediaPicker_AddCaption: String { return self._s[2541]! } + public var CallSettings_TabIconDescription: String { return self._s[2542]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2540]!, self._r[2540]!, [_0]) + return formatWithArgumentRanges(self._s[2543]!, self._r[2543]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2541]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2542]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2543]! } - public var DialogList_SearchSectionRecent: String { return self._s[2544]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2545]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2548]! } - public var LastSeen_WithinAWeek: String { return self._s[2549]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2550]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2552]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2553]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2544]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2545]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2546]! } + public var DialogList_SearchSectionRecent: String { return self._s[2547]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2548]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2551]! } + public var LastSeen_WithinAWeek: String { return self._s[2552]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2553]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2555]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2556]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2554]!, self._r[2554]!, [_0]) + return formatWithArgumentRanges(self._s[2557]!, self._r[2557]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2555]! } - public var Conversation_StatusLeftGroup: String { return self._s[2556]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2557]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2559]! } - public var GroupPermission_AddSuccess: String { return self._s[2560]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2562]! } - public var Conversation_ContextMenuCopy: String { return self._s[2563]! } - public var AccessDenied_CallMicrophone: String { return self._s[2564]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2558]! } + public var Conversation_StatusLeftGroup: String { return self._s[2559]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2560]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2562]! } + public var GroupPermission_AddSuccess: String { return self._s[2563]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2565]! } + public var Conversation_ContextMenuCopy: String { return self._s[2566]! } + public var AccessDenied_CallMicrophone: String { return self._s[2567]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2565]!, self._r[2565]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2568]!, self._r[2568]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2566]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2567]! } - public var Checkout_PaymentMethod_New: String { return self._s[2568]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2569]! } - public var PhotoEditor_QualityTool: String { return self._s[2570]! } - public var Login_SendCodeViaSms: String { return self._s[2571]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2572]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2573]! } - public var Wallet_Receive_CopyAddress: String { return self._s[2574]! } - public var Login_EmailNotConfiguredError: String { return self._s[2575]! } - public var SocksProxySetup_Status: String { return self._s[2576]! } - public var PrivacyPolicy_Accept: String { return self._s[2577]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2578]! } - public var Appearance_AppIconClassicX: String { return self._s[2579]! } + public var Login_InvalidFirstNameError: String { return self._s[2569]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2570]! } + public var Checkout_PaymentMethod_New: String { return self._s[2571]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2572]! } + public var PhotoEditor_QualityTool: String { return self._s[2573]! } + public var Login_SendCodeViaSms: String { return self._s[2574]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2575]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2576]! } + public var Wallet_Receive_CopyAddress: String { return self._s[2577]! } + public var Login_EmailNotConfiguredError: String { return self._s[2578]! } + public var SocksProxySetup_Status: String { return self._s[2579]! } + public var PrivacyPolicy_Accept: String { return self._s[2580]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2581]! } + public var Appearance_AppIconClassicX: String { return self._s[2582]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2580]!, self._r[2580]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2583]!, self._r[2583]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2581]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2583]! } - public var AutoNightTheme_Automatic: String { return self._s[2584]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2585]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2586]! } - public var Cache_Help: String { return self._s[2587]! } - public var Group_ErrorAccessDenied: String { return self._s[2588]! } - public var Passport_Language_fa: String { return self._s[2589]! } - public var Wallet_Intro_Text: String { return self._s[2590]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2591]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2592]! } - public var PrivacySettings_LastSeen: String { return self._s[2593]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2584]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2586]! } + public var AutoNightTheme_Automatic: String { return self._s[2587]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2588]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2589]! } + public var Cache_Help: String { return self._s[2590]! } + public var Group_ErrorAccessDenied: String { return self._s[2591]! } + public var Passport_Language_fa: String { return self._s[2592]! } + public var Wallet_Intro_Text: String { return self._s[2593]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2594]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2595]! } + public var PrivacySettings_LastSeen: String { return self._s[2596]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2594]!, self._r[2594]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2597]!, self._r[2597]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2598]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2599]! } - public var Profile_About: String { return self._s[2600]! } - public var Channel_About_Placeholder: String { return self._s[2601]! } - public var Login_InfoTitle: String { return self._s[2602]! } + public var Preview_SaveGif: String { return self._s[2601]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2602]! } + public var Profile_About: String { return self._s[2603]! } + public var Channel_About_Placeholder: String { return self._s[2604]! } + public var Login_InfoTitle: String { return self._s[2605]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2603]!, self._r[2603]!, [_0]) + return formatWithArgumentRanges(self._s[2606]!, self._r[2606]!, [_0]) } - public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2604]! } - public var Watch_Suggestion_CantTalk: String { return self._s[2606]! } - public var ContactInfo_Title: String { return self._s[2607]! } - public var Media_ShareThisVideo: String { return self._s[2608]! } - public var Weekday_ShortFriday: String { return self._s[2609]! } - public var AccessDenied_Contacts: String { return self._s[2611]! } - public var Notification_CallIncomingShort: String { return self._s[2612]! } - public var Group_Setup_TypePublic: String { return self._s[2613]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2614]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2615]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2618]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2619]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2620]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2621]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2622]! } + public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2607]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2609]! } + public var ContactInfo_Title: String { return self._s[2610]! } + public var Media_ShareThisVideo: String { return self._s[2611]! } + public var Weekday_ShortFriday: String { return self._s[2612]! } + public var AccessDenied_Contacts: String { return self._s[2614]! } + public var Notification_CallIncomingShort: String { return self._s[2615]! } + public var Group_Setup_TypePublic: String { return self._s[2616]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2617]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2618]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2621]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2622]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2623]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2624]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2625]! } public func Wallet_SecureStorageChanged_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2623]!, self._r[2623]!, [_0]) + return formatWithArgumentRanges(self._s[2626]!, self._r[2626]!, [_0]) } - public var DialogList_Typing: String { return self._s[2624]! } - public var CallFeedback_IncludeLogs: String { return self._s[2626]! } - public var Checkout_Phone: String { return self._s[2628]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2631]! } - public var Privacy_Calls_Integration: String { return self._s[2632]! } - public var Notifications_PermissionsAllow: String { return self._s[2633]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2637]! } - public var Settings_ChatSettings: String { return self._s[2638]! } + public var DialogList_Typing: String { return self._s[2627]! } + public var CallFeedback_IncludeLogs: String { return self._s[2629]! } + public var Checkout_Phone: String { return self._s[2631]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2634]! } + public var Privacy_Calls_Integration: String { return self._s[2635]! } + public var Notifications_PermissionsAllow: String { return self._s[2636]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2640]! } + public var Settings_ChatSettings: String { return self._s[2641]! } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2639]!, self._r[2639]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2642]!, self._r[2642]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2641]! } + public var GroupRemoved_DeleteUser: String { return self._s[2644]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2642]!, self._r[2642]!, [_0]) + return formatWithArgumentRanges(self._s[2645]!, self._r[2645]!, [_0]) } - public var Wallet_TransactionInfo_FeeInfoURL: String { return self._s[2643]! } + public var Wallet_TransactionInfo_FeeInfoURL: String { return self._s[2646]! } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2644]!, self._r[2644]!, [_1]) + return formatWithArgumentRanges(self._s[2647]!, self._r[2647]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2645]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2646]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2648]! } - public var Conversation_Unblock: String { return self._s[2649]! } - public var PrivacySettings_DataSettings: String { return self._s[2650]! } - public var Group_PublicLink_Info: String { return self._s[2651]! } + public var Login_ContinueWithLocalization: String { return self._s[2648]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2649]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2651]! } + public var Conversation_Unblock: String { return self._s[2652]! } + public var PrivacySettings_DataSettings: String { return self._s[2653]! } + public var Group_PublicLink_Info: String { return self._s[2654]! } public func Wallet_Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2652]!, self._r[2652]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2655]!, self._r[2655]!, [_1, _2, _3]) } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2653]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2656]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2654]!, self._r[2654]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2657]!, self._r[2657]!, [_0, _1]) } - public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2656]! } - public var PrivacySettings_Passcode: String { return self._s[2658]! } - public var Call_Mute: String { return self._s[2659]! } - public var Wallet_Weekday_Yesterday: String { return self._s[2660]! } - public var Passport_Language_dz: String { return self._s[2661]! } - public var Wallet_Receive_AmountHeader: String { return self._s[2662]! } - public var Passport_Language_tk: String { return self._s[2663]! } + public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2659]! } + public var PrivacySettings_Passcode: String { return self._s[2661]! } + public var Call_Mute: String { return self._s[2662]! } + public var Wallet_Weekday_Yesterday: String { return self._s[2663]! } + public var Passport_Language_dz: String { return self._s[2664]! } + public var Wallet_Receive_AmountHeader: String { return self._s[2665]! } + public var Passport_Language_tk: String { return self._s[2666]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2664]!, self._r[2664]!, [_0]) + return formatWithArgumentRanges(self._s[2667]!, self._r[2667]!, [_0]) } - public var Settings_Search: String { return self._s[2665]! } - public var Wallet_Month_ShortFebruary: String { return self._s[2666]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2667]! } - public var Conversation_ContextMenuReply: String { return self._s[2668]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2669]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2670]! } - public var Tour_Title1: String { return self._s[2671]! } - public var Wallet_Alert_Cancel: String { return self._s[2672]! } - public var Conversation_ClearGroupHistory: String { return self._s[2674]! } - public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2675]! } - public var WallpaperPreview_Motion: String { return self._s[2676]! } + public var Settings_Search: String { return self._s[2668]! } + public var Wallet_Month_ShortFebruary: String { return self._s[2669]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2670]! } + public var Conversation_ContextMenuReply: String { return self._s[2671]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2672]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2673]! } + public var Tour_Title1: String { return self._s[2674]! } + public var Wallet_Alert_Cancel: String { return self._s[2675]! } + public var Conversation_ClearGroupHistory: String { return self._s[2677]! } + public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2678]! } + public var WallpaperPreview_Motion: String { return self._s[2679]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2677]!, self._r[2677]!, [_0]) + return formatWithArgumentRanges(self._s[2680]!, self._r[2680]!, [_0]) } - public var Call_RateCall: String { return self._s[2678]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2679]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2680]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2681]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2683]! } + public var Call_RateCall: String { return self._s[2681]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2682]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2683]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2684]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2686]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2685]!, self._r[2685]!, [_0]) + return formatWithArgumentRanges(self._s[2688]!, self._r[2688]!, [_0]) } - public var Compose_Create: String { return self._s[2686]! } - public var Contacts_InviteToTelegram: String { return self._s[2687]! } - public var GroupInfo_Notifications: String { return self._s[2688]! } - public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2690]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2691]! } - public var Month_GenApril: String { return self._s[2692]! } - public var Appearance_AutoNightTheme: String { return self._s[2693]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2695]! } - public var Login_CodeSentSms: String { return self._s[2697]! } + public var Compose_Create: String { return self._s[2689]! } + public var Contacts_InviteToTelegram: String { return self._s[2690]! } + public var GroupInfo_Notifications: String { return self._s[2691]! } + public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2693]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2694]! } + public var Month_GenApril: String { return self._s[2695]! } + public var Appearance_AutoNightTheme: String { return self._s[2696]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2698]! } + public var Login_CodeSentSms: String { return self._s[2700]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2698]!, self._r[2698]!, [_0]) + return formatWithArgumentRanges(self._s[2701]!, self._r[2701]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2699]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2700]! } - public var Passport_Language_hr: String { return self._s[2701]! } - public var Common_ActionNotAllowedError: String { return self._s[2702]! } + public var EmptyGroupInfo_Line3: String { return self._s[2702]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2703]! } + public var Passport_Language_hr: String { return self._s[2704]! } + public var Common_ActionNotAllowedError: String { return self._s[2705]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2703]!, self._r[2703]!, [_0]) + return formatWithArgumentRanges(self._s[2706]!, self._r[2706]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2704]! } - public var Wallet_Info_TransactionFrom: String { return self._s[2705]! } - public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2706]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2707]! } - public var Privacy_SecretChatsTitle: String { return self._s[2708]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2710]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2711]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2712]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2713]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2714]! } - public var Preview_DeleteGif: String { return self._s[2715]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2716]! } - public var Group_ErrorNotMutualContact: String { return self._s[2717]! } - public var Notification_MessageLifetime5s: String { return self._s[2718]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2707]! } + public var Wallet_Info_TransactionFrom: String { return self._s[2708]! } + public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2709]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2710]! } + public var Privacy_SecretChatsTitle: String { return self._s[2711]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2713]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2714]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2715]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2716]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2717]! } + public var Preview_DeleteGif: String { return self._s[2718]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2719]! } + public var Group_ErrorNotMutualContact: String { return self._s[2720]! } + public var Notification_MessageLifetime5s: String { return self._s[2721]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2719]!, self._r[2719]!, [_0]) + return formatWithArgumentRanges(self._s[2722]!, self._r[2722]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2720]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2722]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2723]! } - public var Passport_Address_AddBankStatement: String { return self._s[2724]! } - public var Notification_CallIncoming: String { return self._s[2725]! } - public var Wallet_Words_NotDoneTitle: String { return self._s[2726]! } - public var Compose_NewGroupTitle: String { return self._s[2727]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2729]! } - public var Passport_Address_Postcode: String { return self._s[2731]! } + public var VoiceOver_Chat_Video: String { return self._s[2723]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2725]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2726]! } + public var Passport_Address_AddBankStatement: String { return self._s[2727]! } + public var Notification_CallIncoming: String { return self._s[2728]! } + public var Wallet_Words_NotDoneTitle: String { return self._s[2729]! } + public var Compose_NewGroupTitle: String { return self._s[2730]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2732]! } + public var Passport_Address_Postcode: String { return self._s[2734]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2732]!, self._r[2732]!, [_0]) + return formatWithArgumentRanges(self._s[2735]!, self._r[2735]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2733]! } - public var Wallet_Month_ShortOctober: String { return self._s[2734]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2735]! } - public var WallpaperColors_Title: String { return self._s[2736]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2737]! } - public var VoiceOver_MessageContextForward: String { return self._s[2738]! } - public var GroupPermission_Duration: String { return self._s[2739]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2736]! } + public var Wallet_Month_ShortOctober: String { return self._s[2737]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2738]! } + public var WallpaperColors_Title: String { return self._s[2739]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2740]! } + public var VoiceOver_MessageContextForward: String { return self._s[2741]! } + public var GroupPermission_Duration: String { return self._s[2742]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2740]!, self._r[2740]!, [_0]) + return formatWithArgumentRanges(self._s[2743]!, self._r[2743]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2741]! } - public var Username_Placeholder: String { return self._s[2742]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2743]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2744]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2745]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2744]! } + public var Username_Placeholder: String { return self._s[2745]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2746]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2747]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2748]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2747]!, self._r[2747]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2750]!, self._r[2750]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2748]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2749]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2750]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2751]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2752]! } - public var Conversation_ContextMenuMore: String { return self._s[2753]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2754]! } - public var CallSettings_TabIcon: String { return self._s[2755]! } - public var KeyCommand_Find: String { return self._s[2756]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2757]! } - public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2758]! } - public var Message_PinnedGame: String { return self._s[2759]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2760]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2762]! } - public var Login_CallRequestState2: String { return self._s[2764]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2766]! } + public var Passport_PasswordDescription: String { return self._s[2751]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2752]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2753]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2754]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2755]! } + public var Conversation_ContextMenuMore: String { return self._s[2756]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2757]! } + public var CallSettings_TabIcon: String { return self._s[2758]! } + public var KeyCommand_Find: String { return self._s[2759]! } + public var ClearCache_FreeSpaceDescription: String { return self._s[2760]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2761]! } + public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2762]! } + public var Message_PinnedGame: String { return self._s[2763]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2764]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2766]! } + public var Login_CallRequestState2: String { return self._s[2768]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2770]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2767]!, self._r[2767]!, [_0]) + return formatWithArgumentRanges(self._s[2771]!, self._r[2771]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2769]!, self._r[2769]!, [_0]) + return formatWithArgumentRanges(self._s[2773]!, self._r[2773]!, [_0]) } - public var WallpaperPreview_Blurred: String { return self._s[2770]! } - public var Conversation_InstantPagePreview: String { return self._s[2771]! } + public var WallpaperPreview_Blurred: String { return self._s[2774]! } + public var Conversation_InstantPagePreview: String { return self._s[2775]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2772]!, self._r[2772]!, [_0]) + return formatWithArgumentRanges(self._s[2776]!, self._r[2776]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2775]! } - public var WallpaperSearch_ColorRed: String { return self._s[2776]! } - public var GroupPermission_NoPinMessages: String { return self._s[2777]! } - public var Passport_Language_es: String { return self._s[2778]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2780]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2781]! } + public var SecretTimer_VideoDescription: String { return self._s[2779]! } + public var WallpaperSearch_ColorRed: String { return self._s[2780]! } + public var GroupPermission_NoPinMessages: String { return self._s[2781]! } + public var Passport_Language_es: String { return self._s[2782]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2784]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2785]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2782]!, self._r[2782]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2786]!, self._r[2786]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2783]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2784]! } - public var Watch_UserInfo_Unmute: String { return self._s[2785]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2786]! } - public var AccessDenied_CameraRestricted: String { return self._s[2788]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2787]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2788]! } + public var Watch_UserInfo_Unmute: String { return self._s[2789]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2790]! } + public var AccessDenied_CameraRestricted: String { return self._s[2792]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2789]!, self._r[2789]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2793]!, self._r[2793]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2791]! } - public var Settings_CopyUsername: String { return self._s[2792]! } - public var Contacts_SearchLabel: String { return self._s[2793]! } - public var Map_OpenInYandexNavigator: String { return self._s[2795]! } - public var PasscodeSettings_EncryptData: String { return self._s[2796]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2797]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2798]! } - public var DialogList_AdNoticeAlert: String { return self._s[2799]! } - public var Wallet_Month_GenMay: String { return self._s[2801]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2802]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2803]! } - public var Localization_LanguageCustom: String { return self._s[2804]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2805]! } - public var CallFeedback_Title: String { return self._s[2806]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2809]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2810]! } - public var Wallet_Intro_CreateErrorTitle: String { return self._s[2811]! } - public var Conversation_InfoGroup: String { return self._s[2812]! } - public var Compose_NewMessage: String { return self._s[2813]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2814]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2815]! } - public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[2816]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2817]! } + public var ChatList_ReadAll: String { return self._s[2795]! } + public var Settings_CopyUsername: String { return self._s[2796]! } + public var Contacts_SearchLabel: String { return self._s[2797]! } + public var Map_OpenInYandexNavigator: String { return self._s[2799]! } + public var PasscodeSettings_EncryptData: String { return self._s[2800]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2801]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2802]! } + public var DialogList_AdNoticeAlert: String { return self._s[2803]! } + public var Wallet_Month_GenMay: String { return self._s[2805]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2806]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2807]! } + public var Localization_LanguageCustom: String { return self._s[2808]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2809]! } + public var CallFeedback_Title: String { return self._s[2810]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2813]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2814]! } + public var Wallet_Intro_CreateErrorTitle: String { return self._s[2815]! } + public var Conversation_InfoGroup: String { return self._s[2816]! } + public var Compose_NewMessage: String { return self._s[2817]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2818]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2819]! } + public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[2820]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2821]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2818]!, self._r[2818]!, [_0]) + return formatWithArgumentRanges(self._s[2822]!, self._r[2822]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2819]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2820]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2821]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2822]! } - public var Channel_BlackList_Title: String { return self._s[2823]! } - public var UserInfo_PhoneCall: String { return self._s[2824]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2826]! } - public var Wallet_Month_ShortJanuary: String { return self._s[2827]! } - public var State_connecting: String { return self._s[2828]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2829]! } - public var Wallet_Month_GenMarch: String { return self._s[2830]! } - public var EditTheme_Expand_BottomInfo: String { return self._s[2831]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2823]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2824]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2825]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2826]! } + public var Channel_BlackList_Title: String { return self._s[2827]! } + public var UserInfo_PhoneCall: String { return self._s[2828]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2830]! } + public var Wallet_Month_ShortJanuary: String { return self._s[2831]! } + public var State_connecting: String { return self._s[2832]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2833]! } + public var Wallet_Month_GenMarch: String { return self._s[2834]! } + public var EditTheme_Expand_BottomInfo: String { return self._s[2835]! } public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2832]!, self._r[2832]!, [_0]) + return formatWithArgumentRanges(self._s[2836]!, self._r[2836]!, [_0]) } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2833]!, self._r[2833]!, [_0]) + return formatWithArgumentRanges(self._s[2837]!, self._r[2837]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2834]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2835]! } - public var Passport_Identity_EditPassport: String { return self._s[2836]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2838]! } - public var Localization_EnglishLanguageName: String { return self._s[2839]! } - public var Share_AuthDescription: String { return self._s[2840]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2841]! } - public var Passport_Identity_Surname: String { return self._s[2842]! } - public var Compose_TokenListPlaceholder: String { return self._s[2843]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2844]! } - public var Settings_AboutEmpty: String { return self._s[2845]! } - public var Conversation_Unmute: String { return self._s[2846]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2848]! } - public var Wallet_Sending_Text: String { return self._s[2849]! } + public var Notifications_GroupNotifications: String { return self._s[2838]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2839]! } + public var Passport_Identity_EditPassport: String { return self._s[2840]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2842]! } + public var Localization_EnglishLanguageName: String { return self._s[2843]! } + public var Share_AuthDescription: String { return self._s[2844]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2845]! } + public var Passport_Identity_Surname: String { return self._s[2846]! } + public var Compose_TokenListPlaceholder: String { return self._s[2847]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2848]! } + public var Settings_AboutEmpty: String { return self._s[2849]! } + public var Conversation_Unmute: String { return self._s[2850]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2852]! } + public var Wallet_Sending_Text: String { return self._s[2853]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2850]!, self._r[2850]!, [_1]) + return formatWithArgumentRanges(self._s[2854]!, self._r[2854]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2851]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2853]! } - public var ChatSettings_Appearance: String { return self._s[2854]! } - public var Appearance_PickAccentColor: String { return self._s[2855]! } + public var Login_CodeSentCall: String { return self._s[2855]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2857]! } + public var ChatSettings_Appearance: String { return self._s[2858]! } + public var Appearance_PickAccentColor: String { return self._s[2859]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2856]!, self._r[2856]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2860]!, self._r[2860]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2857]!, self._r[2857]!, [_1]) + return formatWithArgumentRanges(self._s[2861]!, self._r[2861]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2858]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2859]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2860]! } - public var Wallet_Month_GenOctober: String { return self._s[2862]! } - public var ChatAdmins_AdminLabel: String { return self._s[2863]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2864]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2866]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2867]! } - public var Month_GenJune: String { return self._s[2868]! } - public var Watch_Location_Current: String { return self._s[2869]! } - public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[2870]! } - public var Conversation_TitleMute: String { return self._s[2871]! } + public var Notification_CallMissed: String { return self._s[2862]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2863]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2864]! } + public var Wallet_Month_GenOctober: String { return self._s[2866]! } + public var ChatAdmins_AdminLabel: String { return self._s[2867]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2868]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2870]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2871]! } + public var Month_GenJune: String { return self._s[2872]! } + public var Watch_Location_Current: String { return self._s[2873]! } + public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[2874]! } + public var Conversation_TitleMute: String { return self._s[2875]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2872]!, self._r[2872]!, [_1]) + return formatWithArgumentRanges(self._s[2876]!, self._r[2876]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2873]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2877]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2874]!, self._r[2874]!, [_0]) + return formatWithArgumentRanges(self._s[2878]!, self._r[2878]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2875]! } - public var Chat_SlowmodeSendError: String { return self._s[2876]! } - public var MaskStickerSettings_Info: String { return self._s[2877]! } - public var EditTheme_Expand_TopInfo: String { return self._s[2878]! } + public var Call_ReportPlaceholder: String { return self._s[2879]! } + public var Chat_SlowmodeSendError: String { return self._s[2880]! } + public var MaskStickerSettings_Info: String { return self._s[2881]! } + public var EditTheme_Expand_TopInfo: String { return self._s[2882]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) + return formatWithArgumentRanges(self._s[2883]!, self._r[2883]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2880]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2882]! } - public var Contacts_ShareTelegram: String { return self._s[2883]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2884]! } - public var Channel_ErrorAccessDenied: String { return self._s[2885]! } - public var UserInfo_ScamBotWarning: String { return self._s[2887]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2888]! } - public var Call_ConnectionErrorTitle: String { return self._s[2889]! } - public var UserInfo_NotificationsEnable: String { return self._s[2890]! } - public var ArchivedChats_IntroText1: String { return self._s[2891]! } - public var Tour_Text4: String { return self._s[2894]! } - public var WallpaperSearch_Recent: String { return self._s[2895]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2896]! } - public var Profile_MessageLifetime2s: String { return self._s[2898]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2899]! } - public var Notification_MessageLifetime2s: String { return self._s[2900]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2884]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2886]! } + public var Contacts_ShareTelegram: String { return self._s[2887]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2888]! } + public var Channel_ErrorAccessDenied: String { return self._s[2889]! } + public var UserInfo_ScamBotWarning: String { return self._s[2891]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2892]! } + public var Call_ConnectionErrorTitle: String { return self._s[2893]! } + public var UserInfo_NotificationsEnable: String { return self._s[2894]! } + public var ArchivedChats_IntroText1: String { return self._s[2895]! } + public var Tour_Text4: String { return self._s[2898]! } + public var WallpaperSearch_Recent: String { return self._s[2899]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2900]! } + public var Profile_MessageLifetime2s: String { return self._s[2902]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2903]! } + public var Notification_MessageLifetime2s: String { return self._s[2904]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2901]!, self._r[2901]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2905]!, self._r[2905]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2902]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2903]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2904]! } + public var Cache_ClearCache: String { return self._s[2906]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2907]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2908]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2908]!, self._r[2908]!, [_0]) + return formatWithArgumentRanges(self._s[2912]!, self._r[2912]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2910]!, self._r[2910]!, [_0]) + return formatWithArgumentRanges(self._s[2914]!, self._r[2914]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2911]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2912]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2913]! } - public var ChatList_UnarchiveAction: String { return self._s[2914]! } - public var AutoNightTheme_Title: String { return self._s[2915]! } - public var InstantPage_FeedbackButton: String { return self._s[2916]! } - public var Passport_FieldAddress: String { return self._s[2917]! } + public var LocalGroup_Text: String { return self._s[2915]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2916]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2917]! } + public var ChatList_UnarchiveAction: String { return self._s[2918]! } + public var AutoNightTheme_Title: String { return self._s[2919]! } + public var InstantPage_FeedbackButton: String { return self._s[2920]! } + public var Passport_FieldAddress: String { return self._s[2921]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2918]!, self._r[2918]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2922]!, self._r[2922]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[2919]! } + public var Month_ShortMarch: String { return self._s[2923]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2920]!, self._r[2920]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2924]!, self._r[2924]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2921]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2922]! } - public var Passport_FloodError: String { return self._s[2923]! } - public var SecretGif_Title: String { return self._s[2924]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2925]! } - public var ChatList_Context_UnhideArchive: String { return self._s[2926]! } - public var Passport_Language_th: String { return self._s[2928]! } - public var Passport_Address_Address: String { return self._s[2929]! } - public var Login_InvalidLastNameError: String { return self._s[2930]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2931]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2932]! } - public var ChatList_Context_Archive: String { return self._s[2933]! } - public var SettingsSearch_FAQ: String { return self._s[2934]! } - public var ShareMenu_Send: String { return self._s[2935]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2937]! } - public var Month_GenNovember: String { return self._s[2939]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2941]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2925]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2926]! } + public var Passport_FloodError: String { return self._s[2927]! } + public var SecretGif_Title: String { return self._s[2928]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2929]! } + public var ChatList_Context_UnhideArchive: String { return self._s[2930]! } + public var Passport_Language_th: String { return self._s[2932]! } + public var Passport_Address_Address: String { return self._s[2933]! } + public var Login_InvalidLastNameError: String { return self._s[2934]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2935]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2936]! } + public var ChatList_Context_Archive: String { return self._s[2937]! } + public var SettingsSearch_FAQ: String { return self._s[2938]! } + public var ShareMenu_Send: String { return self._s[2939]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2941]! } + public var Month_GenNovember: String { return self._s[2943]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2945]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2942]!, self._r[2942]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2946]!, self._r[2946]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2943]! } - public var NotificationsSound_Tritone: String { return self._s[2944]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2946]! } - public var Wallet_ContextMenuCopy: String { return self._s[2948]! } + public var Checkout_Email: String { return self._s[2947]! } + public var NotificationsSound_Tritone: String { return self._s[2948]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2950]! } + public var Wallet_ContextMenuCopy: String { return self._s[2952]! } public func Wallet_Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2950]!, self._r[2950]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2954]!, self._r[2954]!, [_1, _2, _3]) } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2951]!, self._r[2951]!, [_1]) + return formatWithArgumentRanges(self._s[2955]!, self._r[2955]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2952]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2956]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2953]!, self._r[2953]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2957]!, self._r[2957]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2954]! } - public var Notification_Exceptions_Add: String { return self._s[2955]! } - public var DialogList_You: String { return self._s[2956]! } - public var MediaPicker_Send: String { return self._s[2959]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2960]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2961]! } - public var Call_AudioRouteSpeaker: String { return self._s[2962]! } - public var Watch_UserInfo_Title: String { return self._s[2963]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[2964]! } - public var Appearance_AccentColor: String { return self._s[2966]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2958]! } + public var Notification_Exceptions_Add: String { return self._s[2959]! } + public var DialogList_You: String { return self._s[2960]! } + public var MediaPicker_Send: String { return self._s[2963]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2964]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2965]! } + public var Call_AudioRouteSpeaker: String { return self._s[2966]! } + public var Watch_UserInfo_Title: String { return self._s[2967]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[2968]! } + public var Appearance_AccentColor: String { return self._s[2970]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2967]!, self._r[2967]!, [_0]) + return formatWithArgumentRanges(self._s[2971]!, self._r[2971]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2968]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2972]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2969]!, self._r[2969]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2973]!, self._r[2973]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2970]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2971]! } - public var Notification_CallOutgoing: String { return self._s[2972]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2973]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2974]! } - public var Call_RecordingDisabledMessage: String { return self._s[2975]! } - public var Message_Game: String { return self._s[2976]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2977]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2978]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2979]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2980]! } - public var Date_DialogDateFormat: String { return self._s[2981]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2982]! } - public var Notifications_InAppNotifications: String { return self._s[2983]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2974]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2975]! } + public var Notification_CallOutgoing: String { return self._s[2976]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2977]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2978]! } + public var Call_RecordingDisabledMessage: String { return self._s[2979]! } + public var Message_Game: String { return self._s[2980]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2981]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2982]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2983]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2984]! } + public var Date_DialogDateFormat: String { return self._s[2985]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2986]! } + public var Notifications_InAppNotifications: String { return self._s[2987]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2984]!, self._r[2984]!, [_0]) + return formatWithArgumentRanges(self._s[2988]!, self._r[2988]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2985]!, self._r[2985]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2989]!, self._r[2989]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[2986]! } + public var NewContact_Title: String { return self._s[2990]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2987]!, self._r[2987]!, [_0]) + return formatWithArgumentRanges(self._s[2991]!, self._r[2991]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2988]! } + public var Conversation_ViewContactDetails: String { return self._s[2992]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2990]!, self._r[2990]!, [_1]) + return formatWithArgumentRanges(self._s[2994]!, self._r[2994]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2991]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2992]! } - public var PrivacySettings_Title: String { return self._s[2993]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2996]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2997]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[2998]! } - public var Contacts_PhoneNumber: String { return self._s[2999]! } - public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3001]! } - public var Map_ShowPlaces: String { return self._s[3002]! } - public var ChatAdmins_Title: String { return self._s[3003]! } - public var InstantPage_Reference: String { return self._s[3005]! } - public var Wallet_Info_Updating: String { return self._s[3006]! } - public var ReportGroupLocation_Text: String { return self._s[3007]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2995]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2996]! } + public var PrivacySettings_Title: String { return self._s[2997]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[3000]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[3001]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[3002]! } + public var Contacts_PhoneNumber: String { return self._s[3003]! } + public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3005]! } + public var Map_ShowPlaces: String { return self._s[3006]! } + public var ChatAdmins_Title: String { return self._s[3007]! } + public var InstantPage_Reference: String { return self._s[3009]! } + public var Wallet_Info_Updating: String { return self._s[3010]! } + public var ReportGroupLocation_Text: String { return self._s[3011]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3008]!, self._r[3008]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3012]!, self._r[3012]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[3009]! } - public var Wallet_Intro_TermsUrl: String { return self._s[3010]! } - public var Watch_UserInfo_Block: String { return self._s[3011]! } - public var ChatSettings_Stickers: String { return self._s[3012]! } - public var ChatSettings_DownloadInBackground: String { return self._s[3013]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[3014]! } + public var Camera_FlashOff: String { return self._s[3013]! } + public var Wallet_Intro_TermsUrl: String { return self._s[3014]! } + public var Watch_UserInfo_Block: String { return self._s[3015]! } + public var ChatSettings_Stickers: String { return self._s[3016]! } + public var ChatSettings_DownloadInBackground: String { return self._s[3017]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[3018]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3015]!, self._r[3015]!, [_0]) + return formatWithArgumentRanges(self._s[3019]!, self._r[3019]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[3016]! } - public var Login_CheckOtherSessionMessages: String { return self._s[3017]! } - public var AutoDownloadSettings_Cellular: String { return self._s[3018]! } - public var Wallet_Created_ExportErrorTitle: String { return self._s[3019]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3020]! } - public var VoiceOver_MessageContextShare: String { return self._s[3021]! } + public var Settings_ViewPhoto: String { return self._s[3020]! } + public var Login_CheckOtherSessionMessages: String { return self._s[3021]! } + public var AutoDownloadSettings_Cellular: String { return self._s[3022]! } + public var Wallet_Created_ExportErrorTitle: String { return self._s[3023]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3024]! } + public var VoiceOver_MessageContextShare: String { return self._s[3025]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3023]!, self._r[3023]!, [_0]) + return formatWithArgumentRanges(self._s[3027]!, self._r[3027]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[3024]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3025]! } + public var Privacy_DeleteDrafts: String { return self._s[3028]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3029]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3026]!, self._r[3026]!, [_0]) + return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[3027]! } - public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3028]! } - public var DialogList_SavedMessages: String { return self._s[3029]! } - public var GroupInfo_UpgradeButton: String { return self._s[3030]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3032]! } - public var DialogList_Pin: String { return self._s[3033]! } + public var DialogList_SavedMessagesHelp: String { return self._s[3031]! } + public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3032]! } + public var DialogList_SavedMessages: String { return self._s[3033]! } + public var GroupInfo_UpgradeButton: String { return self._s[3034]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3036]! } + public var DialogList_Pin: String { return self._s[3037]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3034]!, self._r[3034]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3038]!, self._r[3038]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3035]!, self._r[3035]!, [_0]) + return formatWithArgumentRanges(self._s[3039]!, self._r[3039]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[3036]! } - public var UserInfo_NotificationsDisable: String { return self._s[3037]! } - public var Paint_Outlined: String { return self._s[3038]! } - public var Activity_PlayingGame: String { return self._s[3039]! } - public var SearchImages_NoImagesFound: String { return self._s[3040]! } - public var SocksProxySetup_ProxyType: String { return self._s[3041]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[3043]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[3044]! } - public var Settings_AppLanguage: String { return self._s[3045]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[3046]! } - public var Common_ChoosePhoto: String { return self._s[3047]! } - public var CallFeedback_ReasonEcho: String { return self._s[3048]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[3040]! } + public var UserInfo_NotificationsDisable: String { return self._s[3041]! } + public var Paint_Outlined: String { return self._s[3042]! } + public var Activity_PlayingGame: String { return self._s[3043]! } + public var SearchImages_NoImagesFound: String { return self._s[3044]! } + public var SocksProxySetup_ProxyType: String { return self._s[3045]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[3047]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[3048]! } + public var Settings_AppLanguage: String { return self._s[3049]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[3050]! } + public var Common_ChoosePhoto: String { return self._s[3051]! } + public var CallFeedback_ReasonEcho: String { return self._s[3052]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3049]!, self._r[3049]!, [_1]) + return formatWithArgumentRanges(self._s[3053]!, self._r[3053]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[3050]! } - public var Activity_UploadingVideo: String { return self._s[3051]! } - public var Conversation_WalletRequiredNotNow: String { return self._s[3052]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3053]! } - public var NetworkUsageSettings_Wifi: String { return self._s[3054]! } - public var VoiceOver_Editing_ClearText: String { return self._s[3055]! } - public var PUSH_SENDER_YOU: String { return self._s[3056]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[3057]! } - public var Checkout_PayWithTouchId: String { return self._s[3058]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3059]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[3054]! } + public var Activity_UploadingVideo: String { return self._s[3055]! } + public var Conversation_WalletRequiredNotNow: String { return self._s[3056]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3057]! } + public var NetworkUsageSettings_Wifi: String { return self._s[3058]! } + public var VoiceOver_Editing_ClearText: String { return self._s[3059]! } + public var PUSH_SENDER_YOU: String { return self._s[3060]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[3061]! } + public var Checkout_PayWithTouchId: String { return self._s[3062]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3063]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3061]!, self._r[3061]!, [_1]) + return formatWithArgumentRanges(self._s[3065]!, self._r[3065]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[3062]! } + public var Notifications_ExceptionsNone: String { return self._s[3066]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3063]!, self._r[3063]!, [_0]) + return formatWithArgumentRanges(self._s[3067]!, self._r[3067]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3064]!, self._r[3064]!, [_1]) + return formatWithArgumentRanges(self._s[3068]!, self._r[3068]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[3066]! } - public var Passport_Address_Region: String { return self._s[3069]! } - public var ChatList_DeleteChat: String { return self._s[3070]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[3071]! } - public var PhotoEditor_TiltShift: String { return self._s[3072]! } - public var Settings_FAQ_URL: String { return self._s[3073]! } - public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3074]! } - public var Passport_Language_sl: String { return self._s[3075]! } - public var Settings_PrivacySettings: String { return self._s[3077]! } - public var SharedMedia_TitleLink: String { return self._s[3078]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[3079]! } - public var Settings_SetProfilePhoto: String { return self._s[3080]! } - public var Channel_About_Help: String { return self._s[3081]! } - public var Contacts_PermissionsEnable: String { return self._s[3082]! } - public var Wallet_Sending_Title: String { return self._s[3083]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3084]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[3085]! } - public var CallFeedback_ReasonInterruption: String { return self._s[3087]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[3088]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3089]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3090]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[3091]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[3093]! } - public var Map_OpenInYandexMaps: String { return self._s[3095]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3096]! } - public var VoiceOver_MessageContextReply: String { return self._s[3097]! } - public var PhotoEditor_SaturationTool: String { return self._s[3098]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[3070]! } + public var Passport_Address_Region: String { return self._s[3073]! } + public var ChatList_DeleteChat: String { return self._s[3074]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[3075]! } + public var PhotoEditor_TiltShift: String { return self._s[3076]! } + public var Settings_FAQ_URL: String { return self._s[3077]! } + public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3078]! } + public var Passport_Language_sl: String { return self._s[3079]! } + public var Settings_PrivacySettings: String { return self._s[3081]! } + public var SharedMedia_TitleLink: String { return self._s[3082]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[3083]! } + public var Settings_SetProfilePhoto: String { return self._s[3084]! } + public var Channel_About_Help: String { return self._s[3085]! } + public var Contacts_PermissionsEnable: String { return self._s[3086]! } + public var Wallet_Sending_Title: String { return self._s[3087]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3088]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[3089]! } + public var CallFeedback_ReasonInterruption: String { return self._s[3091]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[3092]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3093]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3094]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[3095]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[3097]! } + public var Map_OpenInYandexMaps: String { return self._s[3099]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3100]! } + public var VoiceOver_MessageContextReply: String { return self._s[3101]! } + public var PhotoEditor_SaturationTool: String { return self._s[3102]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3099]!, self._r[3099]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3103]!, self._r[3103]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3100]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3101]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3102]! } - public var Appearance_TextSize: String { return self._s[3103]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3104]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3105]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3106]! } + public var Appearance_TextSize: String { return self._s[3107]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3104]!, self._r[3104]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3108]!, self._r[3108]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3105]! } - public var Channel_Username_InvalidTooShort: String { return self._s[3107]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3109]! } + public var Channel_Username_InvalidTooShort: String { return self._s[3111]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3108]!, self._r[3108]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3112]!, self._r[3112]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3109]!, self._r[3109]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3113]!, self._r[3113]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[3110]! } - public var Passport_PassportInformation: String { return self._s[3113]! } - public var Theme_Unsupported: String { return self._s[3114]! } - public var WatchRemote_AlertTitle: String { return self._s[3115]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3116]! } - public var ConvertToSupergroup_HelpText: String { return self._s[3118]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[3114]! } + public var Passport_PassportInformation: String { return self._s[3117]! } + public var Theme_Unsupported: String { return self._s[3118]! } + public var WatchRemote_AlertTitle: String { return self._s[3119]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3120]! } + public var ConvertToSupergroup_HelpText: String { return self._s[3122]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3119]!, self._r[3119]!, [_0]) + return formatWithArgumentRanges(self._s[3123]!, self._r[3123]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3120]!, self._r[3120]!, [_1]) + return formatWithArgumentRanges(self._s[3124]!, self._r[3124]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3121]! } - public var Wallet_Navigation_Done: String { return self._s[3123]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3124]! } - public var AccessDenied_CameraDisabled: String { return self._s[3125]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3125]! } + public var Wallet_Navigation_Done: String { return self._s[3127]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3128]! } + public var AccessDenied_CameraDisabled: String { return self._s[3129]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3126]!, self._r[3126]!, [_0]) + return formatWithArgumentRanges(self._s[3130]!, self._r[3130]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[3129]! } + public var PhotoEditor_ContrastTool: String { return self._s[3133]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3130]!, self._r[3130]!, [_1]) + return formatWithArgumentRanges(self._s[3134]!, self._r[3134]!, [_1]) } - public var DialogList_Draft: String { return self._s[3131]! } - public var Privacy_TopPeersDelete: String { return self._s[3133]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[3134]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3135]! } - public var WebSearch_RecentSectionClear: String { return self._s[3136]! } - public var EditTheme_ErrorInvalidCharacters: String { return self._s[3137]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[3139]! } - public var Common_Done: String { return self._s[3141]! } - public var AuthSessions_EmptyText: String { return self._s[3142]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[3143]! } - public var Tour_Title5: String { return self._s[3144]! } - public var Wallet_Settings_Title: String { return self._s[3145]! } + public var DialogList_Draft: String { return self._s[3135]! } + public var Privacy_TopPeersDelete: String { return self._s[3137]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[3138]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3139]! } + public var WebSearch_RecentSectionClear: String { return self._s[3140]! } + public var EditTheme_ErrorInvalidCharacters: String { return self._s[3141]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[3143]! } + public var Common_Done: String { return self._s[3145]! } + public var AuthSessions_EmptyText: String { return self._s[3146]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[3147]! } + public var Tour_Title5: String { return self._s[3148]! } + public var Wallet_Settings_Title: String { return self._s[3149]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3146]!, self._r[3146]!, [_0]) + return formatWithArgumentRanges(self._s[3150]!, self._r[3150]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3147]! } - public var Conversation_LinkDialogSave: String { return self._s[3148]! } - public var GroupInfo_ActionRestrict: String { return self._s[3149]! } - public var Checkout_Title: String { return self._s[3150]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3152]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[3154]! } - public var Notification_RenamedGroup: String { return self._s[3155]! } - public var PeopleNearby_Groups: String { return self._s[3156]! } - public var Checkout_PayWithFaceId: String { return self._s[3157]! } - public var Channel_BanList_BlockedTitle: String { return self._s[3158]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3160]! } - public var Checkout_WebConfirmation_Title: String { return self._s[3161]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[3162]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3151]! } + public var Conversation_LinkDialogSave: String { return self._s[3152]! } + public var GroupInfo_ActionRestrict: String { return self._s[3153]! } + public var Checkout_Title: String { return self._s[3154]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3156]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[3158]! } + public var Notification_RenamedGroup: String { return self._s[3159]! } + public var PeopleNearby_Groups: String { return self._s[3160]! } + public var Checkout_PayWithFaceId: String { return self._s[3161]! } + public var Channel_BanList_BlockedTitle: String { return self._s[3162]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3164]! } + public var Checkout_WebConfirmation_Title: String { return self._s[3165]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[3166]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3163]!, self._r[3163]!, [_0]) + return formatWithArgumentRanges(self._s[3167]!, self._r[3167]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[3165]! } + public var Profile_AddToExisting: String { return self._s[3169]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3166]!, self._r[3166]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3170]!, self._r[3170]!, [_0, _1]) } - public var Cache_Files: String { return self._s[3168]! } - public var Permissions_PrivacyPolicy: String { return self._s[3169]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[3170]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3171]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[3173]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3175]! } - public var Calls_NoCallsPlaceholder: String { return self._s[3176]! } + public var Cache_Files: String { return self._s[3172]! } + public var Permissions_PrivacyPolicy: String { return self._s[3173]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[3174]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3175]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[3177]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3179]! } + public var Calls_NoCallsPlaceholder: String { return self._s[3180]! } public func Wallet_Receive_ShareInvoiceUrlInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3177]!, self._r[3177]!, [_0]) + return formatWithArgumentRanges(self._s[3181]!, self._r[3181]!, [_0]) } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3178]! } - public var VoiceOver_AttachMedia: String { return self._s[3180]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3181]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3182]! } + public var VoiceOver_AttachMedia: String { return self._s[3184]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3185]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3182]!, self._r[3182]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3186]!, self._r[3186]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3183]! } - public var Conversation_SetReminder_Title: String { return self._s[3184]! } - public var Passport_FieldAddressHelp: String { return self._s[3185]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3186]! } - public var PUSH_REMINDER_TITLE: String { return self._s[3187]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3187]! } + public var Conversation_SetReminder_Title: String { return self._s[3188]! } + public var Passport_FieldAddressHelp: String { return self._s[3189]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3190]! } + public var PUSH_REMINDER_TITLE: String { return self._s[3191]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3188]!, self._r[3188]!, [_0]) + return formatWithArgumentRanges(self._s[3192]!, self._r[3192]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[3189]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[3190]! } - public var Login_UnknownError: String { return self._s[3191]! } - public var Group_UpgradeNoticeText2: String { return self._s[3194]! } - public var Watch_Compose_AddContact: String { return self._s[3195]! } - public var Web_Error: String { return self._s[3196]! } - public var Gif_Search: String { return self._s[3197]! } - public var Profile_MessageLifetime1h: String { return self._s[3198]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3199]! } - public var Channel_Username_CheckingUsername: String { return self._s[3200]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[3201]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[3202]! } - public var Channel_AboutItem: String { return self._s[3203]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3205]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[3206]! } - public var GroupInfo_SharedMedia: String { return self._s[3207]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[3193]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[3194]! } + public var Login_UnknownError: String { return self._s[3195]! } + public var Group_UpgradeNoticeText2: String { return self._s[3198]! } + public var Watch_Compose_AddContact: String { return self._s[3199]! } + public var Web_Error: String { return self._s[3200]! } + public var Gif_Search: String { return self._s[3201]! } + public var Profile_MessageLifetime1h: String { return self._s[3202]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3203]! } + public var Channel_Username_CheckingUsername: String { return self._s[3204]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[3205]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[3206]! } + public var Channel_AboutItem: String { return self._s[3207]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3209]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[3210]! } + public var GroupInfo_SharedMedia: String { return self._s[3211]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3208]!, self._r[3208]!, [_1]) + return formatWithArgumentRanges(self._s[3212]!, self._r[3212]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[3209]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[3213]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3210]!, self._r[3210]!, [_1]) + return formatWithArgumentRanges(self._s[3214]!, self._r[3214]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[3211]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3212]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[3213]! } - public var CreatePoll_AddOption: String { return self._s[3214]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3215]! } - public var Group_UpgradeNoticeHeader: String { return self._s[3216]! } - public var Channel_Management_AddModerator: String { return self._s[3217]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[3218]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[3219]! } - public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3220]! } - public var NotificationsSound_Hello: String { return self._s[3222]! } - public var SocksProxySetup_SavedProxies: String { return self._s[3223]! } - public var Channel_Stickers_Placeholder: String { return self._s[3225]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[3215]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3216]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[3217]! } + public var CreatePoll_AddOption: String { return self._s[3218]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3219]! } + public var Group_UpgradeNoticeHeader: String { return self._s[3220]! } + public var Channel_Management_AddModerator: String { return self._s[3221]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[3222]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[3223]! } + public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3224]! } + public var NotificationsSound_Hello: String { return self._s[3226]! } + public var SocksProxySetup_SavedProxies: String { return self._s[3227]! } + public var Channel_Stickers_Placeholder: String { return self._s[3229]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3226]!, self._r[3226]!, [_0]) + return formatWithArgumentRanges(self._s[3230]!, self._r[3230]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3227]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[3228]! } - public var ContactInfo_BirthdayLabel: String { return self._s[3229]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3230]! } - public var AutoDownloadSettings_Channels: String { return self._s[3231]! } - public var Passport_Language_mn: String { return self._s[3232]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[3235]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3236]! } - public var Passport_Language_ja: String { return self._s[3238]! } - public var Settings_About_Title: String { return self._s[3239]! } - public var Settings_NotificationsAndSounds: String { return self._s[3240]! } - public var ChannelInfo_DeleteGroup: String { return self._s[3241]! } - public var Settings_BlockedUsers: String { return self._s[3242]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3231]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[3232]! } + public var ContactInfo_BirthdayLabel: String { return self._s[3233]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3234]! } + public var AutoDownloadSettings_Channels: String { return self._s[3235]! } + public var Passport_Language_mn: String { return self._s[3236]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[3239]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3240]! } + public var Passport_Language_ja: String { return self._s[3242]! } + public var Settings_About_Title: String { return self._s[3243]! } + public var Settings_NotificationsAndSounds: String { return self._s[3244]! } + public var ChannelInfo_DeleteGroup: String { return self._s[3245]! } + public var Settings_BlockedUsers: String { return self._s[3246]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3243]!, self._r[3243]!, [_0]) + return formatWithArgumentRanges(self._s[3247]!, self._r[3247]!, [_0]) } - public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3244]! } - public var Wallet_Weekday_Today: String { return self._s[3245]! } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3246]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3247]! } - public var Channel_Username_Title: String { return self._s[3248]! } + public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3248]! } + public var Wallet_Weekday_Today: String { return self._s[3249]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3250]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3251]! } + public var Channel_Username_Title: String { return self._s[3252]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3249]!, self._r[3249]!, [_0]) + return formatWithArgumentRanges(self._s[3253]!, self._r[3253]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3251]! } - public var AppleWatch_Title: String { return self._s[3252]! } - public var Activity_RecordingVideoMessage: String { return self._s[3253]! } + public var AttachmentMenu_File: String { return self._s[3255]! } + public var AppleWatch_Title: String { return self._s[3256]! } + public var Activity_RecordingVideoMessage: String { return self._s[3257]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3254]!, self._r[3254]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3258]!, self._r[3258]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[3255]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3256]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3257]! } - public var Common_Next: String { return self._s[3259]! } - public var Channel_Stickers_YourStickers: String { return self._s[3261]! } - public var Message_Theme: String { return self._s[3262]! } - public var Call_AudioRouteHeadphones: String { return self._s[3263]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3265]! } - public var Watch_Contacts_NoResults: String { return self._s[3267]! } - public var PhotoEditor_TintTool: String { return self._s[3270]! } - public var LoginPassword_ResetAccount: String { return self._s[3272]! } - public var Settings_SavedMessages: String { return self._s[3273]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3274]! } - public var Bot_GenericSupportStatus: String { return self._s[3275]! } - public var StickerPack_Add: String { return self._s[3276]! } - public var Checkout_TotalAmount: String { return self._s[3277]! } - public var Your_cards_number_is_invalid: String { return self._s[3278]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3279]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3280]! } + public var Weekday_Saturday: String { return self._s[3259]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3260]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3261]! } + public var Common_Next: String { return self._s[3263]! } + public var Channel_Stickers_YourStickers: String { return self._s[3265]! } + public var Message_Theme: String { return self._s[3266]! } + public var Call_AudioRouteHeadphones: String { return self._s[3267]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3269]! } + public var Watch_Contacts_NoResults: String { return self._s[3271]! } + public var PhotoEditor_TintTool: String { return self._s[3274]! } + public var LoginPassword_ResetAccount: String { return self._s[3276]! } + public var Settings_SavedMessages: String { return self._s[3277]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3278]! } + public var Bot_GenericSupportStatus: String { return self._s[3279]! } + public var StickerPack_Add: String { return self._s[3280]! } + public var Checkout_TotalAmount: String { return self._s[3281]! } + public var Your_cards_number_is_invalid: String { return self._s[3282]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3283]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3284]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3281]!, self._r[3281]!, [_0]) + return formatWithArgumentRanges(self._s[3285]!, self._r[3285]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3282]!, self._r[3282]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3286]!, self._r[3286]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3283]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3287]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3285]!, self._r[3285]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3289]!, self._r[3289]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3286]!, self._r[3286]!, [_0]) + return formatWithArgumentRanges(self._s[3290]!, self._r[3290]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3287]! } - public var StickerPack_Share: String { return self._s[3288]! } - public var Passport_DeleteAddress: String { return self._s[3289]! } - public var Settings_Passport: String { return self._s[3290]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3291]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3292]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3293]! } - public var Contacts_PermissionsText: String { return self._s[3294]! } - public var Group_Setup_HistoryVisible: String { return self._s[3295]! } - public var Wallet_Month_ShortDecember: String { return self._s[3297]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3298]! } - public var SocksProxySetup_Title: String { return self._s[3299]! } - public var Notification_Mute1h: String { return self._s[3300]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3291]! } + public var StickerPack_Share: String { return self._s[3292]! } + public var Passport_DeleteAddress: String { return self._s[3293]! } + public var Settings_Passport: String { return self._s[3294]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3295]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3296]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3297]! } + public var Contacts_PermissionsText: String { return self._s[3298]! } + public var Group_Setup_HistoryVisible: String { return self._s[3299]! } + public var Wallet_Month_ShortDecember: String { return self._s[3301]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3302]! } + public var SocksProxySetup_Title: String { return self._s[3303]! } + public var Notification_Mute1h: String { return self._s[3304]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3301]!, self._r[3301]!, [_0]) + return formatWithArgumentRanges(self._s[3305]!, self._r[3305]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3302]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3306]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3303]!, self._r[3303]!, [_1]) + return formatWithArgumentRanges(self._s[3307]!, self._r[3307]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3304]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3307]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3309]! } - public var DialogList_NoMessagesText: String { return self._s[3310]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3311]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3312]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3314]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3315]! } - public var Common_TakePhotoOrVideo: String { return self._s[3316]! } - public var Wallet_Words_Text: String { return self._s[3317]! } - public var Call_StatusBusy: String { return self._s[3318]! } - public var Conversation_PinnedMessage: String { return self._s[3319]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3320]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3321]! } - public var Undo_ChatCleared: String { return self._s[3322]! } - public var AppleWatch_ReplyPresets: String { return self._s[3323]! } - public var Passport_DiscardMessageDescription: String { return self._s[3325]! } - public var Login_NetworkError: String { return self._s[3326]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3308]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3311]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3313]! } + public var DialogList_NoMessagesText: String { return self._s[3314]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3315]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3316]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3318]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3319]! } + public var Common_TakePhotoOrVideo: String { return self._s[3320]! } + public var Wallet_Words_Text: String { return self._s[3321]! } + public var Call_StatusBusy: String { return self._s[3322]! } + public var Conversation_PinnedMessage: String { return self._s[3323]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3324]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3325]! } + public var Undo_ChatCleared: String { return self._s[3326]! } + public var AppleWatch_ReplyPresets: String { return self._s[3327]! } + public var Passport_DiscardMessageDescription: String { return self._s[3329]! } + public var Login_NetworkError: String { return self._s[3330]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3327]!, self._r[3327]!, [_0]) + return formatWithArgumentRanges(self._s[3331]!, self._r[3331]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3328]!, self._r[3328]!, [_0]) + return formatWithArgumentRanges(self._s[3332]!, self._r[3332]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3329]! } - public var Wallet_WordCheck_ViewWords: String { return self._s[3331]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3332]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3333]! } + public var Wallet_WordCheck_ViewWords: String { return self._s[3335]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3336]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3334]!, self._r[3334]!, [_0]) + return formatWithArgumentRanges(self._s[3338]!, self._r[3338]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3335]! } - public var VoiceOver_Chat_Music: String { return self._s[3336]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3337]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3339]! } - public var ConversationMedia_Title: String { return self._s[3340]! } - public var EncryptionKey_Title: String { return self._s[3342]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3343]! } - public var Notification_Exceptions_AddException: String { return self._s[3344]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3345]! } - public var Profile_MessageLifetime1m: String { return self._s[3346]! } + public var Call_ConnectionErrorMessage: String { return self._s[3339]! } + public var VoiceOver_Chat_Music: String { return self._s[3340]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3341]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3343]! } + public var ConversationMedia_Title: String { return self._s[3344]! } + public var EncryptionKey_Title: String { return self._s[3346]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3347]! } + public var Notification_Exceptions_AddException: String { return self._s[3348]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3349]! } + public var Profile_MessageLifetime1m: String { return self._s[3350]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3347]!, self._r[3347]!, [_1]) + return formatWithArgumentRanges(self._s[3351]!, self._r[3351]!, [_1]) } - public var Month_GenMay: String { return self._s[3348]! } + public var Month_GenMay: String { return self._s[3352]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3349]!, self._r[3349]!, [_0]) + return formatWithArgumentRanges(self._s[3353]!, self._r[3353]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3350]! } - public var Wallet_Send_AddressInfo: String { return self._s[3351]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3352]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3353]! } + public var PeopleNearby_Users: String { return self._s[3354]! } + public var Wallet_Send_AddressInfo: String { return self._s[3355]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3356]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3357]! } public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3355]!, self._r[3355]!, [_0]) + return formatWithArgumentRanges(self._s[3359]!, self._r[3359]!, [_0]) } - public var Conversation_EmptyPlaceholder: String { return self._s[3356]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3357]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3358]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3359]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3360]! } - public var Channel_JoinChannel: String { return self._s[3362]! } - public var Appearance_Animations: String { return self._s[3365]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3360]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3361]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3362]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3363]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3364]! } + public var Channel_JoinChannel: String { return self._s[3366]! } + public var Appearance_Animations: String { return self._s[3369]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3366]!, self._r[3366]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3370]!, self._r[3370]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3368]! } - public var Appearance_ShareTheme: String { return self._s[3369]! } - public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3370]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3372]! } - public var Passport_Address_Street: String { return self._s[3373]! } - public var Conversation_AddContact: String { return self._s[3374]! } - public var Login_PhonePlaceholder: String { return self._s[3375]! } - public var Channel_Members_InviteLink: String { return self._s[3377]! } - public var Bot_Stop: String { return self._s[3378]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3380]! } - public var Notification_PassportValueAddress: String { return self._s[3381]! } - public var Month_ShortJuly: String { return self._s[3382]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3383]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3384]! } - public var Passport_Identity_ReverseSide: String { return self._s[3385]! } - public var Watch_Stickers_Recents: String { return self._s[3388]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3390]! } - public var Map_SendThisLocation: String { return self._s[3391]! } + public var Stickers_GroupStickers: String { return self._s[3372]! } + public var Appearance_ShareTheme: String { return self._s[3373]! } + public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3374]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3376]! } + public var Passport_Address_Street: String { return self._s[3377]! } + public var Conversation_AddContact: String { return self._s[3378]! } + public var Login_PhonePlaceholder: String { return self._s[3379]! } + public var Channel_Members_InviteLink: String { return self._s[3381]! } + public var Bot_Stop: String { return self._s[3382]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3384]! } + public var Notification_PassportValueAddress: String { return self._s[3385]! } + public var Month_ShortJuly: String { return self._s[3386]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3387]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3388]! } + public var Passport_Identity_ReverseSide: String { return self._s[3389]! } + public var Watch_Stickers_Recents: String { return self._s[3392]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3394]! } + public var Map_SendThisLocation: String { return self._s[3395]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3392]!, self._r[3392]!, [_0]) - } - public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3393]!, self._r[3393]!, [_0]) - } - public var ConvertToSupergroup_Note: String { return self._s[3394]! } - public var Wallet_Intro_NotNow: String { return self._s[3395]! } - public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3396]!, self._r[3396]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3397]! } + public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3397]!, self._r[3397]!, [_0]) + } + public var ConvertToSupergroup_Note: String { return self._s[3398]! } + public var Wallet_Intro_NotNow: String { return self._s[3399]! } + public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3400]!, self._r[3400]!, [_0]) + } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3401]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3398]!, self._r[3398]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3402]!, self._r[3402]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3400]! } - public var Wallpaper_SearchShort: String { return self._s[3401]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3403]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3404]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3405]! } + public var Login_CallRequestState3: String { return self._s[3404]! } + public var Wallpaper_SearchShort: String { return self._s[3405]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3407]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3408]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3409]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3406]!, self._r[3406]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3410]!, self._r[3410]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3407]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3411]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3411]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3415]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3412]!, self._r[3412]!, [_0]) + return formatWithArgumentRanges(self._s[3416]!, self._r[3416]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3413]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3414]! } + public var Passport_CorrectErrors: String { return self._s[3417]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3418]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3415]!, self._r[3415]!, [_0]) + return formatWithArgumentRanges(self._s[3419]!, self._r[3419]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3416]! } - public var Channel_DiscussionGroup: String { return self._s[3417]! } - public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3418]! } + public var Map_SendMyCurrentLocation: String { return self._s[3420]! } + public var Channel_DiscussionGroup: String { return self._s[3421]! } + public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3422]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3419]!, self._r[3419]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3423]!, self._r[3423]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3420]! } - public var Permissions_NotificationsText_v0: String { return self._s[3421]! } - public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3422]! } - public var Appearance_AppIcon: String { return self._s[3423]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3424]! } - public var LoginPassword_FloodError: String { return self._s[3425]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3427]! } + public var SharedMedia_SearchNoResults: String { return self._s[3424]! } + public var Permissions_NotificationsText_v0: String { return self._s[3425]! } + public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3426]! } + public var Appearance_AppIcon: String { return self._s[3427]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3428]! } + public var LoginPassword_FloodError: String { return self._s[3429]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3431]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3428]!, self._r[3428]!, [_0]) - } - public var Passport_Language_bn: String { return self._s[3429]! } - public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3430]!, self._r[3430]!, [_0]) - } - public var ChatList_Context_Pin: String { return self._s[3431]! } - public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3432]!, self._r[3432]!, [_0]) } + public var Passport_Language_bn: String { return self._s[3433]! } + public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3434]!, self._r[3434]!, [_0]) + } + public var ChatList_Context_Pin: String { return self._s[3435]! } + public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3436]!, self._r[3436]!, [_0]) + } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3433]!, self._r[3433]!, [_0]) + return formatWithArgumentRanges(self._s[3437]!, self._r[3437]!, [_0]) } - public var Wallet_Navigation_Close: String { return self._s[3434]! } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3438]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3440]! } - public var Wallet_Month_GenDecember: String { return self._s[3441]! } - public var Contacts_PermissionsAllow: String { return self._s[3442]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3443]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3444]! } - public var WallpaperPreview_Pattern: String { return self._s[3445]! } - public var Paint_Duplicate: String { return self._s[3446]! } - public var Passport_Address_Country: String { return self._s[3447]! } - public var Notification_RenamedChannel: String { return self._s[3449]! } - public var ChatList_Context_Unmute: String { return self._s[3450]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3451]! } - public var Group_MessagePhotoUpdated: String { return self._s[3452]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3453]! } - public var Conversation_ContextMenuBan: String { return self._s[3454]! } - public var TwoStepAuth_EmailSent: String { return self._s[3455]! } - public var MessagePoll_NoVotes: String { return self._s[3456]! } - public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3457]! } - public var Passport_Language_is: String { return self._s[3458]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3460]! } - public var Tour_Text5: String { return self._s[3461]! } + public var Wallet_Navigation_Close: String { return self._s[3438]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3442]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3444]! } + public var Wallet_Month_GenDecember: String { return self._s[3445]! } + public var Contacts_PermissionsAllow: String { return self._s[3446]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3447]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3448]! } + public var WallpaperPreview_Pattern: String { return self._s[3449]! } + public var Paint_Duplicate: String { return self._s[3450]! } + public var Passport_Address_Country: String { return self._s[3451]! } + public var Notification_RenamedChannel: String { return self._s[3453]! } + public var ChatList_Context_Unmute: String { return self._s[3454]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3455]! } + public var Group_MessagePhotoUpdated: String { return self._s[3456]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3457]! } + public var Conversation_ContextMenuBan: String { return self._s[3458]! } + public var TwoStepAuth_EmailSent: String { return self._s[3459]! } + public var MessagePoll_NoVotes: String { return self._s[3460]! } + public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3461]! } + public var Passport_Language_is: String { return self._s[3462]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3464]! } + public var Tour_Text5: String { return self._s[3465]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3463]!, self._r[3463]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3467]!, self._r[3467]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3464]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3465]! } + public var Undo_SecretChatDeleted: String { return self._s[3468]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3469]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3466]!, self._r[3466]!, [_0]) + return formatWithArgumentRanges(self._s[3470]!, self._r[3470]!, [_0]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3467]! } - public var Paint_Edit: String { return self._s[3469]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3471]! } - public var Undo_DeletedGroup: String { return self._s[3473]! } - public var LoginPassword_ForgotPassword: String { return self._s[3474]! } - public var Wallet_WordImport_IncorrectTitle: String { return self._s[3475]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3476]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3471]! } + public var Paint_Edit: String { return self._s[3473]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3475]! } + public var Undo_DeletedGroup: String { return self._s[3477]! } + public var LoginPassword_ForgotPassword: String { return self._s[3478]! } + public var Wallet_WordImport_IncorrectTitle: String { return self._s[3479]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3480]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3477]!, self._r[3477]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3481]!, self._r[3481]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3478]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3479]! } - public var Passport_Language_uz: String { return self._s[3480]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3481]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3482]! } - public var Map_StopLiveLocation: String { return self._s[3484]! } - public var VoiceOver_MessageContextSend: String { return self._s[3486]! } - public var PasscodeSettings_Help: String { return self._s[3487]! } - public var NotificationsSound_Input: String { return self._s[3488]! } - public var Share_Title: String { return self._s[3491]! } - public var LogoutOptions_Title: String { return self._s[3492]! } - public var Wallet_Send_AddressText: String { return self._s[3493]! } - public var Login_TermsOfServiceAgree: String { return self._s[3494]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3495]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3496]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3497]! } - public var EnterPasscode_EnterTitle: String { return self._s[3498]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3482]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3483]! } + public var Passport_Language_uz: String { return self._s[3484]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3485]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3486]! } + public var Map_StopLiveLocation: String { return self._s[3488]! } + public var VoiceOver_MessageContextSend: String { return self._s[3490]! } + public var PasscodeSettings_Help: String { return self._s[3491]! } + public var NotificationsSound_Input: String { return self._s[3492]! } + public var Share_Title: String { return self._s[3495]! } + public var LogoutOptions_Title: String { return self._s[3496]! } + public var Wallet_Send_AddressText: String { return self._s[3497]! } + public var Login_TermsOfServiceAgree: String { return self._s[3498]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3499]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3500]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3501]! } + public var EnterPasscode_EnterTitle: String { return self._s[3502]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3499]!, self._r[3499]!, [_0]) + return formatWithArgumentRanges(self._s[3503]!, self._r[3503]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3500]! } - public var Conversation_AddToContacts: String { return self._s[3501]! } + public var Settings_CopyPhoneNumber: String { return self._s[3504]! } + public var Conversation_AddToContacts: String { return self._s[3505]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3502]!, self._r[3502]!, [_0]) + return formatWithArgumentRanges(self._s[3506]!, self._r[3506]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[3503]! } + public var NotificationsSound_Keys: String { return self._s[3507]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3504]!, self._r[3504]!, [_0]) + return formatWithArgumentRanges(self._s[3508]!, self._r[3508]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3505]! } - public var Message_Video: String { return self._s[3506]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3507]! } + public var Notification_MessageLifetime1w: String { return self._s[3509]! } + public var Message_Video: String { return self._s[3510]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3511]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3508]!, self._r[3508]!, [_1]) + return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_1]) } - public var Wallet_Receive_AmountInfo: String { return self._s[3511]! } + public var Wallet_Receive_AmountInfo: String { return self._s[3515]! } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_0]) + return formatWithArgumentRanges(self._s[3516]!, self._r[3516]!, [_0]) } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3513]!, self._r[3513]!, [_0]) + return formatWithArgumentRanges(self._s[3517]!, self._r[3517]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3514]! } + public var Passport_Language_mk: String { return self._s[3518]! } public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3515]!, self._r[3515]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3519]!, self._r[3519]!, [_1, _2, _3]) } - public var CreatePoll_CancelConfirmation: String { return self._s[3516]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3518]! } - public var PrivacyPolicy_Decline: String { return self._s[3519]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3520]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3521]! } - public var Permissions_SiriAllow_v0: String { return self._s[3523]! } - public var Wallet_Month_ShortAugust: String { return self._s[3524]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3525]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3520]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3522]! } + public var PrivacyPolicy_Decline: String { return self._s[3523]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3524]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3525]! } + public var Permissions_SiriAllow_v0: String { return self._s[3527]! } + public var Wallet_Month_ShortAugust: String { return self._s[3528]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3529]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3526]!, self._r[3526]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3530]!, self._r[3530]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3527]!, self._r[3527]!, [_0]) + return formatWithArgumentRanges(self._s[3531]!, self._r[3531]!, [_0]) } - public var Paint_Regular: String { return self._s[3528]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3529]! } - public var SocksProxySetup_ShareLink: String { return self._s[3530]! } - public var Wallet_Qr_Title: String { return self._s[3531]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3532]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3534]! } - public var GroupInfo_InviteByLink: String { return self._s[3535]! } - public var MessageTimer_Custom: String { return self._s[3536]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3537]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3539]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3540]! } - public var VoiceOver_Chat_Selected: String { return self._s[3541]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3542]! } - public var Channel_Username_InvalidTaken: String { return self._s[3543]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3544]! } - public var Wallet_WordCheck_TryAgain: String { return self._s[3545]! } - public var Wallet_Info_TransactionPendingHeader: String { return self._s[3546]! } - public var Settings_ChatBackground: String { return self._s[3547]! } - public var Channel_Subscribers_Title: String { return self._s[3548]! } - public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3549]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3550]! } - public var Watch_ConnectionDescription: String { return self._s[3551]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3555]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3556]! } - public var EditProfile_Title: String { return self._s[3557]! } - public var NotificationsSound_Bamboo: String { return self._s[3559]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3561]! } - public var Login_SmsRequestState2: String { return self._s[3562]! } - public var Passport_Language_ar: String { return self._s[3563]! } + public var Paint_Regular: String { return self._s[3532]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3533]! } + public var SocksProxySetup_ShareLink: String { return self._s[3534]! } + public var Wallet_Qr_Title: String { return self._s[3535]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3536]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3538]! } + public var GroupInfo_InviteByLink: String { return self._s[3539]! } + public var MessageTimer_Custom: String { return self._s[3540]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3541]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3543]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3544]! } + public var VoiceOver_Chat_Selected: String { return self._s[3545]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3546]! } + public var Channel_Username_InvalidTaken: String { return self._s[3547]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3548]! } + public var Wallet_WordCheck_TryAgain: String { return self._s[3549]! } + public var Wallet_Info_TransactionPendingHeader: String { return self._s[3550]! } + public var Settings_ChatBackground: String { return self._s[3551]! } + public var Channel_Subscribers_Title: String { return self._s[3552]! } + public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3553]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3554]! } + public var Watch_ConnectionDescription: String { return self._s[3555]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3559]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3560]! } + public var EditProfile_Title: String { return self._s[3561]! } + public var NotificationsSound_Bamboo: String { return self._s[3563]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3565]! } + public var Login_SmsRequestState2: String { return self._s[3566]! } + public var Passport_Language_ar: String { return self._s[3567]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3564]!, self._r[3564]!, [_0]) + return formatWithArgumentRanges(self._s[3568]!, self._r[3568]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3565]! } - public var Wallet_Created_Text: String { return self._s[3566]! } - public var Conversation_MessageDialogEdit: String { return self._s[3567]! } - public var Wallet_Created_Proceed: String { return self._s[3568]! } - public var Wallet_Words_Done: String { return self._s[3569]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3570]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3569]! } + public var Wallet_Created_Text: String { return self._s[3570]! } + public var Conversation_MessageDialogEdit: String { return self._s[3571]! } + public var Wallet_Created_Proceed: String { return self._s[3572]! } + public var Wallet_Words_Done: String { return self._s[3573]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3574]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3571]!, self._r[3571]!, [_1]) + return formatWithArgumentRanges(self._s[3575]!, self._r[3575]!, [_1]) } - public var Common_Close: String { return self._s[3572]! } - public var GroupInfo_PublicLink: String { return self._s[3573]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3574]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3575]! } + public var Common_Close: String { return self._s[3576]! } + public var GroupInfo_PublicLink: String { return self._s[3577]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3578]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3579]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3579]!, self._r[3579]!, [_0]) + return formatWithArgumentRanges(self._s[3583]!, self._r[3583]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3580]! } + public var UserInfo_About_Placeholder: String { return self._s[3584]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3581]!, self._r[3581]!, [_0]) - } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3582]! } - public var Channel_Info_Banned: String { return self._s[3584]! } - public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3585]!, self._r[3585]!, [_0]) } - public var Appearance_Other: String { return self._s[3586]! } - public var Passport_Language_my: String { return self._s[3587]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3588]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3586]! } + public var Channel_Info_Banned: String { return self._s[3588]! } + public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3589]!, self._r[3589]!, [_0]) + } + public var Appearance_Other: String { return self._s[3590]! } + public var Passport_Language_my: String { return self._s[3591]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3592]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3589]!, self._r[3589]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3593]!, self._r[3593]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3590]! } - public var Preview_CopyAddress: String { return self._s[3591]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3594]! } + public var Preview_CopyAddress: String { return self._s[3595]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3592]!, self._r[3592]!, [_0]) + return formatWithArgumentRanges(self._s[3596]!, self._r[3596]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3593]! } - public var UserInfo_BotSettings: String { return self._s[3594]! } - public var LiveLocation_MenuStopAll: String { return self._s[3596]! } - public var Passport_PasswordCreate: String { return self._s[3597]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3598]! } - public var Message_PinnedLocationMessage: String { return self._s[3599]! } - public var Map_Satellite: String { return self._s[3600]! } - public var Watch_Message_Unsupported: String { return self._s[3601]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3602]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3603]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3597]! } + public var UserInfo_BotSettings: String { return self._s[3598]! } + public var LiveLocation_MenuStopAll: String { return self._s[3600]! } + public var Passport_PasswordCreate: String { return self._s[3601]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3602]! } + public var Message_PinnedLocationMessage: String { return self._s[3603]! } + public var Map_Satellite: String { return self._s[3604]! } + public var Watch_Message_Unsupported: String { return self._s[3605]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3606]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3607]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3604]!, self._r[3604]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3608]!, self._r[3608]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3605]!, self._r[3605]!, [_0]) + return formatWithArgumentRanges(self._s[3609]!, self._r[3609]!, [_0]) } - public var Wallet_WordImport_Continue: String { return self._s[3606]! } + public var Wallet_WordImport_Continue: String { return self._s[3610]! } public func TwoFactorSetup_EmailVerification_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3607]!, self._r[3607]!, [_0]) + return formatWithArgumentRanges(self._s[3611]!, self._r[3611]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3608]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3609]! } - public var NotificationsSound_None: String { return self._s[3610]! } - public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3611]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3613]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3614]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3612]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3613]! } + public var NotificationsSound_None: String { return self._s[3614]! } + public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3615]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3617]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3618]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3615]!, self._r[3615]!, [_1]) + return formatWithArgumentRanges(self._s[3619]!, self._r[3619]!, [_1]) } - public var Cache_Indexing: String { return self._s[3616]! } - public var DialogList_RecentTitlePeople: String { return self._s[3618]! } - public var DialogList_EncryptionRejected: String { return self._s[3619]! } - public var GroupInfo_Administrators: String { return self._s[3620]! } - public var Passport_ScanPassportHelp: String { return self._s[3621]! } - public var Application_Name: String { return self._s[3622]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3623]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3625]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3626]! } + public var Cache_Indexing: String { return self._s[3620]! } + public var DialogList_RecentTitlePeople: String { return self._s[3622]! } + public var DialogList_EncryptionRejected: String { return self._s[3623]! } + public var GroupInfo_Administrators: String { return self._s[3624]! } + public var Passport_ScanPassportHelp: String { return self._s[3625]! } + public var Application_Name: String { return self._s[3626]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3627]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3629]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3630]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3627]!, self._r[3627]!, [_0]) + return formatWithArgumentRanges(self._s[3631]!, self._r[3631]!, [_0]) } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3628]!, self._r[3628]!, [_0]) + return formatWithArgumentRanges(self._s[3632]!, self._r[3632]!, [_0]) } public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3629]!, self._r[3629]!, [_0]) + return formatWithArgumentRanges(self._s[3633]!, self._r[3633]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3630]! } - public var Privacy_ChatsTitle: String { return self._s[3631]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3632]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3633]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3634]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3635]! } - public var Group_LinkedChannel: String { return self._s[3636]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3637]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3638]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3639]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3640]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3642]! } - public var Channel_Setup_TypePublic: String { return self._s[3644]! } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3634]! } + public var Privacy_ChatsTitle: String { return self._s[3635]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3636]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3637]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3638]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3639]! } + public var Group_LinkedChannel: String { return self._s[3640]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3641]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3642]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3643]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3644]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3646]! } + public var Channel_Setup_TypePublic: String { return self._s[3648]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3645]!, self._r[3645]!, [_0]) + return formatWithArgumentRanges(self._s[3649]!, self._r[3649]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3647]! } - public var Map_OpenInMaps: String { return self._s[3649]! } + public var Channel_TypeSetup_Title: String { return self._s[3651]! } + public var Map_OpenInMaps: String { return self._s[3653]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3650]!, self._r[3650]!, [_1]) + return formatWithArgumentRanges(self._s[3654]!, self._r[3654]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3652]! } + public var NotificationsSound_Tremolo: String { return self._s[3656]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3653]!, self._r[3653]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3657]!, self._r[3657]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3654]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3655]! } - public var Passport_PasswordHelp: String { return self._s[3656]! } - public var Login_CodeExpiredError: String { return self._s[3657]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3658]! } - public var Conversation_TitleUnmute: String { return self._s[3659]! } - public var Passport_Identity_ScansHelp: String { return self._s[3660]! } - public var Passport_Language_lo: String { return self._s[3661]! } - public var Camera_FlashAuto: String { return self._s[3662]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3663]! } - public var Common_Cancel: String { return self._s[3664]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3665]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3666]! } - public var Appearance_TintAllColors: String { return self._s[3667]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3658]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3659]! } + public var Passport_PasswordHelp: String { return self._s[3660]! } + public var Login_CodeExpiredError: String { return self._s[3661]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3662]! } + public var Conversation_TitleUnmute: String { return self._s[3663]! } + public var Passport_Identity_ScansHelp: String { return self._s[3664]! } + public var Passport_Language_lo: String { return self._s[3665]! } + public var Camera_FlashAuto: String { return self._s[3666]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3667]! } + public var Common_Cancel: String { return self._s[3668]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3669]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3670]! } + public var Appearance_TintAllColors: String { return self._s[3671]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3668]!, self._r[3668]!, [_1]) + return formatWithArgumentRanges(self._s[3672]!, self._r[3672]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3669]! } - public var ChatSettings_Title: String { return self._s[3671]! } - public var Passport_PasswordReset: String { return self._s[3672]! } - public var SocksProxySetup_TypeNone: String { return self._s[3673]! } - public var EditTheme_Title: String { return self._s[3675]! } - public var PhoneNumberHelp_Help: String { return self._s[3676]! } - public var Checkout_EnterPassword: String { return self._s[3677]! } - public var Share_AuthTitle: String { return self._s[3679]! } - public var Activity_UploadingDocument: String { return self._s[3680]! } - public var State_Connecting: String { return self._s[3681]! } - public var Profile_MessageLifetime1w: String { return self._s[3682]! } - public var Conversation_ContextMenuReport: String { return self._s[3683]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3684]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3685]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3673]! } + public var ChatSettings_Title: String { return self._s[3675]! } + public var Passport_PasswordReset: String { return self._s[3676]! } + public var SocksProxySetup_TypeNone: String { return self._s[3677]! } + public var EditTheme_Title: String { return self._s[3679]! } + public var PhoneNumberHelp_Help: String { return self._s[3680]! } + public var Checkout_EnterPassword: String { return self._s[3681]! } + public var Share_AuthTitle: String { return self._s[3683]! } + public var Activity_UploadingDocument: String { return self._s[3684]! } + public var State_Connecting: String { return self._s[3685]! } + public var Profile_MessageLifetime1w: String { return self._s[3686]! } + public var Conversation_ContextMenuReport: String { return self._s[3687]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3688]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3689]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3686]!, self._r[3686]!, [_0]) + return formatWithArgumentRanges(self._s[3690]!, self._r[3690]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3687]! } - public var Wallet_WordImport_CanNotRemember: String { return self._s[3688]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3689]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3690]! } - public var PhotoEditor_Set: String { return self._s[3691]! } - public var EmptyGroupInfo_Title: String { return self._s[3692]! } - public var Login_PadPhoneHelp: String { return self._s[3693]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3695]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3697]! } - public var NotificationsSound_Complete: String { return self._s[3698]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3699]! } - public var Group_Info_AdminLog: String { return self._s[3700]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3701]! } + public var AuthSessions_Terminate: String { return self._s[3691]! } + public var Wallet_WordImport_CanNotRemember: String { return self._s[3692]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3693]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3694]! } + public var PhotoEditor_Set: String { return self._s[3695]! } + public var EmptyGroupInfo_Title: String { return self._s[3696]! } + public var Login_PadPhoneHelp: String { return self._s[3697]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3699]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3701]! } + public var NotificationsSound_Complete: String { return self._s[3702]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3703]! } + public var Group_Info_AdminLog: String { return self._s[3704]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3705]! } public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3702]!, self._r[3702]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3706]!, self._r[3706]!, [_1, _2, _3]) } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3703]! } - public var Conversation_Admin: String { return self._s[3705]! } - public var Conversation_GifTooltip: String { return self._s[3706]! } - public var Passport_NotLoggedInMessage: String { return self._s[3707]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3707]! } + public var Conversation_Admin: String { return self._s[3709]! } + public var Conversation_GifTooltip: String { return self._s[3710]! } + public var Passport_NotLoggedInMessage: String { return self._s[3711]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3709]!, self._r[3709]!, [_0]) + return formatWithArgumentRanges(self._s[3713]!, self._r[3713]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3710]! } - public var SharedMedia_EmptyTitle: String { return self._s[3712]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3714]! } - public var Username_Help: String { return self._s[3715]! } - public var DialogList_LanguageTooltip: String { return self._s[3717]! } - public var Map_LoadError: String { return self._s[3718]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3719]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3720]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3721]! } - public var Notification_Exceptions_NewException: String { return self._s[3722]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3723]! } - public var WatchRemote_AlertText: String { return self._s[3724]! } - public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3725]!, self._r[3725]!, [_1, _2]) + public var Profile_MessageLifetimeForever: String { return self._s[3714]! } + public var SharedMedia_EmptyTitle: String { return self._s[3716]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3718]! } + public var Username_Help: String { return self._s[3719]! } + public var DialogList_LanguageTooltip: String { return self._s[3721]! } + public var Map_LoadError: String { return self._s[3722]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3723]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3724]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3725]! } + public var Notification_Exceptions_NewException: String { return self._s[3726]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3727]! } + public var WatchRemote_AlertText: String { return self._s[3728]! } + public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3729]!, self._r[3729]!, [_1, _2, _3]) } - public var ChatSettings_ConnectionType_Title: String { return self._s[3729]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3733]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3730]!, self._r[3730]!, [_0]) + return formatWithArgumentRanges(self._s[3734]!, self._r[3734]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3731]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3732]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3735]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3736]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3733]!, self._r[3733]!, [_0]) + return formatWithArgumentRanges(self._s[3737]!, self._r[3737]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3734]!, self._r[3734]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3738]!, self._r[3738]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3735]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3736]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3738]! } - public var Wallet_Created_ExportErrorText: String { return self._s[3739]! } - public var ChatList_UndoArchiveText1: String { return self._s[3740]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3741]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3742]! } - public var Cache_ClearNone: String { return self._s[3743]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3744]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3745]! } + public var Group_AdminLog_EmptyText: String { return self._s[3739]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3740]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3742]! } + public var Wallet_Created_ExportErrorText: String { return self._s[3743]! } + public var ChatList_UndoArchiveText1: String { return self._s[3744]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3745]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3746]! } + public var Cache_ClearNone: String { return self._s[3747]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3748]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3749]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3746]!, self._r[3746]!, [_0]) + return formatWithArgumentRanges(self._s[3750]!, self._r[3750]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[3747]! } + public var Passport_Identity_Country: String { return self._s[3751]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3748]!, self._r[3748]!, [_0]) + return formatWithArgumentRanges(self._s[3752]!, self._r[3752]!, [_0]) } public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3749]!, self._r[3749]!, [_0]) + return formatWithArgumentRanges(self._s[3753]!, self._r[3753]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3750]! } - public var AccessDenied_Settings: String { return self._s[3751]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3752]! } - public var Month_ShortMay: String { return self._s[3753]! } - public var Compose_NewGroup: String { return self._s[3755]! } - public var Group_Setup_TypePrivate: String { return self._s[3757]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3759]! } - public var Appearance_ThemeDayClassic: String { return self._s[3760]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3761]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3762]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3763]! } - public var Conversation_typing: String { return self._s[3765]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[3766]! } - public var Paint_Masks: String { return self._s[3767]! } - public var Contacts_DeselectAll: String { return self._s[3768]! } + public var Exceptions_AddToExceptions: String { return self._s[3754]! } + public var AccessDenied_Settings: String { return self._s[3755]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3756]! } + public var Month_ShortMay: String { return self._s[3757]! } + public var Compose_NewGroup: String { return self._s[3759]! } + public var Group_Setup_TypePrivate: String { return self._s[3761]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3763]! } + public var Appearance_ThemeDayClassic: String { return self._s[3764]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3765]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3766]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3767]! } + public var Conversation_typing: String { return self._s[3769]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3770]! } + public var Paint_Masks: String { return self._s[3771]! } + public var Contacts_DeselectAll: String { return self._s[3772]! } public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3769]!, self._r[3769]!, [_0]) + return formatWithArgumentRanges(self._s[3773]!, self._r[3773]!, [_0]) } - public var Username_InvalidTaken: String { return self._s[3770]! } - public var Call_StatusNoAnswer: String { return self._s[3771]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3772]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3773]! } - public var Passport_Identity_Selfie: String { return self._s[3774]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3775]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3776]! } - public var Conversation_ClearSecretHistory: String { return self._s[3777]! } - public var PeopleNearby_Description: String { return self._s[3779]! } - public var NetworkUsageSettings_Title: String { return self._s[3780]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3782]! } + public var Username_InvalidTaken: String { return self._s[3774]! } + public var Call_StatusNoAnswer: String { return self._s[3775]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3776]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3777]! } + public var Passport_Identity_Selfie: String { return self._s[3778]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3779]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3780]! } + public var Conversation_ClearSecretHistory: String { return self._s[3781]! } + public var PeopleNearby_Description: String { return self._s[3783]! } + public var NetworkUsageSettings_Title: String { return self._s[3784]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3786]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3784]!, self._r[3784]!, [_0]) + return formatWithArgumentRanges(self._s[3788]!, self._r[3788]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3785]!, self._r[3785]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3789]!, self._r[3789]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3787]! } - public var VoiceOver_Navigation_Search: String { return self._s[3788]! } - public var Map_LiveLocationTitle: String { return self._s[3789]! } - public var Login_InfoAvatarAdd: String { return self._s[3790]! } - public var Passport_Identity_FilesView: String { return self._s[3791]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3792]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3793]! } - public var VoiceOver_Chat_File: String { return self._s[3794]! } - public var Wallet_Settings_DeleteWalletInfo: String { return self._s[3795]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3791]! } + public var VoiceOver_Navigation_Search: String { return self._s[3792]! } + public var Map_LiveLocationTitle: String { return self._s[3793]! } + public var Login_InfoAvatarAdd: String { return self._s[3794]! } + public var Passport_Identity_FilesView: String { return self._s[3795]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3796]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3797]! } + public var VoiceOver_Chat_File: String { return self._s[3798]! } + public var Wallet_Settings_DeleteWalletInfo: String { return self._s[3799]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3796]!, self._r[3796]!, [_0]) + return formatWithArgumentRanges(self._s[3800]!, self._r[3800]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3797]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3798]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3799]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3801]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3802]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3803]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3800]!, self._r[3800]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3804]!, self._r[3804]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3801]! } - public var Wallet_Intro_CreateErrorText: String { return self._s[3802]! } - public var Tour_Title2: String { return self._s[3803]! } - public var Wallet_Sent_ViewWallet: String { return self._s[3804]! } - public var Conversation_FileOpenIn: String { return self._s[3805]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3806]! } - public var Wallet_Send_ErrorInvalidAddress: String { return self._s[3807]! } - public var Wallpaper_Set: String { return self._s[3808]! } - public var Passport_Identity_Translations: String { return self._s[3810]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3805]! } + public var Wallet_Intro_CreateErrorText: String { return self._s[3806]! } + public var Tour_Title2: String { return self._s[3807]! } + public var Wallet_Sent_ViewWallet: String { return self._s[3808]! } + public var Conversation_FileOpenIn: String { return self._s[3809]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3810]! } + public var Wallet_Send_ErrorInvalidAddress: String { return self._s[3811]! } + public var Wallpaper_Set: String { return self._s[3812]! } + public var Passport_Identity_Translations: String { return self._s[3814]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3811]!, self._r[3811]!, [_0]) + return formatWithArgumentRanges(self._s[3815]!, self._r[3815]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[3812]! } + public var Channel_LeaveChannel: String { return self._s[3816]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3813]!, self._r[3813]!, [_1]) + return formatWithArgumentRanges(self._s[3817]!, self._r[3817]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3815]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3816]! } - public var Passport_Email_Delete: String { return self._s[3817]! } - public var Conversation_Mute: String { return self._s[3819]! } - public var Channel_AddBotAsAdmin: String { return self._s[3820]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3822]! } - public var Channel_Management_LabelOwner: String { return self._s[3824]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3819]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3820]! } + public var Passport_Email_Delete: String { return self._s[3821]! } + public var Conversation_Mute: String { return self._s[3823]! } + public var Channel_AddBotAsAdmin: String { return self._s[3824]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3826]! } + public var Channel_Management_LabelOwner: String { return self._s[3828]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3825]!, self._r[3825]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3829]!, self._r[3829]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3826]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3827]! } - public var Common_No: String { return self._s[3828]! } - public var Weekday_Sunday: String { return self._s[3829]! } - public var Notification_Reply: String { return self._s[3830]! } - public var Conversation_ViewMessage: String { return self._s[3831]! } + public var Calls_CallTabDescription: String { return self._s[3830]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3831]! } + public var Common_No: String { return self._s[3832]! } + public var Weekday_Sunday: String { return self._s[3833]! } + public var Notification_Reply: String { return self._s[3834]! } + public var Conversation_ViewMessage: String { return self._s[3835]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3832]!, self._r[3832]!, [_0]) + return formatWithArgumentRanges(self._s[3836]!, self._r[3836]!, [_0]) } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3833]!, self._r[3833]!, [_0]) + return formatWithArgumentRanges(self._s[3837]!, self._r[3837]!, [_0]) } public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3834]!, self._r[3834]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3838]!, self._r[3838]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3835]! } - public var Wallet_Send_Title: String { return self._s[3836]! } - public var Message_PinnedDocumentMessage: String { return self._s[3837]! } - public var Wallet_Info_RefreshErrorText: String { return self._s[3838]! } - public var DialogList_TabTitle: String { return self._s[3840]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3841]! } - public var Passport_FieldEmail: String { return self._s[3842]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3843]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3844]! } - public var Wallet_SecureStorageReset_Title: String { return self._s[3845]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3846]! } - public var Privacy_Calls_P2P: String { return self._s[3847]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3839]! } + public var Wallet_Send_Title: String { return self._s[3840]! } + public var Message_PinnedDocumentMessage: String { return self._s[3841]! } + public var Wallet_Info_RefreshErrorText: String { return self._s[3842]! } + public var DialogList_TabTitle: String { return self._s[3844]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3845]! } + public var Passport_FieldEmail: String { return self._s[3846]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3847]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3848]! } + public var Wallet_SecureStorageReset_Title: String { return self._s[3849]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3850]! } + public var Privacy_Calls_P2P: String { return self._s[3851]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3849]!, self._r[3849]!, [_0]) + return formatWithArgumentRanges(self._s[3853]!, self._r[3853]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3850]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3854]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3851]!, self._r[3851]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3855]!, self._r[3855]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3852]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3853]! } - public var TwoFactorSetup_Email_Title: String { return self._s[3854]! } - public var Passport_InfoText: String { return self._s[3855]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3856]! } + public var Stickers_ClearRecent: String { return self._s[3856]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3857]! } + public var TwoFactorSetup_Email_Title: String { return self._s[3858]! } + public var Passport_InfoText: String { return self._s[3859]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3860]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3857]!, self._r[3857]!, [_0]) + return formatWithArgumentRanges(self._s[3861]!, self._r[3861]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3858]!, self._r[3858]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3862]!, self._r[3862]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3859]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[3860]! } - public var VoiceOver_Navigation_Compose: String { return self._s[3861]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3862]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3864]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3865]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3863]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[3864]! } + public var VoiceOver_Navigation_Compose: String { return self._s[3865]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3866]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3868]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3869]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3866]!, self._r[3866]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3870]!, self._r[3870]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3868]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3872]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3870]!, self._r[3870]!, [_0]) + return formatWithArgumentRanges(self._s[3874]!, self._r[3874]!, [_0]) } - public var DialogList_Unread: String { return self._s[3871]! } + public var DialogList_Unread: String { return self._s[3875]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3872]!, self._r[3872]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3876]!, self._r[3876]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3873]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3874]! } + public var User_DeletedAccount: String { return self._s[3877]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3878]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3875]!, self._r[3875]!, [_0]) + return formatWithArgumentRanges(self._s[3879]!, self._r[3879]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3876]! } - public var SharedMedia_CategoryMedia: String { return self._s[3877]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3878]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3879]! } - public var Watch_ChatList_Compose: String { return self._s[3880]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3881]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3882]! } - public var Watch_Microphone_Access: String { return self._s[3883]! } - public var Group_Setup_HistoryHeader: String { return self._s[3884]! } - public var Map_SetThisLocation: String { return self._s[3885]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3886]! } - public var Activity_UploadingPhoto: String { return self._s[3887]! } - public var Conversation_Edit: String { return self._s[3889]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3890]! } - public var Login_TermsOfServiceDecline: String { return self._s[3891]! } - public var Message_PinnedContactMessage: String { return self._s[3892]! } + public var UserInfo_NotificationsDefault: String { return self._s[3880]! } + public var SharedMedia_CategoryMedia: String { return self._s[3881]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3882]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3883]! } + public var Watch_ChatList_Compose: String { return self._s[3884]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3885]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3886]! } + public var Watch_Microphone_Access: String { return self._s[3887]! } + public var Group_Setup_HistoryHeader: String { return self._s[3888]! } + public var Map_SetThisLocation: String { return self._s[3889]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3890]! } + public var Activity_UploadingPhoto: String { return self._s[3891]! } + public var Conversation_Edit: String { return self._s[3893]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3894]! } + public var Login_TermsOfServiceDecline: String { return self._s[3895]! } + public var Message_PinnedContactMessage: String { return self._s[3896]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3893]!, self._r[3893]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3897]!, self._r[3897]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3894]!, self._r[3894]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3898]!, self._r[3898]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3895]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3897]! } - public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[3898]! } + public var Appearance_LargeEmoji: String { return self._s[3899]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3901]! } + public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[3902]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3899]!, self._r[3899]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3903]!, self._r[3903]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3900]! } - public var Message_PinnedPhotoMessage: String { return self._s[3901]! } - public var Passport_FieldPhone: String { return self._s[3902]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3903]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3904]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3906]! } - public var Conversation_Call: String { return self._s[3907]! } - public var Common_TakePhoto: String { return self._s[3909]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3910]! } - public var Wallet_Receive_CommentHeader: String { return self._s[3911]! } - public var Channel_NotificationLoading: String { return self._s[3912]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3904]! } + public var Message_PinnedPhotoMessage: String { return self._s[3905]! } + public var Passport_FieldPhone: String { return self._s[3906]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3907]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3908]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3910]! } + public var Conversation_Call: String { return self._s[3911]! } + public var Common_TakePhoto: String { return self._s[3913]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3914]! } + public var Wallet_Receive_CommentHeader: String { return self._s[3915]! } + public var Channel_NotificationLoading: String { return self._s[3916]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3913]!, self._r[3913]!, [_0]) - } - public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3914]!, self._r[3914]!, [_0]) - } - public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3915]!, self._r[3915]!, [_1]) - } - public var Permissions_SiriTitle_v0: String { return self._s[3916]! } - public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3917]!, self._r[3917]!, [_0]) } - public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3918]!, self._r[3918]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3919]! } - public var Wallet_Info_ReceiveGrams: String { return self._s[3920]! } - public var Common_edit: String { return self._s[3921]! } - public var PrivacySettings_AuthSessions: String { return self._s[3922]! } - public var Month_ShortJune: String { return self._s[3923]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3924]! } - public var Call_ReportSend: String { return self._s[3925]! } - public var Watch_LastSeen_JustNow: String { return self._s[3926]! } - public var Notifications_MessageNotifications: String { return self._s[3927]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3928]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3930]! } - public var Group_Status: String { return self._s[3931]! } + public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3919]!, self._r[3919]!, [_1]) + } + public var Permissions_SiriTitle_v0: String { return self._s[3920]! } + public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3921]!, self._r[3921]!, [_0]) + } + public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3922]!, self._r[3922]!, [_0]) + } + public var Channel_MessagePhotoRemoved: String { return self._s[3923]! } + public var Wallet_Info_ReceiveGrams: String { return self._s[3924]! } + public var ClearCache_FreeSpace: String { return self._s[3925]! } + public var Common_edit: String { return self._s[3926]! } + public var PrivacySettings_AuthSessions: String { return self._s[3927]! } + public var Month_ShortJune: String { return self._s[3928]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3929]! } + public var Call_ReportSend: String { return self._s[3930]! } + public var Watch_LastSeen_JustNow: String { return self._s[3931]! } + public var Notifications_MessageNotifications: String { return self._s[3932]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3933]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3935]! } + public var Group_Status: String { return self._s[3936]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3932]!, self._r[3932]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3937]!, self._r[3937]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3933]! } - public var ShareMenu_ShareTo: String { return self._s[3934]! } - public var Conversation_Moderate_Ban: String { return self._s[3935]! } + public var TextFormat_AddLinkTitle: String { return self._s[3938]! } + public var ShareMenu_ShareTo: String { return self._s[3939]! } + public var Conversation_Moderate_Ban: String { return self._s[3940]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3936]!, self._r[3936]!, [_0]) + return formatWithArgumentRanges(self._s[3941]!, self._r[3941]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3937]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3938]! } + public var SharedMedia_ViewInChat: String { return self._s[3942]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3943]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3939]!, self._r[3939]!, [_1]) + return formatWithArgumentRanges(self._s[3944]!, self._r[3944]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3940]!, self._r[3940]!, [_1, _2]) - } - public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3942]!, self._r[3942]!, [_0]) - } - public var Map_OpenInHereMaps: String { return self._s[3943]! } - public var Appearance_ReduceMotion: String { return self._s[3944]! } - public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3945]!, self._r[3945]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3946]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3947]! } - public var PhotoEditor_Skip: String { return self._s[3948]! } - public func PrivacyLastSeenSettings_AddUsers(_ 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 func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3947]!, self._r[3947]!, [_0]) } - public func MessageTimer_Days(_ 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 ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[4 * 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[5 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[6 * 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[7 * 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[8 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 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[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 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[14 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_Years(_ 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 ForwardedMessages(_ 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 PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Hours(_ 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 MessageTimer_Months(_ 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 UserCount(_ 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 PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - 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[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 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[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 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[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 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[33 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedVideos(_ 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 Notifications_Exceptions(_ 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 Watch_LastSeen_MinutesAgo(_ 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 PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedPhotos(_ 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 Conversation_StatusOnline(_ 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 LiveLocationUpdated_MinutesAgo(_ 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 MessageTimer_ShortHours(_ 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 Notification_GameScoreSimple(_ 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 Forward_ConfirmMultipleFiles(_ 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 SharedMedia_Photo(_ 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 MessageTimer_ShortSeconds(_ 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 VoiceOver_Chat_PollOptionCount(_ 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 AttachmentMenu_SendVideo(_ 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 InviteText_ContactsCountText(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ 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 Call_ShortMinutes(_ 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 Notification_GameScoreSelfExtended(_ 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 PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Conversation_LiveLocationMembersCount(_ 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 Notifications_ExceptionMuteExpires_Days(_ 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 MessageTimer_ShortMinutes(_ 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 Conversation_StatusSubscribers(_ 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 ServiceMessage_GameScoreSelfSimple(_ 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 SharedMedia_File(_ 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 ServiceMessage_GameScoreSimple(_ 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 Passport_Scans(_ 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 Watch_LastSeen_HoursAgo(_ 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 MuteFor_Days(_ 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 Media_ShareVideo(_ 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 Conversation_StatusMembers(_ 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 { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + public var Map_OpenInHereMaps: String { return self._s[3948]! } + public var Appearance_ReduceMotion: String { return self._s[3949]! } + public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3950]!, self._r[3950]!, [_1, _2]) } + public var Channel_Setup_TypePublicHelp: String { return self._s[3951]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3952]! } + public var PhotoEditor_Skip: String { return self._s[3953]! } 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[69 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func AttachmentMenu_SendPhoto(_ 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 Map_ETAHours(_ 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 ForwardedLocations(_ 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 LiveLocation_MenuChatsCount(_ 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 PasscodeSettings_FailedAttempts(_ 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 StickerPack_RemoveStickerCount(_ 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 Invitation_Members(_ 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 Call_ShortSeconds(_ 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 PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 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[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 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[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 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[86 * 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[87 * 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[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 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[90 * 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[91 * 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[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 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[96 * 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[97 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 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[100 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func SharedMedia_Generic(_ 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 MuteExpires_Days(_ 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_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Media_SharePhoto(_ 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 VoiceOver_Chat_ContactEmailCount(_ 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 ForwardedStickers(_ 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 Conversation_SelectedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Theme_UsersCount(_ 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 LastSeen_MinutesAgo(_ 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 MessageTimer_Weeks(_ 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) + return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public func StickerPack_AddMaskCount(_ 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) + return String(format: self._ps[1 * 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[2 * 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[3 * 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[4 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func CreatePoll_AddMoreOptions(_ 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 ServiceMessage_GameScoreExtended(_ 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 Invitation_Members(_ 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 AttachmentMenu_SendPhoto(_ 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 Conversation_SelectedMessages(_ 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 ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ 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 PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[12 * 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[13 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[14 * 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[15 * 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[16 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedGifs(_ 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 MessageTimer_Months(_ 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 ForwardedPolls(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ 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 PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ForwardedPhotos(_ 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 ForwardedFiles(_ 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 Map_ETAMinutes(_ 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 StickerPack_AddStickerCount(_ 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 Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ 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 Call_Minutes(_ 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 ForwardedStickers(_ 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 PrivacyLastSeenSettings_AddUsers(_ 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 Media_ShareVideo(_ 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 ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func Theme_UsersCount(_ 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 Wallet_Updated_HoursAgo(_ 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 Wallet_Updated_MinutesAgo(_ 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 MessageTimer_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ 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 Call_ShortMinutes(_ 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 Watch_LastSeen_MinutesAgo(_ 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 MessageTimer_ShortSeconds(_ 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 LiveLocationUpdated_MinutesAgo(_ 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 Watch_LastSeen_HoursAgo(_ 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 MessageTimer_Weeks(_ 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 Passport_Scans(_ 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 Notification_GameScoreSimple(_ 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 MessageTimer_ShortMinutes(_ 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 Notifications_Exceptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedVideos(_ 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 ServiceMessage_GameScoreSimple(_ 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_GameScoreExtended(_ 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 SharedMedia_Video(_ 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 MessageTimer_ShortDays(_ 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 PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, _1, _2) } public func ForwardedAudios(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ForwardedVideoMessages(_ 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 MessageTimer_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ 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 Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ParticipantCount(_ 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 MuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ 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 ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ 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 PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ChatList_SelectedChats(_ 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_MESSAGES(_ 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 MessageTimer_Hours(_ 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 AttachmentMenu_SendGif(_ 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 SharedMedia_DeleteItemsConfirmation(_ 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 VoiceOver_Chat_PollOptionCount(_ 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 Media_ShareItem(_ 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 InviteText_ContactsCountText(_ 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 Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ 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 DialogList_LiveLocationChatsCount(_ 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 Notification_GameScoreSelfExtended(_ 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 SharedMedia_Photo(_ 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 LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ 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 StickerPack_StickerCount(_ 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 VoiceOver_Chat_ContactPhoneNumberCount(_ 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 PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + 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 ForwardedContacts(_ 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 SharedMedia_File(_ 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 Contacts_ImportersCount(_ 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 Forward_ConfirmMultipleFiles(_ 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 Conversation_LiveLocationMembersCount(_ 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 Media_SharePhoto(_ 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 PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ 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 StickerPack_RemoveMaskCount(_ 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 Call_ShortSeconds(_ 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 SharedMedia_Link(_ 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 StickerPack_RemoveStickerCount(_ 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 MessageTimer_ShortHours(_ 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 ServiceMessage_GameScoreSelfSimple(_ 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 Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Call_Seconds(_ 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 MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ 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 LastSeen_HoursAgo(_ 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 PasscodeSettings_FailedAttempts(_ 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 UserCount(_ 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 ForwardedMessages(_ 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) diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 181cd9095213fa21990d15f560eb83fe5d29d4c8..d92206137207fdfeef1530d403afaae1246049b2 100644 GIT binary patch delta 35365 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[pQBGPcr>m`F`(OazmM7q-LRxC;F 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 BFTMZ( delta 35921 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 G?SBD)=FOS_ diff --git a/submodules/TonBinding/Sources/TON.h b/submodules/TonBinding/Sources/TON.h index 7919a6b48f..e808be1c39 100644 --- a/submodules/TonBinding/Sources/TON.h +++ b/submodules/TonBinding/Sources/TON.h @@ -74,6 +74,36 @@ NS_ASSUME_NONNULL_BEGIN @end +@interface TONFees : NSObject + +@property (nonatomic, readonly) int64_t inFwdFee; +@property (nonatomic, readonly) int64_t storageFee; +@property (nonatomic, readonly) int64_t gasFee; +@property (nonatomic, readonly) int64_t fwdFee; + +- (instancetype)initWithInFwdFee:(int64_t)inFwdFee storageFee:(int64_t)storageFee gasFee:(int64_t)gasFee fwdFee:(int64_t)fwdFee; + +@end + +@interface TONSendGramsQueryFees : NSObject + +@property (nonatomic, strong, readonly) TONFees *sourceFees; +@property (nonatomic, strong, readonly) TONFees *destinationFees; + +- (instancetype)initWithSourceFees:(TONFees *)sourceFees destinationFees:(TONFees *)destinationFees; + +@end + +@interface TONPreparedSendGramsQuery : NSObject + +@property (nonatomic, readonly) int64_t queryId; +@property (nonatomic, readonly) int64_t validUntil; +@property (nonatomic, strong, readonly) NSData * _Nonnull bodyHash; + +- (instancetype)initWithQueryId:(int64_t)queryId validUntil:(int64_t)validUntil bodyHash:(NSData *)bodyHash; + +@end + @interface TONSendGramsResult : NSObject @property (nonatomic, readonly) int64_t sentUntil; @@ -92,7 +122,10 @@ NS_ASSUME_NONNULL_BEGIN - (SSignal *)createKeyWithLocalPassword:(NSData *)localPassword mnemonicPassword:(NSData *)mnemonicPassword; - (SSignal *)getWalletAccountAddressWithPublicKey:(NSString *)publicKey; - (SSignal *)getAccountStateWithAddress:(NSString *)accountAddress; -- (SSignal *)sendGramsFromKey:(TONKey *)key localPassword:(NSData *)localPassword fromAddress:(NSString *)fromAddress toAddress:(NSString *)address amount:(int64_t)amount textMessage:(NSData *)textMessage forceIfDestinationNotInitialized:(bool)forceIfDestinationNotInitialized timeout:(int32_t)timeout randomId:(int64_t)randomId; +- (SSignal *)generateSendGramsQueryFromKey:(TONKey *)key localPassword:(NSData *)localPassword fromAddress:(NSString *)fromAddress toAddress:(NSString *)address amount:(int64_t)amount textMessage:(NSData *)textMessage forceIfDestinationNotInitialized:(bool)forceIfDestinationNotInitialized timeout:(int32_t)timeout randomId:(int64_t)randomId; +- (SSignal *)generateFakeSendGramsQueryFromAddress:(NSString *)fromAddress toAddress:(NSString *)address amount:(int64_t)amount textMessage:(NSData *)textMessage forceIfDestinationNotInitialized:(bool)forceIfDestinationNotInitialized timeout:(int32_t)timeout; +- (SSignal *)estimateSendGramsQueryFees:(TONPreparedSendGramsQuery *)preparedQuery; +- (SSignal *)commitPreparedSendGramsQuery:(TONPreparedSendGramsQuery *)preparedQuery; - (SSignal *)exportKey:(TONKey *)key localPassword:(NSData *)localPassword; - (SSignal *)importKeyWithLocalPassword:(NSData *)localPassword mnemonicPassword:(NSData *)mnemonicPassword wordList:(NSArray *)wordList; - (SSignal *)deleteKey:(TONKey *)key; diff --git a/submodules/TonBinding/Sources/TON.mm b/submodules/TonBinding/Sources/TON.mm index 11bc24b962..954ffb14b8 100644 --- a/submodules/TonBinding/Sources/TON.mm +++ b/submodules/TonBinding/Sources/TON.mm @@ -147,6 +147,48 @@ static TONTransactionMessage * _Nullable parseTransactionMessage(tonlib_api::obj @end +@implementation TONFees + +- (instancetype)initWithInFwdFee:(int64_t)inFwdFee storageFee:(int64_t)storageFee gasFee:(int64_t)gasFee fwdFee:(int64_t)fwdFee { + self = [super init]; + if (self != nil) { + _inFwdFee = inFwdFee; + _storageFee = storageFee; + _gasFee = gasFee; + _fwdFee = fwdFee; + } + return self; +} + +@end + +@implementation TONSendGramsQueryFees + +- (instancetype)initWithSourceFees:(TONFees *)sourceFees destinationFees:(TONFees *)destinationFees { + self = [super init]; + if (self != nil) { + _sourceFees = sourceFees; + _destinationFees = destinationFees; + } + return self; +} + +@end + +@implementation TONPreparedSendGramsQuery + +- (instancetype)initWithQueryId:(int64_t)queryId validUntil:(int64_t)validUntil bodyHash:(NSData *)bodyHash { + self = [super init]; + if (self != nil) { + _queryId = queryId; + _validUntil = validUntil; + _bodyHash = bodyHash; + } + return self; +} + +@end + @implementation TONSendGramsResult - (instancetype)initWithSentUntil:(int64_t)sentUntil bodyHash:(NSData *)bodyHash { @@ -524,7 +566,7 @@ typedef enum { }] startOn:[SQueue mainQueue]] deliverOn:[SQueue mainQueue]]; } -- (SSignal *)sendGramsFromKey:(TONKey *)key localPassword:(NSData *)localPassword fromAddress:(NSString *)fromAddress toAddress:(NSString *)address amount:(int64_t)amount textMessage:(NSData *)textMessage forceIfDestinationNotInitialized:(bool)forceIfDestinationNotInitialized timeout:(int32_t)timeout randomId:(int64_t)randomId { +- (SSignal *)generateSendGramsQueryFromKey:(TONKey *)key localPassword:(NSData *)localPassword fromAddress:(NSString *)fromAddress toAddress:(NSString *)address amount:(int64_t)amount textMessage:(NSData *)textMessage forceIfDestinationNotInitialized:(bool)forceIfDestinationNotInitialized timeout:(int32_t)timeout randomId:(int64_t)randomId { return [[[[SSignal alloc] initWithGenerator:^id(SSubscriber *subscriber) { if ([_sendGramRandomIds containsObject:@(randomId)]) { [_sendGramRandomIds addObject:@(randomId)]; @@ -554,17 +596,17 @@ typedef enum { }]; auto error = tonlib_api::move_object_as(object); [subscriber putError:[[TONError alloc] initWithText:[[NSString alloc] initWithUTF8String:error->message_.c_str()]]]; - } else if (object->get_id() == tonlib_api::sendGramsResult::ID) { - auto result = tonlib_api::move_object_as(object); - TONSendGramsResult *sendResult = [[TONSendGramsResult alloc] initWithSentUntil:result->sent_until_ bodyHash:makeData(result->body_hash_)]; - [subscriber putNext:sendResult]; + } else if (object->get_id() == tonlib_api::query_info::ID) { + auto result = tonlib_api::move_object_as(object); + TONPreparedSendGramsQuery *preparedQuery = [[TONPreparedSendGramsQuery alloc] initWithQueryId:result->id_ validUntil:result->valid_until_ bodyHash:makeData(result->body_hash_)]; + [subscriber putNext:preparedQuery]; [subscriber putCompletion]; } else { [subscriber putCompletion]; } }]; - auto query = make_object( + auto query = make_object( make_object( make_object( makeString(publicKeyData), @@ -586,6 +628,101 @@ typedef enum { }] startOn:[SQueue mainQueue]] deliverOn:[SQueue mainQueue]]; } +- (SSignal *)generateFakeSendGramsQueryFromAddress:(NSString *)fromAddress toAddress:(NSString *)address amount:(int64_t)amount textMessage:(NSData *)textMessage forceIfDestinationNotInitialized:(bool)forceIfDestinationNotInitialized timeout:(int32_t)timeout { + return [[[[SSignal alloc] initWithGenerator:^id(SSubscriber *subscriber) { + + uint64_t requestId = _nextRequestId; + _nextRequestId += 1; + + __weak TON *weakSelf = self; + SQueue *queue = _queue; + _requestHandlers[@(requestId)] = [[TONRequestHandler alloc] initWithCompletion:^(tonlib_api::object_ptr &object) { + if (object->get_id() == tonlib_api::error::ID) { + auto error = tonlib_api::move_object_as(object); + [subscriber putError:[[TONError alloc] initWithText:[[NSString alloc] initWithUTF8String:error->message_.c_str()]]]; + } else if (object->get_id() == tonlib_api::query_info::ID) { + auto result = tonlib_api::move_object_as(object); + TONPreparedSendGramsQuery *preparedQuery = [[TONPreparedSendGramsQuery alloc] initWithQueryId:result->id_ validUntil:result->valid_until_ bodyHash:makeData(result->body_hash_)]; + [subscriber putNext:preparedQuery]; + [subscriber putCompletion]; + } else { + [subscriber putCompletion]; + } + }]; + + auto query = make_object( + make_object(), + make_object(fromAddress.UTF8String), + make_object(address.UTF8String), + amount, + timeout, + forceIfDestinationNotInitialized, + makeString(textMessage) + ); + _client->send({ requestId, std::move(query) }); + + return [[SBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[SQueue mainQueue]] deliverOn:[SQueue mainQueue]]; +} + +- (SSignal *)estimateSendGramsQueryFees:(TONPreparedSendGramsQuery *)preparedQuery { + return [[[[SSignal alloc] initWithGenerator:^id(SSubscriber *subscriber) { + uint64_t requestId = _nextRequestId; + _nextRequestId += 1; + + _requestHandlers[@(requestId)] = [[TONRequestHandler alloc] initWithCompletion:^(tonlib_api::object_ptr &object) { + if (object->get_id() == tonlib_api::error::ID) { + auto error = tonlib_api::move_object_as(object); + [subscriber putError:[[TONError alloc] initWithText:[[NSString alloc] initWithUTF8String:error->message_.c_str()]]]; + } else if (object->get_id() == tonlib_api::query_fees::ID) { + auto result = tonlib_api::move_object_as(object); + TONFees *sourceFees = [[TONFees alloc] initWithInFwdFee:result->source_fees_->in_fwd_fee_ storageFee:result->source_fees_->storage_fee_ gasFee:result->source_fees_->gas_fee_ fwdFee:result->source_fees_->fwd_fee_]; + TONFees *destinationFees = [[TONFees alloc] initWithInFwdFee:result->destination_fees_->in_fwd_fee_ storageFee:result->destination_fees_->storage_fee_ gasFee:result->destination_fees_->gas_fee_ fwdFee:result->destination_fees_->fwd_fee_]; + [subscriber putNext:[[TONSendGramsQueryFees alloc] initWithSourceFees:sourceFees destinationFees:destinationFees]]; + [subscriber putCompletion]; + } else { + assert(false); + } + }]; + + auto query = make_object( + preparedQuery.queryId, + true + ); + _client->send({ requestId, std::move(query) }); + + return [[SBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[SQueue mainQueue]] deliverOn:[SQueue mainQueue]]; +} + +- (SSignal *)commitPreparedSendGramsQuery:(TONPreparedSendGramsQuery *)preparedQuery { + return [[[[SSignal alloc] initWithGenerator:^id(SSubscriber *subscriber) { + uint64_t requestId = _nextRequestId; + _nextRequestId += 1; + + _requestHandlers[@(requestId)] = [[TONRequestHandler alloc] initWithCompletion:^(tonlib_api::object_ptr &object) { + if (object->get_id() == tonlib_api::error::ID) { + auto error = tonlib_api::move_object_as(object); + [subscriber putError:[[TONError alloc] initWithText:[[NSString alloc] initWithUTF8String:error->message_.c_str()]]]; + } else if (object->get_id() == tonlib_api::ok::ID) { + [subscriber putCompletion]; + } else { + assert(false); + } + }]; + + auto query = make_object( + preparedQuery.queryId + ); + _client->send({ requestId, std::move(query) }); + + return [[SBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[SQueue mainQueue]] deliverOn:[SQueue mainQueue]]; +} + - (SSignal *)exportKey:(TONKey *)key localPassword:(NSData *)localPassword { return [[[[SSignal alloc] initWithGenerator:^id(SSubscriber *subscriber) { NSData *publicKeyData = [key.publicKey dataUsingEncoding:NSUTF8StringEncoding]; diff --git a/submodules/WalletCore/Sources/WalletCore.swift b/submodules/WalletCore/Sources/WalletCore.swift index aed3b4d4c9..1f9edf1d17 100644 --- a/submodules/WalletCore/Sources/WalletCore.swift +++ b/submodules/WalletCore/Sources/WalletCore.swift @@ -346,19 +346,19 @@ public final class TonInstance { } } - fileprivate func sendGramsFromWallet(decryptedSecret: Data, localPassword: Data, walletInfo: WalletInfo, fromAddress: String, toAddress: String, amount: Int64, textMessage: Data, forceIfDestinationNotInitialized: Bool, timeout: Int32, randomId: Int64) -> Signal { + fileprivate func prepareSendGramsFromWalletQuery(decryptedSecret: Data, localPassword: Data, walletInfo: WalletInfo, fromAddress: String, toAddress: String, amount: Int64, textMessage: Data, forceIfDestinationNotInitialized: Bool, timeout: Int32, randomId: Int64) -> Signal { let key = TONKey(publicKey: walletInfo.publicKey.rawValue, secret: decryptedSecret) return Signal { subscriber in let disposable = MetaDisposable() self.impl.with { impl in impl.withInstance { ton in - let cancel = ton.sendGrams(from: key, localPassword: localPassword, fromAddress: fromAddress, toAddress: toAddress, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: forceIfDestinationNotInitialized, timeout: timeout, randomId: randomId).start(next: { result in - guard let result = result as? TONSendGramsResult else { + let cancel = ton.generateSendGramsQuery(from: key, localPassword: localPassword, fromAddress: fromAddress, toAddress: toAddress, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: forceIfDestinationNotInitialized, timeout: timeout, randomId: randomId).start(next: { result in + guard let result = result as? TONPreparedSendGramsQuery else { subscriber.putError(.generic) return } - subscriber.putNext(PendingWalletTransaction(timestamp: Int64(Date().timeIntervalSince1970), validUntilTimestamp: result.sentUntil, bodyHash: result.bodyHash, address: toAddress, value: amount, comment: textMessage)) + subscriber.putNext(result) subscriber.putCompletion() }, error: { error in if let error = error as? TONError { @@ -391,6 +391,131 @@ public final class TonInstance { } } + fileprivate func prepareFakeSendGramsFromWalletQuery(walletInfo: WalletInfo, fromAddress: String, toAddress: String, amount: Int64, textMessage: Data, timeout: Int32) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.generateFakeSendGramsQuery(fromAddress: fromAddress, toAddress: toAddress, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: true, timeout: timeout).start(next: { result in + guard let result = result as? TONPreparedSendGramsQuery else { + subscriber.putError(.generic) + return + } + subscriber.putNext(result) + subscriber.putCompletion() + }, error: { error in + if let error = error as? TONError { + if error.text.hasPrefix("INVALID_ACCOUNT_ADDRESS") { + subscriber.putError(.invalidAddress) + } else if error.text.hasPrefix("DANGEROUS_TRANSACTION") { + subscriber.putError(.destinationIsNotInitialized) + } else if error.text.hasPrefix("MESSAGE_TOO_LONG") { + subscriber.putError(.messageTooLong) + } else if error.text.hasPrefix("NOT_ENOUGH_FUNDS") { + subscriber.putError(.notEnoughFunds) + } else if error.text.hasPrefix("LITE_SERVER_") { + subscriber.putError(.network) + } else { + subscriber.putError(.generic) + } + } else { + subscriber.putError(.generic) + } + }, completed: { + subscriber.putCompletion() + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func estimateSendGramsQueryFees(preparedQuery: TONPreparedSendGramsQuery) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.estimateSendGramsQueryFees(preparedQuery).start(next: { result in + guard let result = result as? TONSendGramsQueryFees else { + subscriber.putError(.generic) + return + } + subscriber.putNext(result) + subscriber.putCompletion() + }, error: { error in + if let error = error as? TONError { + if error.text.hasPrefix("INVALID_ACCOUNT_ADDRESS") { + subscriber.putError(.invalidAddress) + } else if error.text.hasPrefix("DANGEROUS_TRANSACTION") { + subscriber.putError(.destinationIsNotInitialized) + } else if error.text.hasPrefix("MESSAGE_TOO_LONG") { + subscriber.putError(.messageTooLong) + } else if error.text.hasPrefix("NOT_ENOUGH_FUNDS") { + subscriber.putError(.notEnoughFunds) + } else if error.text.hasPrefix("LITE_SERVER_") { + subscriber.putError(.network) + } else { + subscriber.putError(.generic) + } + } else { + subscriber.putError(.generic) + } + }, completed: nil) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func commitPreparedSendGramsQuery(_ preparedQuery: TONPreparedSendGramsQuery) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.commit(preparedQuery).start(next: { result in + preconditionFailure() + }, error: { error in + if let error = error as? TONError { + if error.text.hasPrefix("INVALID_ACCOUNT_ADDRESS") { + subscriber.putError(.invalidAddress) + } else if error.text.hasPrefix("DANGEROUS_TRANSACTION") { + subscriber.putError(.destinationIsNotInitialized) + } else if error.text.hasPrefix("MESSAGE_TOO_LONG") { + subscriber.putError(.messageTooLong) + } else if error.text.hasPrefix("NOT_ENOUGH_FUNDS") { + subscriber.putError(.notEnoughFunds) + } else if error.text.hasPrefix("LITE_SERVER_") { + subscriber.putError(.network) + } else { + subscriber.putError(.generic) + } + } else { + subscriber.putError(.generic) + } + }, completed: { + subscriber.putCompletion() + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + fileprivate func walletRestoreWords(publicKey: WalletPublicKey, decryptedSecret: Data, localPassword: Data) -> Signal<[String], WalletRestoreWordsError> { return Signal { subscriber in let disposable = MetaDisposable() @@ -765,28 +890,63 @@ public enum SendGramsFromWalletError { case network } +public struct EstimatedSendGramsFees { + public let inFwdFee: Int64 + public let storageFee: Int64 + public let gasFee: Int64 + public let fwdFee: Int64 +} + +public func verifySendGramsRequestAndEstimateFees(tonInstance: TonInstance, walletInfo: WalletInfo, toAddress: String, amount: Int64, textMessage: Data, timeout: Int32) -> Signal { + return walletAddress(publicKey: walletInfo.publicKey, tonInstance: tonInstance) + |> castError(SendGramsFromWalletError.self) + |> mapToSignal { fromAddress -> Signal in + return tonInstance.prepareFakeSendGramsFromWalletQuery(walletInfo: walletInfo, fromAddress: fromAddress, toAddress: toAddress, amount: amount, textMessage: textMessage, timeout: timeout) + |> mapToSignal { preparedQuery -> Signal in + return tonInstance.estimateSendGramsQueryFees(preparedQuery: preparedQuery) + |> map { result -> EstimatedSendGramsFees in + return EstimatedSendGramsFees(inFwdFee: result.sourceFees.inFwdFee, storageFee: result.sourceFees.storageFee, gasFee: result.sourceFees.gasFee, fwdFee: result.sourceFees.fwdFee) + } + } + } +} + public func sendGramsFromWallet(storage: WalletStorageInterface, tonInstance: TonInstance, walletInfo: WalletInfo, decryptedSecret: Data, localPassword: Data, toAddress: String, amount: Int64, textMessage: Data, forceIfDestinationNotInitialized: Bool, timeout: Int32, randomId: Int64) -> Signal { return walletAddress(publicKey: walletInfo.publicKey, tonInstance: tonInstance) |> castError(SendGramsFromWalletError.self) |> mapToSignal { fromAddress -> Signal in - return tonInstance.sendGramsFromWallet(decryptedSecret: decryptedSecret, localPassword: localPassword, walletInfo: walletInfo, fromAddress: fromAddress, toAddress: toAddress, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: forceIfDestinationNotInitialized, timeout: timeout, randomId: randomId) - |> mapToSignal { result -> Signal in - return storage.updateWalletRecords { records in - var records = records - for i in 0 ..< records.count { - if records[i].info.publicKey == walletInfo.publicKey { - if var state = records[i].state { - state.pendingTransactions.insert(result, at: 0) - records[i].state = state + return tonInstance.prepareSendGramsFromWalletQuery(decryptedSecret: decryptedSecret, localPassword: localPassword, walletInfo: walletInfo, fromAddress: fromAddress, toAddress: toAddress, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: forceIfDestinationNotInitialized, timeout: timeout, randomId: randomId) + |> mapToSignal { preparedQuery -> Signal in + return tonInstance.commitPreparedSendGramsQuery(preparedQuery) + |> retryTonRequest(isNetworkError: { error in + if case .network = error { + return true + } else { + return false + } + }) + |> mapToSignal { _ -> Signal in + return .complete() + } + |> then(.single(PendingWalletTransaction(timestamp: Int64(Date().timeIntervalSince1970), validUntilTimestamp: preparedQuery.validUntil, bodyHash: preparedQuery.bodyHash, address: toAddress, value: amount, comment: textMessage))) + |> mapToSignal { result in + return storage.updateWalletRecords { records in + var records = records + for i in 0 ..< records.count { + if records[i].info.publicKey == walletInfo.publicKey { + if var state = records[i].state { + state.pendingTransactions.insert(result, at: 0) + records[i].state = state + } } } + return records } - return records + |> map { _ -> PendingWalletTransaction in + return result + } + |> castError(SendGramsFromWalletError.self) } - |> map { _ -> PendingWalletTransaction in - return result - } - |> castError(SendGramsFromWalletError.self) } } } diff --git a/submodules/WalletUI/Sources/WalletSendScreen.swift b/submodules/WalletUI/Sources/WalletSendScreen.swift index 69e4996518..66cb9f9abe 100644 --- a/submodules/WalletUI/Sources/WalletSendScreen.swift +++ b/submodules/WalletUI/Sources/WalletSendScreen.swift @@ -347,6 +347,9 @@ public func walletSendScreen(context: WalletContext, randomId: Int64, walletInfo let presentationData = context.presentationData let state = stateValue.with { $0 } let amount = amountValue(state.amount) + let commentData = state.comment.data(using: .utf8) + let formattedAddress = String(state.address[state.address.startIndex.. Void)? - let theme = context.presentationData.theme - let controller = richTextAlertController(alertContext: AlertControllerContext(theme: theme.alert, themeSignal: .single(theme.alert)), title: title, text: attributedText, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Wallet_Navigation_Cancel, action: { - dismissAlertImpl?(true) - }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Wallet_Send_ConfirmationConfirm, action: { - dismissAlertImpl?(false) - dismissInputImpl?() + let _ = (verifySendGramsRequestAndEstimateFees(tonInstance: context.tonInstance, walletInfo: walletInfo, toAddress: destinationAddress, amount: amount, textMessage: commentData ?? Data(), timeout: 0) + |> deliverOnMainQueue).start(next: { [weak controller] fees in + controller?.dismiss() let presentationData = context.presentationData - let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) - presentControllerImpl?(controller, nil) - return ActionDisposable { [weak controller] in - Queue.mainQueue().async() { - controller?.dismiss() + + let title = NSAttributedString(string: presentationData.strings.Wallet_Send_Confirmation, font: Font.semibold(17.0), textColor: presentationData.theme.list.itemPrimaryTextColor) + + let feeAmount = fees.inFwdFee + fees.storageFee + fees.gasFee + fees.fwdFee + + let text = presentationData.strings.Wallet_Send_ConfirmationText(formatBalanceText(amount, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator), formattedAddress, "\(formatBalanceText(feeAmount, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator))").0 + let bodyAttributes = MarkdownAttributeSet(font: Font.regular(13.0), textColor: presentationData.theme.list.itemPrimaryTextColor) + let boldAttributes = MarkdownAttributeSet(font: Font.semibold(13.0), textColor: presentationData.theme.list.itemPrimaryTextColor) + let attributedText = NSMutableAttributedString(attributedString: parseMarkdownIntoAttributedString(text, attributes: MarkdownAttributes(body: bodyAttributes, bold: boldAttributes, link: bodyAttributes, linkAttribute: { _ in return nil }), textAlignment: .center)) + attributedText.addAttribute(.font, value: Font.monospace(14.0), range: NSMakeRange(attributedText.string.count - formattedAddress.count - 1, formattedAddress.count)) + + var dismissAlertImpl: ((Bool) -> Void)? + let theme = context.presentationData.theme + let controller = richTextAlertController(alertContext: AlertControllerContext(theme: theme.alert, themeSignal: .single(theme.alert)), title: title, text: attributedText, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Wallet_Navigation_Cancel, action: { + dismissAlertImpl?(true) + }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Wallet_Send_ConfirmationConfirm, action: { + dismissAlertImpl?(false) + dismissInputImpl?() + + let presentationData = context.presentationData + let progressSignal = Signal { subscriber in + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) + presentControllerImpl?(controller, nil) + return ActionDisposable { [weak controller] in + Queue.mainQueue().async() { + controller?.dismiss() + } } } - } - |> runOn(Queue.mainQueue()) - |> delay(0.15, queue: Queue.mainQueue()) - let progressDisposable = progressSignal.start() - - var serverSaltSignal = serverSaltValue.get() - |> take(1) - - serverSaltSignal = serverSaltSignal - |> afterDisposed { - Queue.mainQueue().async { - progressDisposable.dispose() + |> runOn(Queue.mainQueue()) + |> delay(0.15, queue: Queue.mainQueue()) + let progressDisposable = progressSignal.start() + + var serverSaltSignal = serverSaltValue.get() + |> take(1) + + serverSaltSignal = serverSaltSignal + |> afterDisposed { + Queue.mainQueue().async { + progressDisposable.dispose() + } } - } - - let _ = (serverSaltSignal - |> deliverOnMainQueue).start(next: { serverSalt in - if let serverSalt = serverSalt { - if let commentData = state.comment.data(using: .utf8) { - pushImpl?(WalletSplashScreen(context: context, mode: .sending(walletInfo, state.address, amount, commentData, randomId, serverSalt), walletCreatedPreloadState: nil)) + + let _ = (serverSaltSignal + |> deliverOnMainQueue).start(next: { serverSalt in + if let serverSalt = serverSalt { + if let commentData = state.comment.data(using: .utf8) { + pushImpl?(WalletSplashScreen(context: context, mode: .sending(walletInfo, state.address, amount, commentData, randomId, serverSalt), walletCreatedPreloadState: nil)) + } } + }) + })], allowInputInset: false, dismissAutomatically: false) + presentInGlobalOverlayImpl?(controller, nil) + + dismissAlertImpl = { [weak controller] animated in + if animated { + controller?.dismissAnimated() + } else { + controller?.dismiss() } - }) - })], allowInputInset: false, dismissAutomatically: false) - presentInGlobalOverlayImpl?(controller, nil) - - dismissAlertImpl = { [weak controller] animated in - if animated { - controller?.dismissAnimated() - } else { - controller?.dismiss() } - } + }, error: { [weak controller] error in + controller?.dismiss() + + let presentationData = context.presentationData + + var title: String? + let text: String + switch error { + case .generic: + text = presentationData.strings.Wallet_UnknownError + case .network: + title = presentationData.strings.Wallet_Send_NetworkErrorTitle + text = presentationData.strings.Wallet_Send_NetworkErrorText + case .notEnoughFunds: + title = presentationData.strings.Wallet_Send_ErrorNotEnoughFundsTitle + text = presentationData.strings.Wallet_Send_ErrorNotEnoughFundsText + case .messageTooLong: + text = presentationData.strings.Wallet_UnknownError + case .invalidAddress: + text = presentationData.strings.Wallet_Send_ErrorInvalidAddress + case .secretDecryptionFailed: + text = presentationData.strings.Wallet_Send_ErrorDecryptionFailed + case .destinationIsNotInitialized: + text = presentationData.strings.Wallet_UnknownError + } + let theme = presentationData.theme + let controller = textAlertController(alertContext: AlertControllerContext(theme: theme.alert, themeSignal: .single(theme.alert)), title: title, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Wallet_Alert_OK, action: { + })]) + presentControllerImpl?(controller, nil) + }) }) let walletState: Signal = getCombinedWalletState(storage: context.storage, subject: .wallet(walletInfo), tonInstance: context.tonInstance, onlyCached: true) diff --git a/submodules/WalletUI/Sources/WalletStrings.swift b/submodules/WalletUI/Sources/WalletStrings.swift index 0c923ada77..cbbbf2b641 100644 --- a/submodules/WalletUI/Sources/WalletStrings.swift +++ b/submodules/WalletUI/Sources/WalletStrings.swift @@ -399,8 +399,8 @@ public final class WalletStrings: Equatable { public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[178]!, self._r[178]!, [_1, _2, _3]) } - public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[179]!, self._r[179]!, [_1, _2]) + public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[179]!, self._r[179]!, [_1, _2, _3]) } public var Wallet_Created_ExportErrorText: String { return self._s[181]! } public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { diff --git a/submodules/ton/BUCK b/submodules/ton/BUCK index 9ddff5e11f..1829fad04f 100644 --- a/submodules/ton/BUCK +++ b/submodules/ton/BUCK @@ -22,6 +22,7 @@ ton_lib_names = [ "crc32c", "keys", "lite-client-common", + "smc-envelope", "tdactor", "tddb", "tdnet", diff --git a/submodules/ton/tonlib-src/CMakeLists.txt b/submodules/ton/tonlib-src/CMakeLists.txt index a2bb0676cb..3727df784f 100644 --- a/submodules/ton/tonlib-src/CMakeLists.txt +++ b/submodules/ton/tonlib-src/CMakeLists.txt @@ -179,6 +179,7 @@ endif() set(CMAKE_THREAD_PREFER_PTHREAD ON) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) +find_package(ZLIB REQUIRED) if (TON_ARCH AND NOT MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=${TON_ARCH}") @@ -350,6 +351,9 @@ target_link_libraries(test-ed25519 PRIVATE ton_crypto) add_executable(test-vm test/test-td-main.cpp ${TONVM_TEST_SOURCE}) target_link_libraries(test-vm PRIVATE ton_crypto fift-lib) +add_executable(test-smartcont test/test-td-main.cpp ${SMARTCONT_TEST_SOURCE}) +target_link_libraries(test-smartcont PRIVATE smc-envelope fift-lib ton_db) + add_executable(test-cells test/test-td-main.cpp ${CELLS_TEST_SOURCE}) target_link_libraries(test-cells PRIVATE ton_crypto) @@ -385,10 +389,12 @@ endif() enable_testing() set(TEST_OPTIONS "--regression ${CMAKE_CURRENT_SOURCE_DIR}/test/regression-tests.ans --filter -Bench") separate_arguments(TEST_OPTIONS) +add_test(test-ed25519-crypto crypto/test-ed25519-crypto) add_test(test-ed25519 test-ed25519) add_test(test-vm test-vm ${TEST_OPTIONS}) add_test(test-fift test-fift ${TEST_OPTIONS}) add_test(test-cells test-cells ${TEST_OPTIONS}) +add_test(test-smartcont test-smartcont) add_test(test-net test-net) add_test(test-actors test-tdactor) diff --git a/submodules/ton/tonlib-src/adnl/adnl-ext-client.cpp b/submodules/ton/tonlib-src/adnl/adnl-ext-client.cpp index d7a39d417e..1d10283b22 100644 --- a/submodules/ton/tonlib-src/adnl/adnl-ext-client.cpp +++ b/submodules/ton/tonlib-src/adnl/adnl-ext-client.cpp @@ -62,6 +62,9 @@ void AdnlExtClientImpl::hangup() { conn_ = {}; is_closing_ = true; ref_cnt_--; + for (auto &it : out_queries_) { + td::actor::ActorOwn<>(it.second); // send hangup + } try_stop(); } diff --git a/submodules/ton/tonlib-src/adnl/adnl-query.h b/submodules/ton/tonlib-src/adnl/adnl-query.h index e900c69987..3c0ebf065f 100644 --- a/submodules/ton/tonlib-src/adnl/adnl-query.h +++ b/submodules/ton/tonlib-src/adnl/adnl-query.h @@ -20,6 +20,7 @@ #include "td/actor/actor.h" #include "common/bitstring.h" +#include "common/errorcode.h" #include "td/utils/buffer.h" #include @@ -52,6 +53,9 @@ class AdnlQuery : public td::actor::Actor { } void tear_down() override { destroy_(id_); + if (promise_) { + promise_.set_error(td::Status::Error(ErrorCode::cancelled, "Cancelled")); + } } private: diff --git a/submodules/ton/tonlib-src/common/int-to-string.hpp b/submodules/ton/tonlib-src/common/int-to-string.hpp new file mode 100644 index 0000000000..414342cd0f --- /dev/null +++ b/submodules/ton/tonlib-src/common/int-to-string.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include "td/utils/int_types.h" +#include "td/utils/Slice.h" + +namespace ton { + +template +typename std::enable_if_t::value, td::MutableSlice> store_int_to_slice(td::MutableSlice S, + const T &v) { + CHECK(S.size() >= sizeof(T)); + S.copy_from(td::Slice(reinterpret_cast(&v), sizeof(T))); + return S.remove_prefix(sizeof(T)); +} + +template +typename std::enable_if_t::value, T> fetch_int_from_slice(td::Slice S) { + CHECK(S.size() >= sizeof(T)); + T v; + td::MutableSlice(reinterpret_cast(&v), sizeof(T)).copy_from(S.truncate(sizeof(T))); + return v; +} + +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/CMakeLists.txt b/submodules/ton/tonlib-src/crypto/CMakeLists.txt index acf88eeef6..f2cb5cbb93 100644 --- a/submodules/ton/tonlib-src/crypto/CMakeLists.txt +++ b/submodules/ton/tonlib-src/crypto/CMakeLists.txt @@ -88,6 +88,7 @@ set(TON_CRYPTO_SOURCE vm/cells/CellBuilder.cpp vm/cells/CellHash.cpp vm/cells/CellSlice.cpp + vm/cells/CellString.cpp vm/cells/CellTraits.cpp vm/cells/CellUsageTree.cpp vm/cells/DataCell.cpp @@ -99,6 +100,7 @@ set(TON_CRYPTO_SOURCE vm/cells/CellBuilder.h vm/cells/CellHash.h vm/cells/CellSlice.h + vm/cells/CellString.h vm/cells/CellTraits.h vm/cells/CellUsageTree.h vm/cells/CellWithStorage.h @@ -197,6 +199,24 @@ set(BLOCK_SOURCE block/transaction.h ) +set(SMC_ENVELOPE_SOURCE + smc-envelope/GenericAccount.cpp + smc-envelope/MultisigWallet.cpp + smc-envelope/SmartContract.cpp + smc-envelope/SmartContractCode.cpp + smc-envelope/TestGiver.cpp + smc-envelope/TestWallet.cpp + smc-envelope/Wallet.cpp + + smc-envelope/GenericAccount.h + smc-envelope/MultisigWallet.h + smc-envelope/SmartContract.h + smc-envelope/SmartContractCode.h + smc-envelope/TestGiver.h + smc-envelope/TestWallet.h + smc-envelope/Wallet.h +) + set(ED25519_TEST_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/test/Ed25519.cpp PARENT_SCOPE @@ -217,6 +237,11 @@ set(TONVM_TEST_SOURCE PARENT_SCOPE ) +set(SMARTCONT_TEST_SOURCE + ${CMAKE_CURRENT_SOURCE_DIR}/test/test-smartcont.cpp + PARENT_SCOPE +) + set(FIFT_TEST_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/test/fift.cpp PARENT_SCOPE @@ -279,6 +304,7 @@ if (TON_USE_ASAN AND NOT WIN32) set(TURN_OFF_LSAN export LSAN_OPTIONS=detect_leaks=0) endif() +file(MAKE_DIRECTORY smartcont/auto) if (NOT CMAKE_CROSSCOMPILING) set(GENERATE_TLB_CMD tlbc) add_custom_command( @@ -295,29 +321,51 @@ if (NOT CMAKE_CROSSCOMPILING) add_custom_target(gen_fif ALL) function(GenFif) set(options ) - set(oneValueArgs DEST) + set(oneValueArgs DEST NAME) set(multiValueArgs SOURCE) set(FUNC_LIB_SOURCE smartcont/stdlib.fc) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) string(REGEX REPLACE "[^a-zA-Z_]" "_" ID ${ARG_DEST}) + set(ARG_DEST_FIF "${ARG_DEST}.fif") add_custom_command( - COMMENT "Generate ${ARG_DEST}" + COMMENT "Generate ${ARG_DEST_FIF}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMAND func -PS -o ${ARG_DEST} ${FUNC_LIB_SOURCE} ${ARG_SOURCE} + COMMAND func -PS -o ${ARG_DEST_FIF} ${FUNC_LIB_SOURCE} ${ARG_SOURCE} MAIN_DEPENDENCY ${ARG_SOURCE} DEPENDS func ${FUNC_LIB_SOURCE} - OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${ARG_DEST} + OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${ARG_DEST_FIF} ) - add_custom_target(gen_fif_${ID} DEPENDS ${ARG_DEST}) + set(ARG_DEST_CPP "${ARG_DEST}.cpp") + add_custom_command( + COMMENT "Generate ${ARG_DEST_CPP}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMAND fift -Ifift/lib:smartcont -s asm-to-cpp.fif ${ARG_DEST_FIF} ${ARG_DEST_CPP} ${ARG_NAME} + MAIN_DEPENDENCY ${ARG_SOURCE} + DEPENDS fift ${ARG_DEST_FIF} smartcont/asm-to-cpp.fif + OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${ARG_DEST_CPP} + ) + add_custom_target(gen_fif_${ID} DEPENDS ${ARG_DEST_FIF} ${ARG_DEST_CPP}) add_dependencies(gen_fif gen_fif_${ID}) endfunction() - GenFif(DEST smartcont/config-code.fif SOURCE smartcont/config-code.fc) - GenFif(DEST smartcont/wallet-code.fif SOURCE smartcont/wallet-code.fc) - GenFif(DEST smartcont/simple-wallet-code.fif SOURCE smartcont/simple-wallet-code.fc) - GenFif(DEST smartcont/highload-wallet-code.fif SOURCE smartcont/highload-wallet-code.fc) - GenFif(DEST smartcont/highload-wallet-v2-code.fif SOURCE smartcont/highload-wallet-v2-code.fc) - GenFif(DEST smartcont/elector-code.fif SOURCE smartcont/elector-code.fc) + GenFif(DEST smartcont/auto/config-code SOURCE smartcont/config-code.fc NAME config) + GenFif(DEST smartcont/auto/wallet-code SOURCE smartcont/wallet-code.fc NAME wallet) + GenFif(DEST smartcont/auto/simple-wallet-code SOURCE smartcont/simple-wallet-code.fc NAME simple-wallet) + GenFif(DEST smartcont/auto/highload-wallet-code SOURCE smartcont/highload-wallet-code.fc NAME highload-wallet) + GenFif(DEST smartcont/auto/highload-wallet-v2-code SOURCE smartcont/highload-wallet-v2-code.fc NAME highoad-wallet-v2) + GenFif(DEST smartcont/auto/elector-code SOURCE smartcont/elector-code.fc NAME elector-code) + GenFif(DEST smartcont/auto/multisig-code SOURCE smartcont/multisig-code.fc NAME multisig) + GenFif(DEST smartcont/auto/restricted-wallet-code SOURCE smartcont/restricted-wallet-code.fc NAME restricted-wallet) + GenFif(DEST smartcont/auto/restricted-wallet2-code SOURCE smartcont/restricted-wallet2-code.fc NAME restricted-wallet2) + + GenFif(DEST smartcont/auto/simple-wallet-ext-code SOURCE smartcont/simple-wallet-ext-code.fc NAME simple-wallet-ext) +endif() + +add_library(smc-envelope ${SMC_ENVELOPE_SOURCE}) +target_include_directories(smc-envelope PUBLIC $) +target_link_libraries(smc-envelope PUBLIC ton_crypto PRIVATE tdutils ton_block) +if (NOT CMAKE_CROSSCOMPILING) + add_dependencies(smc-envelope gen_fif) endif() add_executable(create-state block/create-state.cpp) diff --git a/submodules/ton/tonlib-src/crypto/block/block-auto.cpp b/submodules/ton/tonlib-src/crypto/block/block-auto.cpp index 75dd9f659e..98ca0888bb 100644 --- a/submodules/ton/tonlib-src/crypto/block/block-auto.cpp +++ b/submodules/ton/tonlib-src/crypto/block/block-auto.cpp @@ -10481,7 +10481,7 @@ bool BlockInfo::skip(vm::CellSlice& cs) const { && cs.advance(392) && (!not_master || cs.advance_refs(1)) && cs.advance_refs(1) - && (!vert_seq_no || cs.advance_refs(1)); + && (!vert_seqno_incr || cs.advance_refs(1)); } bool BlockInfo::validate_skip(vm::CellSlice& cs, bool weak) const { @@ -10501,7 +10501,7 @@ bool BlockInfo::validate_skip(vm::CellSlice& cs, bool weak) const { && cs.advance(288) && (!not_master || t_BlkMasterInfo.validate_skip_ref(cs, weak)) && BlkPrevInfo{after_merge}.validate_skip_ref(cs, weak) - && (!vert_seq_no || t_BlkPrevInfo_0.validate_skip_ref(cs, weak)); + && (!vert_seqno_incr || t_BlkPrevInfo_0.validate_skip_ref(cs, weak)); } bool BlockInfo::unpack(vm::CellSlice& cs, BlockInfo::Record& data) const { @@ -10531,7 +10531,7 @@ bool BlockInfo::unpack(vm::CellSlice& cs, BlockInfo::Record& data) const { && cs.fetch_uint_to(32, data.prev_key_block_seqno) && (!data.not_master || cs.fetch_ref_to(data.master_ref)) && cs.fetch_ref_to(data.prev_ref) - && (!data.vert_seq_no || cs.fetch_ref_to(data.prev_vert_ref)); + && (!data.vert_seqno_incr || cs.fetch_ref_to(data.prev_vert_ref)); } bool BlockInfo::cell_unpack(Ref cell_ref, BlockInfo::Record& data) const { @@ -10567,7 +10567,7 @@ bool BlockInfo::pack(vm::CellBuilder& cb, const BlockInfo::Record& data) const { && cb.store_ulong_rchk_bool(data.prev_key_block_seqno, 32) && (!data.not_master || cb.store_ref_bool(data.master_ref)) && cb.store_ref_bool(data.prev_ref) - && (!data.vert_seq_no || cb.store_ref_bool(data.prev_vert_ref)); + && (!data.vert_seqno_incr || cb.store_ref_bool(data.prev_vert_ref)); } bool BlockInfo::cell_pack(Ref& cell_ref, const BlockInfo::Record& data) const { @@ -10613,7 +10613,7 @@ bool BlockInfo::print_skip(PrettyPrinter& pp, vm::CellSlice& cs) const { && (!not_master || (pp.field("master_ref") && t_BlkMasterInfo.print_ref(pp, cs.fetch_ref()))) && pp.field("prev_ref") && BlkPrevInfo{after_merge}.print_ref(pp, cs.fetch_ref()) - && (!vert_seq_no || (pp.field("prev_vert_ref") && t_BlkPrevInfo_0.print_ref(pp, cs.fetch_ref()))) + && (!vert_seqno_incr || (pp.field("prev_vert_ref") && t_BlkPrevInfo_0.print_ref(pp, cs.fetch_ref()))) && pp.close(); } diff --git a/submodules/ton/tonlib-src/crypto/block/block-auto.h b/submodules/ton/tonlib-src/crypto/block/block-auto.h index fb9e1770d6..9c8c9c3724 100644 --- a/submodules/ton/tonlib-src/crypto/block/block-auto.h +++ b/submodules/ton/tonlib-src/crypto/block/block-auto.h @@ -4466,7 +4466,7 @@ struct BlockInfo::Record { unsigned prev_key_block_seqno; // prev_key_block_seqno : uint32 Ref master_ref; // master_ref : not_master?^BlkMasterInfo Ref prev_ref; // prev_ref : ^(BlkPrevInfo after_merge) - Ref prev_vert_ref; // prev_vert_ref : vert_seq_no?^(BlkPrevInfo 0) + Ref prev_vert_ref; // prev_vert_ref : vert_seqno_incr?^(BlkPrevInfo 0) Record() = default; Record(unsigned _version, bool _not_master, bool _after_merge, bool _before_split, bool _after_split, bool _want_split, bool _want_merge, bool _key_block, bool _vert_seqno_incr, int _flags, int _seq_no, int _vert_seq_no, Ref _shard, unsigned _gen_utime, unsigned long long _start_lt, unsigned long long _end_lt, unsigned _gen_validator_list_hash_short, unsigned _gen_catchain_seqno, unsigned _min_ref_mc_seqno, unsigned _prev_key_block_seqno, Ref _master_ref, Ref _prev_ref, Ref _prev_vert_ref) : version(_version), not_master(_not_master), after_merge(_after_merge), before_split(_before_split), after_split(_after_split), want_split(_want_split), want_merge(_want_merge), key_block(_key_block), vert_seqno_incr(_vert_seqno_incr), flags(_flags), seq_no(_seq_no), vert_seq_no(_vert_seq_no), shard(std::move(_shard)), gen_utime(_gen_utime), start_lt(_start_lt), end_lt(_end_lt), gen_validator_list_hash_short(_gen_validator_list_hash_short), gen_catchain_seqno(_gen_catchain_seqno), min_ref_mc_seqno(_min_ref_mc_seqno), prev_key_block_seqno(_prev_key_block_seqno), master_ref(std::move(_master_ref)), prev_ref(std::move(_prev_ref)), prev_vert_ref(std::move(_prev_vert_ref)) {} }; diff --git a/submodules/ton/tonlib-src/crypto/block/block.cpp b/submodules/ton/tonlib-src/crypto/block/block.cpp index 7b8074bfbc..80723b5856 100644 --- a/submodules/ton/tonlib-src/crypto/block/block.cpp +++ b/submodules/ton/tonlib-src/crypto/block/block.cpp @@ -718,12 +718,9 @@ td::Status ShardState::unpack_state(ton::BlockIdExt blkid, Ref prev_st return td::Status::Error(-666, "shardchain state for "s + blkid.to_str() + " corresponds to incorrect workchain or shard " + shard1.to_str()); } - if (state.vert_seq_no) { - return td::Status::Error( - -666, "shardchain state for "s + blkid.to_str() + " has non-zero vert_seq_no, which is unsupported"); - } id_ = blkid; root_ = std::move(prev_state_root); + vert_seqno_ = state.vert_seq_no; before_split_ = state.before_split; account_dict_ = std::make_unique( vm::load_cell_slice(std::move(state.accounts)).prefetch_ref(), 256, block::tlb::aug_ShardAccounts); @@ -811,7 +808,7 @@ td::Status ShardState::unpack_out_msg_queue_info(Ref out_msg_queue_inf } out_msg_queue_ = std::make_unique(std::move(qinfo.out_queue), 352, block::tlb::aug_OutMsgQueue); - if (verbosity >= 3 * 0) { + if (verbosity >= 3 * 1) { LOG(DEBUG) << "unpacking ProcessedUpto of our previous block " << id_.to_str(); block::gen::t_ProcessedInfo.print(std::cerr, qinfo.proc_info); } @@ -953,14 +950,16 @@ td::Status ShardState::merge_with(ShardState& sib) { lt_ = std::max(lt_, sib.lt_); // 9. compute underload & overload history underload_history_ = overload_history_ = 0; + // 10. compute vert_seqno + vert_seqno_ = std::max(vert_seqno_, sib.vert_seqno_); // Anything else? add here // ... - // 10. compute new root + // 100. compute new root if (!block::gen::t_ShardState.cell_pack_split_state(root_, std::move(root_), std::move(sib.root_))) { return td::Status::Error(-667, "cannot construct a virtual split_state after a merge"); } - // 11. invalidate sibling, change id_ to the (virtual) common parent + // 101. invalidate sibling, change id_ to the (virtual) common parent sib.invalidate(); id_.id.shard = shard.shard; id_.file_hash.set_zero(); diff --git a/submodules/ton/tonlib-src/crypto/block/block.h b/submodules/ton/tonlib-src/crypto/block/block.h index 9fbeedf29f..fd9a724f26 100644 --- a/submodules/ton/tonlib-src/crypto/block/block.h +++ b/submodules/ton/tonlib-src/crypto/block/block.h @@ -26,6 +26,7 @@ #include #include "tl/tlblib.hpp" #include "td/utils/bits.h" +#include "td/utils/CancellationToken.h" #include "td/utils/StringBuilder.h" #include "ton/ton-types.h" @@ -162,12 +163,12 @@ struct MsgProcessedUpto { MsgProcessedUpto(ton::ShardId _shard, ton::BlockSeqno _mcseqno, ton::LogicalTime _lt, td::ConstBitPtr _hash) : shard(_shard), mc_seqno(_mcseqno), last_inmsg_lt(_lt), last_inmsg_hash(_hash) { } - bool operator<(const MsgProcessedUpto& other) const & { + bool operator<(const MsgProcessedUpto& other) const& { return shard < other.shard || (shard == other.shard && mc_seqno < other.mc_seqno); } - bool contains(const MsgProcessedUpto& other) const &; + bool contains(const MsgProcessedUpto& other) const&; bool contains(ton::ShardId other_shard, ton::LogicalTime other_lt, td::ConstBitPtr other_hash, - ton::BlockSeqno other_mc_seqno) const &; + ton::BlockSeqno other_mc_seqno) const&; // NB: this is for checking whether we have already imported an internal message bool already_processed(const EnqueuedMsgDescr& msg) const; }; @@ -384,7 +385,7 @@ struct ShardState { int global_id_; ton::UnixTime utime_; ton::LogicalTime lt_; - ton::BlockSeqno mc_blk_seqno_, min_ref_mc_seqno_; + ton::BlockSeqno mc_blk_seqno_, min_ref_mc_seqno_, vert_seqno_; ton::BlockIdExt mc_blk_ref_; ton::LogicalTime mc_blk_lt_; bool before_split_{false}; @@ -573,7 +574,7 @@ struct BlockProofChain { bool last_link_incomplete() const { return !links.empty() && last_link().incomplete(); } - td::Status validate(); + td::Status validate(td::CancellationToken cancellation_token = {}); }; int filter_out_msg_queue(vm::AugmentedDictionary& out_queue, ton::ShardIdFull old_shard, ton::ShardIdFull subshard); diff --git a/submodules/ton/tonlib-src/crypto/block/block.tlb b/submodules/ton/tonlib-src/crypto/block/block.tlb index 5108294770..d4bba1a182 100644 --- a/submodules/ton/tonlib-src/crypto/block/block.tlb +++ b/submodules/ton/tonlib-src/crypto/block/block.tlb @@ -421,7 +421,7 @@ block_info#9bc7a987 version:uint32 prev_key_block_seqno:uint32 master_ref:not_master?^BlkMasterInfo prev_ref:^(BlkPrevInfo after_merge) - prev_vert_ref:vert_seq_no?^(BlkPrevInfo 0) + prev_vert_ref:vert_seqno_incr?^(BlkPrevInfo 0) = BlockInfo; prev_blk_info$_ prev:ExtBlkRef = BlkPrevInfo 0; diff --git a/submodules/ton/tonlib-src/crypto/block/check-proof.cpp b/submodules/ton/tonlib-src/crypto/block/check-proof.cpp index c459b1b458..7db7a97c6c 100644 --- a/submodules/ton/tonlib-src/crypto/block/check-proof.cpp +++ b/submodules/ton/tonlib-src/crypto/block/check-proof.cpp @@ -32,7 +32,7 @@ namespace block { using namespace std::literals::string_literals; td::Status check_block_header_proof(td::Ref root, ton::BlockIdExt blkid, ton::Bits256* store_shard_hash_to, - bool check_state_hash, td::uint32* save_utime) { + bool check_state_hash, td::uint32* save_utime, ton::LogicalTime* save_lt) { ton::RootHash vhash{root->get_hash().bits()}; if (vhash != blkid.root_hash) { return td::Status::Error(PSTRING() << " block header for block " << blkid.to_str() << " has incorrect root hash " @@ -50,6 +50,9 @@ td::Status check_block_header_proof(td::Ref root, ton::BlockIdExt blki if (save_utime) { *save_utime = info.gen_utime; } + if (save_lt) { + *save_lt = info.end_lt; + } if (store_shard_hash_to) { vm::CellSlice upd_cs{vm::NoVmSpec(), blk.state_update}; if (!(upd_cs.is_special() && upd_cs.prefetch_long(8) == 4 // merkle update @@ -157,7 +160,7 @@ td::Status check_shard_proof(ton::BlockIdExt blk, ton::BlockIdExt shard_blk, td: td::Status check_account_proof(td::Slice proof, ton::BlockIdExt shard_blk, const block::StdAddress& addr, td::Ref root, ton::LogicalTime* last_trans_lt, ton::Bits256* last_trans_hash, - td::uint32* save_utime) { + td::uint32* save_utime, ton::LogicalTime* save_lt) { TRY_RESULT_PREFIX(Q_roots, vm::std_boc_deserialize_multi(std::move(proof)), "cannot deserialize account proof"); if (Q_roots.size() != 2) { return td::Status::Error(PSLICE() << "account state proof must have exactly two roots"); @@ -174,7 +177,7 @@ td::Status check_account_proof(td::Slice proof, ton::BlockIdExt shard_blk, const } ton::Bits256 state_hash = state_root->get_hash().bits(); TRY_STATUS_PREFIX(check_block_header_proof(vm::MerkleProof::virtualize(std::move(Q_roots[0]), 1), shard_blk, - &state_hash, true, save_utime), + &state_hash, true, save_utime, save_lt), "error in account shard block header proof : "); block::gen::ShardStateUnsplit::Record sstate; if (!(tlb::unpack_cell(std::move(state_root), sstate))) { @@ -218,8 +221,6 @@ td::Status check_account_proof(td::Slice proof, ton::BlockIdExt shard_blk, const td::Result AccountState::validate(ton::BlockIdExt ref_blk, block::StdAddress addr) const { TRY_RESULT_PREFIX(root, vm::std_boc_deserialize(state.as_slice(), true), "cannot deserialize account state"); - LOG(INFO) << "got account state for " << addr << " with respect to blocks " << blk.to_str() - << (shard_blk == blk ? "" : std::string{" and "} + shard_blk.to_str()); if (blk != ref_blk && ref_blk.id.seqno != ~0U) { return td::Status::Error(PSLICE() << "obtained getAccountState() for a different reference block " << blk.to_str() << " instead of requested " << ref_blk.to_str()); @@ -238,7 +239,7 @@ td::Result AccountState::validate(ton::BlockIdExt ref_blk, b Info res; TRY_STATUS(block::check_account_proof(proof.as_slice(), shard_blk, addr, root, &res.last_trans_lt, - &res.last_trans_hash, &res.gen_utime)); + &res.last_trans_hash, &res.gen_utime, &res.gen_lt)); res.root = std::move(root); return res; @@ -424,7 +425,7 @@ td::Status BlockProofLink::validate(td::uint32* save_utime) const { } } -td::Status BlockProofChain::validate() { +td::Status BlockProofChain::validate(td::CancellationToken cancellation_token) { valid = false; has_key_block = false; has_utime = false; @@ -450,6 +451,9 @@ td::Status BlockProofChain::validate() { << link.from.to_str() << " but the previous link ends at different block " << cur.to_str()); } + if (cancellation_token) { + return td::Status::Error("Cancelled"); + } auto err = link.validate(&last_utime); if (err.is_error()) { return td::Status::Error(PSTRING() << "link #" << i << " in BlockProofChain is invalid: " << err.to_string()); diff --git a/submodules/ton/tonlib-src/crypto/block/check-proof.h b/submodules/ton/tonlib-src/crypto/block/check-proof.h index 87d6b442b7..173ae9e475 100644 --- a/submodules/ton/tonlib-src/crypto/block/check-proof.h +++ b/submodules/ton/tonlib-src/crypto/block/check-proof.h @@ -26,11 +26,12 @@ using td::Ref; td::Status check_block_header_proof(td::Ref root, ton::BlockIdExt blkid, ton::Bits256* store_shard_hash_to = nullptr, bool check_state_hash = false, - td::uint32* save_utime = nullptr); + td::uint32* save_utime = nullptr, ton::LogicalTime* save_lt = nullptr); td::Status check_shard_proof(ton::BlockIdExt blk, ton::BlockIdExt shard_blk, td::Slice shard_proof); td::Status check_account_proof(td::Slice proof, ton::BlockIdExt shard_blk, const block::StdAddress& addr, td::Ref root, ton::LogicalTime* last_trans_lt = nullptr, - ton::Bits256* last_trans_hash = nullptr, td::uint32* save_utime = nullptr); + ton::Bits256* last_trans_hash = nullptr, td::uint32* save_utime = nullptr, + ton::LogicalTime* save_lt = nullptr); td::Result check_state_proof(ton::BlockIdExt blkid, td::Slice proof); td::Result> check_extract_state_proof(ton::BlockIdExt blkid, td::Slice proof, td::Slice data); @@ -48,6 +49,7 @@ struct AccountState { td::Ref root; ton::LogicalTime last_trans_lt = 0; ton::Bits256 last_trans_hash; + ton::LogicalTime gen_lt{0}; td::uint32 gen_utime{0}; }; diff --git a/submodules/ton/tonlib-src/crypto/block/mc-config.cpp b/submodules/ton/tonlib-src/crypto/block/mc-config.cpp index ceefca79e5..2b3fdb44b0 100644 --- a/submodules/ton/tonlib-src/crypto/block/mc-config.cpp +++ b/submodules/ton/tonlib-src/crypto/block/mc-config.cpp @@ -517,6 +517,58 @@ td::Result> Config::get_storage_prices() const { return std::move(res); } +td::Result Config::get_gas_limits_prices(bool is_masterchain) const { + GasLimitsPrices res; + auto id = is_masterchain ? 20 : 21; + auto cell = get_config_param(id); + if (cell.is_null()) { + return td::Status::Error(PSLICE() << "configuration parameter " << id << " with gas prices is absent"); + } + auto cs = vm::load_cell_slice(std::move(cell)); + block::gen::GasLimitsPrices::Record_gas_flat_pfx flat; + if (tlb::unpack(cs, flat)) { + cs = *flat.other; + res.flat_gas_limit = flat.flat_gas_limit; + res.flat_gas_price = flat.flat_gas_price; + } + auto f = [&](const auto& r, td::uint64 spec_limit) { + res.gas_limit = r.gas_limit; + res.special_gas_limit = spec_limit; + res.gas_credit = r.gas_credit; + res.gas_price = r.gas_price; + res.freeze_due_limit = r.freeze_due_limit; + res.delete_due_limit = r.delete_due_limit; + }; + block::gen::GasLimitsPrices::Record_gas_prices_ext rec; + if (tlb::unpack(cs, rec)) { + f(rec, rec.special_gas_limit); + } else { + block::gen::GasLimitsPrices::Record_gas_prices rec0; + if (tlb::unpack(cs, rec0)) { + f(rec0, rec0.gas_limit); + } else { + return td::Status::Error(PSLICE() << "configuration parameter " << id + << " with gas prices is invalid - can't parse"); + } + } + return res; +} + +td::Result Config::get_msg_prices(bool is_masterchain) const { + auto id = is_masterchain ? 24 : 25; + auto cell = get_config_param(id); + if (cell.is_null()) { + return td::Status::Error(PSLICE() << "configuration parameter " << id << " with msg prices is absent"); + } + auto cs = vm::load_cell_slice(std::move(cell)); + block::gen::MsgForwardPrices::Record rec; + if (!tlb::unpack(cs, rec)) { + return td::Status::Error(PSLICE() << "configuration parameter " << id + << " with msg prices is invalid - can't parse"); + } + return MsgPrices(rec.lump_price, rec.bit_price, rec.cell_price, rec.ihr_price_factor, rec.first_frac, rec.next_frac); +} + CatchainValidatorsConfig Config::unpack_catchain_validators_config(Ref cell) { block::gen::CatchainConfig::Record cfg; if (cell.is_null() || !tlb::unpack_cell(std::move(cell), cfg)) { @@ -1019,47 +1071,47 @@ std::vector ShardConfig::get_shard_hash_ids( std::vector res; bool mcout = mc_shard_hash_.is_null() || !mc_shard_hash_->seqno(); // include masterchain as a shard if seqno > 0 bool ok = shard_hashes_dict_->check_for_each( - [&res, &mcout, mc_shard_hash_ = mc_shard_hash_, &filter ](Ref cs_ref, td::ConstBitPtr key, int n) - ->bool { - int workchain = (int)key.get_int(n); - if (workchain >= 0 && !mcout) { - if (filter(ton::ShardIdFull{ton::masterchainId}, true)) { - res.emplace_back(mc_shard_hash_->blk_.id); - } - mcout = true; - } - if (!cs_ref->have_refs()) { + [&res, &mcout, mc_shard_hash_ = mc_shard_hash_, &filter](Ref cs_ref, td::ConstBitPtr key, + int n) -> bool { + int workchain = (int)key.get_int(n); + if (workchain >= 0 && !mcout) { + if (filter(ton::ShardIdFull{ton::masterchainId}, true)) { + res.emplace_back(mc_shard_hash_->blk_.id); + } + mcout = true; + } + if (!cs_ref->have_refs()) { + return false; + } + std::stack, unsigned long long>> stack; + stack.emplace(cs_ref->prefetch_ref(), ton::shardIdAll); + while (!stack.empty()) { + vm::CellSlice cs{vm::NoVm{}, std::move(stack.top().first)}; + unsigned long long shard = stack.top().second; + stack.pop(); + int t = (int)cs.fetch_ulong(1); + if (t < 0) { + return false; + } + if (!filter(ton::ShardIdFull{workchain, shard}, !t)) { + continue; + } + if (!t) { + if (!(cs.advance(4) && cs.have(32))) { return false; } - std::stack, unsigned long long>> stack; - stack.emplace(cs_ref->prefetch_ref(), ton::shardIdAll); - while (!stack.empty()) { - vm::CellSlice cs{vm::NoVm{}, std::move(stack.top().first)}; - unsigned long long shard = stack.top().second; - stack.pop(); - int t = (int)cs.fetch_ulong(1); - if (t < 0) { - return false; - } - if (!filter(ton::ShardIdFull{workchain, shard}, !t)) { - continue; - } - if (!t) { - if (!(cs.advance(4) && cs.have(32))) { - return false; - } - res.emplace_back(workchain, shard, (int)cs.prefetch_ulong(32)); - continue; - } - unsigned long long delta = (td::lower_bit64(shard) >> 1); - if (!delta || cs.size_ext() != 0x20000) { - return false; - } - stack.emplace(cs.prefetch_ref(1), shard + delta); - stack.emplace(cs.prefetch_ref(0), shard - delta); - } - return true; - }, + res.emplace_back(workchain, shard, (int)cs.prefetch_ulong(32)); + continue; + } + unsigned long long delta = (td::lower_bit64(shard) >> 1); + if (!delta || cs.size_ext() != 0x20000) { + return false; + } + stack.emplace(cs.prefetch_ref(1), shard + delta); + stack.emplace(cs.prefetch_ref(0), shard - delta); + } + return true; + }, true); if (!ok) { return {}; @@ -1415,8 +1467,8 @@ td::Result> Config::get_special_smartcontracts(b return td::Status::Error(-666, "configuration loaded without fundamental smart contract list"); } std::vector res; - if (!special_smc_dict->check_for_each([&res, &without_config, conf_addr = config_addr.bits() ]( - Ref cs_ref, td::ConstBitPtr key, int n) { + if (!special_smc_dict->check_for_each([&res, &without_config, conf_addr = config_addr.bits()]( + Ref cs_ref, td::ConstBitPtr key, int n) { if (cs_ref->size_ext() || n != 256) { return false; } diff --git a/submodules/ton/tonlib-src/crypto/block/mc-config.h b/submodules/ton/tonlib-src/crypto/block/mc-config.h index dc48ec0256..018a47adbe 100644 --- a/submodules/ton/tonlib-src/crypto/block/mc-config.h +++ b/submodules/ton/tonlib-src/crypto/block/mc-config.h @@ -50,7 +50,7 @@ struct ValidatorDescr { : pubkey(_pubkey), weight(_weight), cum_weight(_cum_weight) { adnl_addr.set_zero(); } - bool operator<(td::uint64 wt_pos) const & { + bool operator<(td::uint64 wt_pos) const& { return cum_weight < wt_pos; } }; @@ -327,6 +327,46 @@ struct StoragePrices { , mc_bit_price(_mc_bprice) , mc_cell_price(_mc_cprice) { } + static td::RefInt256 compute_storage_fees(ton::UnixTime now, const std::vector& pricing, + const vm::CellStorageStat& storage_stat, ton::UnixTime last_paid, + bool is_special, bool is_masterchain); +}; + +struct GasLimitsPrices { + td::uint64 flat_gas_limit{0}; + td::uint64 flat_gas_price{0}; + td::uint64 gas_price{0}; + td::uint64 special_gas_limit{0}; + td::uint64 gas_limit{0}; + td::uint64 gas_credit{0}; + td::uint64 block_gas_limit{0}; + td::uint64 freeze_due_limit{0}; + td::uint64 delete_due_limit{0}; + + td::RefInt256 compute_gas_price(td::uint64 gas_used) const; +}; + +// msg_fwd_fees = (lump_price + ceil((bit_price * msg.bits + cell_price * msg.cells)/2^16)) nanograms +// ihr_fwd_fees = ceil((msg_fwd_fees * ihr_price_factor)/2^16) nanograms +// bits in the root cell of a message are not included in msg.bits (lump_price pays for them) + +struct MsgPrices { + td::uint64 lump_price; + td::uint64 bit_price; + td::uint64 cell_price; + td::uint32 ihr_factor; + td::uint32 first_frac; + td::uint32 next_frac; + td::uint64 compute_fwd_fees(td::uint64 cells, td::uint64 bits) const; + std::pair compute_fwd_ihr_fees(td::uint64 cells, td::uint64 bits, + bool ihr_disabled = false) const; + MsgPrices() = default; + MsgPrices(td::uint64 lump, td::uint64 bitp, td::uint64 cellp, td::uint32 ihrf, td::uint32 firstf, td::uint32 nextf) + : lump_price(lump), bit_price(bitp), cell_price(cellp), ihr_factor(ihrf), first_frac(firstf), next_frac(nextf) { + } + td::RefInt256 get_first_part(td::RefInt256 total) const; + td::uint64 get_first_part(td::uint64 total) const; + td::RefInt256 get_next_part(td::RefInt256 total) const; }; struct CatchainValidatorsConfig { @@ -499,6 +539,8 @@ class Config { bool is_special_smartcontract(const ton::StdSmcAddress& addr) const; static td::Result> unpack_validator_set(Ref valset_root); td::Result> get_storage_prices() const; + td::Result get_gas_limits_prices(bool is_masterchain = false) const; + td::Result get_msg_prices(bool is_masterchain = false) const; static CatchainValidatorsConfig unpack_catchain_validators_config(Ref cell); CatchainValidatorsConfig get_catchain_validators_config() const; td::Status visit_validator_params() const; @@ -556,7 +598,7 @@ class ConfigInfo : public Config, public ShardConfig { needAccountsRoot = 64, needPrevBlocks = 128 }; - int vert_seqno{-1}; + ton::BlockSeqno vert_seqno{~0U}; int global_id_{0}; ton::UnixTime utime{0}; ton::LogicalTime lt{0}; @@ -604,6 +646,9 @@ class ConfigInfo : public Config, public ShardConfig { Ref get_state_extra_root() const { return state_extra_root_; } + ton::BlockSeqno get_vert_seqno() const { + return vert_seqno; + } ton::CatchainSeqno get_shard_cc_seqno(ton::ShardIdFull shard) const; bool get_last_key_block(ton::BlockIdExt& blkid, ton::LogicalTime& blklt, bool strict = false) const; bool get_old_mc_block_id(ton::BlockSeqno seqno, ton::BlockIdExt& blkid, ton::LogicalTime* end_lt = nullptr) const; diff --git a/submodules/ton/tonlib-src/crypto/block/transaction.cpp b/submodules/ton/tonlib-src/crypto/block/transaction.cpp index 24fc731ee4..6667cf8774 100644 --- a/submodules/ton/tonlib-src/crypto/block/transaction.cpp +++ b/submodules/ton/tonlib-src/crypto/block/transaction.cpp @@ -421,7 +421,9 @@ void add_partial_storage_payment(td::BigInt256& payment, ton::UnixTime delta, co payment += b; } -td::RefInt256 Account::compute_storage_fees(ton::UnixTime now, const std::vector& pricing) const { +td::RefInt256 StoragePrices::compute_storage_fees(ton::UnixTime now, const std::vector& pricing, + const vm::CellStorageStat& storage_stat, ton::UnixTime last_paid, + bool is_special, bool is_masterchain) { if (now <= last_paid || !last_paid || is_special || pricing.empty() || now <= pricing[0].valid_since) { return {}; } @@ -438,7 +440,7 @@ td::RefInt256 Account::compute_storage_fees(ton::UnixTime now, const std::vector ton::UnixTime valid_until = (i < n - 1 ? std::min(now, pricing[i + 1].valid_since) : now); if (upto < valid_until) { assert(upto >= pricing[i].valid_since); - add_partial_storage_payment(total.unique_write(), valid_until - upto, pricing[i], storage_stat, is_masterchain()); + add_partial_storage_payment(total.unique_write(), valid_until - upto, pricing[i], storage_stat, is_masterchain); } upto = valid_until; } @@ -446,6 +448,10 @@ td::RefInt256 Account::compute_storage_fees(ton::UnixTime now, const std::vector return total; } +td::RefInt256 Account::compute_storage_fees(ton::UnixTime now, const std::vector& pricing) const { + return StoragePrices::compute_storage_fees(now, pricing, storage_stat, last_paid, is_special, is_masterchain()); +} + Transaction::Transaction(const Account& _account, int ttype, ton::LogicalTime req_start_lt, ton::UnixTime _now, Ref _inmsg) : trans_type(ttype) @@ -739,7 +745,8 @@ td::uint64 ComputePhaseConfig::gas_bought_for(td::RefInt256 nanograms) const { } td::RefInt256 ComputePhaseConfig::compute_gas_price(td::uint64 gas_used) const { - return td::rshift(gas_price256 * gas_used, 16, 1); + return gas_used <= flat_gas_limit ? td::make_refint(flat_gas_price) + : td::rshift(gas_price256 * (gas_used - flat_gas_limit), 16, 1) + flat_gas_price; } bool Transaction::compute_gas_limits(ComputePhase& cp, const ComputePhaseConfig& cfg) { @@ -805,7 +812,6 @@ bool Transaction::prepare_rand_seed(td::BitArray<256>& rand_seed, const ComputeP } Ref Transaction::prepare_vm_c7(const ComputePhaseConfig& cfg) const { - // TODO: fix initialization of c7 td::BitArray<256> rand_seed; td::RefInt256 rand_seed_int{true}; if (!(prepare_rand_seed(rand_seed, cfg) && rand_seed_int.unique_write().import_bits(rand_seed.cbits(), 256, false))) { @@ -969,7 +975,7 @@ bool Transaction::prepare_compute_phase(const ComputePhaseConfig& cfg) { gas = vm.get_gas_limits(); cp.gas_used = std::min(gas.gas_consumed(), gas.gas_limit); cp.accepted = (gas.gas_credit == 0); - cp.success = (cp.accepted && (unsigned)cp.exit_code <= 1); + cp.success = (cp.accepted && vm.committed()); if (cp.accepted & use_msg_state) { was_activated = true; acc_status = Account::acc_active; @@ -978,8 +984,8 @@ bool Transaction::prepare_compute_phase(const ComputePhaseConfig& cfg) { << ", limit=" << gas.gas_limit << ", credit=" << gas.gas_credit; LOG(INFO) << "out_of_gas=" << cp.out_of_gas << ", accepted=" << cp.accepted << ", success=" << cp.success; if (cp.success) { - cp.new_data = vm.get_c4(); // c4 -> persistent data - cp.actions = vm.get_d(5); // c5 -> action list + cp.new_data = vm.get_committed_state().c4; // c4 -> persistent data + cp.actions = vm.get_committed_state().c5; // c5 -> action list int out_act_num = output_actions_count(cp.actions); if (verbosity > 2) { std::cerr << "new smart contract data: "; @@ -1304,9 +1310,9 @@ bool Transaction::check_rewrite_dest_addr(Ref& dest_addr, const A int Transaction::try_action_send_msg(const vm::CellSlice& cs0, ActionPhase& ap, const ActionPhaseConfig& cfg, int redoing) { block::gen::OutAction::Record_action_send_msg act_rec; - // mode: +128 = attach all remaining balance, +64 = attach all remaining balance of the inbound message, +1 = pay message fees, +2 = skip if message cannot be sent + // mode: +128 = attach all remaining balance, +64 = attach all remaining balance of the inbound message, +32 = delete smart contract if balance becomes zero, +1 = pay message fees, +2 = skip if message cannot be sent vm::CellSlice cs{cs0}; - if (!tlb::unpack_exact(cs, act_rec) || (act_rec.mode & ~0xc3) || (act_rec.mode & 0xc0) == 0xc0) { + if (!tlb::unpack_exact(cs, act_rec) || (act_rec.mode & ~0xe3) || (act_rec.mode & 0xc0) == 0xc0) { return -1; } bool skip_invalid = (act_rec.mode & 2); @@ -1573,7 +1579,7 @@ int Transaction::try_action_send_msg(const vm::CellSlice& cs0, ActionPhase& ap, ap.total_action_fees += fees_collected; ap.total_fwd_fees += fees_total; - if (act_rec.mode & 0x80) { + if ((act_rec.mode & 0xa0) == 0xa0) { CHECK(ap.remaining_balance.is_zero()); ap.acc_delete_req = ap.reserved_balance.is_zero(); } diff --git a/submodules/ton/tonlib-src/crypto/block/transaction.h b/submodules/ton/tonlib-src/crypto/block/transaction.h index 015dc3f39e..25f8059560 100644 --- a/submodules/ton/tonlib-src/crypto/block/transaction.h +++ b/submodules/ton/tonlib-src/crypto/block/transaction.h @@ -65,10 +65,10 @@ struct NewOutMsg { NewOutMsg(ton::LogicalTime _lt, Ref _msg, Ref _trans) : lt(_lt), msg(std::move(_msg)), trans(std::move(_trans)) { } - bool operator<(const NewOutMsg& other) const & { + bool operator<(const NewOutMsg& other) const& { return lt < other.lt || (lt == other.lt && msg->get_hash() < other.msg->get_hash()); } - bool operator>(const NewOutMsg& other) const & { + bool operator>(const NewOutMsg& other) const& { return lt > other.lt || (lt == other.lt && other.msg->get_hash() < msg->get_hash()); } }; @@ -132,29 +132,6 @@ struct ComputePhaseConfig { bool parse_GasLimitsPrices(Ref cell, td::RefInt256& freeze_due_limit, td::RefInt256& delete_due_limit); }; -// msg_fwd_fees = (lump_price + ceil((bit_price * msg.bits + cell_price * msg.cells)/2^16)) nanograms -// ihr_fwd_fees = ceil((msg_fwd_fees * ihr_price_factor)/2^16) nanograms -// bits in the root cell of a message are not included in msg.bits (lump_price pays for them) - -struct MsgPrices { - td::uint64 lump_price; - td::uint64 bit_price; - td::uint64 cell_price; - td::uint32 ihr_factor; - td::uint32 first_frac; - td::uint32 next_frac; - td::uint64 compute_fwd_fees(td::uint64 cells, td::uint64 bits) const; - std::pair compute_fwd_ihr_fees(td::uint64 cells, td::uint64 bits, - bool ihr_disabled = false) const; - MsgPrices() = default; - MsgPrices(td::uint64 lump, td::uint64 bitp, td::uint64 cellp, td::uint32 ihrf, td::uint32 firstf, td::uint32 nextf) - : lump_price(lump), bit_price(bitp), cell_price(cellp), ihr_factor(ihrf), first_frac(firstf), next_frac(nextf) { - } - td::RefInt256 get_first_part(td::RefInt256 total) const; - td::uint64 get_first_part(td::uint64 total) const; - td::RefInt256 get_next_part(td::RefInt256 total) const; -}; - struct ActionPhaseConfig { int max_actions{255}; MsgPrices fwd_std; diff --git a/submodules/ton/tonlib-src/crypto/common/bitstring.h b/submodules/ton/tonlib-src/crypto/common/bitstring.h index b2a37c72f0..901ff709b7 100644 --- a/submodules/ton/tonlib-src/crypto/common/bitstring.h +++ b/submodules/ton/tonlib-src/crypto/common/bitstring.h @@ -224,6 +224,8 @@ class BitSliceGen { BitSliceGen(BitSliceGen&& bs, unsigned _offs, unsigned _len); BitSliceGen(Pt* _ptr, unsigned _len) : ref(), ptr(_ptr), offs(0), len(_len) { } + explicit BitSliceGen(Slice slice) : BitSliceGen(slice.data(), slice.size() * 8) { + } ~BitSliceGen() { } Pt* get_ptr() const { diff --git a/submodules/ton/tonlib-src/crypto/fift/lib/Asm.fif b/submodules/ton/tonlib-src/crypto/fift/lib/Asm.fif index 69adeeeaa8..eb9034ec1e 100644 --- a/submodules/ton/tonlib-src/crypto/fift/lib/Asm.fif +++ b/submodules/ton/tonlib-src/crypto/fift/lib/Asm.fif @@ -756,6 +756,12 @@ x{EDF9} @Defop BOOLEVAL { PUSHINT c3 PREPAREVAR } cond } dup : PREPARE : PREPAREDICT // +// inline support +{ dup sbits { @addop } { + dup srefs 1- abort"exactly one reference expected in inline" + ref@ CALLREF } cond +} : INLINE +// // throwing and handling exceptions { dup 6 ufits { { s>c c } : }END> diff --git a/submodules/ton/tonlib-src/crypto/fift/lib/Fift.fif b/submodules/ton/tonlib-src/crypto/fift/lib/Fift.fif index f674be7976..5430c359e7 100644 --- a/submodules/ton/tonlib-src/crypto/fift/lib/Fift.fif +++ b/submodules/ton/tonlib-src/crypto/fift/lib/Fift.fif @@ -42,8 +42,8 @@ { dup 10 < { 48 } { 55 } cond + } : Digit { dup 10 < { 48 } { 87 } cond + } : digit // x s b -- x' s' -{ -rot swap rot /mod Digit rot swap hold } : B# -{ -rot swap rot /mod digit rot swap hold } : b# +{ rot swap /mod Digit rot swap hold } : B# +{ rot swap /mod digit rot swap hold } : b# { 16 B# } : X# { 16 b# } : x# // x s b -- 0 s' @@ -110,3 +110,4 @@ variable base { null ' cons rot times } : list { true (atom) drop } : atom { bl word atom 1 'nop } ::_ ` +{ hole dup 1 { @ execute } does create } : recursive diff --git a/submodules/ton/tonlib-src/crypto/fift/lib/TonUtil.fif b/submodules/ton/tonlib-src/crypto/fift/lib/TonUtil.fif index 9535322255..44f1ff1cfd 100644 --- a/submodules/ton/tonlib-src/crypto/fift/lib/TonUtil.fif +++ b/submodules/ton/tonlib-src/crypto/fift/lib/TonUtil.fif @@ -123,3 +123,28 @@ forget val, forget val@ forget .val { 0 lib+ } : private_lib // ( D c -- D' ) Add public library c to collection D { 1 lib+ } : public_lib + +// serialize simple transfers with long comments +// b B n -- b' +recursive append-long-bytes { + over Blen over <= { drop B, } { + B| -rot B, swap ref, + } cond +} swap ! +// b S n -- b' +{ swap $>B swap append-long-bytes } : append-long-string +// S -- c +{ +} : simple-transfer-body + +// ( S -- x ) parse public key +{ dup $len 48 <> abort"public key must be 48 characters long" + base64>B dup Blen 36 <> abort"public key must be 48 characters long" + 34 B| 16 B>u@ over crc16 <> abort"crc16 mismatch in public key" + 16 B>u@+ 0x3ee6 <> abort"invalid tag in public key" + 256 B>u@ +} : parse-pubkey +{ bl word parse-pubkey 1 'nop } ::_ PK' +// ( x -- S ) serialize public key +{ 256 u>B B{3ee6} swap B+ dup crc16 16 u>B B+ B>base64 } : pubkey>$ +{ pubkey>$ type } : .pubkey diff --git a/submodules/ton/tonlib-src/crypto/fift/utils.cpp b/submodules/ton/tonlib-src/crypto/fift/utils.cpp index 1c16b2cd4a..fdbd0c7eef 100644 --- a/submodules/ton/tonlib-src/crypto/fift/utils.cpp +++ b/submodules/ton/tonlib-src/crypto/fift/utils.cpp @@ -43,6 +43,9 @@ td::Result load_TonUtil_fif(std::string dir = "") { td::Result load_Lists_fif(std::string dir = "") { return load_source("Lists.fif", dir); } +td::Result load_Lisp_fif(std::string dir = "") { + return load_source("Lisp.fif", dir); +} class MemoryFileLoader : public fift::FileLoader { public: @@ -91,7 +94,8 @@ class MemoryFileLoader : public fift::FileLoader { }; td::Result create_source_lookup(std::string main, bool need_preamble = true, bool need_asm = true, - bool need_ton_util = true, std::string dir = "") { + bool need_ton_util = true, bool need_lisp = true, + std::string dir = "") { auto loader = std::make_unique(); loader->add_file("/main.fif", std::move(main)); if (need_preamble) { @@ -112,6 +116,10 @@ td::Result create_source_lookup(std::string main, bool need_ loader->add_file("/TonUtil.fif", std::move(f)); } } + if (need_lisp) { + TRY_RESULT(f, load_Lisp_fif(dir)); + loader->add_file("/Lisp.fif", std::move(f)); + } auto res = fift::SourceLookup(std::move(loader)); res.add_include_path("/"); return std::move(res); @@ -143,7 +151,7 @@ td::Result run_fift(fift::SourceLookup source_lookup, std::o } // namespace td::Result mem_run_fift(std::string source, std::vector args, std::string fift_dir) { std::stringstream ss; - TRY_RESULT(source_lookup, create_source_lookup(source, true, true, true, fift_dir)); + TRY_RESULT(source_lookup, create_source_lookup(source, true, true, true, true, fift_dir)); TRY_RESULT_ASSIGN(source_lookup, run_fift(std::move(source_lookup), &ss, true, std::move(args))); FiftOutput res; res.source_lookup = std::move(source_lookup); @@ -159,8 +167,8 @@ td::Result mem_run_fift(SourceLookup source_lookup, std::vector create_mem_source_lookup(std::string main, std::string fift_dir, bool need_preamble, - bool need_asm, bool need_ton_util) { - return create_source_lookup(main, need_preamble, need_asm, need_ton_util, fift_dir); + bool need_asm, bool need_ton_util, bool need_lisp) { + return create_source_lookup(main, need_preamble, need_asm, need_ton_util, need_lisp, fift_dir); } td::Result> compile_asm(td::Slice asm_code, std::string fift_dir, bool is_raw) { @@ -168,7 +176,7 @@ td::Result> compile_asm(td::Slice asm_code, std::string fift_d TRY_RESULT(source_lookup, create_source_lookup(PSTRING() << "\"Asm.fif\" include\n " << (is_raw ? "<{" : "") << asm_code << "\n" << (is_raw ? "}>c" : "") << " boc>B \"res\" B>file", - true, true, true, fift_dir)); + true, true, true, false, fift_dir)); TRY_RESULT(res, run_fift(std::move(source_lookup), &ss)); TRY_RESULT(boc, res.read_file("res")); return vm::std_boc_deserialize(std::move(boc.data)); diff --git a/submodules/ton/tonlib-src/crypto/fift/utils.h b/submodules/ton/tonlib-src/crypto/fift/utils.h index e17eb8ae2c..0dcc629f91 100644 --- a/submodules/ton/tonlib-src/crypto/fift/utils.h +++ b/submodules/ton/tonlib-src/crypto/fift/utils.h @@ -28,7 +28,7 @@ struct FiftOutput { }; td::Result create_mem_source_lookup(std::string main, std::string fift_dir = "", bool need_preamble = true, bool need_asm = true, - bool need_ton_util = true); + bool need_ton_util = true, bool need_lisp = true); td::Result mem_run_fift(std::string source, std::vector args = {}, std::string fift_dir = ""); td::Result mem_run_fift(SourceLookup source_lookup, std::vector args); td::Result> compile_asm(td::Slice asm_code, std::string fift_dir = "", bool is_raw = true); diff --git a/submodules/ton/tonlib-src/crypto/fift/words.cpp b/submodules/ton/tonlib-src/crypto/fift/words.cpp index 87c269b78e..2c1a3083d6 100644 --- a/submodules/ton/tonlib-src/crypto/fift/words.cpp +++ b/submodules/ton/tonlib-src/crypto/fift/words.cpp @@ -614,6 +614,43 @@ void interpret_str_reverse(vm::Stack& stack) { stack.push_string(std::move(s)); } +void interpret_utf8_str_len(vm::Stack& stack) { + std::string s = stack.pop_string(); + long long cnt = 0; + for (char c : s) { + if ((c & 0xc0) != 0x80) { + cnt++; + } + } + stack.push_smallint(cnt); +} + +void interpret_utf8_str_split(vm::Stack& stack) { + stack.check_underflow(2); + unsigned c = stack.pop_smallint_range(0xffff); + std::string s = stack.pop_string(); + if (c > s.size()) { + throw IntError{"not enough utf8 characters for cutting"}; + } + auto it = s.begin(); + for (; it < s.end(); ++it) { + if ((*it & 0xc0) != 0x80) { + if (!c) { + stack.push_string(std::string{s.begin(), it}); + stack.push_string(std::string{it, s.end()}); + return; + } + --c; + } + } + if (!c) { + stack.push_string(std::move(s)); + stack.push_string(std::string{}); + } else { + throw IntError{"not enough utf8 characters for cutting"}; + } +} + void interpret_str_remove_trailing_int(vm::Stack& stack, int arg) { char x = (char)(arg ? arg : stack.pop_long_range(127)); std::string s = stack.pop_string(); @@ -1797,6 +1834,16 @@ void interpret_char(IntCtx& ctx) { push_argcount(ctx, 1); } +void interpret_char_internal(vm::Stack& stack) { + auto s = stack.pop_string(); + int len = (s.size() < 10 ? (int)s.size() : 10); + int code = str_utf8_code(s.c_str(), len); + if (code < 0 || s.size() != (unsigned)len) { + throw IntError{"exactly one character expected"}; + } + stack.push_smallint(code); +} + int parse_number(std::string s, td::RefInt256& num, td::RefInt256& denom, bool allow_frac = true, bool throw_error = false) { if (allow_frac) { @@ -2149,7 +2196,23 @@ void interpret_run_vm(IntCtx& ctx, bool with_gas) { OstreamLogger ostream_logger(ctx.error_stream); auto log = create_vm_log(ctx.error_stream ? &ostream_logger : nullptr); vm::GasLimits gas{gas_limit}; - int res = vm::run_vm_code(cs, ctx.stack, 3, &data, log, nullptr, &gas); + int res = vm::run_vm_code(cs, ctx.stack, 1, &data, log, nullptr, &gas, get_vm_libraries()); + ctx.stack.push_smallint(res); + ctx.stack.push_cell(std::move(data)); + if (with_gas) { + ctx.stack.push_smallint(gas.gas_consumed()); + } +} + +void interpret_run_vm_c7(IntCtx& ctx, bool with_gas) { + long long gas_limit = with_gas ? ctx.stack.pop_long_range(vm::GasLimits::infty) : vm::GasLimits::infty; + auto c7 = ctx.stack.pop_tuple(); + auto data = ctx.stack.pop_cell(); + auto cs = ctx.stack.pop_cellslice(); + OstreamLogger ostream_logger(ctx.error_stream); + auto log = create_vm_log(ctx.error_stream ? &ostream_logger : nullptr); + vm::GasLimits gas{gas_limit}; + int res = vm::run_vm_code(cs, ctx.stack, 1, &data, log, nullptr, &gas, get_vm_libraries(), std::move(c7)); ctx.stack.push_smallint(res); ctx.stack.push_cell(std::move(data)); if (with_gas) { @@ -2278,6 +2341,21 @@ void interpret_get_cmdline_arg(IntCtx& ctx) { } } +void interpret_getenv(vm::Stack& stack) { + auto str = stack.pop_string(); + auto value = str.size() < 1024 ? getenv(str.c_str()) : nullptr; + stack.push_string(value ? std::string{value} : ""); +} + +void interpret_getenv_exists(vm::Stack& stack) { + auto str = stack.pop_string(); + auto value = str.size() < 1024 ? getenv(str.c_str()) : nullptr; + if (value) { + stack.push_string(std::string{value}); + } + stack.push_bool((bool)value); +} + // x1 .. xn n 'w --> void interpret_execute_internal(IntCtx& ctx) { Ref word_def = pop_exec_token(ctx); @@ -2315,7 +2393,7 @@ void compile_one_literal(WordList& wlist, vm::StackEntry val) { auto x = std::move(val).as_int(); if (!x->signed_fits_bits(257)) { throw IntError{"invalid numeric literal"}; - } else if (x->signed_fits_bits(64)) { + } else if (x->signed_fits_bits(td::BigIntInfo::word_shift)) { wlist.push_back(Ref{true, std::bind(interpret_const, _1, x->to_long())}); } else { wlist.push_back(Ref{true, std::bind(interpret_big_const, _1, std::move(x))}); @@ -2465,6 +2543,7 @@ void init_words_common(Dictionary& d) { // char/string manipulation d.def_active_word("\"", interpret_quote_str); d.def_active_word("char ", interpret_char); + d.def_stack_word("(char) ", interpret_char_internal); d.def_ctx_word("emit ", interpret_emit); d.def_ctx_word("space ", std::bind(interpret_emit_const, _1, ' ')); d.def_ctx_word("cr ", std::bind(interpret_emit_const, _1, '\n')); @@ -2484,6 +2563,8 @@ void init_words_common(Dictionary& d) { d.def_stack_word("-trailing0 ", std::bind(interpret_str_remove_trailing_int, _1, '0')); d.def_stack_word("$len ", interpret_str_len); d.def_stack_word("Blen ", interpret_bytes_len); + d.def_stack_word("$Len ", interpret_utf8_str_len); + d.def_stack_word("$Split ", interpret_utf8_str_split); d.def_ctx_word("Bx. ", std::bind(interpret_bytes_hex_print_raw, _1, true)); d.def_stack_word("B>X ", std::bind(interpret_bytes_to_hex, _1, true)); d.def_stack_word("B>x ", std::bind(interpret_bytes_to_hex, _1, false)); @@ -2572,6 +2653,8 @@ void init_words_common(Dictionary& d) { d.def_ctx_word("file-exists? ", interpret_file_exists); // custom & crypto d.def_ctx_word("now ", interpret_now); + d.def_stack_word("getenv ", interpret_getenv); + d.def_stack_word("getenv? ", interpret_getenv_exists); d.def_stack_word("newkeypair ", interpret_new_keypair); d.def_stack_word("priv>pub ", interpret_priv_key_to_pub); d.def_stack_word("ed25519_sign ", interpret_ed25519_sign); @@ -2696,6 +2779,8 @@ void init_words_vm(Dictionary& d) { d.def_ctx_word("gasrunvmdict ", std::bind(interpret_run_vm_dict, _1, true)); d.def_ctx_word("runvm ", std::bind(interpret_run_vm, _1, false)); d.def_ctx_word("gasrunvm ", std::bind(interpret_run_vm, _1, true)); + d.def_ctx_word("runvmctx ", std::bind(interpret_run_vm_c7, _1, false)); + d.def_ctx_word("gasrunvmctx ", std::bind(interpret_run_vm_c7, _1, true)); d.def_ctx_word("dbrunvm ", interpret_db_run_vm); d.def_ctx_word("dbrunvm-parallel ", interpret_db_run_vm_parallel); } diff --git a/submodules/ton/tonlib-src/crypto/func/abscode.cpp b/submodules/ton/tonlib-src/crypto/func/abscode.cpp index 1bc4f0d9db..8ff204f13c 100644 --- a/submodules/ton/tonlib-src/crypto/func/abscode.cpp +++ b/submodules/ton/tonlib-src/crypto/func/abscode.cpp @@ -205,6 +205,9 @@ void VarDescr::clear_value() { } void VarDescrList::show(std::ostream& os) const { + if (unreachable) { + os << " "; + } os << "["; for (const auto& v : list) { os << ' ' << v; diff --git a/submodules/ton/tonlib-src/crypto/func/analyzer.cpp b/submodules/ton/tonlib-src/crypto/func/analyzer.cpp index 4d2e790298..a80bc74e23 100644 --- a/submodules/ton/tonlib-src/crypto/func/analyzer.cpp +++ b/submodules/ton/tonlib-src/crypto/func/analyzer.cpp @@ -272,6 +272,12 @@ VarDescrList& VarDescrList::operator+=(const VarDescrList& y) { } VarDescrList VarDescrList::operator|(const VarDescrList& y) const { + if (y.unreachable) { + return *this; + } + if (unreachable) { + return y; + } VarDescrList res; auto it1 = list.cbegin(); auto it2 = y.list.cbegin(); @@ -289,7 +295,11 @@ VarDescrList VarDescrList::operator|(const VarDescrList& y) const { } VarDescrList& VarDescrList::operator|=(const VarDescrList& y) { - return *this = *this | y; + if (y.unreachable) { + return *this; + } else { + return *this = *this | y; + } } VarDescrList& VarDescrList::operator&=(const VarDescrList& values) { @@ -299,16 +309,22 @@ VarDescrList& VarDescrList::operator&=(const VarDescrList& values) { *item &= vd; } } + unreachable |= values.unreachable; return *this; } VarDescrList& VarDescrList::import_values(const VarDescrList& values) { - for (const VarDescr& vd : values.list) { - VarDescr* item = operator[](vd.idx); - if (item) { - item->set_value(vd); + if (values.unreachable) { + set_unreachable(); + } else + for (auto& vd : list) { + auto new_vd = values[vd.idx]; + if (new_vd) { + vd.set_value(*new_vd); + } else { + vd.clear_value(); + } } - } return *this; } @@ -658,8 +674,11 @@ void Op::prepare_args(VarDescrList values) { const VarDescr* val = values[right[i]]; if (val) { args[i].set_value(*val); - args[i].clear_unused(); + // args[i].clear_unused(); + } else { + args[i].clear_value(); } + args[i].clear_unused(); } } @@ -670,7 +689,7 @@ VarDescrList Op::fwd_analyze(VarDescrList values) { case _Import: break; case _Return: - values.list.clear(); + values.set_unreachable(); break; case _IntConst: { values.add_newval(left[0]).set_const(int_const); diff --git a/submodules/ton/tonlib-src/crypto/func/asmops.cpp b/submodules/ton/tonlib-src/crypto/func/asmops.cpp index afc164715c..df4443a4d2 100644 --- a/submodules/ton/tonlib-src/crypto/func/asmops.cpp +++ b/submodules/ton/tonlib-src/crypto/func/asmops.cpp @@ -193,21 +193,21 @@ void AsmOp::out(std::ostream& os) const { os << (b ? "SWAP" : "NOP"); break; } - os << "s" << a << " s" << b << " XCHG"; + os << SReg(a) << ' ' << SReg(b) << " XCHG"; break; case a_push: if (!(a & -2)) { os << (a ? "OVER" : "DUP"); break; } - os << "s" << a << " PUSH"; + os << SReg(a) << " PUSH"; break; case a_pop: if (!(a & -2)) { os << (a ? "NIP" : "DROP"); break; } - os << "s" << a << " POP"; + os << SReg(a) << " POP"; break; default: throw src::Fatal{"unknown assembler operation"}; diff --git a/submodules/ton/tonlib-src/crypto/func/builtins.cpp b/submodules/ton/tonlib-src/crypto/func/builtins.cpp index 5010a2564b..dd156f24c6 100644 --- a/submodules/ton/tonlib-src/crypto/func/builtins.cpp +++ b/submodules/ton/tonlib-src/crypto/func/builtins.cpp @@ -50,15 +50,15 @@ void define_builtin_func(std::string name, TypeExpr* func_type, const T& func, b } template -void define_builtin_func_x(std::string name, TypeExpr* func_type, const T& func, std::initializer_list arg_order, - std::initializer_list ret_order = {}, bool impure = false) { +void define_builtin_func(std::string name, TypeExpr* func_type, const T& func, std::initializer_list arg_order, + std::initializer_list ret_order = {}, bool impure = false) { SymDef* def = predefine_builtin_func(name, func_type); def->value = new SymValAsmFunc{func_type, func, arg_order, ret_order, impure}; } -void define_builtin_func_x(std::string name, TypeExpr* func_type, const AsmOp& macro, - std::initializer_list arg_order, std::initializer_list ret_order = {}, - bool impure = false) { +void define_builtin_func(std::string name, TypeExpr* func_type, const AsmOp& macro, + std::initializer_list arg_order, std::initializer_list ret_order = {}, + bool impure = false) { SymDef* def = predefine_builtin_func(name, func_type); def->value = new SymValAsmFunc{func_type, make_simple_compile(macro), arg_order, ret_order, impure}; } @@ -429,10 +429,14 @@ AsmOp compile_mul(std::vector& res, std::vector& args) { } return exec_arg_op("MULCONST", y.int_const, 1); } - if (k >= 0) { + if (k > 0) { y.unused(); return exec_arg_op("LSHIFT#", k, 1); } + if (k == 0) { + y.unused(); + return AsmOp::Nop(); + } } if (x.is_int_const()) { int k = is_pos_pow2(x.int_const); @@ -451,10 +455,14 @@ AsmOp compile_mul(std::vector& res, std::vector& args) { } return exec_arg_op("MULCONST", x.int_const, 1); } - if (k >= 0) { + if (k > 0) { x.unused(); return exec_arg_op("LSHIFT#", k, 1); } + if (k == 0) { + x.unused(); + return AsmOp::Nop(); + } } return exec_op("MUL", 2); } @@ -668,6 +676,7 @@ AsmOp compile_cmp_int(std::vector& res, std::vector& args, i return mode == 7 ? push_const(r.int_const) : AsmOp::BoolConst(v != 0); } int v = compute_compare(x, y, mode); + // std::cerr << "compute_compare(" << x << ", " << y << ", " << mode << ") = " << v << std::endl; assert(v); if (!(v & (v - 1))) { r.set_const(v - (v >> 2) - 2); @@ -685,6 +694,7 @@ AsmOp compile_cmp_int(std::vector& res, std::vector& args, i if (v & 4) { r.val &= VarDescr::ConstOne; } + // std::cerr << "result: " << r << std::endl; static const char* cmp_int_names[] = {"", "GTINT", "EQINT", "GTINT", "LESSINT", "NEQINT", "LESSINT"}; static const char* cmp_names[] = {"", "GREATER", "EQUAL", "GEQ", "LESS", "NEQ", "LEQ", "CMP"}; static int cmp_int_delta[] = {0, 0, 0, -1, 0, 0, 1}; @@ -846,10 +856,7 @@ void define_builtins() { auto X = TypeExpr::new_var(); auto Y = TypeExpr::new_var(); auto Z = TypeExpr::new_var(); - auto T = TypeExpr::new_var(); auto XY = TypeExpr::new_tensor({X, Y}); - auto XYZ = TypeExpr::new_tensor({X, Y, Z}); - auto XYZT = TypeExpr::new_tensor({X, Y, Z, T}); auto arith_bin_op = TypeExpr::new_map(Int2, Int); auto arith_un_op = TypeExpr::new_map(Int, Int); auto impure_bin_op = TypeExpr::new_map(Int2, Unit); @@ -867,16 +874,20 @@ void define_builtins() { define_builtin_func("-_", arith_un_op, compile_negate); define_builtin_func("_*_", arith_bin_op, compile_mul); define_builtin_func("_/_", arith_bin_op, std::bind(compile_div, _1, _2, -1)); - define_builtin_func("_/~_", arith_bin_op, std::bind(compile_div, _1, _2, 0)); - define_builtin_func("_/^_", arith_bin_op, std::bind(compile_div, _1, _2, 1)); + define_builtin_func("_~/_", arith_bin_op, std::bind(compile_div, _1, _2, 0)); + define_builtin_func("_^/_", arith_bin_op, std::bind(compile_div, _1, _2, 1)); define_builtin_func("_%_", arith_bin_op, std::bind(compile_mod, _1, _2, -1)); - define_builtin_func("_%~_", arith_bin_op, std::bind(compile_mod, _1, _2, 0)); - define_builtin_func("_%^_", arith_bin_op, std::bind(compile_mod, _1, _2, -1)); + define_builtin_func("_~%_", arith_bin_op, std::bind(compile_mod, _1, _2, 0)); + define_builtin_func("_^%_", arith_bin_op, std::bind(compile_mod, _1, _2, 1)); define_builtin_func("_/%_", TypeExpr::new_map(Int2, Int2), AsmOp::Custom("DIVMOD", 2, 2)); + define_builtin_func("divmod", TypeExpr::new_map(Int2, Int2), AsmOp::Custom("DIVMOD", 2, 2)); + define_builtin_func("~divmod", TypeExpr::new_map(Int2, Int2), AsmOp::Custom("DIVMOD", 2, 2)); + define_builtin_func("moddiv", TypeExpr::new_map(Int2, Int2), AsmOp::Custom("DIVMOD", 2, 2), {}, {1, 0}); + define_builtin_func("~moddiv", TypeExpr::new_map(Int2, Int2), AsmOp::Custom("DIVMOD", 2, 2), {}, {1, 0}); define_builtin_func("_<<_", arith_bin_op, compile_lshift); define_builtin_func("_>>_", arith_bin_op, std::bind(compile_rshift, _1, _2, -1)); - define_builtin_func("_>>~_", arith_bin_op, std::bind(compile_rshift, _1, _2, 0)); - define_builtin_func("_>>^_", arith_bin_op, std::bind(compile_rshift, _1, _2, 1)); + define_builtin_func("_~>>_", arith_bin_op, std::bind(compile_rshift, _1, _2, 0)); + define_builtin_func("_^>>_", arith_bin_op, std::bind(compile_rshift, _1, _2, 1)); define_builtin_func("_&_", arith_bin_op, AsmOp::Custom("AND", 2)); define_builtin_func("_|_", arith_bin_op, AsmOp::Custom("OR", 2)); define_builtin_func("_^_", arith_bin_op, AsmOp::Custom("XOR", 2)); @@ -885,15 +896,15 @@ void define_builtins() { define_builtin_func("^_-=_", arith_bin_op, compile_sub); define_builtin_func("^_*=_", arith_bin_op, compile_mul); define_builtin_func("^_/=_", arith_bin_op, std::bind(compile_div, _1, _2, -1)); - define_builtin_func("^_/~=_", arith_bin_op, std::bind(compile_div, _1, _2, 0)); - define_builtin_func("^_/^=_", arith_bin_op, std::bind(compile_div, _1, _2, 1)); + define_builtin_func("^_~/=_", arith_bin_op, std::bind(compile_div, _1, _2, 0)); + define_builtin_func("^_^/=_", arith_bin_op, std::bind(compile_div, _1, _2, 1)); define_builtin_func("^_%=_", arith_bin_op, std::bind(compile_mod, _1, _2, -1)); - define_builtin_func("^_%~=_", arith_bin_op, std::bind(compile_mod, _1, _2, 0)); - define_builtin_func("^_%^=_", arith_bin_op, std::bind(compile_mod, _1, _2, 1)); + define_builtin_func("^_~%=_", arith_bin_op, std::bind(compile_mod, _1, _2, 0)); + define_builtin_func("^_^%=_", arith_bin_op, std::bind(compile_mod, _1, _2, 1)); define_builtin_func("^_<<=_", arith_bin_op, compile_lshift); define_builtin_func("^_>>=_", arith_bin_op, std::bind(compile_rshift, _1, _2, -1)); - define_builtin_func("^_>>~=_", arith_bin_op, std::bind(compile_rshift, _1, _2, 0)); - define_builtin_func("^_>>^=_", arith_bin_op, std::bind(compile_rshift, _1, _2, 1)); + define_builtin_func("^_~>>=_", arith_bin_op, std::bind(compile_rshift, _1, _2, 0)); + define_builtin_func("^_^>>=_", arith_bin_op, std::bind(compile_rshift, _1, _2, 1)); define_builtin_func("^_&=_", arith_bin_op, AsmOp::Custom("AND", 2)); define_builtin_func("^_|=_", arith_bin_op, AsmOp::Custom("OR", 2)); define_builtin_func("^_^=_", arith_bin_op, AsmOp::Custom("XOR", 2)); @@ -911,43 +922,24 @@ void define_builtins() { define_builtin_func("false", Int, /* AsmOp::Const("FALSE") */ std::bind(compile_bool_const, _1, _2, false)); // define_builtin_func("null", Null, AsmOp::Const("PUSHNULL")); define_builtin_func("nil", Tuple, AsmOp::Const("PUSHNULL")); + define_builtin_func("Nil", Tuple, AsmOp::Const("NIL")); define_builtin_func("null?", TypeExpr::new_forall({X}, TypeExpr::new_map(X, Int)), compile_is_null); - define_builtin_func("cons", TypeExpr::new_forall({X}, TypeExpr::new_map(TypeExpr::new_tensor(X, Tuple), Tuple)), - AsmOp::Custom("CONS", 2, 1)); - define_builtin_func("uncons", TypeExpr::new_forall({X}, TypeExpr::new_map(Tuple, TypeExpr::new_tensor(X, Tuple))), - AsmOp::Custom("UNCONS", 1, 2)); - define_builtin_func_x("list_next", - TypeExpr::new_forall({X}, TypeExpr::new_map(Tuple, TypeExpr::new_tensor(Tuple, X))), - AsmOp::Custom("UNCONS", 1, 2), {}, {1, 0}); - define_builtin_func("car", TypeExpr::new_forall({X}, TypeExpr::new_map(Tuple, X)), AsmOp::Custom("CAR", 1, 1)); - define_builtin_func("cdr", TypeExpr::new_map(Tuple, Tuple), AsmOp::Custom("CDR", 1, 1)); - define_builtin_func("pair", TypeExpr::new_forall({X, Y}, TypeExpr::new_map(XY, Tuple)), AsmOp::Custom("PAIR", 2, 1)); - define_builtin_func("unpair", TypeExpr::new_forall({X, Y}, TypeExpr::new_map(Tuple, XY)), - AsmOp::Custom("UNPAIR", 1, 2)); - define_builtin_func("triple", TypeExpr::new_forall({X, Y, Z}, TypeExpr::new_map(XYZ, Tuple)), - AsmOp::Custom("TRIPLE", 3, 1)); - define_builtin_func("untriple", TypeExpr::new_forall({X, Y, Z}, TypeExpr::new_map(Tuple, XYZ)), - AsmOp::Custom("UNTRIPLE", 1, 3)); - define_builtin_func("tuple4", TypeExpr::new_forall({X, Y, Z, T}, TypeExpr::new_map(XYZT, Tuple)), - AsmOp::Custom("4 TUPLE", 4, 1)); - define_builtin_func("untuple4", TypeExpr::new_forall({X, Y, Z, T}, TypeExpr::new_map(Tuple, XYZT)), - AsmOp::Custom("4 UNTUPLE", 1, 4)); define_builtin_func("throw", impure_un_op, compile_throw, true); define_builtin_func("throw_if", impure_bin_op, std::bind(compile_cond_throw, _1, _2, true), true); define_builtin_func("throw_unless", impure_bin_op, std::bind(compile_cond_throw, _1, _2, false), true); - define_builtin_func_x("load_int", fetch_int_op, std::bind(compile_fetch_int, _1, _2, true, true), {}, {1, 0}); - define_builtin_func_x("load_uint", fetch_int_op, std::bind(compile_fetch_int, _1, _2, true, false), {}, {1, 0}); + define_builtin_func("load_int", fetch_int_op, std::bind(compile_fetch_int, _1, _2, true, true), {}, {1, 0}); + define_builtin_func("load_uint", fetch_int_op, std::bind(compile_fetch_int, _1, _2, true, false), {}, {1, 0}); define_builtin_func("preload_int", prefetch_int_op, std::bind(compile_fetch_int, _1, _2, false, true)); define_builtin_func("preload_uint", prefetch_int_op, std::bind(compile_fetch_int, _1, _2, false, false)); - define_builtin_func_x("store_int", store_int_op, std::bind(compile_store_int, _1, _2, true), {1, 0, 2}); - define_builtin_func_x("store_uint", store_int_op, std::bind(compile_store_int, _1, _2, false), {1, 0, 2}); - define_builtin_func_x("~store_int", store_int_method, std::bind(compile_store_int, _1, _2, true), {1, 0, 2}); - define_builtin_func_x("~store_uint", store_int_method, std::bind(compile_store_int, _1, _2, false), {1, 0, 2}); - define_builtin_func_x("load_bits", fetch_slice_op, std::bind(compile_fetch_slice, _1, _2, true), {}, {1, 0}); + define_builtin_func("store_int", store_int_op, std::bind(compile_store_int, _1, _2, true), {1, 0, 2}); + define_builtin_func("store_uint", store_int_op, std::bind(compile_store_int, _1, _2, false), {1, 0, 2}); + define_builtin_func("~store_int", store_int_method, std::bind(compile_store_int, _1, _2, true), {1, 0, 2}); + define_builtin_func("~store_uint", store_int_method, std::bind(compile_store_int, _1, _2, false), {1, 0, 2}); + define_builtin_func("load_bits", fetch_slice_op, std::bind(compile_fetch_slice, _1, _2, true), {}, {1, 0}); define_builtin_func("preload_bits", prefetch_slice_op, std::bind(compile_fetch_slice, _1, _2, false)); define_builtin_func("int_at", TypeExpr::new_map(TupleInt, Int), compile_tuple_at); define_builtin_func("cell_at", TypeExpr::new_map(TupleInt, Cell), compile_tuple_at); - define_builtin_func("slice_at", TypeExpr::new_map(TupleInt, Cell), compile_tuple_at); + define_builtin_func("slice_at", TypeExpr::new_map(TupleInt, Slice), compile_tuple_at); define_builtin_func("tuple_at", TypeExpr::new_map(TupleInt, Tuple), compile_tuple_at); define_builtin_func("at", TypeExpr::new_forall({X}, TypeExpr::new_map(TupleInt, X)), compile_tuple_at); define_builtin_func("touch", TypeExpr::new_forall({X}, TypeExpr::new_map(X, X)), AsmOp::Nop()); @@ -960,13 +952,12 @@ void define_builtins() { AsmOp::Custom("s0 DUMP", 1, 1)); define_builtin_func("run_method0", TypeExpr::new_map(Int, Unit), [](auto a, auto b, auto c) { return compile_run_method(a, b, c, 0, false); }, true); - define_builtin_func_x("run_method1", - TypeExpr::new_forall({X}, TypeExpr::new_map(TypeExpr::new_tensor({Int, X}), Unit)), - [](auto a, auto b, auto c) { return compile_run_method(a, b, c, 1, false); }, {1, 0}, {}, true); - define_builtin_func_x( + define_builtin_func("run_method1", TypeExpr::new_forall({X}, TypeExpr::new_map(TypeExpr::new_tensor({Int, X}), Unit)), + [](auto a, auto b, auto c) { return compile_run_method(a, b, c, 1, false); }, {1, 0}, {}, true); + define_builtin_func( "run_method2", TypeExpr::new_forall({X, Y}, TypeExpr::new_map(TypeExpr::new_tensor({Int, X, Y}), Unit)), [](auto a, auto b, auto c) { return compile_run_method(a, b, c, 2, false); }, {1, 2, 0}, {}, true); - define_builtin_func_x( + define_builtin_func( "run_method3", TypeExpr::new_forall({X, Y, Z}, TypeExpr::new_map(TypeExpr::new_tensor({Int, X, Y, Z}), Unit)), [](auto a, auto b, auto c) { return compile_run_method(a, b, c, 3, false); }, {1, 2, 3, 0}, {}, true); } diff --git a/submodules/ton/tonlib-src/crypto/func/codegen.cpp b/submodules/ton/tonlib-src/crypto/func/codegen.cpp index 7e0d873ff6..70ae929df3 100644 --- a/submodules/ton/tonlib-src/crypto/func/codegen.cpp +++ b/submodules/ton/tonlib-src/crypto/func/codegen.cpp @@ -308,7 +308,7 @@ bool Op::generate_code_step(Stack& stack) { func->compile(stack.o, res, args); // compile res := f (args) } else { std::string name = sym::symbols.get_name(fun_ref->sym_idx); - stack.o << AsmOp::Custom(name + " CALLDICT", (int)right.size()); + stack.o << AsmOp::Custom(name + " CALLDICT", (int)right.size(), (int)left.size()); } stack.push_new_var(left[0]); return true; @@ -395,7 +395,7 @@ bool Op::generate_code_step(Stack& stack) { assert(stack.s[k + i].first == right1[i]); } if (cl == _CallInd) { - stack.o << exec_arg_op("CALLARGS", (int)right.size() - 1, -1, (int)right.size() - 1); + stack.o << exec_arg_op("CALLARGS", (int)right.size() - 1, (int)right.size(), (int)left.size()); } else { auto func = dynamic_cast(fun_ref->value); if (func) { @@ -406,8 +406,11 @@ bool Op::generate_code_step(Stack& stack) { } func->compile(stack.o, res, args); // compile res := f (args) } else { + auto fv = dynamic_cast(fun_ref->value); std::string name = sym::symbols.get_name(fun_ref->sym_idx); - stack.o << AsmOp::Custom(name + " CALLDICT", (int)right.size()); + bool is_inline = (fv && (fv->flags & 3)); + stack.o << AsmOp::Custom(name + (is_inline ? " INLINECALLDICT" : " CALLDICT"), (int)right.size(), + (int)left.size()); } } stack.s.resize(k); @@ -421,6 +424,11 @@ bool Op::generate_code_step(Stack& stack) { if (block0->is_empty() && block1->is_empty()) { return true; } + if (!next->noreturn() && (block0->noreturn() != block1->noreturn())) { + // simple fix of unbalanced returns in if/else branches + // (to be replaced with a finer condition working in loop bodies) + throw src::ParseError{where, "`if` and `else` branches should both return or both not return"}; + } var_idx_t x = left[0]; stack.rearrange_top(x, var_info[x] && var_info[x]->is_last()); assert(stack[0] == x); @@ -548,7 +556,7 @@ bool Op::generate_code_step(Stack& stack) { stack.opt_show(); stack.s.pop_back(); stack.modified(); - if (!next->is_empty()) { + if (true || !next->is_empty()) { stack.o << "REPEAT:<{"; stack.o.indent(); stack.forget_const(); @@ -596,7 +604,7 @@ bool Op::generate_code_step(Stack& stack) { case _Until: { // stack.drop_vars_except(block0->var_info); // stack.opt_show(); - if (!next->is_empty()) { + if (true || !next->is_empty()) { stack.o << "UNTIL:<{"; stack.o.indent(); stack.forget_const(); @@ -627,7 +635,7 @@ bool Op::generate_code_step(Stack& stack) { stack.drop_vars_except(block0->var_info); stack.opt_show(); StackLayout layout1 = stack.vars(); - bool next_empty = next->is_empty(); + bool next_empty = false && next->is_empty(); stack.o << "WHILE:<{"; stack.o.indent(); stack.forget_const(); diff --git a/submodules/ton/tonlib-src/crypto/func/func.cpp b/submodules/ton/tonlib-src/crypto/func/func.cpp index 223e6fcf95..2b98c332bd 100644 --- a/submodules/ton/tonlib-src/crypto/func/func.cpp +++ b/submodules/ton/tonlib-src/crypto/func/func.cpp @@ -60,21 +60,36 @@ void generate_output_func(SymDef* func_sym) { code.print(std::cerr, 9); } code.simplify_var_types(); - // std::cerr << "after simplify_var_types: \n"; code.print(std::cerr, 0); + if (verbosity >= 5) { + std::cerr << "after simplify_var_types: \n"; + code.print(std::cerr, 0); + } code.prune_unreachable_code(); - // std::cerr << "after prune_unreachable: \n"; code.print(std::cerr, 0); + if (verbosity >= 5) { + std::cerr << "after prune_unreachable: \n"; + code.print(std::cerr, 0); + } code.split_vars(true); - // std::cerr << "after split_vars: \n"; code.print(std::cerr, 0); + if (verbosity >= 5) { + std::cerr << "after split_vars: \n"; + code.print(std::cerr, 0); + } for (int i = 0; i < 8; i++) { code.compute_used_code_vars(); - if (verbosity >= 5) { + if (verbosity >= 4) { std::cerr << "after compute_used_vars: \n"; code.print(std::cerr, 6); } code.fwd_analyze(); - // std::cerr << "after fwd_analyze: \n"; code.print(std::cerr, 6); + if (verbosity >= 5) { + std::cerr << "after fwd_analyze: \n"; + code.print(std::cerr, 6); + } code.prune_unreachable_code(); - // std::cerr << "after prune_unreachable: \n"; code.print(std::cerr, 6); + if (verbosity >= 5) { + std::cerr << "after prune_unreachable: \n"; + code.print(std::cerr, 6); + } } code.mark_noreturn(); if (verbosity >= 3) { @@ -83,7 +98,8 @@ void generate_output_func(SymDef* func_sym) { if (verbosity >= 2) { std::cerr << "\n---------- resulting code for " << name << " -------------\n"; } - *outs << std::string(indent * 2, ' ') << name << " PROC:<{\n"; + bool inline_ref = (func_val->flags & 2); + *outs << std::string(indent * 2, ' ') << name << " PROC" << (inline_ref ? "REF" : "") << ":<{\n"; code.generate_code( *outs, (stack_layout_comments ? Stack::_StkCmt | Stack::_CptStkCmt : 0) | (opt_level < 2 ? Stack::_DisableOpt : 0), diff --git a/submodules/ton/tonlib-src/crypto/func/func.h b/submodules/ton/tonlib-src/crypto/func/func.h index 8fc881c88b..d1481299b8 100644 --- a/submodules/ton/tonlib-src/crypto/func/func.h +++ b/submodules/ton/tonlib-src/crypto/func/func.h @@ -67,6 +67,8 @@ enum Keyword { _RshiftC, _DivR, _DivC, + _ModR, + _ModC, _DivMod, _PlusLet, _MinusLet, @@ -75,10 +77,15 @@ enum Keyword { _DivRLet, _DivCLet, _ModLet, + _ModRLet, + _ModCLet, _LshiftLet, _RshiftLet, _RshiftRLet, _RshiftCLet, + _AndLet, + _OrLet, + _XorLet, _Int, _Cell, _Slice, @@ -87,9 +94,12 @@ enum Keyword { _Tuple, _Type, _Mapsto, + _Forall, _Asm, _Impure, _Extern, + _Inline, + _InlineRef, _MethodId, _Operator, _Infix, @@ -123,7 +133,7 @@ class IdSc { */ struct TypeExpr { - enum te_type { te_Unknown, te_Indirect, te_Atomic, te_Tensor, te_Map, te_Type, te_ForAll } constr; + enum te_type { te_Unknown, te_Var, te_Indirect, te_Atomic, te_Tensor, te_Map, te_Type, te_ForAll } constr; enum { _Int = Keyword::_Int, _Cell = Keyword::_Cell, @@ -168,6 +178,9 @@ struct TypeExpr { bool is_int() const { return is_atomic(_Int); } + bool is_var() const { + return constr == te_Var; + } bool has_fixed_width() const { return minw == maxw; } @@ -210,7 +223,10 @@ struct TypeExpr { return new_tensor({te1, te2, te3}); } static TypeExpr* new_var() { - return new TypeExpr{te_Unknown, --type_vars, 1}; + return new TypeExpr{te_Var, --type_vars, 1}; + } + static TypeExpr* new_var(int idx) { + return new TypeExpr{te_Var, idx, 1}; } static TypeExpr* new_forall(std::vector list, TypeExpr* body) { return new TypeExpr{te_ForAll, body, std::move(list)}; @@ -392,6 +408,7 @@ inline std::ostream& operator<<(std::ostream& os, const VarDescr& vd) { struct VarDescrList { std::vector list; + bool unreachable{false}; VarDescrList() : list() { } VarDescrList(const std::vector& _list) : list(_list) { @@ -425,6 +442,10 @@ struct VarDescrList { VarDescrList operator|(const VarDescrList& y) const; VarDescrList& operator|=(const VarDescrList& values); void show(std::ostream& os) const; + void set_unreachable() { + list.clear(); + unreachable = true; + } }; inline std::ostream& operator<<(std::ostream& os, const VarDescrList& values) { @@ -632,6 +653,9 @@ struct CodeBlob { } bool import_params(FormalArgList arg_list); var_idx_t create_var(int cls, TypeExpr* var_type = 0, SymDef* sym = 0, const SrcLocation* loc = 0); + var_idx_t create_tmp_var(TypeExpr* var_type = 0, const SrcLocation* loc = 0) { + return create_var(TmpVar::_Tmp, var_type, nullptr, loc); + } int split_vars(bool strict = false); bool compute_used_code_vars(); bool compute_used_code_vars(std::unique_ptr& ops, const VarDescrList& var_info, bool edit) const; @@ -670,8 +694,9 @@ struct SymVal : sym::SymValBase { TypeExpr* sym_type; td::RefInt256 method_id; bool impure; + short flags; // +1 = inline, +2 = inline_ref SymVal(int _type, int _idx, TypeExpr* _stype = nullptr, bool _impure = false) - : sym::SymValBase(_type, _idx), sym_type(_stype), impure(_impure) { + : sym::SymValBase(_type, _idx), sym_type(_stype), impure(_impure), flags(0) { } ~SymVal() override = default; TypeExpr* get_type() const { @@ -710,6 +735,16 @@ struct SymValCodeFunc : SymValFunc { } }; +struct SymValType : sym::SymValBase { + TypeExpr* sym_type; + SymValType(int _type, int _idx, TypeExpr* _stype = nullptr) : sym::SymValBase(_type, _idx), sym_type(_stype) { + } + ~SymValType() override = default; + TypeExpr* get_type() const { + return sym_type; + } +}; + extern int glob_func_cnt, undef_func_cnt; extern std::vector glob_func; @@ -802,6 +837,10 @@ struct Expr { int define_new_vars(CodeBlob& code); int predefine_vars(); std::vector pre_compile(CodeBlob& code) const; + var_idx_t new_tmp(CodeBlob& code) const; + std::vector new_tmp_vect(CodeBlob& code) const { + return {new_tmp(code)}; + } }; /* diff --git a/submodules/ton/tonlib-src/crypto/func/gen-abscode.cpp b/submodules/ton/tonlib-src/crypto/func/gen-abscode.cpp index ab2efed541..a3cc52042d 100644 --- a/submodules/ton/tonlib-src/crypto/func/gen-abscode.cpp +++ b/submodules/ton/tonlib-src/crypto/func/gen-abscode.cpp @@ -212,6 +212,10 @@ int Expr::predefine_vars() { return 0; } +var_idx_t Expr::new_tmp(CodeBlob& code) const { + return code.create_tmp_var(e_type, &here); +} + std::vector Expr::pre_compile(CodeBlob& code) const { switch (cls) { case _Tuple: { @@ -241,8 +245,7 @@ std::vector Expr::pre_compile(CodeBlob& code) const { res.insert(res.end(), add.cbegin(), add.cend()); } } - var_idx_t rv = code.create_var(TmpVar::_Tmp, e_type, nullptr, &here); - std::vector rvect{rv}; + auto rvect = new_tmp_vect(code); auto& op = code.emplace_back(here, Op::_Call, rvect, std::move(res), sym); if (flags & _IsImpure) { op.flags |= Op::_Impure; @@ -256,57 +259,52 @@ std::vector Expr::pre_compile(CodeBlob& code) const { return {val}; case _VarApply: if (args[0]->cls == _Glob) { - std::vector res = args[1]->pre_compile(code); - var_idx_t rv = code.create_var(TmpVar::_Tmp, e_type, nullptr, &here); - std::vector rvect{rv}; + auto res = args[1]->pre_compile(code); + auto rvect = new_tmp_vect(code); auto& op = code.emplace_back(here, Op::_Call, rvect, std::move(res), args[0]->sym); if (args[0]->flags & _IsImpure) { op.flags |= Op::_Impure; } return rvect; } else { - std::vector res = args[1]->pre_compile(code); - std::vector tfunc = args[0]->pre_compile(code); + auto res = args[1]->pre_compile(code); + auto tfunc = args[0]->pre_compile(code); if (tfunc.size() != 1) { throw src::Fatal{"stack tuple used as a function"}; } res.push_back(tfunc[0]); - var_idx_t rv = code.create_var(TmpVar::_Tmp, e_type, nullptr, &here); - std::vector rvect{rv}; + auto rvect = new_tmp_vect(code); code.emplace_back(here, Op::_CallInd, rvect, std::move(res)); return rvect; } case _Const: { - var_idx_t rv = code.create_var(TmpVar::_Tmp, e_type, nullptr, &here); - std::vector rvect{rv}; + auto rvect = new_tmp_vect(code); code.emplace_back(here, Op::_IntConst, rvect, intval); return rvect; } case _Glob: { - var_idx_t rv = code.create_var(TmpVar::_Tmp, e_type, nullptr, &here); - std::vector rvect{rv}; + auto rvect = new_tmp_vect(code); code.emplace_back(here, Op::_GlobVar, rvect, std::vector{}, sym); return rvect; } case _Letop: { - std::vector right = args[1]->pre_compile(code); - std::vector left = args[0]->pre_compile(code); - code.emplace_back(here, Op::_Let, left, std::move(right)); - return left; + auto right = args[1]->pre_compile(code); + auto left = args[0]->pre_compile(code); + code.emplace_back(here, Op::_Let, std::move(left), right); + return right; } case _LetFirst: { - var_idx_t rv = code.create_var(TmpVar::_Tmp, e_type, nullptr, &here); - std::vector right = args[1]->pre_compile(code); - std::vector left = args[0]->pre_compile(code); - left.push_back(rv); + auto rvect = new_tmp_vect(code); + auto right = args[1]->pre_compile(code); + auto left = args[0]->pre_compile(code); + left.push_back(rvect[0]); code.emplace_back(here, Op::_Let, std::move(left), std::move(right)); - return std::vector{rv}; + return rvect; } case _CondExpr: { auto cond = args[0]->pre_compile(code); assert(cond.size() == 1); - var_idx_t rv = code.create_var(TmpVar::_Tmp, e_type, nullptr, &here); - std::vector rvect{rv}; + auto rvect = new_tmp_vect(code); Op& if_op = code.emplace_back(here, Op::_If, cond); code.push_set_cur(if_op.block0); code.emplace_back(here, Op::_Let, rvect, args[1]->pre_compile(code)); diff --git a/submodules/ton/tonlib-src/crypto/func/keywords.cpp b/submodules/ton/tonlib-src/crypto/func/keywords.cpp index bab30d32a6..c640f4fe71 100644 --- a/submodules/ton/tonlib-src/crypto/func/keywords.cpp +++ b/submodules/ton/tonlib-src/crypto/func/keywords.cpp @@ -54,6 +54,7 @@ void define_keywords() { .add_kw_char('>') .add_kw_char('&') .add_kw_char('|') + .add_kw_char('^') .add_kw_char('~'); using Kw = funC::Keyword; @@ -64,22 +65,29 @@ void define_keywords() { .add_keyword("<=>", Kw::_Spaceship) .add_keyword("<<", Kw::_Lshift) .add_keyword(">>", Kw::_Rshift) - .add_keyword(">>~", Kw::_RshiftR) - .add_keyword(">>^", Kw::_RshiftC) - .add_keyword("/~", Kw::_DivR) - .add_keyword("/^", Kw::_DivC) + .add_keyword("~>>", Kw::_RshiftR) + .add_keyword("^>>", Kw::_RshiftC) + .add_keyword("~/", Kw::_DivR) + .add_keyword("^/", Kw::_DivC) + .add_keyword("~%", Kw::_ModR) + .add_keyword("^%", Kw::_ModC) .add_keyword("/%", Kw::_DivMod) .add_keyword("+=", Kw::_PlusLet) .add_keyword("-=", Kw::_MinusLet) .add_keyword("*=", Kw::_TimesLet) .add_keyword("/=", Kw::_DivLet) + .add_keyword("~/=", Kw::_DivRLet) + .add_keyword("^/=", Kw::_DivCLet) .add_keyword("%=", Kw::_ModLet) - .add_keyword("/~=", Kw::_DivRLet) - .add_keyword("/^=", Kw::_DivCLet) + .add_keyword("~%=", Kw::_ModRLet) + .add_keyword("^%=", Kw::_ModCLet) .add_keyword("<<=", Kw::_LshiftLet) .add_keyword(">>=", Kw::_RshiftLet) - .add_keyword(">>~=", Kw::_RshiftRLet) - .add_keyword(">>^=", Kw::_RshiftCLet); + .add_keyword("~>>=", Kw::_RshiftRLet) + .add_keyword("^>>=", Kw::_RshiftCLet) + .add_keyword("&=", Kw::_AndLet) + .add_keyword("|=", Kw::_OrLet) + .add_keyword("^=", Kw::_XorLet); sym::symbols.add_keyword("return", Kw::_Return) .add_keyword("var", Kw::_Var) @@ -100,11 +108,15 @@ void define_keywords() { .add_keyword("builder", Kw::_Builder) .add_keyword("cont", Kw::_Cont) .add_keyword("tuple", Kw::_Tuple) - .add_keyword("->", Kw::_Mapsto); + .add_keyword("type", Kw::_Type) + .add_keyword("->", Kw::_Mapsto) + .add_keyword("forall", Kw::_Forall); sym::symbols.add_keyword("extern", Kw::_Extern) .add_keyword("asm", Kw::_Asm) .add_keyword("impure", Kw::_Impure) + .add_keyword("inline", Kw::_Inline) + .add_keyword("inline_ref", Kw::_InlineRef) .add_keyword("method_id", Kw::_MethodId) .add_keyword("operator", Kw::_Operator) .add_keyword("infix", Kw::_Infix) diff --git a/submodules/ton/tonlib-src/crypto/func/parse-func.cpp b/submodules/ton/tonlib-src/crypto/func/parse-func.cpp index f605bd83ef..e04077918c 100644 --- a/submodules/ton/tonlib-src/crypto/func/parse-func.cpp +++ b/submodules/ton/tonlib-src/crypto/func/parse-func.cpp @@ -89,6 +89,15 @@ TypeExpr* parse_type1(Lexer& lex) { case '_': lex.next(); return TypeExpr::new_hole(); + case _Ident: { + auto sym = sym::lookup_symbol(lex.cur().val); + if (sym && dynamic_cast(sym->value)) { + auto val = dynamic_cast(sym->value); + lex.next(); + return val->get_type(); + } + lex.cur().error_at("`", "` is not a type identifier"); + } } lex.expect('('); if (lex.tp() == ')') { @@ -133,7 +142,14 @@ FormalArg parse_formal_arg(Lexer& lex, int fa_idx) { } else if (lex.tp() != _Ident) { arg_type = parse_type(lex); } else { - arg_type = TypeExpr::new_hole(); + auto sym = sym::lookup_symbol(lex.cur().val); + if (sym && dynamic_cast(sym->value)) { + auto val = dynamic_cast(sym->value); + lex.next(); + arg_type = val->get_type(); + } else { + arg_type = TypeExpr::new_hole(); + } } if (lex.tp() == '_' || lex.tp() == ',' || lex.tp() == ')') { if (lex.tp() == '_') { @@ -147,6 +163,9 @@ FormalArg parse_formal_arg(Lexer& lex, int fa_idx) { } loc = lex.cur().loc; SymDef* new_sym_def = sym::define_symbol(lex.cur().val, true, loc); + if (!new_sym_def) { + lex.cur().error_at("cannot define symbol `", "`"); + } if (new_sym_def->value) { lex.cur().error_at("redefined formal parameter `", "`"); } @@ -295,6 +314,15 @@ Expr* parse_expr100(Lexer& lex, CodeBlob& code, bool nv) { return res; } if (t == _Ident) { + auto sym = sym::lookup_symbol(lex.cur().val); + if (sym && dynamic_cast(sym->value)) { + auto val = dynamic_cast(sym->value); + Expr* res = new Expr{Expr::_Type, lex.cur().loc}; + res->flags = Expr::_IsType; + res->e_type = val->get_type(); + lex.next(); + return res; + } Expr* res = new Expr{Expr::_Var, lex.cur().loc}; if (nv) { res->val = ~lex.cur().val; @@ -302,14 +330,14 @@ Expr* parse_expr100(Lexer& lex, CodeBlob& code, bool nv) { res->flags = Expr::_IsLvalue | Expr::_IsNewVar; // std::cerr << "defined new variable " << lex.cur().str << " : " << res->e_type << std::endl; } else { - res->sym = sym::lookup_symbol(lex.cur().val); - if (!res->sym) { + if (!sym) { check_global_func(lex.cur()); - res->sym = sym::lookup_symbol(lex.cur().val); + sym = sym::lookup_symbol(lex.cur().val); } + res->sym = sym; SymVal* val = nullptr; - if (res->sym) { - val = dynamic_cast(res->sym->value); + if (sym) { + val = dynamic_cast(sym->value); } if (!val) { lex.cur().error_at("undefined identifier `", "`"); @@ -428,7 +456,6 @@ Expr* parse_expr80(Lexer& lex, CodeBlob& code, bool nv) { res->flags = Expr::_IsRvalue | (val->impure ? Expr::_IsImpure : 0); res->deduce_type(lex.cur()); if (modify) { - // FIXME (use _LetFirst instead of _Letop) auto tmp = res; res = new Expr{Expr::_LetFirst, {obj->copy(), tmp}}; res->here = loc; @@ -464,7 +491,7 @@ Expr* parse_expr75(Lexer& lex, CodeBlob& code, bool nv) { Expr* parse_expr30(Lexer& lex, CodeBlob& code, bool nv) { Expr* res = parse_expr75(lex, code, nv); while (lex.tp() == '*' || lex.tp() == '/' || lex.tp() == '%' || lex.tp() == _DivMod || lex.tp() == _DivC || - lex.tp() == _DivR || lex.tp() == '&') { + lex.tp() == _DivR || lex.tp() == _ModC || lex.tp() == _ModR || lex.tp() == '&') { res->chk_rvalue(lex.cur()); int t = lex.tp(); sym_idx_t name = symbols.lookup_add(std::string{"_"} + lex.cur().str + "_"); @@ -482,7 +509,7 @@ Expr* parse_expr30(Lexer& lex, CodeBlob& code, bool nv) { return res; } -// parse [-] E { (+ | - | `|` ) E } +// parse [-] E { (+ | - | `|` | ^) E } Expr* parse_expr20(Lexer& lex, CodeBlob& code, bool nv) { Expr* res; int t = lex.tp(); @@ -501,7 +528,7 @@ Expr* parse_expr20(Lexer& lex, CodeBlob& code, bool nv) { } else { res = parse_expr30(lex, code, nv); } - while (lex.tp() == '-' || lex.tp() == '+' || lex.tp() == '|') { + while (lex.tp() == '-' || lex.tp() == '+' || lex.tp() == '|' || lex.tp() == '^') { res->chk_rvalue(lex.cur()); t = lex.tp(); sym_idx_t name = symbols.lookup_add(std::string{"_"} + lex.cur().str + "_"); @@ -587,7 +614,8 @@ Expr* parse_expr10(Lexer& lex, CodeBlob& code, bool nv) { auto x = parse_expr13(lex, code, nv); int t = lex.tp(); if (t == _PlusLet || t == _MinusLet || t == _TimesLet || t == _DivLet || t == _DivRLet || t == _DivCLet || - t == _ModLet || t == _LshiftLet || t == _RshiftLet || t == _RshiftCLet || t == _RshiftRLet) { + t == _ModLet || t == _ModCLet || t == _ModRLet || t == _LshiftLet || t == _RshiftLet || t == _RshiftCLet || + t == _RshiftRLet || t == _AndLet || t == _OrLet || t == _XorLet) { x->chk_lvalue(lex.cur()); x->chk_rvalue(lex.cur()); sym_idx_t name = symbols.lookup_add(std::string{"^_"} + lex.cur().str + "_"); @@ -960,9 +988,76 @@ SymValAsmFunc* parse_asm_func_body(Lexer& lex, TypeExpr* func_type, const Formal return res; } +std::vector parse_type_var_list(Lexer& lex) { + std::vector res; + lex.expect(_Forall); + int idx = 0; + while (true) { + if (lex.tp() == _Type) { + lex.next(); + } + if (lex.tp() != _Ident) { + throw src::ParseError{lex.cur().loc, "free type identifier expected"}; + } + auto loc = lex.cur().loc; + SymDef* new_sym_def = sym::define_symbol(lex.cur().val, true, loc); + if (new_sym_def->value) { + lex.cur().error_at("redefined type variable `", "`"); + } + auto var = TypeExpr::new_var(idx); + new_sym_def->value = new SymValType{SymVal::_Typename, idx++, var}; + res.push_back(var); + lex.next(); + if (lex.tp() != ',') { + break; + } + lex.next(); + } + lex.expect(_Mapsto); + return res; +} + +void type_var_usage(TypeExpr* expr, const std::vector& typevars, std::vector& used) { + if (expr->constr != TypeExpr::te_Var) { + for (auto arg : expr->args) { + type_var_usage(arg, typevars, used); + } + return; + } + for (std::size_t i = 0; i < typevars.size(); i++) { + if (typevars[i] == expr) { + used.at(i) = true; + return; + } + } + return; +} + +TypeExpr* compute_type_closure(TypeExpr* expr, const std::vector& typevars) { + if (typevars.empty()) { + return expr; + } + std::vector used(typevars.size(), false); + type_var_usage(expr, typevars, used); + std::vector used_vars; + for (std::size_t i = 0; i < typevars.size(); i++) { + if (used.at(i)) { + used_vars.push_back(typevars[i]); + } + } + if (!used_vars.empty()) { + expr = TypeExpr::new_forall(std::move(used_vars), expr); + } + return expr; +} + void parse_func_def(Lexer& lex) { SrcLocation loc{lex.cur().loc}; sym::open_scope(lex); + std::vector type_vars; + if (lex.tp() == _Forall) { + type_vars = parse_type_var_list(lex); + } auto ret_type = parse_type(lex); if (lex.tp() != _Ident) { throw src::ParseError{lex.cur().loc, "function name identifier expected"}; @@ -974,6 +1069,11 @@ void parse_func_def(Lexer& lex) { if (impure) { lex.next(); } + int f = 0; + if (lex.tp() == _Inline || lex.tp() == _InlineRef) { + f = (lex.tp() == _Inline) ? 1 : 2; + lex.next(); + } td::RefInt256 method_id; std::string method_name; if (lex.tp() == _MethodId) { @@ -1005,6 +1105,7 @@ void parse_func_def(Lexer& lex) { lex.expect('{', "function body block expected"); } TypeExpr* func_type = TypeExpr::new_map(extract_total_arg_type(arg_list), ret_type); + func_type = compute_type_closure(func_type, type_vars); if (verbosity >= 1) { std::cerr << "function " << func_name.str << " : " << func_type << std::endl; } @@ -1071,6 +1172,17 @@ void parse_func_def(Lexer& lex) { lex.cur().error("integer method identifier for `"s + func_name.str + "` changed to a different value"); } } + if (f) { + auto val = dynamic_cast(func_sym->value); + if (!val) { + lex.cur().error("cannot set unknown function `"s + func_name.str + "` as an inline"); + } + if (!(val->flags & 3)) { + val->flags = (short)(val->flags | f); + } else if ((val->flags & 3) != f) { + lex.cur().error("inline mode for `"s + func_name.str + "` changed with respect to a previous declaration"); + } + } if (verbosity >= 1) { std::cerr << "new type of function " << func_name.str << " : " << func_type << std::endl; } diff --git a/submodules/ton/tonlib-src/crypto/func/test/a6.fc b/submodules/ton/tonlib-src/crypto/func/test/a6.fc index 06eeed9fe3..3a387aace1 100644 --- a/submodules/ton/tonlib-src/crypto/func/test/a6.fc +++ b/submodules/ton/tonlib-src/crypto/func/test/a6.fc @@ -59,20 +59,20 @@ operator _/%_ infix 20; return (x / y, x % y); } -} -{- -< type A, type B, type C > + +forall A, B, C -> (B, C, A) rot (A x, B y, C z) { return (y, z, x); } --} + int ataninv(int base, int q) { ;; computes base*atan(1/q) - base /~= q; + base ~/= q; q *= - q; int sum = 0; int n = 1; do { - sum += base /~ n; - base /~= q; + sum += base ~/ n; + base ~/= q; n += 2; } until base == 0; return sum; @@ -81,5 +81,9 @@ int ataninv(int base, int q) { ;; computes base*atan(1/q) int calc_pi() { int base = 64; repeat (70) { base *= 10; } - return (ataninv(base << 2, 5) - ataninv(base, 239)) >>~ 4; + return (ataninv(base << 2, 5) - ataninv(base, 239)) ~>> 4; +} + +int main() { + return calc_pi(); } diff --git a/submodules/ton/tonlib-src/crypto/func/test/a6_3.fc b/submodules/ton/tonlib-src/crypto/func/test/a6_3.fc new file mode 100644 index 0000000000..7c8ff3af2e --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/func/test/a6_3.fc @@ -0,0 +1,22 @@ +forall A, B, C -> +(B, C, A) rot(A x, B y, C z) { + return (y, z, x); +} + +forall A, B, C -> +_ rot2(A x, B y, C z) { + return rot(rot(x, y, z)); +} + +_ test() { + return rot2(2, 3, 9); +} + +_ test2(cell x, slice y, tuple z) { + return rot2(x, y, z); +} + +forall A -> +_ test3(cell x, A y, int z) { + return rot2(x, y, z); +} diff --git a/submodules/ton/tonlib-src/crypto/func/test/b3.fc b/submodules/ton/tonlib-src/crypto/func/test/b3.fc new file mode 100644 index 0000000000..0e1e403474 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/func/test/b3.fc @@ -0,0 +1,20 @@ +;; inline test +_ unpack() inline { + var ds = get_data().begin_parse(); + var res = (ds~load_uint(8), ds~load_int(32), ds~load_int(32)); + return res; +} + +() pack(a, x, y) impure inline_ref { + set_data(begin_cell() + .store_uint(a, 8) + .store_int(x, 32) + .store_int(y, 32) + .end_cell()); +} + +() main() impure { + var (a, x, y) = unpack(); + x += y; + pack(a, x, y); +} diff --git a/submodules/ton/tonlib-src/crypto/func/test/w1.fc b/submodules/ton/tonlib-src/crypto/func/test/w1.fc new file mode 100644 index 0000000000..6efd4f3e19 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/func/test/w1.fc @@ -0,0 +1,9 @@ +(int, int) nested_if(int id) method_id { + dump_stack(); + if (id > 0) { + if (id > 10) { + return (2 * id, 3 * id); + } + } + return (5, 6); +} diff --git a/submodules/ton/tonlib-src/crypto/func/test/w2.fc b/submodules/ton/tonlib-src/crypto/func/test/w2.fc new file mode 100644 index 0000000000..3bbcd415ab --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/func/test/w2.fc @@ -0,0 +1,14 @@ +_ f(cs) { + return (cs~load_uint(8), cs~load_uint(8), cs~load_uint(8), cs~load_uint(8), + cs~load_uint(8), cs~load_uint(8), cs~load_uint(8), cs~load_uint(8), + cs~load_uint(8), cs~load_uint(8), cs~load_uint(8), cs~load_uint(8), + cs~load_uint(8), cs~load_uint(8), cs~load_uint(8), cs~load_uint(8), + cs~load_uint(8), cs~load_uint(8), cs~load_uint(8), cs~load_uint(8)); +} + +_ main(cs) { + var (x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, + x11, x12, x13, x14, x15, x16, x17, x18, x19) = f(cs); + return x0 + x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19; +} diff --git a/submodules/ton/tonlib-src/crypto/func/test/w3.fc b/submodules/ton/tonlib-src/crypto/func/test/w3.fc new file mode 100644 index 0000000000..0de8e551f6 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/func/test/w3.fc @@ -0,0 +1,13 @@ +() main(cs) impure { + int i = 0; + if (cs.slice_refs()) { + do { + i = i + 1; + } until(i > 10); + } + set_data(begin_cell() + .store_uint(1, 32) + .store_uint(2, 32) + .store_uint(i, 32) + .end_cell()); +} diff --git a/submodules/ton/tonlib-src/crypto/func/test/w4.fc b/submodules/ton/tonlib-src/crypto/func/test/w4.fc new file mode 100644 index 0000000000..1c0e2cefe1 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/func/test/w4.fc @@ -0,0 +1,13 @@ +_ main(cell dict, int t3) { + int index = -1; + do { + (index, slice value, int found) = dict.udict_get_next?(32, index); + if (found) { + (int temp1, int temp2) = (value~load_uint(16), value~load_uint(32)); + if (t3 > temp2) { + dict~udict_delete_get?(32, index); + } + } + } until ( ~ found); + return dict; +} diff --git a/submodules/ton/tonlib-src/crypto/func/test/w5.fc b/submodules/ton/tonlib-src/crypto/func/test/w5.fc new file mode 100644 index 0000000000..330a505042 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/func/test/w5.fc @@ -0,0 +1,14 @@ +(cell) recv_external(slice in_msg) impure { + cell mydict = new_dict(); + builder r = begin_cell().store_int(10, 16); + mydict~udict_set_builder(32, 1, r ); + int index = -1; + do { + (var index, var value, var found) = mydict.udict_get_next?(32, index); + } until ( ~ found ); + return mydict; +} + +() recv_internal() impure { + ;; Nothing +} diff --git a/submodules/ton/tonlib-src/crypto/func/test/w6.fc b/submodules/ton/tonlib-src/crypto/func/test/w6.fc new file mode 100644 index 0000000000..37251a58e8 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/func/test/w6.fc @@ -0,0 +1,12 @@ +int test(int x) method_id { + int i = 0; + ;; int f = false; + do { + i = i + 1; + if (i > 5) { + return 1; + } + int f = (i * i == 64); + } until (f); + return -1; +} diff --git a/submodules/ton/tonlib-src/crypto/func/test/w7.fc b/submodules/ton/tonlib-src/crypto/func/test/w7.fc new file mode 100644 index 0000000000..dddfd627b2 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/func/test/w7.fc @@ -0,0 +1,14 @@ +int test(int y) { + int x = 1; + if (y > 0) { + return 1; + } + return x > 0; +} + +int f(int y) { + if (y > 0) { + return 1; + } + return 2; +} diff --git a/submodules/ton/tonlib-src/crypto/func/unify-types.cpp b/submodules/ton/tonlib-src/crypto/func/unify-types.cpp index fd841a0fbe..698d21feba 100644 --- a/submodules/ton/tonlib-src/crypto/func/unify-types.cpp +++ b/submodules/ton/tonlib-src/crypto/func/unify-types.cpp @@ -153,7 +153,7 @@ bool TypeExpr::remove_forall(TypeExpr*& te) { bool TypeExpr::remove_forall_in(TypeExpr*& te, TypeExpr* te2, const std::vector& new_vars) { assert(te); assert(te2 && te2->constr == te_ForAll); - if (te->constr == te_Unknown) { + if (te->constr == te_Var) { for (std::size_t i = 0; i < new_vars.size(); i++) { if (te == te2->args[i + 1]) { te = new_vars[i]; @@ -201,12 +201,14 @@ std::ostream& operator<<(std::ostream& os, TypeExpr* type_expr) { std::ostream& TypeExpr::print(std::ostream& os, int lex_level) { switch (constr) { case te_Unknown: - if (value >= 0) { - return os << "??" << value; - } else if (value >= -26) { - return os << (char)(64 - value); + return os << "??" << value; + case te_Var: + if (value >= -26 && value < 0) { + return os << "_" << (char)(91 + value); + } else if (value >= 0 && value < 26) { + return os << (char)(65 + value); } else { - return os << "TVAR" << -value; + return os << "TVAR" << value; } case te_Indirect: return os << args[0]; diff --git a/submodules/ton/tonlib-src/crypto/smartcont/CreateState.fif b/submodules/ton/tonlib-src/crypto/smartcont/CreateState.fif index d701ecdc69..d3c05c00c9 100644 --- a/submodules/ton/tonlib-src/crypto/smartcont/CreateState.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/CreateState.fif @@ -182,3 +182,48 @@ dictnew constant special-dict -2 constant run_ticktock -3 constant split_prepare -4 constant split_install + +// public key conversion + + +// restricted wallet creation +"auto/restricted-wallet-code.fif" include =: RWCode1 +"auto/restricted-wallet2-code.fif" include =: RWCode2 + +// pubkey amount -- +{ over ."Key " pubkey>$ type ." -> " + RWCode1 // code + // data + empty_cell // libs + 3 roll // balance + 0 // split_depth + 0 // ticktock + 2 // mode: create + register_smc + Masterchain 6 .Addr cr +} : create-wallet1 + +// D x t -- D' +{ idict! not abort"cannot add value" +} : rdict-entry +// balance -- dict +{ dictnew + over -32768 rdict-entry + over 3/4 */ 92 rdict-entry + over 1/2 */ 183 rdict-entry + swap 1/4 */ 366 rdict-entry + 0 548 rdict-entry +} : make-rdict + +// pubkey amount -- +{ over ."Key " pubkey>$ type ." -> " + RWCode2 // code + // data + empty_cell // libs + 3 roll // balance + 0 // split_depth + 0 // ticktock + 2 // mode: create + register_smc + Masterchain 6 .Addr cr +} : create-wallet2 diff --git a/submodules/ton/tonlib-src/crypto/smartcont/asm-to-cpp.fif b/submodules/ton/tonlib-src/crypto/smartcont/asm-to-cpp.fif new file mode 100755 index 0000000000..21ff34bb2d --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/asm-to-cpp.fif @@ -0,0 +1,31 @@ +#!/usr/bin/fift -s +"TonUtil.fif" include +"Asm.fif" include + +{ ."usage: " @' $0 type ." " cr + ."Compiles asm from file and stores serialization in a way prepared for usage from c++ to " cr 1 halt +} : usage + + +$# 3 - ' usage if + + +$1 =: source +$2 =: destination +$3 =: name + +."Include source from " source type cr +source include + +boc>B +."Convert boc to base64" cr +B>base64 + +{ char " chr tuck $+ $+ } : wrp +wrp // "" +"with_tvm_code(" name wrp $+ +", " swap ");" 10 hold $+ $+ // "with_tm_code("");\n" + +$>B + +."Store tvm code to " destination type cr +destination B>file diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/config-code.cpp b/submodules/ton/tonlib-src/crypto/smartcont/auto/config-code.cpp new file mode 100644 index 0000000000..fdc0e4fa4d --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/config-code.cpp @@ -0,0 +1 @@ +with_tvm_code("config", "te6ccgECFQEAAjUAART/APSkE/Sg8sgLAQIBIAIDAgLHBAUCAvETFAIBzwYHAAaqglsCASAICQIBIA4PAgEgCgsCASAMDQDpAHQ0wP6QDAg+kQBpANxsBOxI8cAsZJfA+AC0x/TPyKCEE5WU1S6jj0yAdTRcfgzIG6SMH+U0NcL/+IDcAS6mzIh8AIh+CO8ArywkQLinYAkWPABghDudk9L8ATgMYIQ7nZPb/AF4BAkXwQgwAABgx6wsfKlgACU7UTQ1FAzgCD0FcjMAc8Wye1UgADM0NMHAcAR8onTH9Mf0w/TDzAgwgDyib7yiYAArHCAGMjLBVAFzxYUy27LH8s/yQH7AIAIBIBAQAgEgERIACSAQPADgAFscfgz0NcL//gjghBOQ29kcIIAxP/IyxAUy/+DHfoCE8tqEssfyz8BzxbJcPsAgAL8IYIQQ2ZQIbqbMdMf1NFAE4Ag9BWORyGCEE5Db2S6jhcx1CH7BCDHAJFbm+1DAu1TIfEGgu1T4o4iIYIQUGJLIbqVMTHT/9GOESGCEE5D7wW6kzHwBpMw8mDi4uIB4gGAArQw7UTQ1IAggCRTMfRqIG6TECNbjjgg0CDXScInjinTB9cLHwHAEfgjEr6wjhUBgCJUEET0blRTIfRuMIAkQBP0WjCTECNb4pQQNF8D4uLIzAHPFsntVIAB5IMI1xgg0x/TH9Mf+CMSufJj7UTQ1NMf0//RUUG68qEF+QFUEGP5EPKi+AAQNBLwBwKkyBLMyx/L/8ntVIA=="); diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/config-code.fif b/submodules/ton/tonlib-src/crypto/smartcont/auto/config-code.fif new file mode 100644 index 0000000000..2fed584c31 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/config-code.fif @@ -0,0 +1,344 @@ +// automatically generated from `smartcont/stdlib.fc` `smartcont/config-code.fc` +PROGRAM{ + DECLPROC set_conf_param + DECLPROC check_validator_set + DECLPROC send_answer + DECLPROC send_confirmation + DECLPROC send_error + DECLPROC recv_internal + DECLPROC change_elector_code + 1666 DECLMETHOD after_code_upgrade + DECLPROC perform_action + DECLPROC recv_external + DECLPROC run_ticktock + set_conf_param PROC:<{ + // index value + c4 PUSH // index value _3 + CTOS // index value cs + LDREF // index value cfg_dict cs + s3 s3 XCHG2 + 32 PUSHINT // cs value index cfg_dict _9=32 + DICTISETREF // cs cfg_dict + NEWC // cs cfg_dict _11 + STREF // cs _12 + SWAP // _12 cs + STSLICER // _13 + ENDC // _14 + c4 POP + }> + check_validator_set PROC:<{ + // vset + CTOS // cs + 8 LDU // _4 cs + SWAP // cs _4 + 17 EQINT // cs _8 + 9 THROWIFNOT + 32 LDU // utime_since cs + 32 LDU // utime_since utime_until cs + 16 LDU // utime_since utime_until total cs + 16 LDU // utime_since utime_until total _42 _41 + DROP // utime_since utime_until total main + DUP // utime_since utime_until total main main + 0 GTINT // utime_since utime_until total main _28 + 9 THROWIFNOT + GEQ // utime_since utime_until _31 + 9 THROWIFNOT + }> + send_answer PROC:<{ + // addr query_id ans_tag mode + 0 PUSHINT // addr query_id ans_tag mode _4=0 + 24 PUSHINT // addr query_id ans_tag mode _4=0 _5=24 + NEWC // addr query_id ans_tag mode _4=0 _5=24 _6 + 6 STU // addr query_id ans_tag mode _4=0 _8 + s0 s5 XCHG2 // _4=0 query_id ans_tag mode _8 addr + STSLICER // _4=0 query_id ans_tag mode _9 + s1 s4 XCHG // mode query_id ans_tag _4=0 _9 + 111 STU // mode query_id ans_tag _23 + 32 STU // mode query_id _25 + 64 STU // mode _27 + ENDC // mode _28 + SWAP // _28 mode + SENDRAWMSG + }> + send_confirmation PROC:<{ + // addr query_id ans_tag + 64 PUSHINT // addr query_id ans_tag _3=64 + send_answer CALLDICT + }> + send_error PROC:<{ + // addr query_id ans_tag + 64 PUSHINT // addr query_id ans_tag _3=64 + send_answer CALLDICT + }> + recv_internal PROC:<{ + // in_msg_cell in_msg + SWAP // in_msg in_msg_cell + CTOS // in_msg cs + 4 LDU // in_msg flags cs + LDMSGADDR // in_msg flags _74 _73 + DROP // in_msg flags s_addr + DUP // in_msg flags s_addr s_addr + REWRITESTDADDR // in_msg flags s_addr src_wc src_addr + SWAP // in_msg flags s_addr src_addr src_wc + INC // in_msg flags s_addr src_addr _15 + s0 s3 XCHG + 1 PUSHINT // in_msg _15 s_addr src_addr flags _16=1 + AND // in_msg _15 s_addr src_addr _17 + s1 s3 XCHG // in_msg src_addr s_addr _15 _17 + OR // in_msg src_addr s_addr _18 + s3 PUSH // in_msg src_addr s_addr _18 in_msg + SEMPTY // in_msg src_addr s_addr _18 _19 + OR // in_msg src_addr s_addr _20 + IFJMP:<{ // in_msg src_addr s_addr + 3 BLKDROP // + }> // in_msg src_addr s_addr + s0 s2 XCHG // s_addr src_addr in_msg + 32 LDU // s_addr src_addr tag in_msg + 64 LDU // s_addr src_addr tag query_id in_msg + s2 PUSH + 1314280276 PUSHINT // s_addr src_addr tag query_id in_msg tag _29=1314280276 + EQUAL // s_addr src_addr tag query_id in_msg _30 + IFJMP:<{ // s_addr src_addr tag query_id in_msg + s2 POP // s_addr src_addr in_msg query_id + SWAP // s_addr src_addr query_id in_msg + LDREF // s_addr src_addr query_id vset in_msg + ENDS + 1 PUSHINT // s_addr src_addr query_id vset _36=1 + CONFIGOPTPARAM // s_addr src_addr query_id vset elector_param + DUP // s_addr src_addr query_id vset elector_param elector_param + ISNULL // s_addr src_addr query_id vset elector_param _39 + IF:<{ // s_addr src_addr query_id vset elector_param + DROP // s_addr src_addr query_id vset + -1 PUSHINT // s_addr src_addr query_id vset _40=-1 + }>ELSE<{ // s_addr src_addr query_id vset elector_param + CTOS // s_addr src_addr query_id vset _42 + 256 PLDU // s_addr src_addr query_id vset _40 + }> // s_addr src_addr query_id vset elector_addr + s0 s3 XCHG + FALSE + s0 s4 XCHG // s_addr ok query_id vset src_addr elector_addr + EQUAL // s_addr ok query_id vset _47 + IF:<{ // s_addr ok query_id vset + s2 POP // s_addr vset query_id + OVER // s_addr vset query_id vset + check_validator_set CALLDICT // s_addr vset query_id t_since t_until + OVER + NOW // s_addr vset query_id t_since t_until t_since t + GREATER // s_addr vset query_id t_since t_until _53 + s0 s2 XCHG // s_addr vset query_id _53 t_until t_since + GREATER // s_addr vset query_id _53 _54 + AND // s_addr vset query_id ok + }>ELSE<{ + s0 s2 XCHG // s_addr vset query_id ok + }> + IFJMP:<{ // s_addr vset query_id + 36 PUSHINT // s_addr vset query_id _56=36 + ROT // s_addr query_id _56=36 vset + set_conf_param CALLDICT + 4000730955 PUSHINT // s_addr query_id _58=4000730955 + send_confirmation CALLDICT + }> // s_addr vset query_id + NIP // s_addr query_id + 4000730991 PUSHINT // s_addr query_id _60=4000730991 + send_error CALLDICT + }> // s_addr src_addr tag query_id in_msg + s2 s4 XCHG + 4 BLKDROP // tag + DUP // tag tag + 0 EQINT // tag _64 + SWAP + 31 PUSHPOW2 // _64 tag _67 + AND // _64 _68 + OR // _69 + 37 THROWIFNOT + }> + change_elector_code PROC:<{ + // cs + 1 PUSHINT // cs _2=1 + CONFIGOPTPARAM // cs _3 + CTOS // cs _4 + 256 PLDU // cs dest_addr + NOW // cs dest_addr query_id + 1313042276 PUSHINT // cs dest_addr query_id _9=1313042276 + 0 PUSHINT // cs dest_addr query_id _9=1313042276 _10=0 + 50431 PUSHINT // cs dest_addr query_id _9=1313042276 _10=0 _11=50431 + NEWC // cs dest_addr query_id _9=1313042276 _10=0 _11=50431 _12 + 17 STU // cs dest_addr query_id _9=1313042276 _10=0 _14 + s1 s4 XCHG // cs _10=0 query_id _9=1313042276 dest_addr _14 + 256 STU // cs _10=0 query_id _9=1313042276 _16 + 30 PUSHPOW2 // cs _10=0 query_id _9=1313042276 _16 _19 + STGRAMS // cs _10=0 query_id _9=1313042276 _20 + s1 s3 XCHG // cs _9=1313042276 query_id _10=0 _20 + 107 STU // cs _9=1313042276 query_id _34 + s1 s2 XCHG // cs query_id _9=1313042276 _34 + 32 STU // cs query_id _36 + 64 STU // cs _38 + SWAP // _38 cs + STSLICER // _39 + ENDC // _40 + 0 PUSHINT // _40 _41=0 + SENDRAWMSG + }> + after_code_upgrade PROC:<{ + // param old_code + 2DROP // + }> + perform_action PROC:<{ + // cfg_dict public_key action cs + OVER + 1130778657 PUSHINT // cfg_dict public_key action cs action _4=1130778657 + EQUAL // cfg_dict public_key action cs _5 + IF:<{ // cfg_dict public_key action cs + NIP // cfg_dict public_key cs + 32 LDU // cfg_dict public_key param_index cs + LDREF // cfg_dict public_key param_index param_value cs + ENDS + s0 s1 s3 XCHG3 + 32 PUSHINT // public_key param_value param_index cfg_dict _15=32 + DICTISETREF // public_key cfg_dict + }>ELSE<{ // cfg_dict public_key action cs + OVER + 1313042276 PUSHINT // cfg_dict public_key action cs action _17=1313042276 + EQUAL // cfg_dict public_key action cs _18 + IF:<{ // cfg_dict public_key action cs + NIP // cfg_dict public_key cs + LDREF // cfg_dict public_key new_code cs + OVER // cfg_dict public_key new_code cs new_code + SETCODE + DUP // cfg_dict public_key new_code cs cs + SEMPTY // cfg_dict public_key new_code cs _23 + IFNOT:<{ // cfg_dict public_key new_code cs + c3 PUSH // cfg_dict public_key new_code cs old_code + s0 s2 XCHG // cfg_dict public_key old_code cs new_code + c3 POP + OVER // cfg_dict public_key old_code cs old_code + after_code_upgrade CALLDICT + c3 POP + }>ELSE<{ + 2DROP // cfg_dict public_key + }> + }>ELSE<{ // cfg_dict public_key action cs + OVER + 1348619041 PUSHINT // cfg_dict public_key action cs action _29=1348619041 + EQUAL // cfg_dict public_key action cs _30 + IF:<{ // cfg_dict public_key action cs + NIP + NIP // cfg_dict cs + 256 LDU // cfg_dict public_key cs + ENDS + }>ELSE<{ // cfg_dict public_key action cs + OVER + 1313074949 PUSHINT // cfg_dict public_key action cs action _35=1313074949 + EQUAL // cfg_dict public_key action cs _36 + IF:<{ // cfg_dict public_key action cs + NIP // cfg_dict public_key cs + change_elector_code CALLDICT + }>ELSE<{ // cfg_dict public_key action cs + DROP // cfg_dict public_key action + 32 THROWIF + }> + }> + }> + SWAP // public_key cfg_dict + }> + SWAP // cfg_dict public_key + }> + recv_external PROC:<{ + // in_msg + 9 PUSHPOW2 // in_msg _3=512 + LDSLICEX // signature in_msg + DUP // signature in_msg cs + 32 LDU // signature in_msg action cs + 32 LDU // signature in_msg action msg_seqno cs + 32 LDU // signature in_msg action msg_seqno valid_until cs + NOW // signature in_msg action msg_seqno valid_until cs _19 + s1 s2 XCHG // signature in_msg action msg_seqno cs valid_until _19 + LESS // signature in_msg action msg_seqno cs _20 + 35 THROWIF + c4 PUSH // signature in_msg action msg_seqno cs _23 + CTOS // signature in_msg action msg_seqno cs cs2 + LDREF // signature in_msg action msg_seqno cs cfg_dict cs2 + 32 LDU // signature in_msg action msg_seqno cs cfg_dict stored_seqno cs2 + 256 LDU // signature in_msg action msg_seqno cs cfg_dict stored_seqno public_key cs2 + ENDS + s4 s1 XCPU // signature in_msg action public_key cs cfg_dict stored_seqno msg_seqno stored_seqno + EQUAL // signature in_msg action public_key cs cfg_dict stored_seqno _38 + 33 THROWIFNOT + s0 s5 XCHG // signature stored_seqno action public_key cs cfg_dict in_msg + HASHSU // signature stored_seqno action public_key cs cfg_dict _41 + s0 s6 s3 XC2PU // cfg_dict stored_seqno action public_key cs _41 signature public_key + CHKSIGNU // cfg_dict stored_seqno action public_key cs _42 + 34 THROWIFNOT + ACCEPT + s3 s4 XCHG + s1 s2 XCHG // stored_seqno cfg_dict public_key action cs + perform_action CALLDICT // stored_seqno cfg_dict public_key + s0 s2 XCHG // public_key cfg_dict stored_seqno + INC // public_key cfg_dict _47 + NEWC // public_key cfg_dict _47 _48 + s1 s2 XCHG // public_key _47 cfg_dict _48 + STREF // public_key _47 _49 + 32 STU // public_key _51 + 256 STU // _53 + ENDC // _54 + c4 POP + }> + run_ticktock PROC:<{ + // is_tock + DROP // + c4 PUSH // _2 + CTOS // cs + LDREF // cfg_dict cs + 32 PUSHINT // cfg_dict cs kl=32 + 36 PUSHINT // cfg_dict cs kl=32 _10=36 + s3 s1 PUSH2 // cfg_dict cs kl=32 _10=36 cfg_dict kl=32 + DICTIGETOPTREF // cfg_dict cs kl=32 next_vset + DUP // cfg_dict cs kl=32 next_vset next_vset + ISNULL // cfg_dict cs kl=32 next_vset _12 + IFNOT:<{ // cfg_dict cs kl=32 next_vset + DUP // cfg_dict cs kl=32 next_vset next_vset + CTOS // cfg_dict cs kl=32 next_vset ds + DUP // cfg_dict cs kl=32 next_vset ds ds + SBITS // cfg_dict cs kl=32 next_vset ds _15 + 39 GTINT // cfg_dict cs kl=32 next_vset ds _17 + IF:<{ // cfg_dict cs kl=32 next_vset ds + 8 LDU // cfg_dict cs kl=32 next_vset tag ds + 32 PLDU // cfg_dict cs kl=32 next_vset tag since + SWAP // cfg_dict cs kl=32 next_vset since tag + 17 EQINT // cfg_dict cs kl=32 next_vset since _26 + NOW // cfg_dict cs kl=32 next_vset since _26 _27 + s1 s2 XCHG // cfg_dict cs kl=32 next_vset _26 since _27 + GEQ // cfg_dict cs kl=32 next_vset _26 _28 + AND // cfg_dict cs kl=32 next_vset _29 + IF:<{ // cfg_dict cs kl=32 next_vset + SWAP + 34 PUSHINT + s0 s4 s4 XC2PU // kl=32 cs next_vset _32=34 cfg_dict kl=32 + DICTISETGETOPTREF // kl=32 cs cfg_dict cur_vset + s3 s1 s0 PUXCPU // kl=32 cs cur_vset _35=32 cfg_dict kl=32 + DICTISETGETOPTREF // kl=32 cs _51 _52 + DROP // kl=32 cs cfg_dict + 36 PUSHINT // kl=32 cs cfg_dict _38=36 + s0 s1 s3 XCHG3 // cs _38=36 cfg_dict kl=32 + DICTIDEL // cs _53 _54 + DROP // cs cfg_dict + }>ELSE<{ + s2 s3 XCHG + 2DROP // cs cfg_dict + }> + }>ELSE<{ + s3 s4 XCHG + 3 BLKDROP // cs cfg_dict + }> + }>ELSE<{ + s2 s3 XCHG + 2DROP // cs cfg_dict + }> + NEWC // cs cfg_dict _40 + STREF // cs _41 + SWAP // _41 cs + STSLICER // _42 + ENDC // _43 + c4 POP + }> +}END>c diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/elector-code.cpp b/submodules/ton/tonlib-src/crypto/smartcont/auto/elector-code.cpp new file mode 100644 index 0000000000..eb520f79ef --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/elector-code.cpp @@ -0,0 +1 @@ +with_tvm_code("elector-code", "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"); diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/elector-code.fif b/submodules/ton/tonlib-src/crypto/smartcont/auto/elector-code.fif new file mode 100644 index 0000000000..d964063b2e --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/elector-code.fif @@ -0,0 +1,1712 @@ +// automatically generated from `smartcont/stdlib.fc` `smartcont/elector-code.fc` +PROGRAM{ + DECLPROC load_data + DECLPROC store_data + DECLPROC unpack_elect + DECLPROC pack_elect + DECLPROC get_validator_conf + DECLPROC send_message_back + DECLPROC return_stake + DECLPROC send_confirmation + DECLPROC send_validator_set_to_config + DECLPROC ~credit_to + DECLPROC process_new_stake + DECLPROC unfreeze_without_bonuses + DECLPROC unfreeze_with_bonuses + DECLPROC unfreeze_all + DECLPROC config_set_confirmed + DECLPROC process_simple_transfer + DECLPROC recover_stake + 1666 DECLMETHOD after_code_upgrade + DECLPROC upgrade_code + DECLPROC recv_internal + DECLPROC postpone_elections + DECLPROC compute_total_stake + DECLPROC try_elect + DECLPROC conduct_elections + DECLPROC update_active_vset_id + DECLPROC cell_hash_eq? + DECLPROC validator_set_installed + DECLPROC check_unfreeze + DECLPROC announce_new_elections + DECLPROC run_ticktock + 86535 DECLMETHOD active_election_id + 87852 DECLMETHOD participates_in + 123541 DECLMETHOD participant_list + 130944 DECLMETHOD compute_returned_stake + load_data PROC:<{ + // + c4 PUSH // _1 + CTOS // cs + LDDICT // _4 cs + LDDICT // _4 _6 cs + LDDICT // _4 _6 _8 cs + LDGRAMS // _4 _6 _8 _10 cs + 32 LDU // _4 _6 _8 _10 _12 cs + 256 LDU // res res res res res res cs + ENDS + }> + store_data PROC:<{ + // elect credits past_elect grams active_id active_hash + NEWC // elect credits past_elect grams active_id active_hash _6 + s1 s6 XCHG // active_hash credits past_elect grams active_id elect _6 + STDICT // active_hash credits past_elect grams active_id _7 + s1 s4 XCHG // active_hash active_id past_elect grams credits _7 + STDICT // active_hash active_id past_elect grams _8 + s1 s2 XCHG // active_hash active_id grams past_elect _8 + STDICT // active_hash active_id grams _9 + SWAP // active_hash active_id _9 grams + STGRAMS // active_hash active_id _10 + 32 STU // active_hash _12 + 256 STU // _14 + ENDC // _15 + c4 POP + }> + unpack_elect PROC:<{ + // elect + CTOS // es + 32 LDU // _4 es + 32 LDU // _4 _7 es + LDGRAMS // _4 _7 _10 es + LDGRAMS // _4 _7 _10 _12 es + LDDICT // _4 _7 _10 _12 _14 es + 1 LDI // _4 _7 _10 _12 _14 _16 es + 1 LDI // res res res res res res res es + ENDS + }> + pack_elect PROC:<{ + // elect_at elect_close min_stake total_stake members failed finished + NEWC // elect_at elect_close min_stake total_stake members failed finished _7 + s1 s7 XCHG // finished elect_close min_stake total_stake members failed elect_at _7 + 32 STU // finished elect_close min_stake total_stake members failed _9 + s1 s5 XCHG // finished failed min_stake total_stake members elect_close _9 + 32 STU // finished failed min_stake total_stake members _11 + s0 s3 XCHG2 // finished failed members total_stake _11 min_stake + STGRAMS // finished failed members total_stake _12 + SWAP // finished failed members _12 total_stake + STGRAMS // finished failed members _13 + STDICT // finished failed _14 + 1 STI // finished _16 + 1 STI // _18 + ENDC // _19 + }> + get_validator_conf PROC:<{ + // + 15 PUSHINT // _1=15 + CONFIGOPTPARAM // _2 + CTOS // cs + 32 LDI // _4 cs + 32 LDI // _4 _7 cs + 32 LDI // _4 _7 _10 cs + 32 PLDI // _4 _7 _10 _14 + }> + send_message_back PROC:<{ + // addr ans_tag query_id body grams mode + 0 PUSHINT // addr ans_tag query_id body grams mode _7=0 + 24 PUSHINT // addr ans_tag query_id body grams mode _7=0 _8=24 + NEWC // addr ans_tag query_id body grams mode _7=0 _8=24 _9 + 6 STU // addr ans_tag query_id body grams mode _7=0 _11 + s0 s7 XCHG2 // _7=0 ans_tag query_id body grams mode _11 addr + STSLICER // _7=0 ans_tag query_id body grams mode _12 + ROT // _7=0 ans_tag query_id body mode _12 grams + STGRAMS // _7=0 ans_tag query_id body mode _13 + s1 s5 XCHG // mode ans_tag query_id body _7=0 _13 + 107 STU // mode ans_tag query_id body _27 + s1 s3 XCHG // mode body query_id ans_tag _27 + 32 STU // mode body query_id _29 + 64 STU // mode body msg + OVER // mode body msg body + -1 GTINT // mode body msg _33 + IF:<{ // mode body msg + 32 STU // mode msg + }>ELSE<{ + NIP // mode msg + }> + ENDC // mode _37 + SWAP // _37 mode + SENDRAWMSG + }> + return_stake PROC:<{ + // addr query_id reason + 4000269644 PUSHINT // addr query_id reason _3=4000269644 + 0 PUSHINT // addr query_id reason _3=4000269644 _4=0 + s3 s3 s0 XCHG3 + 64 PUSHINT // addr _3=4000269644 query_id reason _4=0 _5=64 + send_message_back CALLDICT + }> + send_confirmation PROC:<{ + // addr query_id comment + 4084484172 PUSHINT // addr query_id comment _3=4084484172 + 1000000000 PUSHINT // addr query_id comment _3=4084484172 _4=1000000000 + s3 s3 s0 XCHG3 + 2 PUSHINT // addr _3=4084484172 query_id comment _4=1000000000 _5=2 + send_message_back CALLDICT + }> + send_validator_set_to_config PROC:<{ + // config_addr vset query_id + 1314280276 PUSHINT // config_addr vset query_id _4=1314280276 + 0 PUSHINT // config_addr vset query_id _4=1314280276 _5=0 + 50431 PUSHINT // config_addr vset query_id _4=1314280276 _5=0 _6=50431 + NEWC // config_addr vset query_id _4=1314280276 _5=0 _6=50431 _7 + 17 STU // config_addr vset query_id _4=1314280276 _5=0 _9 + s1 s5 XCHG // _5=0 vset query_id _4=1314280276 config_addr _9 + 256 STU // _5=0 vset query_id _4=1314280276 _11 + 30 PUSHPOW2 // _5=0 vset query_id _4=1314280276 _11 _14 + STGRAMS // _5=0 vset query_id _4=1314280276 _15 + s1 s4 XCHG // _4=1314280276 vset query_id _5=0 _15 + 107 STU // _4=1314280276 vset query_id _29 + s1 s3 XCHG // query_id vset _4=1314280276 _29 + 32 STU // query_id vset _31 + s1 s2 XCHG // vset query_id _31 + 64 STU // vset _33 + STREF // msg + ENDC // _35 + 1 PUSHINT // _35 _36=1 + SENDRAWMSG + }> + ~credit_to PROC:<{ + // credits addr amount + s1 s2 PUSH2 + 8 PUSHPOW2 // credits addr amount addr credits _5=256 + DICTUGET + NULLSWAPIFNOT // credits addr amount val f + IF:<{ // credits addr amount val + LDGRAMS // credits addr amount _18 _17 + DROP // credits addr amount _7 + ADD // credits addr amount + }>ELSE<{ + DROP // credits addr amount + }> + NEWC // credits addr amount _11 + SWAP // credits addr _11 amount + STGRAMS // credits addr _12 + s0 s2 XCHG + 8 PUSHPOW2 // _12 addr credits _13=256 + DICTUSETB // credits + }> + process_new_stake PROC:<{ + // s_addr msg_value cs query_id + s3 PUSH // s_addr msg_value cs query_id s_addr + REWRITESTDADDR // s_addr msg_value cs query_id src_wc src_addr + c4 PUSH // s_addr msg_value cs query_id src_wc src_addr _8 + CTOS // s_addr msg_value cs query_id src_wc src_addr ds + LDDICT // s_addr msg_value cs query_id src_wc src_addr elect ds + OVER // s_addr msg_value cs query_id src_wc src_addr elect ds elect + ISNULL // s_addr msg_value cs query_id src_wc src_addr elect ds _13 + s0 s4 XCHG // s_addr msg_value cs query_id _13 src_addr elect ds src_wc + INC // s_addr msg_value cs query_id _13 src_addr elect ds _15 + s1 s4 XCHG // s_addr msg_value cs query_id ds src_addr elect _13 _15 + OR // s_addr msg_value cs query_id ds src_addr elect _16 + IFJMP:<{ // s_addr msg_value cs query_id ds src_addr elect + s3 s5 XCHG + 5 BLKDROP // s_addr query_id + 0 PUSHINT // s_addr query_id _17=0 + return_stake CALLDICT + }> // s_addr msg_value cs query_id ds src_addr elect + s0 s4 XCHG // s_addr msg_value elect query_id ds src_addr cs + 256 LDU // s_addr msg_value elect query_id ds src_addr validator_pubkey cs + 32 LDU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at cs + 32 LDU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor cs + 256 LDU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr cs + LDREF // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr _36 cs + SWAP // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr cs _36 + CTOS // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr cs _38 + 9 PUSHPOW2 // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr cs _38 _39=512 + PLDSLICEX // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr cs signature + SWAP // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature cs + ENDS + 1699500148 PUSHINT // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _42=1699500148 + NEWC // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _42=1699500148 _43 + 32 STU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _45 + s4 s(-1) PUXC // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature stake_at _45 + 32 STU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _47 + s3 s(-1) PUXC // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature max_factor _47 + 32 STU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _49 + s6 s(-1) PUXC // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature src_addr _49 + 256 STU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _51 + s2 s(-1) PUXC // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature adnl_addr _51 + 256 STU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _53 + ENDC // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _54 + CTOS // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _55 + s1 s5 XCPU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr _55 signature validator_pubkey + CHKSIGNS // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr _56 + IFNOTJMP:<{ // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr + s6 s8 XCHG + 8 BLKDROP // s_addr query_id + 1 PUSHINT // s_addr query_id _57=1 + return_stake CALLDICT + }> // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr + OVER + 16 PUSHPOW2 // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr max_factor _59=65536 + LESS // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr _60 + IFJMP:<{ // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr + s6 s8 XCHG + 8 BLKDROP // s_addr query_id + 6 PUSHINT // s_addr query_id _61=6 + return_stake CALLDICT + }> // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr + s0 s7 XCHG // s_addr msg_value adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor elect + unpack_elect CALLDICT // s_addr msg_value adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor _146 _147 _148 _149 _150 _151 _152 + NIP // s_addr msg_value adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor elect_at elect_close min_stake total_stake members finished + s0 s5 XCHG // s_addr msg_value adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members elect_at + s0 DUMP // s_addr msg_value adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members elect_at + s0 s13 XCHG + 1000000000 PUSHINT // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value _73=1000000000 + SUB // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value + DUP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value msg_value + 12 LSHIFT# // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value _76 + s3 PUSH // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value _76 total_stake + LESS // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value _77 + IFJMP:<{ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value + s11 s12 XCHG + 12 BLKDROP + NIP // s_addr query_id + 2 PUSHINT // s_addr query_id _78=2 + return_stake CALLDICT + }> // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value + s2 s2 XCPU // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake msg_value members total_stake msg_value + ADD // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake msg_value members total_stake + s7 s13 XCPU // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor finished elect_close min_stake msg_value members stake_at elect_at + NEQ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor finished elect_close min_stake msg_value members _81 + IFJMP:<{ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor finished elect_close min_stake msg_value members + s10 s12 XCHG + 12 BLKDROP // s_addr query_id + 3 PUSHINT // s_addr query_id _82=3 + return_stake CALLDICT + }> // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor finished elect_close min_stake msg_value members + s0 s4 XCHG // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value finished + IFJMP:<{ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value + s9 s11 XCHG + 11 BLKDROP // s_addr query_id + 0 PUSHINT // s_addr query_id _84=0 + return_stake CALLDICT + }> // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value + s6 s3 PUSH2 + 8 PUSHPOW2 // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value validator_pubkey members _88=256 + DICTUGET + NULLSWAPIFNOT // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value mem found + DUP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value mem found found + IF:<{ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value mem found + DROP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value mem + LDGRAMS // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _90 mem + -ROT // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake mem msg_value _90 + ADD // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake mem msg_value + SWAP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value mem + 64 LDU // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _158 _157 + NIP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value mem + 256 LDU // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _160 _159 + DROP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _96 + s8 s(-1) PUXC // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value src_addr _96 + NEQ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value found + }>ELSE<{ + NIP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value found + }> + IFJMP:<{ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value + s9 s11 XCHG + 11 BLKDROP // s_addr query_id + 4 PUSHINT // s_addr query_id _100=4 + return_stake CALLDICT + }> // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value + s0 s1 PUSH2 // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value msg_value min_stake + LESS // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _102 + IFJMP:<{ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value + s9 s11 XCHG + 11 BLKDROP // s_addr query_id + 5 PUSHINT // s_addr query_id _103=5 + return_stake CALLDICT + }> // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value + DUP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value msg_value + 44 THROWIFNOT + ACCEPT + NOW // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _109 + NEWC // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _109 _110 + ROT // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake _109 _110 msg_value + STGRAMS // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake _109 _111 + 32 STU // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake _113 + s1 s4 XCHG // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake min_stake members elect_close max_factor _113 + 32 STU // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake min_stake members elect_close _115 + s1 s6 XCHG // s_addr elect_at adnl_addr query_id ds elect_close validator_pubkey total_stake min_stake members src_addr _115 + 256 STU // s_addr elect_at adnl_addr query_id ds elect_close validator_pubkey total_stake min_stake members _117 + s1 s8 XCHG // s_addr elect_at members query_id ds elect_close validator_pubkey total_stake min_stake adnl_addr _117 + 256 STU // s_addr elect_at members query_id ds elect_close validator_pubkey total_stake min_stake _119 + s0 s3 s7 XCHG3 + 8 PUSHPOW2 // s_addr elect_at total_stake query_id ds elect_close min_stake _119 validator_pubkey members _120=256 + DICTUSETB // s_addr elect_at total_stake query_id ds elect_close min_stake members + FALSE // s_addr elect_at total_stake query_id ds elect_close min_stake members _122 + s5 s7 XCHG + s3 s4 XCHG + s2 s3 XCHG + s2 s6 XCHG + FALSE // s_addr query_id ds elect_at elect_close min_stake total_stake members _122 _123 + pack_elect CALLDICT // s_addr query_id ds elect + NEWC // s_addr query_id ds elect _125 + STDICT // s_addr query_id ds _126 + SWAP // s_addr query_id _126 ds + STSLICER // s_addr query_id _127 + ENDC // s_addr query_id _128 + c4 POP + DUP // s_addr query_id query_id + IFJMP:<{ // s_addr query_id + 0 PUSHINT // s_addr query_id _130=0 + send_confirmation CALLDICT + }> // s_addr query_id + 2DROP // + }> + unfreeze_without_bonuses PROC:<{ + // credits freeze_dict tot_stakes + 0 PUSHINT // credits freeze_dict tot_stakes _5=0 + DUP // credits freeze_dict tot_stakes total=0 recovered=0 + -1 PUSHINT // credits freeze_dict tot_stakes total=0 recovered=0 pubkey=-1 + UNTIL:<{ + s4 PUSH + 8 PUSHPOW2 // credits freeze_dict tot_stakes total recovered pubkey freeze_dict _10=256 + DICTUGETNEXT + NULLSWAPIFNOT + NULLSWAPIFNOT // credits freeze_dict tot_stakes total recovered cs pubkey f + DUP // credits freeze_dict tot_stakes total recovered cs pubkey f f + IF:<{ // credits freeze_dict tot_stakes total recovered cs pubkey f + s0 s2 XCHG // credits freeze_dict tot_stakes total recovered f pubkey cs + 256 LDU // credits freeze_dict tot_stakes total recovered f pubkey _16 cs + 64 LDU // credits freeze_dict tot_stakes total recovered f pubkey _16 _42 _41 + NIP // credits freeze_dict tot_stakes total recovered f pubkey _16 cs + LDGRAMS // credits freeze_dict tot_stakes total recovered f pubkey _16 _22 cs + 1 LDI // credits freeze_dict tot_stakes total recovered f pubkey addr stake banned cs + ENDS + IF:<{ // credits freeze_dict tot_stakes total recovered f pubkey addr stake + NIP // credits freeze_dict tot_stakes total recovered f pubkey stake + s3 s3 XCPU // credits freeze_dict tot_stakes total stake f pubkey recovered stake + ADD // credits freeze_dict tot_stakes total stake f pubkey recovered + }>ELSE<{ // credits freeze_dict tot_stakes total recovered f pubkey addr stake + s8 s8 s8 XC2PU // stake freeze_dict tot_stakes total recovered f pubkey credits addr stake + ~credit_to CALLDICT // stake freeze_dict tot_stakes total recovered f pubkey credits + s0 s7 XCHG + s0 s3 XCHG // credits freeze_dict tot_stakes total stake f pubkey recovered + }> + s4 s3 XCHG2 // credits freeze_dict tot_stakes pubkey recovered f total stake + ADD // credits freeze_dict tot_stakes pubkey recovered f total + }>ELSE<{ + s4 s2 XCHG2 + DROP // credits freeze_dict tot_stakes pubkey recovered f total + }> + SWAP // credits freeze_dict tot_stakes pubkey recovered total f + NOT // credits freeze_dict tot_stakes pubkey recovered total _32 + s1 s3 XCHG // credits freeze_dict tot_stakes total recovered pubkey _32 + }> // credits freeze_dict tot_stakes total recovered pubkey + DROP + s3 POP // credits recovered tot_stakes total + SWAP // credits recovered total tot_stakes + EQUAL // credits recovered _34 + 59 THROWIFNOT + }> + unfreeze_with_bonuses PROC:<{ + // credits freeze_dict tot_stakes tot_bonuses + 0 PUSHINT // credits freeze_dict tot_stakes tot_bonuses _7=0 + s0 s0 PUSH2 // credits freeze_dict tot_stakes tot_bonuses total=0 returned_bonuses=0 recovered=0 + -1 PUSHINT // credits freeze_dict tot_stakes tot_bonuses total=0 returned_bonuses=0 recovered=0 pubkey=-1 + UNTIL:<{ + s6 PUSH + 8 PUSHPOW2 // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered pubkey freeze_dict _12=256 + DICTUGETNEXT + NULLSWAPIFNOT + NULLSWAPIFNOT // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered cs pubkey f + DUP // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered cs pubkey f f + IF:<{ // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered cs pubkey f + s0 s2 XCHG // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey cs + 256 LDU // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey _18 cs + 64 LDU // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey _18 _52 _51 + NIP // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey _18 cs + LDGRAMS // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey _18 _24 cs + 1 LDI // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake banned cs + ENDS + IF:<{ // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake + NIP // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey stake + s3 s3 XCPU // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses stake f pubkey recovered stake + ADD // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses stake f pubkey recovered + }>ELSE<{ // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake + s7 s0 s8 PUSH3 // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake tot_bonuses stake tot_stakes + MULDIV // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake bonus + s6 s6 XCPU // credits freeze_dict tot_stakes tot_bonuses total bonus recovered f pubkey addr stake returned_bonuses bonus + ADD // credits freeze_dict tot_stakes tot_bonuses total bonus recovered f pubkey addr stake returned_bonuses + s1 s6 PUXC // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake stake bonus + ADD // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake _35 + s11 s11 s0 XCHG3 // stake freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey credits addr _35 + ~credit_to CALLDICT // stake freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey credits + s0 s9 XCHG + s0 s3 XCHG // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses stake f pubkey recovered + }> + s5 s3 XCHG2 // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered f total stake + ADD // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered f total + }>ELSE<{ + s5 s2 XCHG2 + DROP // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered f total + }> + SWAP // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered total f + NOT // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered total _38 + s1 s4 XCHG // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered pubkey _38 + }> // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered pubkey + DROP + s5 POP // credits recovered tot_stakes tot_bonuses total returned_bonuses + s0 s3 XCHG // credits recovered returned_bonuses tot_bonuses total tot_stakes + EQUAL // credits recovered returned_bonuses tot_bonuses _40 + s2 s1 PUSH2 // credits recovered returned_bonuses tot_bonuses _40 returned_bonuses tot_bonuses + LEQ // credits recovered returned_bonuses tot_bonuses _40 _41 + AND // credits recovered returned_bonuses tot_bonuses _42 + 59 THROWIFNOT + s1 s2 XCHG // credits returned_bonuses recovered tot_bonuses + ADD // credits returned_bonuses _44 + SWAP // credits _44 returned_bonuses + SUB // credits _45 + }> + unfreeze_all PROC:<{ + // credits past_elections elect_id + SWAP + 32 PUSHINT // credits elect_id past_elections _6=32 + DICTUDELGET + NULLSWAPIFNOT // credits past_elections fs f + IFNOTJMP:<{ // credits past_elections fs + DROP // credits past_elections + 0 PUSHINT // credits past_elections _8=0 + }> // credits past_elections fs + 64 LDU // credits past_elections _44 _43 + NIP // credits past_elections fs + 256 LDU // credits past_elections _46 _45 + NIP // credits past_elections fs + LDDICT // credits past_elections _21 fs + LDGRAMS // credits past_elections _21 _23 fs + LDGRAMS // credits past_elections _21 _23 _25 fs + LDDICT // credits past_elections _21 _23 _25 _54 _53 + NIP // credits past_elections fdict tot_stakes bonuses fs + ENDS + DUP // credits past_elections fdict tot_stakes bonuses bonuses + 0 GTINT // credits past_elections fdict tot_stakes bonuses _32 + IF:<{ // credits past_elections fdict tot_stakes bonuses + s3 s4 XCHG // past_elections credits fdict tot_stakes bonuses + unfreeze_with_bonuses CALLDICT // past_elections credits _33 + }>ELSE<{ // credits past_elections fdict tot_stakes bonuses + DROP // credits past_elections fdict tot_stakes + s2 s3 XCHG // past_elections credits fdict tot_stakes + unfreeze_without_bonuses CALLDICT // past_elections credits _33 + }> // past_elections credits unused_prizes + s1 s2 XCHG // credits past_elections unused_prizes + }> + config_set_confirmed PROC:<{ + // s_addr cs query_id ok + s2 POP // s_addr ok query_id + s0 s2 XCHG // query_id ok s_addr + REWRITESTDADDR // query_id ok src_wc src_addr + 0 PUSHINT // query_id ok src_wc src_addr _8=0 + CONFIGOPTPARAM // query_id ok src_wc src_addr _9 + CTOS // query_id ok src_wc src_addr _10 + 256 PLDU // query_id ok src_wc src_addr config_addr + c4 PUSH // query_id ok src_wc src_addr config_addr _14 + CTOS // query_id ok src_wc src_addr config_addr ds + LDDICT // query_id ok src_wc src_addr config_addr elect ds + s0 s4 XCHG // query_id ok ds src_addr config_addr elect src_wc + INC // query_id ok ds src_addr config_addr elect _20 + 2SWAP // query_id ok ds elect _20 src_addr config_addr + NEQ // query_id ok ds elect _20 _21 + OR // query_id ok ds elect _22 + OVER // query_id ok ds elect _22 elect + ISNULL // query_id ok ds elect _22 _23 + OR // query_id ok ds elect _24 + IFJMP:<{ // query_id ok ds elect + 4 BLKDROP // + }> // query_id ok ds elect + unpack_elect CALLDICT // query_id ok ds _63 _64 _65 _66 _67 _68 _69 + s0 s5 XCHG + 5 BLKDROP // query_id ok ds elect_at finished + s1 s4 PUXC // finished ok ds elect_at elect_at query_id + NEQ // finished ok ds elect_at _33 + s0 s4 XCHG // _33 ok ds elect_at finished + NOT // _33 ok ds elect_at _34 + s1 s4 XCHG // elect_at ok ds _33 _34 + OR // elect_at ok ds _35 + IFJMP:<{ // elect_at ok ds + 3 BLKDROP // + }> // elect_at ok ds + ACCEPT + SWAP // elect_at ds ok + IFNOT:<{ // elect_at ds + LDDICT // elect_at _40 ds + LDDICT // elect_at _40 _42 ds + LDGRAMS // elect_at credits past_elections grams ds + s3 s3 s4 XCHG3 // ds grams credits past_elections elect_at + unfreeze_all CALLDICT // ds grams credits past_elections unused_prizes + FALSE // ds grams credits past_elections unused_prizes _48 + NEWC // ds grams credits past_elections unused_prizes _48 _49 + 1 STI // ds grams credits past_elections unused_prizes _51 + s1 s3 XCHG // ds grams unused_prizes past_elections credits _51 + STDICT // ds grams unused_prizes past_elections _52 + STDICT // ds grams unused_prizes _53 + -ROT // ds _53 grams unused_prizes + ADD // ds _53 _54 + STGRAMS // ds _55 + SWAP // _55 ds + STSLICER // _56 + ENDC // _57 + c4 POP + }>ELSE<{ + 2DROP // + }> + }> + process_simple_transfer PROC:<{ + // s_addr msg_value + load_data CALLDICT // s_addr msg_value elect credits past_elect grams active_id active_hash + s0 s7 XCHG // active_hash msg_value elect credits past_elect grams active_id s_addr + REWRITESTDADDR // active_hash msg_value elect credits past_elect grams active_id src_wc src_addr + SWAP // active_hash msg_value elect credits past_elect grams active_id src_addr src_wc + INC // active_hash msg_value elect credits past_elect grams active_id src_addr _13 + OR // active_hash msg_value elect credits past_elect grams active_id _14 + OVER // active_hash msg_value elect credits past_elect grams active_id _14 active_id + 0 EQINT // active_hash msg_value elect credits past_elect grams active_id _14 _16 + OR // active_hash msg_value elect credits past_elect grams active_id _17 + IFJMP:<{ // active_hash msg_value elect credits past_elect grams active_id + s0 s5 XCHG // active_hash active_id elect credits past_elect grams msg_value + ADD // active_hash active_id elect credits past_elect grams + 2 4 BLKSWAP + SWAP // elect credits past_elect grams active_id active_hash + store_data CALLDICT + }> // active_hash msg_value elect credits past_elect grams active_id + s0 s2 PUSH2 + 32 PUSHINT // active_hash msg_value elect credits past_elect grams active_id active_id past_elect _22=32 + DICTUGET + NULLSWAPIFNOT // active_hash msg_value elect credits past_elect grams active_id fs f + IF:<{ // active_hash msg_value elect credits past_elect grams active_id fs + 64 LDU // active_hash msg_value elect credits past_elect grams active_id _30 fs + 256 LDU // active_hash msg_value elect credits past_elect grams active_id _30 _33 fs + LDDICT // active_hash msg_value elect credits past_elect grams active_id _30 _33 _36 fs + LDGRAMS // active_hash msg_value elect credits past_elect grams active_id _30 _33 _36 _38 fs + LDGRAMS // active_hash msg_value elect credits past_elect grams active_id data hash dict total_stake bonuses fs + s0 s11 XCHG // active_hash fs elect credits past_elect grams active_id data hash dict total_stake bonuses msg_value + ADD // active_hash fs elect credits past_elect grams active_id data hash dict total_stake bonuses + NEWC // active_hash fs elect credits past_elect grams active_id data hash dict total_stake bonuses _44 + s1 s5 XCHG // active_hash fs elect credits past_elect grams active_id bonuses hash dict total_stake data _44 + 64 STU // active_hash fs elect credits past_elect grams active_id bonuses hash dict total_stake _46 + s1 s3 XCHG // active_hash fs elect credits past_elect grams active_id bonuses total_stake dict hash _46 + 256 STU // active_hash fs elect credits past_elect grams active_id bonuses total_stake dict _48 + STDICT // active_hash fs elect credits past_elect grams active_id bonuses total_stake _49 + SWAP // active_hash fs elect credits past_elect grams active_id bonuses _49 total_stake + STGRAMS // active_hash fs elect credits past_elect grams active_id bonuses _50 + SWAP // active_hash fs elect credits past_elect grams active_id _50 bonuses + STGRAMS // active_hash fs elect credits past_elect grams active_id _51 + s0 s6 XCHG2 // active_hash active_id elect credits past_elect grams _51 fs + STSLICER // active_hash active_id elect credits past_elect grams _52 + SWAP + 32 PUSHINT + s6 s3 s3 PUXC2 // active_hash active_id elect credits grams _52 active_id past_elect _53=32 + DICTUSETB // active_hash active_id elect credits grams past_elect + }>ELSE<{ // active_hash msg_value elect credits past_elect grams active_id fs + DROP // active_hash msg_value elect credits past_elect grams active_id + s0 s5 XCHG // active_hash active_id elect credits past_elect grams msg_value + ADD // active_hash active_id elect credits past_elect grams + SWAP // active_hash active_id elect credits grams past_elect + }> + s3 s5 XCHG + s1 s4 s3 XCHG3 // elect credits past_elect grams active_id active_hash + store_data CALLDICT + }> + recover_stake PROC:<{ + // op s_addr cs query_id + NIP // op s_addr query_id + OVER // op s_addr query_id s_addr + REWRITESTDADDR // op s_addr query_id src_wc src_addr + SWAP // op s_addr query_id src_addr src_wc + INC // op s_addr query_id src_addr _8 + IFJMP:<{ // op s_addr query_id src_addr + DROP // op s_addr query_id + 4294967294 PUSHINT // op s_addr query_id _9=4294967294 + 0 PUSHINT // op s_addr query_id _9=4294967294 _10=0 + s3 s4 XCHG + s1 s3 XCHG + 64 PUSHINT // s_addr _9=4294967294 query_id op _10=0 _11=64 + send_message_back CALLDICT + }> // op s_addr query_id src_addr + c4 PUSH // op s_addr query_id src_addr _14 + CTOS // op s_addr query_id src_addr ds + LDDICT // op s_addr query_id src_addr _18 ds + LDDICT // op s_addr query_id src_addr elect credits ds + s3 s3 XCHG2 + 8 PUSHPOW2 // op s_addr query_id ds elect src_addr credits _25=256 + DICTUDELGET + NULLSWAPIFNOT // op s_addr query_id ds elect credits cs f + IFNOTJMP:<{ // op s_addr query_id ds elect credits cs + 4 BLKDROP // op s_addr query_id + 4294967294 PUSHINT // op s_addr query_id _27=4294967294 + 0 PUSHINT // op s_addr query_id _27=4294967294 _28=0 + s3 s4 XCHG + s1 s3 XCHG + 64 PUSHINT // s_addr _27=4294967294 query_id op _28=0 _29=64 + send_message_back CALLDICT + }> // op s_addr query_id ds elect credits cs + s6 POP // cs s_addr query_id ds elect credits + s0 s5 XCHG // credits s_addr query_id ds elect cs + LDGRAMS // credits s_addr query_id ds elect amount cs + ENDS + NEWC // credits s_addr query_id ds elect amount _35 + s1 s2 XCHG // credits s_addr query_id ds amount elect _35 + STDICT // credits s_addr query_id ds amount _36 + s1 s5 XCHG // amount s_addr query_id ds credits _36 + STDICT // amount s_addr query_id ds _37 + SWAP // amount s_addr query_id _37 ds + STSLICER // amount s_addr query_id _38 + ENDC // amount s_addr query_id _39 + c4 POP + 4184830756 PUSHINT // amount s_addr query_id _41=4184830756 + 0 PUSHINT // amount s_addr query_id _41=4184830756 _42=0 + 24 PUSHINT // amount s_addr query_id _41=4184830756 _42=0 _43=24 + NEWC // amount s_addr query_id _41=4184830756 _42=0 _43=24 _44 + 6 STU // amount s_addr query_id _41=4184830756 _42=0 _46 + s0 s4 XCHG2 // amount _42=0 query_id _41=4184830756 _46 s_addr + STSLICER // amount _42=0 query_id _41=4184830756 _47 + s0 s4 XCHG2 // _41=4184830756 _42=0 query_id _47 amount + STGRAMS // _41=4184830756 _42=0 query_id _48 + s1 s2 XCHG // _41=4184830756 query_id _42=0 _48 + 107 STU // _41=4184830756 query_id _62 + s1 s2 XCHG // query_id _41=4184830756 _62 + 32 STU // query_id _64 + 64 STU // _66 + ENDC // _67 + 64 PUSHINT // _67 _68=64 + SENDRAWMSG + }> + after_code_upgrade PROC:<{ + // s_addr cs query_id + NIP // s_addr query_id + 1313042276 PUSHINT // s_addr query_id op=1313042276 + 3460525924 PUSHINT // s_addr query_id op=1313042276 _5=3460525924 + 0 PUSHINT // s_addr query_id op=1313042276 _5=3460525924 _6=0 + s3 s3 s0 XCHG3 + 64 PUSHINT // s_addr _5=3460525924 query_id op=1313042276 _6=0 _7=64 + send_message_back CALLDICT + }> + upgrade_code PROC:<{ + // s_addr cs query_id + 0 PUSHINT // s_addr cs query_id _4=0 + CONFIGOPTPARAM // s_addr cs query_id c_addr + DUP // s_addr cs query_id c_addr c_addr + ISNULL // s_addr cs query_id c_addr _6 + IFJMP:<{ // s_addr cs query_id c_addr + 4 BLKDROP // + FALSE // _7 + }> // s_addr cs query_id c_addr + CTOS // s_addr cs query_id _9 + 256 PLDU // s_addr cs query_id config_addr + s3 PUSH // s_addr cs query_id config_addr s_addr + REWRITESTDADDR // s_addr cs query_id config_addr src_wc src_addr + SWAP // s_addr cs query_id config_addr src_addr src_wc + INC // s_addr cs query_id config_addr src_addr _16 + s0 s2 XCHG // s_addr cs query_id _16 src_addr config_addr + NEQ // s_addr cs query_id _16 _17 + OR // s_addr cs query_id _18 + IFJMP:<{ // s_addr cs query_id + 3 BLKDROP // + FALSE // _19 + }> // s_addr cs query_id + ACCEPT + SWAP // s_addr query_id cs + LDREF // s_addr query_id code cs + OVER // s_addr query_id code cs code + SETCODE + DUP // s_addr query_id code cs cs + SEMPTY // s_addr query_id code cs _25 + IFNOT:<{ // s_addr query_id code cs + SWAP // s_addr query_id cs code + c3 POP + SWAP // s_addr cs query_id + after_code_upgrade CALLDICT + 0 THROW + }>ELSE<{ + 4 BLKDROP // + }> + TRUE // _30 + }> + recv_internal PROC:<{ + // msg_value in_msg_cell in_msg + SWAP // msg_value in_msg in_msg_cell + CTOS // msg_value in_msg cs + 4 LDU // msg_value in_msg flags cs + SWAP + 1 PUSHINT // msg_value in_msg cs flags _9=1 + AND // msg_value in_msg cs _10 + IFJMP:<{ // msg_value in_msg cs + 3 BLKDROP // + }> // msg_value in_msg cs + LDMSGADDR // msg_value in_msg _61 _60 + DROP // msg_value in_msg s_addr + OVER // msg_value in_msg s_addr in_msg + SEMPTY // msg_value in_msg s_addr _14 + IFJMP:<{ // msg_value in_msg s_addr + NIP // msg_value s_addr + SWAP // s_addr msg_value + process_simple_transfer CALLDICT + }> // msg_value in_msg s_addr + SWAP // msg_value s_addr in_msg + 32 LDU // msg_value s_addr op in_msg + OVER // msg_value s_addr op in_msg op + 0 EQINT // msg_value s_addr op in_msg _21 + IFJMP:<{ // msg_value s_addr op in_msg + 2DROP // msg_value s_addr + SWAP // s_addr msg_value + process_simple_transfer CALLDICT + }> // msg_value s_addr op in_msg + 64 LDU // msg_value s_addr op query_id in_msg + s2 PUSH + 1316189259 PUSHINT // msg_value s_addr op query_id in_msg op _27=1316189259 + EQUAL // msg_value s_addr op query_id in_msg _28 + IFJMP:<{ // msg_value s_addr op query_id in_msg + s2 POP // msg_value s_addr in_msg query_id + s2 s3 XCHG // s_addr msg_value in_msg query_id + process_new_stake CALLDICT + }> // msg_value s_addr op query_id in_msg + s4 POP // in_msg s_addr op query_id + OVER + 1197831204 PUSHINT // in_msg s_addr op query_id op _30=1197831204 + EQUAL // in_msg s_addr op query_id _31 + IFJMP:<{ // in_msg s_addr op query_id + s1 s3 XCHG // op s_addr in_msg query_id + recover_stake CALLDICT + }> // in_msg s_addr op query_id + OVER + 1313042276 PUSHINT // in_msg s_addr op query_id op _33=1313042276 + EQUAL // in_msg s_addr op query_id _34 + IFJMP:<{ // in_msg s_addr op query_id + s2 s3 s3 PUXCPU // query_id s_addr op s_addr in_msg query_id + upgrade_code CALLDICT // query_id s_addr op ok + IF:<{ // query_id s_addr op + 3460525924 PUSHINT // query_id s_addr op _37=3460525924 + }>ELSE<{ // query_id s_addr op + 32 PUSHPOW2DEC // query_id s_addr op _37=4294967295 + }> + 0 PUSHINT // query_id s_addr op _37 _40=0 + s3 s4 XCHG + s3 s3 s0 XCHG3 + 64 PUSHINT // s_addr _37 query_id op _40=0 _41=64 + send_message_back CALLDICT + }> // in_msg s_addr op query_id + OVER + 4000730955 PUSHINT // in_msg s_addr op query_id op _44=4000730955 + EQUAL // in_msg s_addr op query_id cfg_ok + s2 PUSH + 4000730991 PUSHINT // in_msg s_addr op query_id cfg_ok op _46=4000730991 + EQUAL // in_msg s_addr op query_id cfg_ok _47 + s1 s(-1) PUXC // in_msg s_addr op query_id cfg_ok cfg_ok _47 + OR // in_msg s_addr op query_id cfg_ok _48 + IFJMP:<{ // in_msg s_addr op query_id cfg_ok + s2 POP // in_msg s_addr cfg_ok query_id + s2 s3 XCHG + SWAP // s_addr in_msg query_id cfg_ok + config_set_confirmed CALLDICT + }> // in_msg s_addr op query_id cfg_ok + DROP + s3 POP // query_id s_addr op + DUP + 31 PUSHPOW2 // query_id s_addr op op _52 + AND // query_id s_addr op _53 + IFNOTJMP:<{ // query_id s_addr op + 32 PUSHPOW2DEC // query_id s_addr op _54=4294967295 + 0 PUSHINT // query_id s_addr op _54=4294967295 _55=0 + s3 s4 XCHG + s3 s3 s0 XCHG3 + 64 PUSHINT // s_addr _54=4294967295 query_id op _55=0 _56=64 + send_message_back CALLDICT + }> // query_id s_addr op + 3 BLKDROP // + }> + postpone_elections PROC:<{ + // + FALSE // _0 + }> + compute_total_stake PROC:<{ + // l n m_stake + 0 PUSHINT // l n m_stake tot_stake=0 + s0 s2 XCHG // l tot_stake=0 m_stake n + REPEAT:<{ // l tot_stake m_stake + s0 s2 XCHG // m_stake tot_stake l + UNCONS // m_stake tot_stake h l + OVER // m_stake tot_stake h l h + 0 INDEX // m_stake tot_stake h l stake + s0 s2 XCHG // m_stake tot_stake stake l h + 1 INDEX // m_stake tot_stake stake l max_f + s4 PUSH // m_stake tot_stake stake l max_f m_stake + MUL // m_stake tot_stake stake l _13 + 16 RSHIFT# // m_stake tot_stake stake l _15 + s1 s2 XCHG // m_stake tot_stake l stake _15 + MIN // m_stake tot_stake l stake + s1 s2 XCHG // m_stake l tot_stake stake + ADD // m_stake l tot_stake + ROT // l tot_stake m_stake + }> + DROP + NIP // tot_stake + }> + try_elect PROC:<{ + // credits members min_stake max_stake min_total_stake max_stake_factor + 16 PUSHINT // credits members min_stake max_stake min_total_stake max_stake_factor _7=16 + CONFIGOPTPARAM // credits members min_stake max_stake min_total_stake max_stake_factor _8 + CTOS // credits members min_stake max_stake min_total_stake max_stake_factor cs + 16 LDU // credits members min_stake max_stake min_total_stake max_stake_factor _13 cs + 16 LDU // credits members min_stake max_stake min_total_stake max_stake_factor _13 _253 _252 + NIP // credits members min_stake max_stake min_total_stake max_stake_factor _13 cs + 16 LDU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators cs + ENDS + 1 PUSHINT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators _23=1 + MAX // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators + 0 PUSHINT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n=0 + NEWDICT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n=0 sdict + -1 PUSHINT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n=0 sdict pubkey=-1 + UNTIL:<{ + s9 PUSH + 8 PUSHPOW2 // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict pubkey members _33=256 + DICTUGETNEXT + NULLSWAPIFNOT + NULLSWAPIFNOT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict cs pubkey f + DUP // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict cs pubkey f f + IF:<{ // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict cs pubkey f + s0 s2 XCHG // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey cs + LDGRAMS // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey _40 cs + 32 LDU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey _40 _42 cs + 32 LDU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey _40 _42 _45 cs + 256 LDU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey _40 _42 _45 _48 cs + 256 LDU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey stake time max_factor addr adnl_addr cs + ENDS + s0 s3 XCHG // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey stake adnl_addr max_factor addr time + NEGATE // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey stake adnl_addr max_factor addr _56 + NEWC // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey stake adnl_addr max_factor addr _56 _57 + s1 s5 XCHG // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey _56 adnl_addr max_factor addr stake _57 + 128 STU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey _56 adnl_addr max_factor addr _59 + s1 s4 XCHG // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr max_factor _56 _59 + 32 STI // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr max_factor _61 + s4 s(-1) PUXC // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr max_factor pubkey _61 + 256 STU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr max_factor _63 + ENDC // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr max_factor _64 + CTOS // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr max_factor key + s1 s10 XCPU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr key max_factor max_stake_factor + MIN // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr key _67 + NEWC // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr key _67 _68 + 32 STU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr key _70 + s1 s3 XCHG // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey key adnl_addr addr _70 + 256 STU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey key adnl_addr _72 + 256 STU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey key _74 + s0 s1 s4 XCHG3 + 416 PUSHINT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n pubkey f _74 key sdict _79 + DICTSETB // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n pubkey f sdict + s0 s3 XCHG // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators sdict pubkey f n + INC // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators sdict pubkey f n + }>ELSE<{ + s3 s4 XCHG + 2SWAP + DROP // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators sdict pubkey f n + }> + SWAP // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators sdict pubkey n f + NOT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators sdict pubkey n _83 + s3 s3 s0 XCHG3 // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict pubkey _83 + }> // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict pubkey + DROP + s4 POP // credits members min_stake max_stake min_total_stake sdict max_validators min_validators n + ROT // credits members min_stake max_stake min_total_stake sdict min_validators n max_validators + MIN // credits members min_stake max_stake min_total_stake sdict min_validators n + s0 s1 PUSH2 // credits members min_stake max_stake min_total_stake sdict min_validators n n min_validators + LESS // credits members min_stake max_stake min_total_stake sdict min_validators n _85 + IFJMP:<{ // credits members min_stake max_stake min_total_stake sdict min_validators n + 7 BLKDROP // credits + NEWDICT // credits _86 + NEWDICT // credits _86 _87 + 0 PUSHINT // credits _86 _87 _88=0 + DUP // credits _86 _87 _88=0 _89=0 + }> // credits members min_stake max_stake min_total_stake sdict min_validators n + PUSHNULL // credits members min_stake max_stake min_total_stake sdict min_validators n l + UNTIL:<{ + s0 s3 XCHG + 416 PUSHINT // credits members min_stake max_stake min_total_stake l min_validators n sdict _100 + DICTREMMIN + NULLSWAPIFNOT + NULLSWAPIFNOT // credits members min_stake max_stake min_total_stake l min_validators n sdict cs key f + DUP // credits members min_stake max_stake min_total_stake l min_validators n sdict cs key f f + IF:<{ // credits members min_stake max_stake min_total_stake l min_validators n sdict cs key f + SWAP // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f key + 128 LDU // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f _105 key + s1 s9 XCPU // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f key _105 max_stake + MIN // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f key _108 + SWAP // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f _108 key + 32 LDU // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f _108 _279 _278 + NIP // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f _108 key + 256 PLDU // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f stake pubkey + s0 s3 XCHG // credits members min_stake max_stake min_total_stake l min_validators n sdict pubkey f stake cs + 32 LDU // credits members min_stake max_stake min_total_stake l min_validators n sdict pubkey f stake _117 cs + 256 LDU // credits members min_stake max_stake min_total_stake l min_validators n sdict pubkey f stake _117 _283 _282 + NIP // credits members min_stake max_stake min_total_stake l min_validators n sdict pubkey f stake _117 cs + 256 PLDU // credits members min_stake max_stake min_total_stake l min_validators n sdict pubkey f stake max_f adnl_addr + s1 s3 s0 XCHG3 + s1 s4 XCHG // credits members min_stake max_stake min_total_stake l min_validators n sdict f stake max_f pubkey adnl_addr + 4 TUPLE // credits members min_stake max_stake min_total_stake l min_validators n sdict f _125 + s0 s5 XCHG2 // credits members min_stake max_stake min_total_stake f min_validators n sdict _125 l + CONS // credits members min_stake max_stake min_total_stake f min_validators n sdict l + }>ELSE<{ + s6 s1 s6 XCHG3 + 2DROP // credits members min_stake max_stake min_total_stake f min_validators n sdict l + }> + s0 s4 XCHG // credits members min_stake max_stake min_total_stake l min_validators n sdict f + NOT // credits members min_stake max_stake min_total_stake l min_validators n sdict _127 + s1 s4 XCHG // credits members min_stake max_stake min_total_stake sdict min_validators n l _127 + }> // credits members min_stake max_stake min_total_stake sdict min_validators n l + s3 POP + s4 POP // credits members min_stake n min_total_stake l min_validators + DEC // credits members min_stake n min_total_stake l i + 2DUP // credits members min_stake n min_total_stake l i l1 i + REPEAT:<{ // credits members min_stake n min_total_stake l i l1 + CDR // credits members min_stake n min_total_stake l i l1 + }> + 0 PUSHINT // credits members min_stake n min_total_stake l i l1 _135=0 + DUP // credits members min_stake n min_total_stake l i l1 best_stake=0 m=0 + UNTIL:<{ + s0 s2 XCHG // credits members min_stake n min_total_stake l i m best_stake l1 + UNCONS // credits members min_stake n min_total_stake l i m best_stake _138 l1 + SWAP // credits members min_stake n min_total_stake l i m best_stake l1 _138 + 0 INDEX // credits members min_stake n min_total_stake l i m best_stake l1 stake + s0 s4 XCHG // credits members min_stake n min_total_stake l stake m best_stake l1 i + INC // credits members min_stake n min_total_stake l stake m best_stake l1 i + s4 s8 PUSH2 // credits members min_stake n min_total_stake l stake m best_stake l1 i stake min_stake + GEQ // credits members min_stake n min_total_stake l stake m best_stake l1 i _144 + IF:<{ // credits members min_stake n min_total_stake l stake m best_stake l1 i + s5 s(-1) s4 PU2XC // credits members min_stake n min_total_stake l i m best_stake l1 l i stake + compute_total_stake CALLDICT // credits members min_stake n min_total_stake l i m best_stake l1 tot_stake + s0 s2 PUSH2 // credits members min_stake n min_total_stake l i m best_stake l1 tot_stake tot_stake best_stake + GREATER // credits members min_stake n min_total_stake l i m best_stake l1 tot_stake _147 + IF:<{ // credits members min_stake n min_total_stake l i m best_stake l1 tot_stake + s2 POP + s2 POP // credits members min_stake n min_total_stake l i l1 tot_stake + s2 PUSH // credits members min_stake n min_total_stake l i l1 best_stake m + }>ELSE<{ + s1 s3 XCHG + DROP // credits members min_stake n min_total_stake l i l1 best_stake m + }> + }>ELSE<{ + s3 s4 XCHG2 + DROP // credits members min_stake n min_total_stake l i l1 best_stake m + }> + s3 s6 PUSH2 // credits members min_stake n min_total_stake l i l1 best_stake m i n + GEQ // credits members min_stake n min_total_stake l i l1 best_stake m _148 + }> // credits members min_stake n min_total_stake l i l1 best_stake m + s2 POP + s2 POP + s4 POP + s4 POP // credits members best_stake m min_total_stake l + s2 PUSH // credits members best_stake m min_total_stake l m + 0 EQINT // credits members best_stake m min_total_stake l _150 + s4 s2 PUXC // credits members best_stake m _150 l best_stake min_total_stake + LESS // credits members best_stake m _150 l _151 + s1 s2 XCHG // credits members best_stake m l _150 _151 + OR // credits members best_stake m l _152 + IFJMP:<{ // credits members best_stake m l + 4 BLKDROP // credits + NEWDICT // credits _153 + NEWDICT // credits _153 _154 + 0 PUSHINT // credits _153 _154 _155=0 + DUP // credits _153 _154 _155=0 _156=0 + }> // credits members best_stake m l + DUP // credits members best_stake m l l1 + s0 DUMP // credits members best_stake m l l1 + s2 PUSH // credits members best_stake m l l1 m + DEC // credits members best_stake m l l1 _161 + REPEAT:<{ // credits members best_stake m l l1 + CDR // credits members best_stake m l l1 + }> + CAR // credits members best_stake m l _164 + 0 INDEX // credits members best_stake m l m_stake + 0 PUSHINT // credits members best_stake m l m_stake i=0 + DUP // credits members best_stake m l m_stake i=0 tot_stake=0 + NEWDICT // credits members best_stake m l m_stake i=0 tot_stake=0 vset + NEWDICT // credits members best_stake m l m_stake i=0 tot_stake=0 vset frozen + UNTIL:<{ + s0 s5 XCHG // credits members best_stake m frozen m_stake i tot_stake vset l + UNCONS // credits members best_stake m frozen m_stake i tot_stake vset _179 l + SWAP // credits members best_stake m frozen m_stake i tot_stake vset l _179 + 4 UNTUPLE // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr + s1 s12 PUSH2 + 8 PUSHPOW2 // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr pubkey members _184=256 + DICTUGET + NULLSWAPIFNOT // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr val f + 61 THROWIFNOT + LDGRAMS // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr _295 _294 + NIP // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr val + 64 LDU // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr _297 _296 + NIP // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr val + 256 PLDU // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr src_addr + s8 s11 PUSH2 // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr src_addr i m + LESS // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr src_addr _198 + IF:<{ // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr src_addr + s3 s9 XCPU // credits members best_stake m frozen m_stake i tot_stake vset l stake src_addr pubkey adnl_addr max_f m_stake + MUL // credits members best_stake m frozen m_stake i tot_stake vset l stake src_addr pubkey adnl_addr _200 + 16 RSHIFT# // credits members best_stake m frozen m_stake i tot_stake vset l stake src_addr pubkey adnl_addr _202 + s4 s(-1) PUXC // credits members best_stake m frozen m_stake i tot_stake vset l stake src_addr pubkey adnl_addr stake _202 + MIN // credits members best_stake m frozen m_stake i tot_stake vset l stake src_addr pubkey adnl_addr true_stake + s4 s4 XCPU // credits members best_stake m frozen m_stake i tot_stake vset l true_stake src_addr pubkey adnl_addr stake true_stake + SUB // credits members best_stake m frozen m_stake i tot_stake vset l true_stake src_addr pubkey adnl_addr stake + s4 PUSH // credits members best_stake m frozen m_stake i tot_stake vset l true_stake src_addr pubkey adnl_addr stake true_stake + 60 LSHIFT# // credits members best_stake m frozen m_stake i tot_stake vset l true_stake src_addr pubkey adnl_addr stake _207 + s13 PUSH // credits members best_stake m frozen m_stake i tot_stake vset l true_stake src_addr pubkey adnl_addr stake _207 best_stake + DIV // credits members best_stake m frozen m_stake i tot_stake vset l true_stake src_addr pubkey adnl_addr stake weight + s8 s5 XCPU // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake true_stake + ADD // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake + 2390828938 PUSHINT // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 + s3 PUSH // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 adnl_addr + IF:<{ // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 + 115 PUSHINT // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 _212=115 + }>ELSE<{ // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 + 83 PUSHINT // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 _212=83 + }> + NEWC // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 _212 _215 + 8 STU // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 _217 + 32 STU // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _219 + s4 s(-1) PUXC // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake pubkey _219 + 256 STU // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _221 + s9 s(-1) PUXC // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake weight _221 + 64 STU // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake vinfo + s3 PUSH // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake vinfo adnl_addr + IF:<{ // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake vinfo + s1 s3 XCHG // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey tot_stake stake adnl_addr vinfo + 256 STU // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey tot_stake stake vinfo + }>ELSE<{ + s0 s3 XCHG2 + DROP // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey tot_stake stake vinfo + }> + SWAP + 16 PUSHINT + s10 s8 s8 PUXC2 // credits members best_stake m frozen m_stake i weight stake l true_stake src_addr pubkey tot_stake vinfo i vset _228=16 + DICTUSETB // credits members best_stake m frozen m_stake i weight stake l true_stake src_addr pubkey tot_stake vset + FALSE // credits members best_stake m frozen m_stake i weight stake l true_stake src_addr pubkey tot_stake vset _231 + s4 PUSH + NEWC // credits members best_stake m frozen m_stake i weight stake l true_stake src_addr pubkey tot_stake vset _231 src_addr _232 + 256 STU // credits members best_stake m frozen m_stake i weight stake l true_stake src_addr pubkey tot_stake vset _231 _234 + s1 s9 XCHG // credits members best_stake m frozen m_stake i _231 stake l true_stake src_addr pubkey tot_stake vset weight _234 + 64 STU // credits members best_stake m frozen m_stake i _231 stake l true_stake src_addr pubkey tot_stake vset _236 + s0 s5 XCHG2 // credits members best_stake m frozen m_stake i _231 stake l vset src_addr pubkey tot_stake _236 true_stake + STGRAMS // credits members best_stake m frozen m_stake i _231 stake l vset src_addr pubkey tot_stake _237 + s1 s7 XCHG // credits members best_stake m frozen m_stake i tot_stake stake l vset src_addr pubkey _231 _237 + 1 STI // credits members best_stake m frozen m_stake i tot_stake stake l vset src_addr pubkey _239 + s0 s1 s9 XCHG3 + 8 PUSHPOW2 // credits members best_stake m src_addr m_stake i tot_stake stake l vset _239 pubkey frozen _240=256 + DICTUSETB // credits members best_stake m src_addr m_stake i tot_stake stake l vset frozen + }>ELSE<{ + s0 s10 XCHG + s4 s6 XCHG + s0 s3 XCHG + 3 BLKDROP // credits members best_stake m src_addr m_stake i tot_stake stake l vset frozen + }> + s3 PUSH // credits members best_stake m src_addr m_stake i tot_stake stake l vset frozen stake + IF:<{ // credits members best_stake m src_addr m_stake i tot_stake stake l vset frozen + s11 s7 s3 XCHG3 // l members best_stake m vset m_stake i tot_stake frozen credits src_addr stake + ~credit_to CALLDICT // l members best_stake m vset m_stake i tot_stake frozen credits + }>ELSE<{ + s11 s7 s3 XCHG3 + 2DROP // l members best_stake m vset m_stake i tot_stake frozen credits + }> + s0 s3 XCHG // l members best_stake m vset m_stake credits tot_stake frozen i + INC // l members best_stake m vset m_stake credits tot_stake frozen i + s9 PUSH // l members best_stake m vset m_stake credits tot_stake frozen i l + ISNULL // l members best_stake m vset m_stake credits tot_stake frozen i _246 + s4 s10 XCHG + s4 s6 XCHG + s4 s4 s0 XCHG3 // credits members best_stake m l m_stake i tot_stake vset frozen _246 + }> // credits members best_stake m l m_stake i tot_stake vset frozen + s3 POP + s3 POP + s3 POP + s5 POP // credits frozen best_stake m tot_stake vset + s1 s3 PUXC // credits frozen vset m tot_stake tot_stake best_stake + EQUAL // credits frozen vset m tot_stake _248 + 49 THROWIFNOT + s2 s3 XCHG + SWAP // credits vset frozen tot_stake m + }> + conduct_elections PROC:<{ + // ds elect credits + SWAP // ds credits elect + unpack_elect CALLDICT // ds credits _130 _131 _132 _133 _134 _135 _136 + s4 POP // ds credits elect_at elect_close finished total_stake members failed + NOW // ds credits elect_at elect_close finished total_stake members failed _11 + s5 PUSH // ds credits elect_at elect_close finished total_stake members failed _11 elect_close + LESS // ds credits elect_at elect_close finished total_stake members failed _12 + IFJMP:<{ // ds credits elect_at elect_close finished total_stake members failed + 8 BLKDROP // + FALSE // _13 + }> // ds credits elect_at elect_close finished total_stake members failed + 0 PUSHINT // ds credits elect_at elect_close finished total_stake members failed _14=0 + CONFIGOPTPARAM // ds credits elect_at elect_close finished total_stake members failed _15 + ISNULL // ds credits elect_at elect_close finished total_stake members failed _16 + IFJMP:<{ // ds credits elect_at elect_close finished total_stake members failed + 8 BLKDROP // + postpone_elections CALLDICT // _17 + }> // ds credits elect_at elect_close finished total_stake members failed + 17 PUSHINT // ds credits elect_at elect_close finished total_stake members failed _19=17 + CONFIGOPTPARAM // ds credits elect_at elect_close finished total_stake members failed _20 + CTOS // ds credits elect_at elect_close finished total_stake members failed cs + LDGRAMS // ds credits elect_at elect_close finished total_stake members failed min_stake cs + LDGRAMS // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake cs + LDGRAMS // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake min_total_stake cs + 32 LDU // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake min_total_stake max_stake_factor cs + ENDS + s6 s1 PUSH2 // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake min_total_stake max_stake_factor total_stake min_total_stake + LESS // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake min_total_stake max_stake_factor _35 + IFJMP:<{ // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake min_total_stake max_stake_factor + 12 BLKDROP // + postpone_elections CALLDICT // _36 + }> // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake min_total_stake max_stake_factor + s0 s4 XCHG // ds credits elect_at elect_close finished total_stake members max_stake_factor min_stake max_stake min_total_stake failed + IFJMP:<{ // ds credits elect_at elect_close finished total_stake members max_stake_factor min_stake max_stake min_total_stake + 11 BLKDROP // + postpone_elections CALLDICT // _37 + }> // ds credits elect_at elect_close finished total_stake members max_stake_factor min_stake max_stake min_total_stake + s0 s6 XCHG // ds credits elect_at elect_close min_total_stake total_stake members max_stake_factor min_stake max_stake finished + IFJMP:<{ // ds credits elect_at elect_close min_total_stake total_stake members max_stake_factor min_stake max_stake + 10 BLKDROP // + FALSE // _38 + }> // ds credits elect_at elect_close min_total_stake total_stake members max_stake_factor min_stake max_stake + s3 s8 XCHG + s8 PUSH + s3 s2 XCPU + s7 s7 XCHG2 // ds members elect_at elect_close min_stake total_stake credits members min_stake max_stake min_total_stake max_stake_factor + try_elect CALLDICT // ds members elect_at elect_close min_stake total_stake credits vdict frozen total_stakes cnt + DUP // ds members elect_at elect_close min_stake total_stake credits vdict frozen total_stakes cnt cnt + 0 EQINT // ds members elect_at elect_close min_stake total_stake credits vdict frozen total_stakes cnt failed + DUP // ds members elect_at elect_close min_stake total_stake credits vdict frozen total_stakes cnt failed failed + NOT // ds members elect_at elect_close min_stake total_stake credits vdict frozen total_stakes cnt failed finished + s10 PUSH + s0 s6 XCHG + s5 s10 XCHG + s4 s9 XCHG + s3 s8 XCHG + s12 s12 s12 XCHG3 // ds vdict elect_at frozen total_stakes cnt credits elect_at elect_close min_stake total_stake members failed finished + pack_elect CALLDICT // ds vdict elect_at frozen total_stakes cnt credits elect + s2 PUSH // ds vdict elect_at frozen total_stakes cnt credits elect cnt + IFNOTJMP:<{ // ds vdict elect_at frozen total_stakes cnt credits elect + s2 POP + s2 POP + s2 POP + s2 POP + s2 POP // ds elect credits + NEWC // ds elect credits _48 + s1 s2 XCHG // ds credits elect _48 + STDICT // ds credits _49 + STDICT // ds _50 + SWAP // _50 ds + STSLICER // _51 + ENDC // _52 + c4 POP + postpone_elections CALLDICT // _54 + }> // ds vdict elect_at frozen total_stakes cnt credits elect + get_validator_conf CALLDICT // ds vdict elect_at frozen total_stakes cnt credits elect _150 _151 _152 _153 + s2 POP // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held elect_end_before + NOW // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held elect_end_before _61 + SWAP // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held _61 elect_end_before + ADD // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held _62 + -60 ADDCONST // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held _64 + s8 PUSH // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held _64 elect_at + MAX // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start + 16 PUSHINT // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _67=16 + CONFIGOPTPARAM // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _68 + CTOS // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _69 + 16 PUSHINT // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _69 _70=16 + SDSKIPFIRST // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _71 + 16 PLDU // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start main_validators + s6 s(-1) PUXC // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start cnt main_validators + MIN // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 + s1 s3 PUSH2 // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 start elect_for + ADD // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _76 + 17 PUSHINT // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _76 _77=17 + NEWC // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _76 _77=17 _78 + 8 STU // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _76 _80 + s3 s(-1) PUXC // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _76 start _80 + 32 STU // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _76 _82 + 32 STU // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _84 + s1 s7 XCHG // ds vdict elect_at frozen total_stakes _75 credits elect elect_for stake_held start cnt _84 + 16 STU // ds vdict elect_at frozen total_stakes _75 credits elect elect_for stake_held start _86 + s1 s6 XCHG // ds vdict elect_at frozen total_stakes start credits elect elect_for stake_held _75 _86 + 16 STU // ds vdict elect_at frozen total_stakes start credits elect elect_for stake_held _88 + s0 s9 XCHG // ds _88 elect_at frozen total_stakes start credits elect elect_for stake_held vdict + CTOS // ds _88 elect_at frozen total_stakes start credits elect elect_for stake_held _89 + s1 s9 XCHG // ds stake_held elect_at frozen total_stakes start credits elect elect_for _88 _89 + STSLICER // ds stake_held elect_at frozen total_stakes start credits elect elect_for _90 + ENDC // ds stake_held elect_at frozen total_stakes start credits elect elect_for vset + 0 PUSHINT // ds stake_held elect_at frozen total_stakes start credits elect elect_for vset _93=0 + CONFIGOPTPARAM // ds stake_held elect_at frozen total_stakes start credits elect elect_for vset _94 + CTOS // ds stake_held elect_at frozen total_stakes start credits elect elect_for vset _95 + 256 PLDU // ds stake_held elect_at frozen total_stakes start credits elect elect_for vset config_addr + s1 s8 PUSH2 // ds stake_held elect_at frozen total_stakes start credits elect elect_for vset config_addr vset elect_at + send_validator_set_to_config CALLDICT + s0 s9 XCHG // vset stake_held elect_at frozen total_stakes start credits elect elect_for ds + LDDICT // vset stake_held elect_at frozen total_stakes start credits elect elect_for past_elect ds + FALSE // vset stake_held elect_at frozen total_stakes start credits elect elect_for past_elect ds _103 + s0 s11 XCHG // _103 stake_held elect_at frozen total_stakes start credits elect elect_for past_elect ds vset + HASHCU // _103 stake_held elect_at frozen total_stakes start credits elect elect_for past_elect ds _104 + s6 s3 XCHG2 // _103 stake_held elect_at frozen total_stakes ds credits elect _104 past_elect start elect_for + ADD // _103 stake_held elect_at frozen total_stakes ds credits elect _104 past_elect _105 + s9 PUSH // _103 stake_held elect_at frozen total_stakes ds credits elect _104 past_elect _105 stake_held + ADD // _103 stake_held elect_at frozen total_stakes ds credits elect _104 past_elect _106 + NEWC // _103 stake_held elect_at frozen total_stakes ds credits elect _104 past_elect _106 _107 + 32 STU // _103 stake_held elect_at frozen total_stakes ds credits elect _104 past_elect _109 + s1 s9 XCHG // _103 past_elect elect_at frozen total_stakes ds credits elect _104 stake_held _109 + 32 STU // _103 past_elect elect_at frozen total_stakes ds credits elect _104 _111 + 256 STU // _103 past_elect elect_at frozen total_stakes ds credits elect _113 + s1 s5 XCHG // _103 past_elect elect_at elect total_stakes ds credits frozen _113 + STDICT // _103 past_elect elect_at elect total_stakes ds credits _114 + s0 s3 XCHG2 // _103 past_elect elect_at elect credits ds _114 total_stakes + STGRAMS // _103 past_elect elect_at elect credits ds _115 + 0 PUSHINT // _103 past_elect elect_at elect credits ds _115 _116=0 + STGRAMS // _103 past_elect elect_at elect credits ds _117 + s1 s6 XCHG // ds past_elect elect_at elect credits _103 _117 + 1 STI // ds past_elect elect_at elect credits _119 + s0 s3 s4 XCHG3 + 32 PUSHINT // ds elect credits _119 elect_at past_elect _120=32 + DICTUSETB // ds elect credits past_elect + NEWC // ds elect credits past_elect _122 + s1 s3 XCHG // ds past_elect credits elect _122 + STDICT // ds past_elect credits _123 + STDICT // ds past_elect _124 + STDICT // ds _125 + SWAP // _125 ds + STSLICER // _126 + ENDC // _127 + c4 POP + TRUE // _129 + }> + update_active_vset_id PROC:<{ + // + load_data CALLDICT // elect credits past_elect grams active_id active_hash + 34 PUSHINT // elect credits past_elect grams active_id active_hash _8=34 + CONFIGOPTPARAM // elect credits past_elect grams active_id active_hash _9 + HASHCU // elect credits past_elect grams active_id active_hash cur_hash + s0 s1 PUSH2 // elect credits past_elect grams active_id active_hash cur_hash cur_hash active_hash + EQUAL // elect credits past_elect grams active_id active_hash cur_hash _11 + IFJMP:<{ // elect credits past_elect grams active_id active_hash cur_hash + 7 BLKDROP // + FALSE // _12 + }> // elect credits past_elect grams active_id active_hash cur_hash + s2 PUSH // elect credits past_elect grams active_id active_hash cur_hash active_id + IF:<{ // elect credits past_elect grams active_id active_hash cur_hash + s2 s4 PUSH2 + 32 PUSHINT // elect credits past_elect grams active_id active_hash cur_hash active_id past_elect _15=32 + DICTUGET + NULLSWAPIFNOT // elect credits past_elect grams active_id active_hash cur_hash fs f + IF:<{ // elect credits past_elect grams active_id active_hash cur_hash fs + 32 LDU // elect credits past_elect grams active_id active_hash cur_hash _99 _98 + NIP // elect credits past_elect grams active_id active_hash cur_hash fs + DUP // elect credits past_elect grams active_id active_hash cur_hash fs0 fs + 32 LDU // elect credits past_elect grams active_id active_hash cur_hash fs0 _24 fs + 256 LDU // elect credits past_elect grams active_id active_hash cur_hash fs0 _24 _103 _102 + DROP // elect credits past_elect grams active_id active_hash cur_hash fs0 stake_held hash + s0 s4 XCHG2 // elect credits past_elect grams active_id stake_held cur_hash fs0 hash active_hash + EQUAL // elect credits past_elect grams active_id stake_held cur_hash fs0 _31 + 57 THROWIFNOT + NOW // elect credits past_elect grams active_id stake_held cur_hash fs0 _33 + s0 s3 XCHG2 // elect credits past_elect grams active_id fs0 cur_hash _33 stake_held + ADD // elect credits past_elect grams active_id fs0 cur_hash unfreeze_time + NEWC // elect credits past_elect grams active_id fs0 cur_hash unfreeze_time _36 + 32 STU // elect credits past_elect grams active_id fs0 cur_hash _38 + ROT // elect credits past_elect grams active_id cur_hash _38 fs0 + STSLICER // elect credits past_elect grams active_id cur_hash _39 + s0 s0 s4 XCHG3 + 32 PUSHINT // elect credits cur_hash grams _39 active_id past_elect _40=32 + DICTUSETB // elect credits cur_hash grams past_elect + }>ELSE<{ + s1 s5 XCHG + s1 s3 XCHG + 3 BLKDROP // elect credits cur_hash grams past_elect + }> + }>ELSE<{ + s4 s1 s4 XCHG3 + 2DROP // elect credits cur_hash grams past_elect + }> + -1 PUSHINT // elect credits cur_hash grams past_elect id=-1 + UNTIL:<{ + OVER + 32 PUSHINT // elect credits cur_hash grams past_elect id past_elect _46=32 + DICTUGETNEXT + NULLSWAPIFNOT + NULLSWAPIFNOT // elect credits cur_hash grams past_elect fs id f + DUP // elect credits cur_hash grams past_elect fs id f f + IF:<{ // elect credits cur_hash grams past_elect fs id f + s0 s2 XCHG // elect credits cur_hash grams past_elect f id fs + 64 LDU // elect credits cur_hash grams past_elect f id _50 fs + 256 LDU // elect credits cur_hash grams past_elect f id tm hash fs + s1 s7 PUSH2 // elect credits cur_hash grams past_elect f id tm hash fs hash cur_hash + EQUAL // elect credits cur_hash grams past_elect f id tm hash fs _56 + IF:<{ // elect credits cur_hash grams past_elect f id tm hash fs + s4 POP // elect credits cur_hash grams past_elect fs id tm hash + s0 s3 XCHG // elect credits cur_hash grams past_elect hash id tm fs + LDDICT // elect credits cur_hash grams past_elect hash id tm _60 fs + LDGRAMS // elect credits cur_hash grams past_elect hash id tm _60 _62 fs + LDGRAMS // elect credits cur_hash grams past_elect hash id tm dict total_stake bonuses fs + s8 PUSH // elect credits cur_hash grams past_elect hash id tm dict total_stake bonuses fs grams + 3 RSHIFT# // elect credits cur_hash grams past_elect hash id tm dict total_stake bonuses fs amount + s9 s9 XCPU // elect credits cur_hash amount past_elect hash id tm dict total_stake bonuses fs grams amount + SUB // elect credits cur_hash amount past_elect hash id tm dict total_stake bonuses fs grams + s2 s9 XCHG2 // elect credits cur_hash grams past_elect hash id tm dict total_stake fs bonuses amount + ADD // elect credits cur_hash grams past_elect hash id tm dict total_stake fs bonuses + NEWC // elect credits cur_hash grams past_elect hash id tm dict total_stake fs bonuses _72 + s1 s5 XCHG // elect credits cur_hash grams past_elect hash id bonuses dict total_stake fs tm _72 + 64 STU // elect credits cur_hash grams past_elect hash id bonuses dict total_stake fs _74 + s1 s6 XCHG // elect credits cur_hash grams past_elect fs id bonuses dict total_stake hash _74 + 256 STU // elect credits cur_hash grams past_elect fs id bonuses dict total_stake _76 + s1 s2 XCHG // elect credits cur_hash grams past_elect fs id bonuses total_stake dict _76 + STDICT // elect credits cur_hash grams past_elect fs id bonuses total_stake _77 + SWAP // elect credits cur_hash grams past_elect fs id bonuses _77 total_stake + STGRAMS // elect credits cur_hash grams past_elect fs id bonuses _78 + SWAP // elect credits cur_hash grams past_elect fs id _78 bonuses + STGRAMS // elect credits cur_hash grams past_elect fs id _79 + ROT // elect credits cur_hash grams past_elect id _79 fs + STSLICER // elect credits cur_hash grams past_elect id _80 + SWAP + 32 PUSHINT + s1 s3 s3 PUXC2 // elect credits cur_hash grams id _80 id past_elect _81=32 + DICTUSETB // elect credits cur_hash grams id past_elect + FALSE // elect credits cur_hash grams id past_elect f + }>ELSE<{ + s3 s5 XCHG + s3 s4 XCHG + 3 BLKDROP // elect credits cur_hash grams id past_elect f + }> + }>ELSE<{ + s3 s0 s3 XCHG3 + DROP // elect credits cur_hash grams id past_elect f + }> + NOT // elect credits cur_hash grams id past_elect _84 + s1 s2 XCHG // elect credits cur_hash grams past_elect id _84 + }> // elect credits cur_hash grams past_elect id + DUP // elect credits cur_hash grams past_elect id id + ISNULL // elect credits cur_hash grams past_elect id _85 + IF:<{ // elect credits cur_hash grams past_elect id + DROP // elect credits cur_hash grams past_elect + 0 PUSHINT // elect credits cur_hash grams past_elect _86=0 + }>ELSE<{ // elect credits cur_hash grams past_elect _86 + }> // elect credits active_hash grams past_elect active_id + s0 s3 XCHG2 // elect credits past_elect grams active_id active_hash + store_data CALLDICT + TRUE // _89 + }> + cell_hash_eq? PROC:<{ + // vset expected_vset_hash + OVER // vset expected_vset_hash vset + ISNULL // vset expected_vset_hash _2 + IF:<{ // vset expected_vset_hash + 2DROP // + FALSE // _3 + }>ELSE<{ // vset expected_vset_hash + SWAP // expected_vset_hash vset + HASHCU // expected_vset_hash _5 + SWAP // _5 expected_vset_hash + EQUAL // _3 + }> + }> + validator_set_installed PROC:<{ + // ds elect credits + SWAP // ds credits elect + unpack_elect CALLDICT // ds credits _44 _45 _46 _47 _48 _49 _50 + s0 s5 XCHG + 5 BLKDROP // ds credits elect_at finished + IFNOTJMP:<{ // ds credits elect_at + 3 BLKDROP // + FALSE // _11 + }> // ds credits elect_at + s0 s2 XCHG // elect_at credits ds + LDDICT // elect_at credits past_elections ds + s3 s1 XCPU + 32 PUSHINT // ds credits past_elections elect_at past_elections _17=32 + DICTUGET + NULLSWAPIFNOT // ds credits past_elections fs f + IFNOTJMP:<{ // ds credits past_elections fs + 4 BLKDROP // + FALSE // _19 + }> // ds credits past_elections fs + 64 PUSHINT // ds credits past_elections fs _21=64 + SDSKIPFIRST // ds credits past_elections _22 + 256 PLDU // ds credits past_elections vset_hash + 34 PUSHINT // ds credits past_elections vset_hash _25=34 + CONFIGOPTPARAM // ds credits past_elections vset_hash _26 + OVER // ds credits past_elections vset_hash _26 vset_hash + cell_hash_eq? CALLDICT // ds credits past_elections vset_hash _27 + 36 PUSHINT // ds credits past_elections vset_hash _27 _28=36 + CONFIGOPTPARAM // ds credits past_elections vset_hash _27 _29 + ROT // ds credits past_elections _27 _29 vset_hash + cell_hash_eq? CALLDICT // ds credits past_elections _27 _30 + OR // ds credits past_elections _31 + IFJMP:<{ // ds credits past_elections + FALSE // ds credits past_elections _32 + NEWC // ds credits past_elections _32 _33 + 1 STI // ds credits past_elections _35 + s1 s2 XCHG // ds past_elections credits _35 + STDICT // ds past_elections _36 + STDICT // ds _37 + SWAP // _37 ds + STSLICER // _38 + ENDC // _39 + c4 POP + update_active_vset_id CALLDICT // _41 + DROP // + TRUE // _42 + }> // ds credits past_elections + 3 BLKDROP // + FALSE // _43 + }> + check_unfreeze PROC:<{ + // + load_data CALLDICT // elect credits past_elect grams active_id active_hash + -1 PUSHINT // elect credits past_elect grams active_id active_hash id=-1 + UNTIL:<{ + s4 PUSH + 32 PUSHINT // elect credits past_elect grams active_id active_hash id past_elect _11=32 + DICTUGETNEXT + NULLSWAPIFNOT + NULLSWAPIFNOT // elect credits past_elect grams active_id active_hash fs id f + DUP // elect credits past_elect grams active_id active_hash fs id f f + IF:<{ // elect credits past_elect grams active_id active_hash fs id f + s0 s2 XCHG // elect credits past_elect grams active_id active_hash f id fs + 32 LDU // elect credits past_elect grams active_id active_hash f id _39 _38 + DROP // elect credits past_elect grams active_id active_hash f id unfreeze_at + NOW // elect credits past_elect grams active_id active_hash f id unfreeze_at _17 + LEQ // elect credits past_elect grams active_id active_hash f id _18 + s1 s4 PUSH2 // elect credits past_elect grams active_id active_hash f id _18 id active_id + NEQ // elect credits past_elect grams active_id active_hash f id _18 _19 + AND // elect credits past_elect grams active_id active_hash f id _20 + IF:<{ // elect credits past_elect grams active_id active_hash f id + NIP // elect credits past_elect grams active_id active_hash id + s5 s4 s4 XC2PU // elect active_hash id grams active_id credits past_elect id + unfreeze_all CALLDICT // elect active_hash id grams active_id credits past_elect unused_prizes + s1 s4 XCHG // elect active_hash id past_elect active_id credits grams unused_prizes + ADD // elect active_hash id past_elect active_id credits grams + s6 s1 s3 PUSH3 + s3 s5 s8 PUSH3 // elect active_hash id past_elect active_id credits grams elect credits past_elect grams active_id active_hash + store_data CALLDICT + FALSE // elect active_hash id past_elect active_id credits grams f + }>ELSE<{ + s6 s1 s5 XCHG3 + s4 s4 XCHG2 // elect active_hash id past_elect active_id credits grams f + }> + }>ELSE<{ + s3 s7 XCHG + s1 s6 XCHG + s5 s0 s5 XCHG3 + DROP // elect active_hash id past_elect active_id credits grams f + }> + NOT // elect active_hash id past_elect active_id credits grams _26 + s2 s6 XCHG + s4 s5 XCHG + s1 s4 XCHG // elect credits past_elect grams active_id active_hash id _26 + }> // elect credits past_elect grams active_id active_hash id + s0 s6 XCHG + 6 BLKDROP // id + ISNULL // _27 + NOT // _28 + }> + announce_new_elections PROC:<{ + // ds elect credits + NIP // ds credits + 36 PUSHINT // ds credits _4=36 + CONFIGOPTPARAM // ds credits next_vset + ISNULL // ds credits _6 + IFNOTJMP:<{ // ds credits + 2DROP // + FALSE // _7 + }> // ds credits + 1 PUSHINT // ds credits _9=1 + CONFIGOPTPARAM // ds credits _10 + CTOS // ds credits _11 + 256 PLDU // ds credits elector_addr + MYADDR // ds credits elector_addr _16 + REWRITESTDADDR // ds credits elector_addr my_wc my_addr + SWAP // ds credits elector_addr my_addr my_wc + INC // ds credits elector_addr my_addr _19 + s0 s2 XCHG // ds credits _19 my_addr elector_addr + NEQ // ds credits _19 _20 + OR // ds credits _21 + IFJMP:<{ // ds credits + 2DROP // + FALSE // _22 + }> // ds credits + 34 PUSHINT // ds credits _24=34 + CONFIGOPTPARAM // ds credits cur_vset + DUP // ds credits cur_vset cur_vset + ISNULL // ds credits cur_vset _26 + IFJMP:<{ // ds credits cur_vset + 3 BLKDROP // + FALSE // _27 + }> // ds credits cur_vset + get_validator_conf CALLDICT // ds credits cur_vset _76 _77 _78 _79 + DROP + s2 POP // ds credits cur_vset elect_end_before elect_begin_before + s0 s2 XCHG // ds credits elect_begin_before elect_end_before cur_vset + CTOS // ds credits elect_begin_before elect_end_before _34 + 40 PUSHINT // ds credits elect_begin_before elect_end_before _34 _37 + SDSKIPFIRST // ds credits elect_begin_before elect_end_before _38 + 32 PLDU // ds credits elect_begin_before elect_end_before cur_valid_until + NOW // ds credits elect_begin_before elect_end_before cur_valid_until t + s1 s3 XCPU // ds credits elect_begin_before elect_end_before t cur_valid_until elect_begin_before + SUB // ds credits elect_begin_before elect_end_before t t0 + 2DUP // ds credits elect_begin_before elect_end_before t t0 t t0 + LESS // ds credits elect_begin_before elect_end_before t t0 _45 + IFJMP:<{ // ds credits elect_begin_before elect_end_before t t0 + 6 BLKDROP // + FALSE // _46 + }> // ds credits elect_begin_before elect_end_before t t0 + 2DUP // ds credits elect_begin_before elect_end_before t t0 t t0 + SUB // ds credits elect_begin_before elect_end_before t t0 _47 + 60 LESSINT // ds credits elect_begin_before elect_end_before t t0 _49 + IF:<{ // ds credits elect_begin_before elect_end_before t t0 + NIP // ds credits elect_begin_before elect_end_before t + }>ELSE<{ + DROP // ds credits elect_begin_before elect_end_before t + }> + 17 PUSHINT // ds credits elect_begin_before elect_end_before t _52=17 + CONFIGOPTPARAM // ds credits elect_begin_before elect_end_before t _53 + CTOS // ds credits elect_begin_before elect_end_before t _54 + LDGRAMS // ds credits elect_begin_before elect_end_before t _81 _80 + DROP // ds credits elect_begin_before elect_end_before t min_stake + s0 s3 XCHG // ds credits min_stake elect_end_before t elect_begin_before + ADD // ds credits min_stake elect_end_before elect_at + s0 DUMP // ds credits min_stake elect_end_before elect_at + s0 s1 PUXC // ds credits min_stake elect_at elect_at elect_end_before + SUB // ds credits min_stake elect_at elect_close + 0 PUSHINT // ds credits min_stake elect_at elect_close _62=0 + NEWDICT // ds credits min_stake elect_at elect_close _62=0 _63 + FALSE // ds credits min_stake elect_at elect_close _62=0 _63 _64 + s4 s5 XCHG + s3 s4 XCHG + FALSE // ds credits elect_at elect_close min_stake _62=0 _63 _64 _65 + pack_elect CALLDICT // ds credits elect + NEWC // ds credits elect _67 + STDICT // ds credits _68 + STDICT // ds _69 + SWAP // _69 ds + STSLICER // _70 + ENDC // _71 + c4 POP + TRUE // _73 + }> + run_ticktock PROC:<{ + // is_tock + DROP // + c4 PUSH // _2 + CTOS // ds + LDDICT // _6 ds + LDDICT // elect credits ds + s2 PUSH // elect credits ds elect + ISNULL // elect credits ds _10 + IF:<{ // elect credits ds + -ROT // ds elect credits + announce_new_elections CALLDICT // _18 + 0 THROWIF + }>ELSE<{ // elect credits ds + s0 s2 s1 PUSH3 // elect credits ds ds elect credits + conduct_elections CALLDICT // elect credits ds _12 + 0 THROWIF + -ROT // ds elect credits + validator_set_installed CALLDICT // _15 + 0 THROWIF + }> + update_active_vset_id CALLDICT // _21 + 0 THROWIF + check_unfreeze CALLDICT // _23 + DROP // + }> + active_election_id PROC:<{ + // + c4 PUSH // _1 + CTOS // _2 + PLDDICT // elect + DUP // elect elect + ISNULL // elect _4 + IF:<{ // elect + DROP // + 0 PUSHINT // _5=0 + }>ELSE<{ // elect + CTOS // _7 + 32 PLDU // _5 + }> + }> + participates_in PROC:<{ + // validator_pubkey + c4 PUSH // validator_pubkey _2 + CTOS // validator_pubkey _3 + PLDDICT // validator_pubkey elect + DUP // validator_pubkey elect elect + ISNULL // validator_pubkey elect _5 + IFJMP:<{ // validator_pubkey elect + 2DROP // + 0 PUSHINT // _6=0 + }> // validator_pubkey elect + unpack_elect CALLDICT // validator_pubkey _23 _24 _25 _26 _27 _28 _29 + s2 s6 XCHG + 6 BLKDROP // validator_pubkey members + 8 PUSHPOW2 // validator_pubkey members _17=256 + DICTUGET + NULLSWAPIFNOT // mem found + IF:<{ // mem + LDGRAMS // _33 _32 + DROP // _19 + }>ELSE<{ // mem + DROP // + 0 PUSHINT // _19=0 + }> + }> + participant_list PROC:<{ + // + c4 PUSH // _1 + CTOS // _2 + PLDDICT // elect + DUP // elect elect + ISNULL // elect _4 + IFJMP:<{ // elect + DROP // + PUSHNULL // _5 + }> // elect + unpack_elect CALLDICT // _35 _36 _37 _38 _39 _40 _41 + s2 s6 XCHG + 6 BLKDROP // members + PUSHNULL // members l + 256 PUSHPOW2DEC // members l id + UNTIL:<{ + s2 PUSH + 8 PUSHPOW2 // members l id members _28=256 + DICTUGETPREV + NULLSWAPIFNOT + NULLSWAPIFNOT // members l fs id f + DUP // members l fs id f f + IF:<{ // members l fs id f + s0 s2 XCHG // members l f id fs + LDGRAMS // members l f id _46 _45 + DROP // members l f id _30 + s1 s(-1) PUXC // members l f id id _30 + PAIR // members l f id _32 + s0 s3 XCHG2 // members id f _32 l + CONS // members id f l + }>ELSE<{ + 2SWAP + DROP // members id f l + }> + SWAP // members id l f + NOT // members id l _34 + s1 s2 XCHG // members l id _34 + }> // members l id + DROP + NIP // l + }> + compute_returned_stake PROC:<{ + // wallet_addr + c4 PUSH // wallet_addr _2 + CTOS // wallet_addr cs + LDDICT // wallet_addr _19 _18 + NIP // wallet_addr cs + LDDICT // wallet_addr _21 _20 + DROP // wallet_addr credits + 8 PUSHPOW2 // wallet_addr credits _12=256 + DICTUGET + NULLSWAPIFNOT // val f + IF:<{ // val + LDGRAMS // _25 _24 + DROP // _14 + }>ELSE<{ // val + DROP // + 0 PUSHINT // _14=0 + }> + }> +}END>c diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-code.cpp b/submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-code.cpp new file mode 100644 index 0000000000..ecc0b71d8e --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-code.cpp @@ -0,0 +1 @@ +with_tvm_code("highload-wallet", "te6ccgEBBgEAhgABFP8A9KQT9KDyyAsBAgEgAgMCAUgEBQC88oMI1xgg0x/TH9Mf+CMTu/Jj7UTQ0x/TH9P/0VEyuvKhUUS68qIE+QFUEFX5EPKj9ATR+AB/jhghgBD0eG+hb6EgmALTB9QwAfsAkTLiAbPmWwGkyMsfyx/L/8ntVAAE0DAAEaCZL9qJoa4WPw=="); diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-code.fif b/submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-code.fif new file mode 100644 index 0000000000..d2122a96fb --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-code.fif @@ -0,0 +1,79 @@ +// automatically generated from `smartcont/stdlib.fc` `smartcont/highload-wallet-code.fc` +PROGRAM{ + DECLPROC recv_internal + DECLPROC recv_external + 85143 DECLMETHOD seqno + recv_internal PROC:<{ + // in_msg + DROP // + }> + recv_external PROC:<{ + // in_msg + 9 PUSHPOW2 // in_msg _3=512 + LDSLICEX // signature in_msg + DUP // signature in_msg cs + 32 LDU // signature in_msg _9 cs + 32 LDU // signature in_msg _9 _12 cs + 32 LDU // signature in_msg subwallet_id valid_until msg_seqno cs + NOW // signature in_msg subwallet_id valid_until msg_seqno cs _19 + s1 s3 XCHG // signature in_msg subwallet_id cs msg_seqno valid_until _19 + LEQ // signature in_msg subwallet_id cs msg_seqno _20 + 35 THROWIF + c4 PUSH // signature in_msg subwallet_id cs msg_seqno _23 + CTOS // signature in_msg subwallet_id cs msg_seqno ds + 32 LDU // signature in_msg subwallet_id cs msg_seqno _28 ds + 32 LDU // signature in_msg subwallet_id cs msg_seqno _28 _31 ds + 256 LDU // signature in_msg subwallet_id cs msg_seqno stored_seqno stored_subwallet public_key ds + ENDS + s3 s2 XCPU // signature in_msg subwallet_id cs public_key stored_seqno stored_subwallet msg_seqno stored_seqno + EQUAL // signature in_msg subwallet_id cs public_key stored_seqno stored_subwallet _39 + 33 THROWIFNOT + s4 s4 XCPU // signature in_msg stored_subwallet cs public_key stored_seqno subwallet_id stored_subwallet + EQUAL // signature in_msg stored_subwallet cs public_key stored_seqno _42 + 34 THROWIFNOT + s0 s4 XCHG // signature stored_seqno stored_subwallet cs public_key in_msg + HASHSU // signature stored_seqno stored_subwallet cs public_key _45 + s0 s5 s5 XC2PU // public_key stored_seqno stored_subwallet cs _45 signature public_key + CHKSIGNU // public_key stored_seqno stored_subwallet cs _46 + 35 THROWIFNOT + LDDICT // public_key stored_seqno stored_subwallet dict cs + ENDS + ACCEPT + -1 PUSHINT // public_key stored_seqno stored_subwallet dict i=-1 + UNTIL:<{ + OVER + 16 PUSHINT // public_key stored_seqno stored_subwallet dict i dict _57=16 + DICTIGETNEXT + NULLSWAPIFNOT + NULLSWAPIFNOT // public_key stored_seqno stored_subwallet dict cs i f + DUP // public_key stored_seqno stored_subwallet dict cs i f f + IF:<{ // public_key stored_seqno stored_subwallet dict cs i f + s0 s2 XCHG // public_key stored_seqno stored_subwallet dict f i cs + 8 LDU // public_key stored_seqno stored_subwallet dict f i mode cs + LDREF // public_key stored_seqno stored_subwallet dict f i mode _100 _99 + DROP // public_key stored_seqno stored_subwallet dict f i mode _63 + SWAP // public_key stored_seqno stored_subwallet dict f i _63 mode + SENDRAWMSG + }>ELSE<{ + s2 POP // public_key stored_seqno stored_subwallet dict f i + }> + SWAP // public_key stored_seqno stored_subwallet dict i f + NOT // public_key stored_seqno stored_subwallet dict i _66 + }> // public_key stored_seqno stored_subwallet dict i + 2DROP // public_key stored_seqno stored_subwallet + SWAP // public_key stored_subwallet stored_seqno + INC // public_key stored_subwallet _68 + NEWC // public_key stored_subwallet _68 _69 + 32 STU // public_key stored_subwallet _71 + 32 STU // public_key _73 + 256 STU // _75 + ENDC // _76 + c4 POP + }> + seqno PROC:<{ + // + c4 PUSH // _0 + CTOS // _1 + 32 PLDU // _3 + }> +}END>c diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-v2-code.cpp b/submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-v2-code.cpp new file mode 100644 index 0000000000..ca5d2c70f7 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-v2-code.cpp @@ -0,0 +1 @@ +with_tvm_code("highoad-wallet-v2", "te6ccgEBBwEA1wABFP8A9KQT9KDyyAsBAgEgAgMCAUgEBQHu8oMI1xgg0x/TP/gjqh9TILnyY+1E0NMf0z/T//QE0VNggED0Dm+hMfJgUXO68qIH+QFUEIf5EPKjAvQE0fgAf44YIYAQ9HhvoW+hIJgC0wfUMAH7AJEy4gGz5luDJaHIQDSAQPRDiuYxyBLLHxPLP8v/9ADJ7VQGAATQMABBoZfl2omhpj5jpn+n/mPoCaKkQQCB6BzfQmMktv8ld0fFADoggED0lm+hb6EyURCUMFMDud4gkjM2k0MTW+IBsw=="); diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-v2-code.fif b/submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-v2-code.fif new file mode 100644 index 0000000000..9d5e467de5 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/highload-wallet-v2-code.fif @@ -0,0 +1,134 @@ +// automatically generated from `smartcont/stdlib.fc` `smartcont/highload-wallet-v2-code.fc` +PROGRAM{ + DECLPROC recv_internal + DECLPROC recv_external + 117746 DECLMETHOD processed? + recv_internal PROC:<{ + // in_msg + DROP // + }> + recv_external PROC:<{ + // in_msg + 9 PUSHPOW2 // in_msg _3=512 + LDSLICEX // signature in_msg + DUP // signature in_msg cs + 32 LDU // signature in_msg _8 cs + 64 LDU // signature in_msg subwallet_id query_id cs + NOW // signature in_msg subwallet_id query_id cs _15 + 32 LSHIFT# // signature in_msg subwallet_id query_id cs bound + s2 s0 PUSH2 // signature in_msg subwallet_id query_id cs bound query_id bound + LESS // signature in_msg subwallet_id query_id cs bound _19 + 35 THROWIF + c4 PUSH // signature in_msg subwallet_id query_id cs bound _22 + CTOS // signature in_msg subwallet_id query_id cs bound ds + 32 LDU // signature in_msg subwallet_id query_id cs bound _28 ds + 64 LDU // signature in_msg subwallet_id query_id cs bound _28 _31 ds + 256 LDU // signature in_msg subwallet_id query_id cs bound _28 _31 _34 ds + LDDICT // signature in_msg subwallet_id query_id cs bound stored_subwallet last_cleaned public_key old_queries ds + ENDS + s6 s0 PUSH2 + 64 PUSHINT // signature in_msg subwallet_id query_id cs bound stored_subwallet last_cleaned public_key old_queries query_id old_queries _42=64 + DICTUGET + NULLSWAPIFNOT // signature in_msg subwallet_id query_id cs bound stored_subwallet last_cleaned public_key old_queries _115 _116 + NIP // signature in_msg subwallet_id query_id cs bound stored_subwallet last_cleaned public_key old_queries found? + 32 THROWIF + s7 s3 XCPU // signature in_msg old_queries query_id cs bound stored_subwallet last_cleaned public_key subwallet_id stored_subwallet + EQUAL // signature in_msg old_queries query_id cs bound stored_subwallet last_cleaned public_key _47 + 34 THROWIFNOT + s0 s7 XCHG // signature public_key old_queries query_id cs bound stored_subwallet last_cleaned in_msg + HASHSU // signature public_key old_queries query_id cs bound stored_subwallet last_cleaned _50 + s0 s8 s7 XC2PU // last_cleaned public_key old_queries query_id cs bound stored_subwallet _50 signature public_key + CHKSIGNU // last_cleaned public_key old_queries query_id cs bound stored_subwallet _51 + 35 THROWIFNOT + s0 s2 XCHG // last_cleaned public_key old_queries query_id stored_subwallet bound cs + LDDICT // last_cleaned public_key old_queries query_id stored_subwallet bound dict cs + ENDS + ACCEPT + -1 PUSHINT // last_cleaned public_key old_queries query_id stored_subwallet bound dict i=-1 + UNTIL:<{ + OVER + 16 PUSHINT // last_cleaned public_key old_queries query_id stored_subwallet bound dict i dict _62=16 + DICTIGETNEXT + NULLSWAPIFNOT + NULLSWAPIFNOT // last_cleaned public_key old_queries query_id stored_subwallet bound dict cs i f + DUP // last_cleaned public_key old_queries query_id stored_subwallet bound dict cs i f f + IF:<{ // last_cleaned public_key old_queries query_id stored_subwallet bound dict cs i f + s0 s2 XCHG // last_cleaned public_key old_queries query_id stored_subwallet bound dict f i cs + 8 LDU // last_cleaned public_key old_queries query_id stored_subwallet bound dict f i mode cs + LDREF // last_cleaned public_key old_queries query_id stored_subwallet bound dict f i mode _125 _124 + DROP // last_cleaned public_key old_queries query_id stored_subwallet bound dict f i mode _68 + SWAP // last_cleaned public_key old_queries query_id stored_subwallet bound dict f i _68 mode + SENDRAWMSG + }>ELSE<{ + s2 POP // last_cleaned public_key old_queries query_id stored_subwallet bound dict f i + }> + SWAP // last_cleaned public_key old_queries query_id stored_subwallet bound dict i f + NOT // last_cleaned public_key old_queries query_id stored_subwallet bound dict i _71 + }> // last_cleaned public_key old_queries query_id stored_subwallet bound dict i + 2DROP // last_cleaned public_key old_queries query_id stored_subwallet bound + 38 PUSHPOW2 // last_cleaned public_key old_queries query_id stored_subwallet bound _74 + SUB // last_cleaned public_key old_queries query_id stored_subwallet bound + NEWC // last_cleaned public_key old_queries query_id stored_subwallet bound _77 + s0 s3 s4 XCHG3 + 64 PUSHINT // last_cleaned public_key stored_subwallet bound _77 query_id old_queries _78=64 + DICTUSETB // last_cleaned public_key stored_subwallet bound old_queries + UNTIL:<{ + DUP + 64 PUSHINT // last_cleaned public_key stored_subwallet bound old_queries old_queries _85=64 + DICTUREMMIN + NULLSWAPIFNOT + NULLSWAPIFNOT // last_cleaned public_key stored_subwallet bound old_queries _126 _128 _127 _129 + s2 POP // last_cleaned public_key stored_subwallet bound old_queries old_queries' f i + s1 s0 XCPU // last_cleaned public_key stored_subwallet bound old_queries old_queries' i f f + IF:<{ // last_cleaned public_key stored_subwallet bound old_queries old_queries' i f + DROP // last_cleaned public_key stored_subwallet bound old_queries old_queries' i + s0 s3 PUSH2 // last_cleaned public_key stored_subwallet bound old_queries old_queries' i i bound + LESS // last_cleaned public_key stored_subwallet bound old_queries old_queries' i f + }> // last_cleaned public_key stored_subwallet bound old_queries old_queries' i f + DUP // last_cleaned public_key stored_subwallet bound old_queries old_queries' i f f + IF:<{ // last_cleaned public_key stored_subwallet bound old_queries old_queries' i f + s3 POP + s6 POP // last_cleaned public_key stored_subwallet bound f old_queries + }>ELSE<{ + s3 s1 s3 XCHG3 + 2DROP // last_cleaned public_key stored_subwallet bound f old_queries + }> + SWAP // last_cleaned public_key stored_subwallet bound old_queries f + NOT // last_cleaned public_key stored_subwallet bound old_queries _90 + }> // last_cleaned public_key stored_subwallet bound old_queries + NIP // last_cleaned public_key stored_subwallet old_queries + NEWC // last_cleaned public_key stored_subwallet old_queries _91 + s1 s2 XCHG // last_cleaned public_key old_queries stored_subwallet _91 + 32 STU // last_cleaned public_key old_queries _93 + s1 s3 XCHG // old_queries public_key last_cleaned _93 + 64 STU // old_queries public_key _95 + 256 STU // old_queries _97 + STDICT // _98 + ENDC // _99 + c4 POP + }> + processed? PROC:<{ + // query_id + c4 PUSH // query_id _2 + CTOS // query_id ds + 32 LDU // query_id _29 _28 + NIP // query_id ds + 64 LDU // query_id _11 ds + 256 LDU // query_id _11 _33 _32 + NIP // query_id _11 ds + LDDICT // query_id last_cleaned old_queries ds + ENDS + s2 s(-1) PUXC + 64 PUSHINT // query_id last_cleaned query_id old_queries _22=64 + DICTUGET + NULLSWAPIFNOT // query_id last_cleaned _36 _37 + NIP // query_id last_cleaned found + IF:<{ // query_id last_cleaned + 2DROP // + TRUE // _24 + }>ELSE<{ // query_id last_cleaned + LEQ // _26 + NEGATE // _24 + }> + }> +}END>c diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/multisig-code.cpp b/submodules/ton/tonlib-src/crypto/smartcont/auto/multisig-code.cpp new file mode 100644 index 0000000000..39ac8a7f6f --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/multisig-code.cpp @@ -0,0 +1 @@ +with_tvm_code("multisig", "te6ccgECMAEAA2oAART/APSkE/Sg8sgLAQIBIAIDAgFICAkEwPIgxwCOgzDbPOCDCNcYIPkBAdMH2zwiwAAToVNhePQOb6Hyn9cL/0iQ+RDyoAP0BCD5AQHTP/gjqh9TILnyYVMngED0Dm+hECNUSADbPAquXLDyYrEBpPgAVDiTVHo5KxcvFgQEnts8VHCrU5rbPO1U+A9wJm5TqL6xmBA6EHlQdl8GiuIEgyWhjichgED0lm+hb6EyURCUMFMCud4glDQ2N3+XEEkQR0QUW+ICsxBXECXmMAMaHwUGAiowKkZTBts8UHegECQQN0EGU1bbPH8kGgEKipJfBeIHAQwQJNs87VQfAgLNCgsCASAbHAIBIAwNAgEgEhMCASAODwIBIBARAAMMIAEBIC8BASAfAQEgJAIBIBQVAgEgGBkBASAWAQEgFwA4jhXSAAHyo9MHWNcBIPkBBPkBFLrypFjgW3BSAgIc2zwC8mX4AFpxAts87VQvHwEBIBoATwhbpEx4CBukTDgAdAg10rDAJrUAvAHyFjPFszJ4HHXI8gBzxb0AMmAAaFIwvo4aXwOTIddKmAHTB9QC+wAB6DFwyMoAAoBA9EOOEnHIywATywdYzwFYzxYCgED0Q+ICASAdHgIBICUmARO77ZbVAjcFnbPIHwIBSCAhABjIywfLB8s/9AD0AMkCASAiIwF5sR10IMI1xgg+QEB0weCAdTE7UPYUyB49A5vofKf1wv/XjH5EPKgrgH0BCFulhAjXwNxAeD5AVjbPAGkAYCQAPa7agOgA6AD6AgF6AhH8gID8gN15T/gD5HoAAOeLZMAAFa4ZV0EA1WZ2oexAAGBwjikD0IMI1xjTB/QEMFMWePQOb6HypdcL/1RFRPkQ8qauUiCxUgO9FKEjbuYyMjICASAnKAIBSCkqAVW3JVtnhiZQCAqIhn6BzfQxwmYmQDpAADMaYOYuAFrgJhwLb+4cBgY3dG4QLwGNtVmbZ4Br4G/tscbqIlAIHo+N9C30JBHEgFpAADHDRA8a5CTa4GT2E5kAOeLAMAgKiCq+iHJCZhxSQmYcUktGHEA2fMCL4JAvAgEgKywCA5k4LS4BDawabZ4vgcAvABWt+UEAzJV2oewYQAENqTbPBRfBIC8AFa3cLOCAarM7UPYgABztRNDTB9MH0z/0BPQE0Q=="); diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/multisig-code.fif b/submodules/ton/tonlib-src/crypto/smartcont/auto/multisig-code.fif new file mode 100644 index 0000000000..ce1c21bf08 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/multisig-code.fif @@ -0,0 +1,502 @@ +// automatically generated from `smartcont/stdlib.fc` `smartcont/multisig-code.fc` +PROGRAM{ + DECLPROC unpack_state + DECLPROC pack_state + DECLPROC check_signatures + DECLPROC recv_internal + DECLPROC unpack_query_data + DECLPROC try_init + DECLPROC update_pending_queries + DECLPROC recv_external + 104746 DECLMETHOD get_query_state + 117746 DECLMETHOD processed? + 81625 DECLMETHOD create_init_state + DECLPROC merge_list + 120004 DECLMETHOD get_public_keys + 87157 DECLMETHOD check_query_signatures + 109260 DECLMETHOD messages_by_mask + 85042 DECLMETHOD get_messages_unsigned_by_id + 120055 DECLMETHOD get_messages_unsigned + 114740 DECLMETHOD get_n_k + 83381 DECLMETHOD merge_inner_queries + unpack_state PROCREF:<{ + // + c4 PUSH // _1 + CTOS // ds + 8 LDU // _4 ds + 8 LDU // _4 _7 ds + 64 LDU // _4 _7 _10 ds + LDDICT // _4 _7 _10 _13 ds + LDDICT // res res res res res ds + ENDS + }> + pack_state PROCREF:<{ + // pending_queries public_keys last_cleaned k n + NEWC // pending_queries public_keys last_cleaned k n _5 + 8 STU // pending_queries public_keys last_cleaned k _7 + 8 STU // pending_queries public_keys last_cleaned _9 + 64 STU // pending_queries public_keys _11 + STDICT // pending_queries _12 + STDICT // _13 + ENDC // _14 + }> + check_signatures PROCREF:<{ + // public_keys signatures hash cnt_bits + 0 PUSHINT // public_keys signatures hash cnt_bits cnt=0 + UNTIL:<{ + s0 s3 XCHG // public_keys cnt hash cnt_bits signatures + CTOS // public_keys cnt hash cnt_bits cs + 9 PUSHPOW2 // public_keys cnt hash cnt_bits cs _10=512 + LDSLICEX // public_keys cnt hash cnt_bits signature cs + 8 LDU // public_keys cnt hash cnt_bits signature i cs + LDDICT // public_keys cnt hash cnt_bits signature i _43 _42 + DROP // public_keys cnt hash cnt_bits signature i signatures + s1 s6 PUSH2 + 8 PUSHINT // public_keys cnt hash cnt_bits signature i signatures i public_keys _20=8 + DICTUGET + NULLSWAPIFNOT // public_keys cnt hash cnt_bits signature i signatures public_key found? + 37 THROWIFNOT + 256 PLDU // public_keys cnt hash cnt_bits signature i signatures _26 + s5 s3 s3 PUXC2 // public_keys cnt hash cnt_bits signatures i hash signature _26 + CHKSIGNU // public_keys cnt hash cnt_bits signatures i _27 + 38 THROWIFNOT + POW2 // public_keys cnt hash cnt_bits signatures mask + s2 s(-1) PUXC // public_keys cnt hash old_cnt_bits signatures cnt_bits mask + OR // public_keys cnt hash old_cnt_bits signatures cnt_bits + s0 s2 PUXC // public_keys cnt hash cnt_bits signatures cnt_bits old_cnt_bits + NEQ // public_keys cnt hash cnt_bits signatures should_check + s1 s4 XCHG // public_keys signatures hash cnt_bits cnt should_check + SUB // public_keys signatures hash cnt_bits cnt + s3 PUSH // public_keys signatures hash cnt_bits cnt signatures + ISNULL // public_keys signatures hash cnt_bits cnt _37 + }> // public_keys signatures hash cnt_bits cnt + s2 POP + s2 POP + s2 POP // cnt cnt_bits + }> + recv_internal PROC:<{ + // in_msg + DROP // + }> + unpack_query_data PROCREF:<{ + // in_msg n query found? + IFJMP:<{ // in_msg n query + 1 LDI // in_msg n _5 query + SWAP // in_msg n query _5 + 35 THROWIFNOT + 8 LDU // in_msg n _12 query + ROT // in_msg _12 query n + LDUX // in_msg cnt cnt_bits msg + DUP // in_msg cnt cnt_bits msg msg + HASHSU // in_msg cnt cnt_bits msg _18 + s0 s4 XCHG // _18 cnt cnt_bits msg in_msg + HASHSU // _18 cnt cnt_bits msg _19 + s1 s4 XCHG // msg cnt cnt_bits _18 _19 + EQUAL // msg cnt cnt_bits _20 + 36 THROWIFNOT + ROT // cnt cnt_bits msg + }> // in_msg n query + 2DROP // in_msg + 0 PUSHINT // in_msg _22=0 + s0 s1 PUXC // _22=0 _23=0 in_msg + }> + try_init PROCREF:<{ + // + unpack_state INLINECALLDICT // n k last_cleaned public_keys pending_queries + s0 s2 XCHG // n k pending_queries public_keys last_cleaned + 37 THROWIF + ACCEPT + 2SWAP + 1 PUSHINT + s0 s2 XCHG // pending_queries public_keys _9=1 k n + pack_state INLINECALLDICT // _10 + c4 POP + }> + update_pending_queries PROCREF:<{ + // pending_queries msg query_id cnt cnt_bits n k + s3 s(-1) PUXC // pending_queries msg query_id cnt cnt_bits n cnt k + GEQ // pending_queries msg query_id cnt cnt_bits n _7 + IF:<{ // pending_queries msg query_id cnt cnt_bits n + 3 BLKDROP // pending_queries msg query_id + WHILE:<{ + OVER // pending_queries msg query_id msg + SREFS // pending_queries msg query_id _8 + }>DO<{ // pending_queries msg query_id + SWAP // pending_queries query_id msg + 8 LDU // pending_queries query_id mode msg + LDREF // pending_queries query_id mode _13 msg + s0 s2 XCHG // pending_queries query_id msg _13 mode + SENDRAWMSG + SWAP // pending_queries msg query_id + }> // pending_queries msg query_id + NIP // pending_queries query_id + 0 PUSHINT // pending_queries query_id _17=0 + NEWC // pending_queries query_id _17=0 _18 + 1 STI // pending_queries query_id _20 + s0 s2 XCHG + 64 PUSHINT // _20 query_id pending_queries _21=64 + DICTUSETB // pending_queries + }>ELSE<{ // pending_queries msg query_id cnt cnt_bits n + 1 PUSHINT // pending_queries msg query_id cnt cnt_bits n _24=1 + NEWC // pending_queries msg query_id cnt cnt_bits n _24=1 _25 + 1 STU // pending_queries msg query_id cnt cnt_bits n _27 + s1 s3 XCHG // pending_queries msg query_id n cnt_bits cnt _27 + 8 STU // pending_queries msg query_id n cnt_bits _29 + ROT // pending_queries msg query_id cnt_bits _29 n + STUX // pending_queries msg query_id _30 + ROT // pending_queries query_id _30 msg + STSLICER // pending_queries query_id _31 + s0 s2 XCHG + 64 PUSHINT // _31 query_id pending_queries _32=64 + DICTUSETB // pending_queries + }> + }> + recv_external PROC:<{ + // in_msg + DUP // in_msg in_msg + SEMPTY // in_msg _1 + IFJMP:<{ // in_msg + DROP // + try_init INLINECALLDICT + }> // in_msg + 9 PUSHPOW2 // in_msg _5=512 + LDSLICEX // root_signature in_msg + DUP // root_signature in_msg in_msg + HASHSU // root_signature in_msg root_hash + SWAP // root_signature root_hash in_msg + 8 LDU // root_signature root_hash root_i in_msg + unpack_state INLINECALLDICT // root_signature root_hash root_i in_msg n k last_cleaned public_keys pending_queries + s2 PUSH // root_signature root_hash root_i in_msg n k last_cleaned public_keys pending_queries last_cleaned + 0 EQINT // root_signature root_hash root_i in_msg n k last_cleaned public_keys pending_queries _20 + s1 s3 XCHG // root_signature root_hash root_i in_msg n k pending_queries public_keys last_cleaned _20 + SUB // root_signature root_hash root_i in_msg n k pending_queries public_keys last_cleaned + s6 s1 PUSH2 + 8 PUSHINT // root_signature root_hash root_i in_msg n k pending_queries public_keys last_cleaned root_i public_keys _24=8 + DICTUGET + NULLSWAPIFNOT // root_signature root_hash root_i in_msg n k pending_queries public_keys last_cleaned public_key found? + 31 THROWIFNOT + 256 PLDU // root_signature root_hash root_i in_msg n k pending_queries public_keys last_cleaned _30 + s8 s9 s0 XCHG3 // last_cleaned public_keys root_i in_msg n k pending_queries root_hash root_signature _30 + CHKSIGNU // last_cleaned public_keys root_i in_msg n k pending_queries _31 + 32 THROWIFNOT + s0 s3 XCHG // last_cleaned public_keys root_i pending_queries n k in_msg + LDDICT // last_cleaned public_keys root_i pending_queries n k signatures in_msg + DUP // last_cleaned public_keys root_i pending_queries n k signatures in_msg in_msg + HASHSU // last_cleaned public_keys root_i pending_queries n k signatures in_msg hash + SWAP // last_cleaned public_keys root_i pending_queries n k signatures hash in_msg + 64 LDU // last_cleaned public_keys root_i pending_queries n k signatures hash query_id in_msg + NOW // last_cleaned public_keys root_i pending_queries n k signatures hash query_id in_msg _43 + 32 LSHIFT# // last_cleaned public_keys root_i pending_queries n k signatures hash query_id in_msg bound + s2 s0 PUSH2 // last_cleaned public_keys root_i pending_queries n k signatures hash query_id in_msg bound query_id bound + LESS // last_cleaned public_keys root_i pending_queries n k signatures hash query_id in_msg bound _47 + 33 THROWIF + s2 s7 PUSH2 + 64 PUSHINT // last_cleaned public_keys root_i pending_queries n k signatures hash query_id in_msg bound query_id pending_queries _51=64 + DICTUGET + NULLSWAPIFNOT // last_cleaned public_keys root_i pending_queries n k signatures hash query_id in_msg bound query found? + s2 s3 XCHG + s8 s(-1) s(-1) PUXC2 // last_cleaned public_keys root_i pending_queries n k signatures hash query_id bound in_msg n query found? + unpack_query_data INLINECALLDICT // last_cleaned public_keys root_i pending_queries n k signatures hash query_id bound cnt cnt_bits msg + s0 s10 XCHG // last_cleaned public_keys msg pending_queries n k signatures hash query_id bound cnt cnt_bits root_i + POW2 // last_cleaned public_keys msg pending_queries n k signatures hash query_id bound cnt cnt_bits mask + 2DUP // last_cleaned public_keys msg pending_queries n k signatures hash query_id bound cnt cnt_bits mask cnt_bits mask + AND // last_cleaned public_keys msg pending_queries n k signatures hash query_id bound cnt cnt_bits mask _61 + 34 THROWIF + OR // last_cleaned public_keys msg pending_queries n k signatures hash query_id bound cnt cnt_bits + SWAP // last_cleaned public_keys msg pending_queries n k signatures hash query_id bound cnt_bits cnt + INC // last_cleaned public_keys msg pending_queries n k signatures hash query_id bound cnt_bits cnt + ACCEPT + s8 s9 s3 XCPU2 + s10 s3 s9 PUSH3 + s11 PUSH // last_cleaned public_keys msg cnt n k signatures hash query_id bound cnt_bits pending_queries msg query_id cnt cnt_bits n k + update_pending_queries INLINECALLDICT // last_cleaned public_keys msg cnt n k signatures hash query_id bound cnt_bits pending_queries + s0 s10 s11 PUSH3 + s9 s10 PUSH2 // last_cleaned public_keys msg cnt n k signatures hash query_id bound cnt_bits pending_queries pending_queries public_keys last_cleaned k n + pack_state INLINECALLDICT // last_cleaned public_keys msg cnt n k signatures hash query_id bound cnt_bits pending_queries _68 + c4 POP + COMMIT + 0 PUSHINT // last_cleaned public_keys msg cnt n k signatures hash query_id bound cnt_bits pending_queries need_save=0 + s6 PUSH // last_cleaned public_keys msg cnt n k signatures hash query_id bound cnt_bits pending_queries need_save=0 signatures + ISNULL // last_cleaned public_keys msg cnt n k signatures hash query_id bound cnt_bits pending_queries need_save=0 _73 + s10 s8 PUSH2 // last_cleaned public_keys msg cnt n k signatures hash query_id bound cnt_bits pending_queries need_save=0 _73 cnt k + GEQ // last_cleaned public_keys msg cnt n k signatures hash query_id bound cnt_bits pending_queries need_save=0 _73 _74 + OR // last_cleaned public_keys msg cnt n k signatures hash query_id bound cnt_bits pending_queries need_save=0 _75 + IFNOT:<{ // last_cleaned public_keys msg cnt n k signatures hash query_id bound cnt_bits pending_queries need_save=0 + DROP // last_cleaned public_keys msg cnt n k signatures hash query_id bound cnt_bits pending_queries + s10 PUSH + s6 s5 s3 XCHG3 + s0 s6 XCHG // last_cleaned public_keys msg cnt n k bound pending_queries query_id public_keys signatures hash cnt_bits + check_signatures INLINECALLDICT // last_cleaned public_keys msg cnt n k bound pending_queries query_id new_cnt cnt_bits + s7 s7 XCHG2 // last_cleaned public_keys msg cnt_bits n k bound pending_queries query_id cnt new_cnt + ADD // last_cleaned public_keys msg cnt_bits n k bound pending_queries query_id cnt + s2 s4 XCHG + s3 s7 XCHG + s1 s0 s6 XCHG3 + s5 s6 PUSH2 // last_cleaned public_keys bound k n pending_queries msg query_id cnt cnt_bits n k + update_pending_queries INLINECALLDICT // last_cleaned public_keys bound k n pending_queries + -1 PUSHINT // last_cleaned public_keys bound k n pending_queries need_save=-1 + }>ELSE<{ + s3 s10 XCHG + s7 s9 XCHG + s7 s6 XCHG2 + 6 BLKDROP // last_cleaned public_keys bound k n pending_queries need_save + }> + s0 s4 XCHG + 38 PUSHPOW2 // last_cleaned public_keys need_save k n pending_queries bound _83 + SUB // last_cleaned public_keys need_save k n pending_queries bound + UNTIL:<{ + OVER + 64 PUSHINT // last_cleaned public_keys need_save k n pending_queries bound pending_queries _90=64 + DICTUREMMIN + NULLSWAPIFNOT + NULLSWAPIFNOT // last_cleaned public_keys need_save k n pending_queries bound _121 _123 _122 _124 + s2 POP // last_cleaned public_keys need_save k n pending_queries bound pending_queries' f i + s1 s0 XCPU // last_cleaned public_keys need_save k n pending_queries bound pending_queries' i f f + IF:<{ // last_cleaned public_keys need_save k n pending_queries bound pending_queries' i f + DROP // last_cleaned public_keys need_save k n pending_queries bound pending_queries' i + s0 s2 PUSH2 // last_cleaned public_keys need_save k n pending_queries bound pending_queries' i i bound + LESS // last_cleaned public_keys need_save k n pending_queries bound pending_queries' i f + }> // last_cleaned public_keys need_save k n pending_queries bound pending_queries' i f + DUP // last_cleaned public_keys need_save k n pending_queries bound pending_queries' i f f + IF:<{ // last_cleaned public_keys need_save k n pending_queries bound pending_queries' i f + s4 POP + s6 POP + s7 POP // pending_queries public_keys last_cleaned k n f bound + -1 PUSHINT // pending_queries public_keys last_cleaned k n f bound need_save=-1 + }>ELSE<{ + s4 s9 XCHG + s4 s7 XCHG + s4 s1 s4 XCHG3 + 2DROP // pending_queries public_keys last_cleaned k n f bound need_save + }> + s0 s2 XCHG // pending_queries public_keys last_cleaned k n need_save bound f + NOT // pending_queries public_keys last_cleaned k n need_save bound _96 + s5 s7 XCHG + s2 s5 XCHG // last_cleaned public_keys need_save k n pending_queries bound _96 + }> // last_cleaned public_keys need_save k n pending_queries bound + DROP // last_cleaned public_keys need_save k n pending_queries + s0 s3 XCHG // last_cleaned public_keys pending_queries k n need_save + IF:<{ // last_cleaned public_keys pending_queries k n + s2 s4 XCHG // pending_queries public_keys last_cleaned k n + pack_state INLINECALLDICT // _97 + c4 POP + }>ELSE<{ + 5 BLKDROP // + }> + }> + get_query_state PROC:<{ + // query_id + unpack_state INLINECALLDICT // query_id _25 _26 _27 _28 _29 + NIP + s2 POP // query_id n pending_queries last_cleaned + 64 PUSHINT // query_id n pending_queries last_cleaned _9=64 + s4 s2 s2 PUXC2 // query_id n last_cleaned query_id pending_queries _9=64 + DICTUGET + NULLSWAPIFNOT // query_id n last_cleaned cs found + IFJMP:<{ // query_id n last_cleaned cs + NIP + s2 POP // cs n + SWAP // n cs + 1 LDI // n _11 cs + SWAP // n cs _11 + IFJMP:<{ // n cs + 8 LDU // n _35 _34 + NIP // n cs + 0 PUSHINT // n cs _17=0 + s0 s2 XCHG // _17=0 cs n + LDUX // _17=0 _37 _36 + DROP // _17=0 _18 + }> // n cs + 2DROP // + -1 PUSHINT // _20=-1 + 0 PUSHINT // _20=-1 _21=0 + }> // query_id n last_cleaned cs + DROP + NIP // query_id last_cleaned + LEQ // _22 + NEGATE // _23 + 0 PUSHINT // _23 _24=0 + }> + processed? PROC:<{ + // query_id + get_query_state CALLDICT // _4 _5 + DROP // x + }> + create_init_state PROC:<{ + // n k public_keys + NEWDICT // n k public_keys _3 + s2 s3 XCHG2 + 0 PUSHINT + -ROT // _3 public_keys _4=0 k n + pack_state INLINECALLDICT // _5 + }> + merge_list PROC:<{ + // a b + OVER // a b a + ISNULL // a b _2 + IFJMP:<{ // a b + NIP // b + }> // a b + DUP // a b b + ISNULL // a b _3 + IFJMP:<{ // a b + DROP // a + }> // a b + SWAP // b a + CTOS // b as + DUP // b as as + SREFS // b as _6 + 0 NEQINT // b as _8 + IFJMP:<{ // b as + LDREF // b _10 as + s0 s2 XCHG // as _10 b + merge_list CALLDICT // as tail + NEWC // as tail _13 + ROT // tail _13 as + STSLICER // tail _14 + STREF // _15 + ENDC // _16 + }> // b as + 1 PUSHINT // b as _18=1 + SDSKIPLAST // b as + NEWC // b as _20 + SWAP // b _20 as + STSLICER // b _21 + STDICT // _22 + ENDC // _23 + }> + get_public_keys PROC:<{ + // + unpack_state INLINECALLDICT // _6 _7 _8 _9 _10 + s1 s4 XCHG + 4 BLKDROP // public_keys + }> + check_query_signatures PROC:<{ + // query + CTOS // cs + 9 PUSHPOW2 // cs _5=512 + LDSLICEX // root_signature cs + DUP // root_signature cs cs + HASHSU // root_signature cs root_hash + SWAP // root_signature root_hash cs + 8 LDU // root_signature root_hash root_i cs + get_public_keys CALLDICT // root_signature root_hash root_i cs public_keys + s2 s0 PUSH2 + 8 PUSHINT // root_signature root_hash root_i cs public_keys root_i public_keys _17=8 + DICTUGET + NULLSWAPIFNOT // root_signature root_hash root_i cs public_keys public_key found? + 31 THROWIFNOT + 256 PLDU // root_signature root_hash root_i cs public_keys _23 + 5 1 REVERSE // public_keys cs root_i root_hash root_signature _23 + CHKSIGNU // public_keys cs root_i _24 + 32 THROWIFNOT + POW2 // public_keys cs mask + SWAP // public_keys mask cs + LDDICT // public_keys mask signatures cs + OVER // public_keys mask signatures cs signatures + ISNULL // public_keys mask signatures cs _32 + IFJMP:<{ // public_keys mask signatures cs + s2 s3 XCHG + 3 BLKDROP // mask + 1 PUSHINT // mask _33=1 + SWAP // _33=1 mask + }> // public_keys mask signatures cs + HASHSU // public_keys mask signatures _35 + ROT // public_keys signatures _35 mask + check_signatures INLINECALLDICT // cnt mask + SWAP // mask cnt + INC // mask _38 + SWAP // _38 mask + }> + messages_by_mask PROC:<{ + // mask + unpack_state INLINECALLDICT // mask _29 _30 _31 _32 _33 + s0 s3 XCHG + 3 BLKDROP // mask n pending_queries + -1 PUSHINT // mask n pending_queries i=-1 + NEWDICT // mask n pending_queries i=-1 a + UNTIL:<{ + s1 s2 XCPU + 64 PUSHINT // mask n pending_queries a i pending_queries _13=64 + DICTUGETNEXT + NULLSWAPIFNOT + NULLSWAPIFNOT // mask n pending_queries a cs i f + DUP // mask n pending_queries a cs i f f + IF:<{ // mask n pending_queries a cs i f + s0 s2 XCHG // mask n pending_queries a f i cs + 1 LDI // mask n pending_queries a f i _15 cs + SWAP // mask n pending_queries a f i cs _15 + IF:<{ // mask n pending_queries a f i cs + DUP + 8 PUSHINT // mask n pending_queries a f i cs cs _19=8 + SDSKIPFIRST // mask n pending_queries a f i cs _20 + s6 PUSH // mask n pending_queries a f i cs _20 n + PLDUX // mask n pending_queries a f i cs cnt_bits + s7 PUSH // mask n pending_queries a f i cs cnt_bits mask + AND // mask n pending_queries a f i cs _22 + IF:<{ // mask n pending_queries a f i cs + NEWC // mask n pending_queries a f i cs _24 + SWAP // mask n pending_queries a f i _24 cs + STSLICER // mask n pending_queries a f i _25 + SWAP + 64 PUSHINT + s1 s4 s4 PUXC2 // mask n pending_queries i f _25 i a _26=64 + DICTUSETB // mask n pending_queries i f a + }>ELSE<{ + s1 s3 XCHG + DROP // mask n pending_queries i f a + }> + }>ELSE<{ + s1 s3 XCHG + DROP // mask n pending_queries i f a + }> + }>ELSE<{ + 2SWAP + DROP // mask n pending_queries i f a + }> + SWAP // mask n pending_queries i a f + NOT // mask n pending_queries i a _28 + }> // mask n pending_queries i a + s0 s4 XCHG + 4 BLKDROP // a + }> + get_messages_unsigned_by_id PROC:<{ + // id + POW2 // _2 + messages_by_mask CALLDICT // _3 + }> + get_messages_unsigned PROC:<{ + // + 0 PUSHINT // _0=0 + NOT // _1 + messages_by_mask CALLDICT // _2 + }> + get_n_k PROC:<{ + // + unpack_state INLINECALLDICT // _6 _7 _8 _9 _10 + 3 BLKDROP // n k + }> + merge_inner_queries PROC:<{ + // a b + SWAP // b a + CTOS // b ca + SWAP // ca b + CTOS // ca cb + SWAP // cb ca + LDDICT // cb list_a ca + s0 s2 XCHG // ca list_a cb + LDDICT // ca list_a list_b cb + s3 PUSH // ca list_a list_b cb ca + HASHSU // ca list_a list_b cb _13 + SWAP // ca list_a list_b _13 cb + HASHSU // ca list_a list_b _13 _14 + EQUAL // ca list_a list_b _15 + 31 THROWIFNOT + merge_list CALLDICT // ca _17 + NEWC // ca _17 _18 + STDICT // ca _19 + SWAP // _19 ca + STSLICER // _20 + ENDC // _21 + }> +}END>c diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet-code.cpp b/submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet-code.cpp new file mode 100644 index 0000000000..1391da27b8 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet-code.cpp @@ -0,0 +1 @@ +with_tvm_code("restricted-wallet", "te6ccgECDQEAAQgAART/APSkE/Sg8sgLAQIBIAIDAgFIBAUB+vKDCNcYINMf0x/4IxK78mPtRNDTH9P/0VMxuvKhA54xMjL4AKTIyx/L/8ntVOED+QFUEEL5EPKi+ACA8/gzIG6SMH+X0NcLH/gjvOJx+DPQ1wv/BJMg10qOldMH1H8kjoUwUxbbPN6TAvsAkjIw4ugxMwLRpMjLH8v/ye1UDAICzgYHAgEgCgsCASAICQEBSAwAAwwgACUgPP4MyBukjB/l9DXCx/4I7zigABG+ZL9qJoa4WPwAOby2BAefwZkDdJGD/L6GuFj/wR3nFIuEp8EzeIcUADIB0NMDAXiwklt/4PpAMfpAMPpEAcD/Arqw"); diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet-code.fif b/submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet-code.fif new file mode 100644 index 0000000000..6582706c2b --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet-code.fif @@ -0,0 +1,144 @@ +// automatically generated from `smartcont/stdlib.fc` `smartcont/restricted-wallet-code.fc` +PROGRAM{ + DECLPROC recv_internal + DECLPROC restricted? + DECLPROC check_destination + DECLPROC recv_external + 85143 DECLMETHOD seqno + 104128 DECLMETHOD balance + recv_internal PROC:<{ + // in_msg + DROP // + }> + restricted? PROC:<{ + // + -13 PUSHINT // _1=-13 + CONFIGOPTPARAM // p + DUP // p p + ISNULL // p _3 + IF:<{ // p + DROP // + TRUE // _4 + }>ELSE<{ // p + CTOS // _6 + 32 PLDU // _8 + NOW // _8 _9 + GREATER // _4 + }> + }> + check_destination PROCREF:<{ + // msg dest + SWAP // dest msg + CTOS // dest cs + 4 LDU // dest flags cs + SWAP + 8 PUSHINT // dest cs flags _8=8 + AND // dest cs _9 + IFJMP:<{ // dest cs + 2DROP // + TRUE // _10 + }> // dest cs + LDMSGADDR // dest _27 _26 + NIP // dest cs + LDMSGADDR // dest _29 _28 + DROP // dest d_addr + REWRITESTDADDR // dest dest_wc dest_addr + SWAP // dest dest_addr dest_wc + -1 EQINT // dest dest_addr _21 + s0 s2 XCHG // _21 dest_addr dest + EQUAL // _21 _22 + AND // _23 + }> + recv_external PROC:<{ + // in_msg + 9 PUSHPOW2 // in_msg _3=512 + LDSLICEX // signature in_msg + DUP // signature in_msg cs + 32 LDU // signature in_msg _8 cs + 32 LDU // signature in_msg msg_seqno valid_until cs + NOW // signature in_msg msg_seqno valid_until cs _15 + s1 s2 XCHG // signature in_msg msg_seqno cs valid_until _15 + LEQ // signature in_msg msg_seqno cs _16 + 35 THROWIF + c4 PUSH // signature in_msg msg_seqno cs _19 + CTOS // signature in_msg msg_seqno cs ds + 32 LDU // signature in_msg msg_seqno cs _23 ds + 256 LDU // signature in_msg msg_seqno cs stored_seqno public_key ds + ENDS + s3 s1 PUSH2 // signature in_msg msg_seqno cs stored_seqno public_key msg_seqno stored_seqno + EQUAL // signature in_msg msg_seqno cs stored_seqno public_key _31 + 33 THROWIFNOT + s0 s3 XCHG // signature in_msg public_key cs stored_seqno msg_seqno + IFNOTJMP:<{ // signature in_msg public_key cs stored_seqno + NIP + s2 POP + s2 POP // public_key stored_seqno + ACCEPT + INC // public_key _35 + NEWC // public_key _35 _36 + 32 STU // public_key _38 + 256 STU // _40 + ENDC // _41 + c4 POP + }> // signature in_msg public_key cs stored_seqno + s0 s3 XCHG // signature stored_seqno public_key cs in_msg + HASHSU // signature stored_seqno public_key cs _44 + s0 s4 s2 XC2PU // cs stored_seqno public_key _44 signature public_key + CHKSIGNU // cs stored_seqno public_key _45 + 34 THROWIFNOT + ACCEPT + restricted? INLINECALLDICT // cs stored_seqno public_key restrict + 1 PUSHINT // cs stored_seqno public_key restrict _51=1 + CONFIGOPTPARAM // cs stored_seqno public_key restrict _52 + CTOS // cs stored_seqno public_key restrict _53 + 256 PLDU // cs stored_seqno public_key restrict elector + s0 s4 XCHG // elector stored_seqno public_key restrict cs + WHILE:<{ + DUP // elector stored_seqno public_key restrict cs cs + SREFS // elector stored_seqno public_key restrict cs _58 + }>DO<{ // elector stored_seqno public_key restrict cs + 8 LDU // elector stored_seqno public_key restrict mode cs + LDREF // elector stored_seqno public_key restrict mode msg cs + TRUE // elector stored_seqno public_key restrict mode msg cs ok + s4 PUSH // elector stored_seqno public_key restrict mode msg cs ok restrict + IF:<{ // elector stored_seqno public_key restrict mode msg cs ok + DROP // elector stored_seqno public_key restrict mode msg cs + s1 s6 PUSH2 // elector stored_seqno public_key restrict mode msg cs msg elector + check_destination INLINECALLDICT // elector stored_seqno public_key restrict mode msg cs ok + }> // elector stored_seqno public_key restrict mode msg cs ok + IF:<{ // elector stored_seqno public_key restrict mode msg cs + s0 s2 XCHG // elector stored_seqno public_key restrict cs msg mode + SENDRAWMSG + }>ELSE<{ + s2 POP + DROP // elector stored_seqno public_key restrict cs + }> + }> // elector stored_seqno public_key restrict cs + NIP + s3 POP // cs stored_seqno public_key + s0 s2 XCHG // public_key stored_seqno cs + ENDS + INC // public_key _72 + NEWC // public_key _72 _73 + 32 STU // public_key _75 + 256 STU // _77 + ENDC // _78 + c4 POP + }> + seqno PROC:<{ + // + c4 PUSH // _0 + CTOS // _1 + 32 PLDU // _3 + }> + balance PROC:<{ + // + restricted? INLINECALLDICT // _0 + IF:<{ // + 0 PUSHINT // _1=0 + }>ELSE<{ // + BALANCE // _3 + FIRST // _1 + }> + }> +}END>c diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet2-code.cpp b/submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet2-code.cpp new file mode 100644 index 0000000000..a95ad749d2 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet2-code.cpp @@ -0,0 +1 @@ +with_tvm_code("restricted-wallet2", "te6ccgECDAEAAR0AART/APSkE/Sg8sgLAQIBIAIDAgFIBAUBAvIKAgLPBgcCASAICQADDCAAMyA8/gzIG6SMH+e+CMB0NcLH6GCAVGAqQTigABG+ZL9qJoa4WPwAf7y2B2omhAgJBrkPoCaMB5/BmQN0kYP898EYDoa4WP0MEAqMBUgnF8EzeIAUAIej230LfQmMv9ABhQuFsEyJhxQB/oMI1xgg0x/TH/gjErvyY+1E0NMf0//0BNFTQrryoQSOEjIzM/gAAaTIyx8Sy//0AMntVOEE+QFUEFT5EPKi+ACA8/gzIG6SMH+e+CMB0NcLH6GCAVGAqQTiIoAQ9HtvoW+hMZb6ADBy+wKRMOKTINdKltMH1AL7AOjRAqTIyx8LAA7L//QAye1U"); diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet2-code.fif b/submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet2-code.fif new file mode 100644 index 0000000000..112e8c6228 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/restricted-wallet2-code.fif @@ -0,0 +1,140 @@ +// automatically generated from `smartcont/stdlib.fc` `smartcont/restricted-wallet2-code.fc` +PROGRAM{ + DECLPROC recv_internal + DECLPROC days_passed + DECLPROC recv_external + 85143 DECLMETHOD seqno + 104128 DECLMETHOD balance + recv_internal PROC:<{ + // in_msg + DROP // + }> + days_passed PROC:<{ + // + -13 PUSHINT // _1=-13 + CONFIGOPTPARAM // p + DUP // p p + ISNULL // p _3 + IF:<{ // p + DROP // + -1 PUSHINT // _4=-1 + }>ELSE<{ // p + NOW // p _6 + SWAP // _6 p + CTOS // _6 _7 + 32 PLDU // _6 _9 + SUB // _10 + 86400 PUSHINT // _10 _11=86400 + DIV // _4 + }> + }> + recv_external PROC:<{ + // in_msg + 9 PUSHPOW2 // in_msg _3=512 + LDSLICEX // signature in_msg + DUP // signature in_msg cs + 32 LDU // signature in_msg _8 cs + 32 LDU // signature in_msg msg_seqno valid_until cs + NOW // signature in_msg msg_seqno valid_until cs _15 + s1 s2 XCHG // signature in_msg msg_seqno cs valid_until _15 + LEQ // signature in_msg msg_seqno cs _16 + 35 THROWIF + c4 PUSH // signature in_msg msg_seqno cs _19 + CTOS // signature in_msg msg_seqno cs ds + 32 LDU // signature in_msg msg_seqno cs _24 ds + 256 LDU // signature in_msg msg_seqno cs _24 _27 ds + LDDICT // signature in_msg msg_seqno cs stored_seqno public_key rdict ds + ENDS + s4 s2 PUSH2 // signature in_msg msg_seqno cs stored_seqno public_key rdict msg_seqno stored_seqno + EQUAL // signature in_msg msg_seqno cs stored_seqno public_key rdict _34 + 33 THROWIFNOT + s0 s4 XCHG // signature in_msg rdict cs stored_seqno public_key msg_seqno + IFNOTJMP:<{ // signature in_msg rdict cs stored_seqno public_key + s2 POP + s3 POP + s3 POP // public_key stored_seqno rdict + ACCEPT + SWAP // public_key rdict stored_seqno + INC // public_key rdict _38 + NEWC // public_key rdict _38 _39 + 32 STU // public_key rdict _41 + s1 s2 XCHG // rdict public_key _41 + 256 STU // rdict _43 + STDICT // _44 + ENDC // _45 + c4 POP + }> // signature in_msg rdict cs stored_seqno public_key + s0 s4 XCHG // signature public_key rdict cs stored_seqno in_msg + HASHSU // signature public_key rdict cs stored_seqno _48 + s0 s5 s4 XC2PU // stored_seqno public_key rdict cs _48 signature public_key + CHKSIGNU // stored_seqno public_key rdict cs _49 + 34 THROWIFNOT + ACCEPT + days_passed INLINECALLDICT // stored_seqno public_key rdict cs ts + s2 PUSH + 16 PUSHINT // stored_seqno public_key rdict cs ts rdict _57=16 + DICTIGETPREVEQ + NULLSWAPIFNOT + NULLSWAPIFNOT // stored_seqno public_key rdict cs _98 _97 _99 + NIP // stored_seqno public_key rdict cs value found + IF:<{ // stored_seqno public_key rdict cs value + LDGRAMS // stored_seqno public_key rdict cs _101 _100 + DROP // stored_seqno public_key rdict cs _59 + 2 PUSHINT // stored_seqno public_key rdict cs _59 _61=2 + RAWRESERVE + }>ELSE<{ + DROP // stored_seqno public_key rdict cs + }> // stored_seqno public_key rdict cs + WHILE:<{ + DUP // stored_seqno public_key rdict cs cs + SREFS // stored_seqno public_key rdict cs _65 + }>DO<{ // stored_seqno public_key rdict cs + 8 LDU // stored_seqno public_key rdict mode cs + LDREF // stored_seqno public_key rdict mode msg cs + s0 s2 XCHG // stored_seqno public_key rdict cs msg mode + SENDRAWMSG + }> // stored_seqno public_key rdict cs + ENDS + s0 s2 XCHG // rdict public_key stored_seqno + INC // rdict public_key _76 + NEWC // rdict public_key _76 _77 + 32 STU // rdict public_key _79 + 256 STU // rdict _81 + STDICT // _82 + ENDC // _83 + c4 POP + }> + seqno PROC:<{ + // + c4 PUSH // _0 + CTOS // _1 + 32 PLDU // _3 + }> + balance PROC:<{ + // + c4 PUSH // _1 + CTOS // _2 + 288 PUSHINT // _2 _5 + SDSKIPFIRST // ds + LDDICT // rdict ds + ENDS + days_passed INLINECALLDICT // rdict ts + BALANCE // rdict ts _14 + FIRST // rdict ts balance + s0 s2 XCHG + 16 PUSHINT // balance ts rdict _19=16 + DICTIGETPREVEQ + NULLSWAPIFNOT + NULLSWAPIFNOT // balance _29 _28 _30 + NIP // balance value found + IF:<{ // balance value + LDGRAMS // balance _32 _31 + DROP // balance _21 + SUB // _23 + 0 PUSHINT // _23 _24=0 + MAX // balance + }>ELSE<{ + DROP // balance + }> + }> +}END>c diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-code.cpp b/submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-code.cpp new file mode 100644 index 0000000000..ea4603f0ae --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-code.cpp @@ -0,0 +1 @@ +with_tvm_code("simple-wallet", "te6ccgEBBAEATwABFP8A9KQT9KDyyAsBAgEgAgMABNIwAG7ygwjXGCDTH+1E0NMf0//RUTG68qED+QFUEEL5EPKi+ABRINdKltMH1AL7AN7RpMjLH8v/ye1U"); diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-code.fif b/submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-code.fif new file mode 100644 index 0000000000..c052d4b656 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-code.fif @@ -0,0 +1,45 @@ +// automatically generated from `smartcont/stdlib.fc` `smartcont/simple-wallet-code.fc` +PROGRAM{ + DECLPROC recv_internal + DECLPROC recv_external + recv_internal PROC:<{ + // in_msg + DROP // + }> + recv_external PROC:<{ + // in_msg + 9 PUSHPOW2 // in_msg _3=512 + LDSLICEX // signature in_msg + DUP // signature in_msg cs + 32 LDU // signature in_msg msg_seqno cs + c4 PUSH // signature in_msg msg_seqno cs _11 + CTOS // signature in_msg msg_seqno cs cs2 + 32 LDU // signature in_msg msg_seqno cs stored_seqno cs2 + 256 LDU // signature in_msg msg_seqno cs stored_seqno public_key cs2 + ENDS + s3 s1 XCPU // signature in_msg public_key cs stored_seqno msg_seqno stored_seqno + EQUAL // signature in_msg public_key cs stored_seqno _23 + 33 THROWIFNOT + s0 s3 XCHG // signature stored_seqno public_key cs in_msg + HASHSU // signature stored_seqno public_key cs _26 + s0 s4 s2 XC2PU // cs stored_seqno public_key _26 signature public_key + CHKSIGNU // cs stored_seqno public_key _27 + 34 THROWIFNOT + ACCEPT + s2 s0 XCPU // public_key stored_seqno cs cs + SREFS // public_key stored_seqno cs _32 + IF:<{ // public_key stored_seqno cs + 8 LDU // public_key stored_seqno mode cs + LDREF // public_key stored_seqno mode _37 cs + s0 s2 XCHG // public_key stored_seqno cs _37 mode + SENDRAWMSG + }> // public_key stored_seqno cs + ENDS + INC // public_key _42 + NEWC // public_key _42 _43 + 32 STU // public_key _45 + 256 STU // _47 + ENDC // _48 + c4 POP + }> +}END>c diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-ext-code.cpp b/submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-ext-code.cpp new file mode 100644 index 0000000000..ad546b2894 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-ext-code.cpp @@ -0,0 +1 @@ +with_tvm_code("simple-wallet-ext", "te6ccgEBFgEAzwABFP8A9KQT9KDyyAsBAgEgAgMCAUgEBQA08vACVDIS8AT4ACDXSpbTB9QC+wDe0aQB8AMCAs0GBwIBIA4PAgEgCAkAKdAUGEa4wQaY+CXXlQ/ICgCfyIeVFAIBIAoLAgEgDA0AAwwgAA8yBLLH8v/yYAARO1E0NMf0/8wgAAk8AHtVIAIBIBARAgEgFBUADbvtlwAfABgCASASEwARtZL9qJoa4WPwAA22l54AXgCQACG40BggFMl+1D2IIByODtQ9iAAVuI4MjLHxLLB8zJg="); diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-ext-code.fif b/submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-ext-code.fif new file mode 100644 index 0000000000..b403131e07 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/simple-wallet-ext-code.fif @@ -0,0 +1,104 @@ +// automatically generated from `smartcont/stdlib.fc` `smartcont/simple-wallet-ext-code.fc` +PROGRAM{ + DECLPROC create_state + DECLPROC load_state + DECLPROC save_state + DECLPROC recv_internal + DECLPROC do_verify_message + DECLPROC recv_external + 85143 DECLMETHOD seqno + 81625 DECLMETHOD create_init_state + 116960 DECLMETHOD prepare_send_message_with_seqno + 101633 DECLMETHOD prepare_send_message + 95420 DECLMETHOD verify_message + create_state PROC:<{ + // seqno public_key + NEWC // seqno public_key _2 + s1 s2 XCHG // public_key seqno _2 + 32 STU // public_key _4 + 256 STU // _6 + ENDC // _7 + }> + load_state PROC:<{ + // + c4 PUSH // _1 + CTOS // cs2 + 32 LDU // _3 cs2 + 256 LDU // _3 _12 _11 + DROP // _3 _6 + }> + save_state PROC:<{ + // seqno public_key + create_state CALLDICT // _2 + c4 POP + }> + recv_internal PROC:<{ + // in_msg + DROP // + }> + do_verify_message PROC:<{ + // in_msg seqno public_key + s0 s2 XCHG + 9 PUSHPOW2 // public_key seqno in_msg _5=512 + LDSLICEX // public_key seqno signature in_msg + DUP // public_key seqno signature in_msg cs + 32 LDU // public_key seqno signature in_msg msg_seqno cs + s0 s4 XCHG // public_key cs signature in_msg msg_seqno seqno + EQUAL // public_key cs signature in_msg _13 + 33 THROWIFNOT + HASHSU // public_key cs signature _16 + s0 s1 s3 XCHG3 // cs _16 signature public_key + CHKSIGNU // cs _17 + 34 THROWIFNOT + }> + recv_external PROC:<{ + // in_msg + load_state CALLDICT // in_msg stored_seqno public_key + s2 s1 s2 XCPU2 // public_key stored_seqno in_msg stored_seqno public_key + do_verify_message CALLDICT // public_key stored_seqno cs + ACCEPT // public_key stored_seqno cs + DUP // public_key stored_seqno cs cs + SREFS // public_key stored_seqno cs _9 + IF:<{ // public_key stored_seqno cs + 8 LDU // public_key stored_seqno mode cs + LDREF // public_key stored_seqno mode _14 cs + s0 s2 XCHG // public_key stored_seqno cs _14 mode + SENDRAWMSG + }> // public_key stored_seqno cs + ENDS + INC // public_key _19 + SWAP // _19 public_key + save_state CALLDICT + }> + seqno PROC:<{ + // + c4 PUSH // _0 + CTOS // _1 + 32 PLDU // _3 + }> + create_init_state PROC:<{ + // public_key + 0 PUSHINT // public_key _1=0 + SWAP // _1=0 public_key + create_state CALLDICT // _2 + }> + prepare_send_message_with_seqno PROC:<{ + // mode msg seqno + NEWC // mode msg seqno _3 + 32 STU // mode msg _5 + s1 s2 XCHG // msg mode _5 + 8 STU // msg _7 + STREF // _8 + ENDC // _9 + }> + prepare_send_message PROC:<{ + // mode msg + seqno CALLDICT // mode msg _2 + prepare_send_message_with_seqno CALLDICT // _3 + }> + verify_message PROC:<{ + // msg + load_state CALLDICT // msg stored_seqno public_key + do_verify_message CALLDICT // _4 + }> +}END>c diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/wallet-code.cpp b/submodules/ton/tonlib-src/crypto/smartcont/auto/wallet-code.cpp new file mode 100644 index 0000000000..52fefeeb07 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/wallet-code.cpp @@ -0,0 +1 @@ +with_tvm_code("wallet", "te6ccgEBBgEAaAABFP8A9KQT9KDyyAsBAgEgAgMCAUgEBQCA8oMI1xgg0x/TH/gjErvyY+1E0NMf0//RUTG68qED+QFUEEL5EPKi+AACkyDXSpbTB9QC+wDo0aTIyx/L/8ntVAAE0DAAEaCZL9qJoa4WPw=="); diff --git a/submodules/ton/tonlib-src/crypto/smartcont/auto/wallet-code.fif b/submodules/ton/tonlib-src/crypto/smartcont/auto/wallet-code.fif new file mode 100644 index 0000000000..cd9fa5d0f8 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/auto/wallet-code.fif @@ -0,0 +1,59 @@ +// automatically generated from `smartcont/stdlib.fc` `smartcont/wallet-code.fc` +PROGRAM{ + DECLPROC recv_internal + DECLPROC recv_external + 85143 DECLMETHOD seqno + recv_internal PROC:<{ + // in_msg + DROP // + }> + recv_external PROC:<{ + // in_msg + 9 PUSHPOW2 // in_msg _3=512 + LDSLICEX // signature in_msg + DUP // signature in_msg cs + 32 LDU // signature in_msg _8 cs + 32 LDU // signature in_msg msg_seqno valid_until cs + NOW // signature in_msg msg_seqno valid_until cs _15 + s1 s2 XCHG // signature in_msg msg_seqno cs valid_until _15 + LEQ // signature in_msg msg_seqno cs _16 + 35 THROWIF + c4 PUSH // signature in_msg msg_seqno cs _19 + CTOS // signature in_msg msg_seqno cs ds + 32 LDU // signature in_msg msg_seqno cs _23 ds + 256 LDU // signature in_msg msg_seqno cs stored_seqno public_key ds + ENDS + s3 s1 XCPU // signature in_msg public_key cs stored_seqno msg_seqno stored_seqno + EQUAL // signature in_msg public_key cs stored_seqno _31 + 33 THROWIFNOT + s0 s3 XCHG // signature stored_seqno public_key cs in_msg + HASHSU // signature stored_seqno public_key cs _34 + s0 s4 s2 XC2PU // cs stored_seqno public_key _34 signature public_key + CHKSIGNU // cs stored_seqno public_key _35 + 34 THROWIFNOT + ACCEPT + s0 s2 XCHG // public_key stored_seqno cs + WHILE:<{ + DUP // public_key stored_seqno cs cs + SREFS // public_key stored_seqno cs _40 + }>DO<{ // public_key stored_seqno cs + 8 LDU // public_key stored_seqno mode cs + LDREF // public_key stored_seqno mode _45 cs + s0 s2 XCHG // public_key stored_seqno cs _45 mode + SENDRAWMSG + }> // public_key stored_seqno cs + ENDS + INC // public_key _50 + NEWC // public_key _50 _51 + 32 STU // public_key _53 + 256 STU // _55 + ENDC // _56 + c4 POP + }> + seqno PROC:<{ + // + c4 PUSH // _0 + CTOS // _1 + 32 PLDU // _3 + }> +}END>c diff --git a/submodules/ton/tonlib-src/crypto/smartcont/config-code.fc b/submodules/ton/tonlib-src/crypto/smartcont/config-code.fc index 5e0508f537..c9c09a9596 100644 --- a/submodules/ton/tonlib-src/crypto/smartcont/config-code.fc +++ b/submodules/ton/tonlib-src/crypto/smartcont/config-code.fc @@ -86,6 +86,39 @@ .end_cell(), 0); } +() after_code_upgrade(slice param, cell old_code) impure method_id(1666) { +} + +_ perform_action(cfg_dict, public_key, action, cs) { + if (action == 0x43665021) { + ;; change one configuration parameter + var param_index = cs~load_uint(32); + var param_value = cs~load_ref(); + cs.end_parse(); + cfg_dict~idict_set_ref(32, param_index, param_value); + } elseif (action == 0x4e436f64) { + ;; change configuration smart contract code + var new_code = cs~load_ref(); + set_code(new_code); + ifnot(cs.slice_empty?()) { + var old_code = get_c3(); + set_c3(new_code); + after_code_upgrade(cs, old_code); + set_c3(old_code); + } + } elseif (action == 0x50624b21) { + ;; change configuration master public key + public_key = cs~load_uint(256); + cs.end_parse(); + } elseif (action == 0x4e43ef05) { + ;; change election smart contract code + change_elector_code(cs); + } else { + throw_if(32, action); + } + return (cfg_dict, public_key); +} + () recv_external(slice in_msg) impure { var signature = in_msg~load_bits(512); var cs = in_msg; @@ -101,27 +134,7 @@ throw_unless(33, msg_seqno == stored_seqno); throw_unless(34, check_signature(slice_hash(in_msg), signature, public_key)); accept_message(); - if (action == 0x43665021) { - ;; change one configuration parameter - var param_index = cs~load_uint(32); - var param_value = cs~load_ref(); - cs.end_parse(); - cfg_dict~idict_set_ref(32, param_index, param_value); - } elseif (action == 0x4e436f64) { - ;; change configuration smart contract code - var new_code = cs~load_ref(); - cs.end_parse(); - set_code(new_code); - } elseif (action == 0x50624b21) { - ;; change configuration master public key - public_key = cs~load_uint(256); - cs.end_parse(); - } elseif (action == 0x4e43ef05) { - ;; change election smart contract code - change_elector_code(cs); - } else { - throw_if(32, action); - } + (cfg_dict, public_key) = perform_action(cfg_dict, public_key, action, cs); set_data(begin_cell().store_ref(cfg_dict).store_uint(stored_seqno + 1, 32).store_uint(public_key, 256).end_cell()); } diff --git a/submodules/ton/tonlib-src/crypto/smartcont/elector-code.fif b/submodules/ton/tonlib-src/crypto/smartcont/elector-code.fif index 08184e6f43..d964063b2e 100644 --- a/submodules/ton/tonlib-src/crypto/smartcont/elector-code.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/elector-code.fif @@ -354,104 +354,105 @@ PROGRAM{ }> unfreeze_without_bonuses PROC:<{ // credits freeze_dict tot_stakes - 0 PUSHINT // credits freeze_dict tot_stakes recovered=0 - DUP // credits freeze_dict tot_stakes recovered=0 total=0 - -1 PUSHINT // credits freeze_dict tot_stakes recovered=0 total=0 pubkey=-1 + 0 PUSHINT // credits freeze_dict tot_stakes _5=0 + DUP // credits freeze_dict tot_stakes total=0 recovered=0 + -1 PUSHINT // credits freeze_dict tot_stakes total=0 recovered=0 pubkey=-1 UNTIL:<{ s4 PUSH - 8 PUSHPOW2 // credits freeze_dict tot_stakes recovered total pubkey freeze_dict _10=256 + 8 PUSHPOW2 // credits freeze_dict tot_stakes total recovered pubkey freeze_dict _10=256 DICTUGETNEXT NULLSWAPIFNOT - NULLSWAPIFNOT // credits freeze_dict tot_stakes recovered total cs pubkey f - DUP // credits freeze_dict tot_stakes recovered total cs pubkey f f - IF:<{ // credits freeze_dict tot_stakes recovered total cs pubkey f - s0 s2 XCHG // credits freeze_dict tot_stakes recovered total f pubkey cs - 256 LDU // credits freeze_dict tot_stakes recovered total f pubkey _16 cs - 64 LDU // credits freeze_dict tot_stakes recovered total f pubkey _16 _42 _41 - NIP // credits freeze_dict tot_stakes recovered total f pubkey _16 cs - LDGRAMS // credits freeze_dict tot_stakes recovered total f pubkey _16 _22 cs - 1 LDI // credits freeze_dict tot_stakes recovered total f pubkey addr stake banned cs + NULLSWAPIFNOT // credits freeze_dict tot_stakes total recovered cs pubkey f + DUP // credits freeze_dict tot_stakes total recovered cs pubkey f f + IF:<{ // credits freeze_dict tot_stakes total recovered cs pubkey f + s0 s2 XCHG // credits freeze_dict tot_stakes total recovered f pubkey cs + 256 LDU // credits freeze_dict tot_stakes total recovered f pubkey _16 cs + 64 LDU // credits freeze_dict tot_stakes total recovered f pubkey _16 _42 _41 + NIP // credits freeze_dict tot_stakes total recovered f pubkey _16 cs + LDGRAMS // credits freeze_dict tot_stakes total recovered f pubkey _16 _22 cs + 1 LDI // credits freeze_dict tot_stakes total recovered f pubkey addr stake banned cs ENDS - IF:<{ // credits freeze_dict tot_stakes recovered total f pubkey addr stake - NIP // credits freeze_dict tot_stakes recovered total f pubkey stake - s4 s4 XCPU // credits freeze_dict tot_stakes stake total f pubkey recovered stake - ADD // credits freeze_dict tot_stakes stake total f pubkey recovered - }>ELSE<{ // credits freeze_dict tot_stakes recovered total f pubkey addr stake - s8 s8 s8 XC2PU // stake freeze_dict tot_stakes recovered total f pubkey credits addr stake - ~credit_to CALLDICT // stake freeze_dict tot_stakes recovered total f pubkey credits + IF:<{ // credits freeze_dict tot_stakes total recovered f pubkey addr stake + NIP // credits freeze_dict tot_stakes total recovered f pubkey stake + s3 s3 XCPU // credits freeze_dict tot_stakes total stake f pubkey recovered stake + ADD // credits freeze_dict tot_stakes total stake f pubkey recovered + }>ELSE<{ // credits freeze_dict tot_stakes total recovered f pubkey addr stake + s8 s8 s8 XC2PU // stake freeze_dict tot_stakes total recovered f pubkey credits addr stake + ~credit_to CALLDICT // stake freeze_dict tot_stakes total recovered f pubkey credits s0 s7 XCHG - s0 s4 XCHG // credits freeze_dict tot_stakes stake total f pubkey recovered + s0 s3 XCHG // credits freeze_dict tot_stakes total stake f pubkey recovered }> - s3 s4 XCHG2 // credits freeze_dict tot_stakes recovered pubkey f total stake - ADD // credits freeze_dict tot_stakes recovered pubkey f total + s4 s3 XCHG2 // credits freeze_dict tot_stakes pubkey recovered f total stake + ADD // credits freeze_dict tot_stakes pubkey recovered f total }>ELSE<{ - 2SWAP - DROP // credits freeze_dict tot_stakes recovered pubkey f total + s4 s2 XCHG2 + DROP // credits freeze_dict tot_stakes pubkey recovered f total }> - SWAP // credits freeze_dict tot_stakes recovered pubkey total f - NOT // credits freeze_dict tot_stakes recovered pubkey total _32 - s1 s2 XCHG // credits freeze_dict tot_stakes recovered total pubkey _32 - }> // credits freeze_dict tot_stakes recovered total pubkey + SWAP // credits freeze_dict tot_stakes pubkey recovered total f + NOT // credits freeze_dict tot_stakes pubkey recovered total _32 + s1 s3 XCHG // credits freeze_dict tot_stakes total recovered pubkey _32 + }> // credits freeze_dict tot_stakes total recovered pubkey DROP - s3 POP // credits total tot_stakes recovered - -ROT // credits recovered total tot_stakes + s3 POP // credits recovered tot_stakes total + SWAP // credits recovered total tot_stakes EQUAL // credits recovered _34 59 THROWIFNOT }> unfreeze_with_bonuses PROC:<{ // credits freeze_dict tot_stakes tot_bonuses - 0 PUSHINT // credits freeze_dict tot_stakes tot_bonuses returned_bonuses=0 - s0 s0 PUSH2 // credits freeze_dict tot_stakes tot_bonuses returned_bonuses=0 recovered=0 total=0 - -1 PUSHINT // credits freeze_dict tot_stakes tot_bonuses returned_bonuses=0 recovered=0 total=0 pubkey=-1 + 0 PUSHINT // credits freeze_dict tot_stakes tot_bonuses _7=0 + s0 s0 PUSH2 // credits freeze_dict tot_stakes tot_bonuses total=0 returned_bonuses=0 recovered=0 + -1 PUSHINT // credits freeze_dict tot_stakes tot_bonuses total=0 returned_bonuses=0 recovered=0 pubkey=-1 UNTIL:<{ s6 PUSH - 8 PUSHPOW2 // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total pubkey freeze_dict _12=256 + 8 PUSHPOW2 // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered pubkey freeze_dict _12=256 DICTUGETNEXT NULLSWAPIFNOT - NULLSWAPIFNOT // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total cs pubkey f - DUP // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total cs pubkey f f - IF:<{ // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total cs pubkey f - s0 s2 XCHG // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey cs - 256 LDU // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey _18 cs - 64 LDU // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey _18 _52 _51 - NIP // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey _18 cs - LDGRAMS // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey _18 _24 cs - 1 LDI // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey addr stake banned cs + NULLSWAPIFNOT // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered cs pubkey f + DUP // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered cs pubkey f f + IF:<{ // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered cs pubkey f + s0 s2 XCHG // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey cs + 256 LDU // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey _18 cs + 64 LDU // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey _18 _52 _51 + NIP // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey _18 cs + LDGRAMS // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey _18 _24 cs + 1 LDI // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake banned cs ENDS - IF:<{ // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey addr stake - NIP // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey stake - s4 s4 XCPU // credits freeze_dict tot_stakes tot_bonuses returned_bonuses stake total f pubkey recovered stake - ADD // credits freeze_dict tot_stakes tot_bonuses returned_bonuses stake total f pubkey recovered - }>ELSE<{ // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey addr stake - s7 s0 s8 PUSH3 // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey addr stake tot_bonuses stake tot_stakes - MULDIV // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey addr stake bonus - s7 s7 XCPU // credits freeze_dict tot_stakes tot_bonuses bonus recovered total f pubkey addr stake returned_bonuses bonus - ADD // credits freeze_dict tot_stakes tot_bonuses bonus recovered total f pubkey addr stake returned_bonuses - s1 s7 PUXC // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey addr stake stake bonus - ADD // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey addr stake _35 - s11 s11 s0 XCHG3 // stake freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey credits addr _35 - ~credit_to CALLDICT // stake freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total f pubkey credits + IF:<{ // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake + NIP // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey stake + s3 s3 XCPU // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses stake f pubkey recovered stake + ADD // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses stake f pubkey recovered + }>ELSE<{ // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake + s7 s0 s8 PUSH3 // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake tot_bonuses stake tot_stakes + MULDIV // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake bonus + s6 s6 XCPU // credits freeze_dict tot_stakes tot_bonuses total bonus recovered f pubkey addr stake returned_bonuses bonus + ADD // credits freeze_dict tot_stakes tot_bonuses total bonus recovered f pubkey addr stake returned_bonuses + s1 s6 PUXC // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake stake bonus + ADD // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake _35 + s11 s11 s0 XCHG3 // stake freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey credits addr _35 + ~credit_to CALLDICT // stake freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey credits s0 s9 XCHG - s0 s4 XCHG // credits freeze_dict tot_stakes tot_bonuses returned_bonuses stake total f pubkey recovered + s0 s3 XCHG // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses stake f pubkey recovered }> - s3 s4 XCHG2 // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered pubkey f total stake - ADD // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered pubkey f total + s5 s3 XCHG2 // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered f total stake + ADD // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered f total }>ELSE<{ - 2SWAP - DROP // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered pubkey f total + s5 s2 XCHG2 + DROP // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered f total }> - SWAP // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered pubkey total f - NOT // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered pubkey total _38 - s1 s2 XCHG // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total pubkey _38 - }> // credits freeze_dict tot_stakes tot_bonuses returned_bonuses recovered total pubkey + SWAP // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered total f + NOT // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered total _38 + s1 s4 XCHG // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered pubkey _38 + }> // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered pubkey DROP - s5 POP // credits total tot_stakes tot_bonuses returned_bonuses recovered - s4 s3 XCHG2 // credits returned_bonuses recovered tot_bonuses total tot_stakes - EQUAL // credits returned_bonuses recovered tot_bonuses _40 - s3 s1 PUSH2 // credits returned_bonuses recovered tot_bonuses _40 returned_bonuses tot_bonuses - LEQ // credits returned_bonuses recovered tot_bonuses _40 _41 - AND // credits returned_bonuses recovered tot_bonuses _42 + s5 POP // credits recovered tot_stakes tot_bonuses total returned_bonuses + s0 s3 XCHG // credits recovered returned_bonuses tot_bonuses total tot_stakes + EQUAL // credits recovered returned_bonuses tot_bonuses _40 + s2 s1 PUSH2 // credits recovered returned_bonuses tot_bonuses _40 returned_bonuses tot_bonuses + LEQ // credits recovered returned_bonuses tot_bonuses _40 _41 + AND // credits recovered returned_bonuses tot_bonuses _42 59 THROWIFNOT + s1 s2 XCHG // credits returned_bonuses recovered tot_bonuses ADD // credits returned_bonuses _44 SWAP // credits _44 returned_bonuses SUB // credits _45 diff --git a/submodules/ton/tonlib-src/crypto/smartcont/gen-zerostate-test.fif b/submodules/ton/tonlib-src/crypto/smartcont/gen-zerostate-test.fif index 2e6d87a75e..6fe3fbed03 100644 --- a/submodules/ton/tonlib-src/crypto/smartcont/gen-zerostate-test.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/gen-zerostate-test.fif @@ -121,7 +121,7 @@ dup make_special dup constant smc3_addr ."address = " x. cr // SmartContract #4 (elector) -"elector-code.fif" include // code in separate source file +"auto/elector-code.fif" include // code in separate source file // data GR$10 // balance: 10 grams 0 // split_depth diff --git a/submodules/ton/tonlib-src/crypto/smartcont/gen-zerostate.fif b/submodules/ton/tonlib-src/crypto/smartcont/gen-zerostate.fif index e66bb4f572..70abe412e0 100644 --- a/submodules/ton/tonlib-src/crypto/smartcont/gen-zerostate.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/gen-zerostate.fif @@ -133,7 +133,7 @@ dup make_special dup constant smc3_addr * SmartContract #4 (elector) * */ -"elector-code.fif" include // code in separate source file +"auto/elector-code.fif" include // code in separate source file // data: dict dict dict grams uint32 uint256 empty_cell // libraries GR$10 // balance: 10 grams @@ -173,7 +173,7 @@ config.special! // gas_price gas_limit special_gas_limit gas_credit block_gas_limit freeze_due_limit delete_due_limit flat_gas_limit flat_gas_price -- 1000 sg* 1 *M dup 10000 10 *M GR$0.1 GR$1.0 100 100000 config.gas_prices! -10000 sg* 1 *M 10 *M 10000 10 *M GR$0.1 GR$1.0 0 0 config.mc_gas_prices! +10000 sg* 1 *M 10 *M 10000 10 *M GR$0.1 GR$1.0 100 1000000 config.mc_gas_prices! // lump_price bit_price cell_price ihr_factor first_frac next_frac 1000000 1000 sg* 100000 sg* 3/2 sg*/ 1/3 sg*/ 1/3 sg*/ config.fwd_prices! 10000000 10000 sg* 1000000 sg* 3/2 sg*/ 1/3 sg*/ 1/3 sg*/ config.mc_fwd_prices! @@ -202,8 +202,7 @@ smc1_addr config.minter_smc! // 17 add-validator // newkeypair nip dup ."Validator #2 public key = " Bx. cr // 239 add-validator -// 100000 =: orig_vset_valid_for -100 =: orig_vset_valid_for // original validator set valid 100 seconds only (DEBUG) +100000 =: orig_vset_valid_for // original validator set valid 100000 seconds now dup orig_vset_valid_for + 0 config.validators! /* @@ -211,7 +210,7 @@ now dup orig_vset_valid_for + 0 config.validators! * SmartContract #5 (Configuration smart contract) * */ -"config-code.fif" include // code in separate source file +"auto/config-code.fif" include // code in separate source file []" cr diff --git a/submodules/ton/tonlib-src/crypto/smartcont/highload-wallet.fif b/submodules/ton/tonlib-src/crypto/smartcont/highload-wallet.fif old mode 100644 new mode 100755 index ab69fdf368..e851016cc9 --- a/submodules/ton/tonlib-src/crypto/smartcont/highload-wallet.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/highload-wallet.fif @@ -1,4 +1,4 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include { ."usage: " @' $0 type ." []" cr diff --git a/submodules/ton/tonlib-src/crypto/smartcont/multisig-code.fc b/submodules/ton/tonlib-src/crypto/smartcont/multisig-code.fc new file mode 100644 index 0000000000..cbe2d30feb --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/multisig-code.fc @@ -0,0 +1,265 @@ +;; Simple wallet smart contract + +_ unpack_state() inline_ref { + var ds = begin_parse(get_data()); + var res = (ds~load_uint(8), ds~load_uint(8), ds~load_uint(64), ds~load_dict(), ds~load_dict()); + ds.end_parse(); + return res; +} + +_ pack_state(cell pending_queries, cell public_keys, int last_cleaned, int k, int n) inline_ref { + return begin_cell() + .store_uint(n, 8) + .store_uint(k, 8) + .store_uint(last_cleaned, 64) + .store_dict(public_keys) + .store_dict(pending_queries) + .end_cell(); +} + +(int, int) check_signatures(cell public_keys, cell signatures, int hash, int cnt_bits) inline_ref { + int cnt = 0; + + do { + slice cs = signatures.begin_parse(); + slice signature = cs~load_bits(512); + + int i = cs~load_uint(8); + signatures = cs~load_dict(); + + (slice public_key, var found?) = public_keys.udict_get?(8, i); + throw_unless(37, found?); + throw_unless(38, check_signature(hash, signature, public_key.preload_uint(256))); + + int mask = (1 << i); + int old_cnt_bits = cnt_bits; + cnt_bits |= mask; + int should_check = cnt_bits != old_cnt_bits; + cnt -= should_check; + } until (cell_null?(signatures)); + + return (cnt, cnt_bits); +} + + +() recv_internal(slice in_msg) impure { + ;; do nothing for internal messages +} + +(int, int, slice) unpack_query_data(slice in_msg, int n, slice query, var found?) inline_ref { + if (found?) { + throw_unless(35, query~load_int(1)); + (int cnt, int cnt_bits, slice msg) = (query~load_uint(8), query~load_uint(n), query); + throw_unless(36, slice_hash(msg) == slice_hash(in_msg)); + return (cnt, cnt_bits, msg); + } + return (0, 0, in_msg); +} + +() try_init() impure inline_ref { + ;; first query without signatures is always accepted + (int n, int k, int last_cleaned, cell public_keys, cell pending_queries) = unpack_state(); + throw_if(37, last_cleaned); + accept_message(); + set_data(pack_state(pending_queries, public_keys, 1, k, n)); +} + +cell update_pending_queries(cell pending_queries, slice msg, int query_id, int cnt, int cnt_bits, int n, int k) impure inline_ref { + if (cnt >= k) { + while (msg.slice_refs()) { + var mode = msg~load_uint(8); + send_raw_message(msg~load_ref(), mode); + } + pending_queries~udict_set_builder(64, query_id, begin_cell().store_int(0, 1)); + } else { + pending_queries~udict_set_builder(64, query_id, begin_cell() + .store_uint(1, 1) + .store_uint(cnt, 8) + .store_uint(cnt_bits, n) + .store_slice(msg)); + } + return pending_queries; +} + +() recv_external(slice in_msg) impure { + ;; empty message triggers init + if (slice_empty?(in_msg)) { + return try_init(); + } + + ;; Check root signature + slice root_signature = in_msg~load_bits(512); + int root_hash = slice_hash(in_msg); + int root_i = in_msg~load_uint(8); + + (int n, int k, int last_cleaned, cell public_keys, cell pending_queries) = unpack_state(); + last_cleaned -= last_cleaned == 0; + + (slice public_key, var found?) = public_keys.udict_get?(8, root_i); + throw_unless(31, found?); + throw_unless(32, check_signature(root_hash, root_signature, public_key.preload_uint(256))); + + cell signatures = in_msg~load_dict(); + + var hash = slice_hash(in_msg); + int query_id = in_msg~load_uint(64); + + var bound = (now() << 32); + throw_if(33, query_id < bound); + + (slice query, var found?) = pending_queries.udict_get?(64, query_id); + (int cnt, int cnt_bits, slice msg) = unpack_query_data(in_msg, n, query, found?); + int mask = 1 << root_i; + throw_if(34, cnt_bits & mask); + cnt_bits |= mask; + cnt += 1; + + ;; TODO: reserve some gas or FAIL + accept_message(); + + pending_queries = update_pending_queries(pending_queries, msg, query_id, cnt, cnt_bits, n, k); + set_data(pack_state(pending_queries, public_keys, last_cleaned, k, n)); + + commit(); + + int need_save = 0; + ifnot (cell_null?(signatures) | (cnt >= k)) { + (int new_cnt, cnt_bits) = check_signatures(public_keys, signatures, hash, cnt_bits); + cnt += new_cnt; + pending_queries = update_pending_queries(pending_queries, msg, query_id, cnt, cnt_bits, n, k); + need_save = -1; + } + + bound -= (64 << 32); ;; clean up records expired more than 64 seconds ago + int old_last_cleaned = last_cleaned; + do { + var (pending_queries', i, _, f) = pending_queries.udict_delete_get_min(64); + f~touch(); + if (f) { + f = (i < bound); + } + if (f) { + pending_queries = pending_queries'; + last_cleaned = i; + need_save = -1; + } + } until (~ f); + + if (need_save) { + set_data(pack_state(pending_queries, public_keys, last_cleaned, k, n)); + } +} + +;; Get methods +;; returns -1 for processed queries, 0 for unprocessed, 1 for unknown (forgotten) +(int, int) get_query_state(int query_id) method_id { + (int n, _, int last_cleaned, _, cell pending_queries) = unpack_state(); + (slice cs, var found) = pending_queries.udict_get?(64, query_id); + if (found) { + if (cs~load_int(1)) { + cs~load_uint(8); + return (0, cs~load_uint(n)); + } else { + return (-1, 0); + } + } else { + return (-(query_id <= last_cleaned), 0); + } +} + +int processed?(int query_id) method_id { + (int x, _) = get_query_state(query_id); + return x; +} + +cell create_init_state(int n, int k, cell public_keys) method_id { + return pack_state(new_dict(), public_keys, 0, k, n); +} + +cell merge_list(cell a, cell b) { + if (cell_null?(a)) { + return b; + } + if (cell_null?(b)) { + return a; + } + slice as = a.begin_parse(); + if (as.slice_refs() != 0) { + cell tail = merge_list(as~load_ref(), b); + return begin_cell().store_slice(as).store_ref(tail).end_cell(); + } + + as~skip_last_bits(1); + ;; as~skip_bits(1); + return begin_cell().store_slice(as).store_dict(b).end_cell(); + +} + +cell get_public_keys() method_id { + (_, _, _, cell public_keys, _) = unpack_state(); + return public_keys; +} + +(int, int) check_query_signatures(cell query) method_id { + slice cs = query.begin_parse(); + slice root_signature = cs~load_bits(512); + int root_hash = slice_hash(cs); + int root_i = cs~load_uint(8); + + cell public_keys = get_public_keys(); + (slice public_key, var found?) = public_keys.udict_get?(8, root_i); + throw_unless(31, found?); + throw_unless(32, check_signature(root_hash, root_signature, public_key.preload_uint(256))); + + int mask = 1 << root_i; + + cell signatures = cs~load_dict(); + if (cell_null?(signatures)) { + return (1, mask); + } + (int cnt, mask) = check_signatures(public_keys, signatures, slice_hash(cs), mask); + return (cnt + 1, mask); +} + +cell messages_by_mask(int mask) method_id { + (int n, _, _, _, cell pending_queries) = unpack_state(); + int i = -1; + cell a = new_dict(); + do { + (i, var cs, var f) = pending_queries.udict_get_next?(64, i); + if (f) { + if (cs~load_int(1)) { + int cnt_bits = cs.skip_bits(8).preload_uint(n); + if (cnt_bits & mask) { + a~udict_set_builder(64, i, begin_cell().store_slice(cs)); + } + } + } + } until (~ f); + return a; +} + +cell get_messages_unsigned_by_id(int id) method_id { + return messages_by_mask(1 << id); +} + +cell get_messages_unsigned() method_id { + return messages_by_mask(~ 0); +} + +(int, int) get_n_k() method_id { + (int n, int k, _, _, _) = unpack_state(); + return (n, k); +} + +cell merge_inner_queries(cell a, cell b) method_id { + slice ca = a.begin_parse(); + slice cb = b.begin_parse(); + cell list_a = ca~load_dict(); + cell list_b = cb~load_dict(); + throw_unless(31, slice_hash(ca) == slice_hash(cb)); + return begin_cell() + .store_dict(merge_list(list_a, list_b)) + .store_slice(ca) + .end_cell(); +} diff --git a/submodules/ton/tonlib-src/crypto/smartcont/new-highload-wallet-v2.fif b/submodules/ton/tonlib-src/crypto/smartcont/new-highload-wallet-v2.fif old mode 100644 new mode 100755 index df386cc72a..d0183b2250 --- a/submodules/ton/tonlib-src/crypto/smartcont/new-highload-wallet-v2.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/new-highload-wallet-v2.fif @@ -1,4 +1,4 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include "Asm.fif" include @@ -19,8 +19,8 @@ def? $3 { @' $3 } { "new-wallet" } cond constant file-base ."Creating new v2 high-load wallet in workchain " wc . ."with subwallet id " subwallet-id . cr -// Create new high-load wallet; source code included from `highload-wallet-v2-code.fif` -"highload-wallet-v2-code.fif" include +// Create new high-load wallet; source code included from `auto/highload-wallet-v2-code.fif` +"auto/highload-wallet-v2-code.fif" include // code []" cr + ."Creates a restricted wallet in the masterchain controlled by the private key corresponding to the specified public key" cr + ."and saves its address into .addr ('rwallet.addr' by default)" cr 1 halt +} : usage +$# 1- -2 and ' usage if + +-1 =: wc +$1 parse-pubkey =: PubKey +def? $2 { @' $2 } { "rwallet" } cond constant file-base + +."Creating new restricted wallet in workchain " wc . ."controlled by public key " PubKey .pubkey cr + +// Create new restricted wallet; code taken from `auto/restricted-wallet-code.fif` +"auto/restricted-wallet-code.fif" include // code + // data +null // no libraries + // create StateInit +dup ."StateInit: " +dup ."External message for initialization is " B dup Bx. cr +file-base +"-query.boc" tuck B>file +."(Saved wallet creating query to file " type .")" cr diff --git a/submodules/ton/tonlib-src/crypto/smartcont/new-restricted-wallet2.fif b/submodules/ton/tonlib-src/crypto/smartcont/new-restricted-wallet2.fif new file mode 100644 index 0000000000..8f95e4c1cc --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/new-restricted-wallet2.fif @@ -0,0 +1,47 @@ +#!/usr/bin/fift -s +"TonUtil.fif" include +"Asm.fif" include + +{ ."usage: " @' $0 type ." []" cr + ."Creates a restricted lockup wallet in the masterchain controlled by the private key corresponding to the specified public key" cr + ."and saves its address into .addr ('rwallet.addr' by default)" cr 1 halt +} : usage +$# 2- -2 and ' usage if + +-1 =: wc +$1 parse-pubkey =: PubKey +$2 $>GR =: amount +def? $3 { @' $3 } { "rwallet" } cond constant file-base + +."Creating new restricted lockup wallet in workchain " wc . ."controlled by public key " PubKey .pubkey +." with nominal amount " amount .GR cr + +// D x t -- D' +{ idict! not abort"cannot add value" +} : rdict-entry +// balance -- dict +{ dictnew + over -32768 rdict-entry + over 3/4 */ 92 rdict-entry + over 1/2 */ 183 rdict-entry + swap 1/4 */ 366 rdict-entry + 0 548 rdict-entry +} : make-rdict + +// Create new restricted wallet; code taken from `auto/restricted-wallet2-code.fif` +"auto/restricted-wallet-code.fif" include // code + // data +null // no libraries + // create StateInit +dup ."StateInit: " +dup ."External message for initialization is " B dup Bx. cr +file-base +"-query.boc" tuck B>file +."(Saved wallet creating query to file " type .")" cr diff --git a/submodules/ton/tonlib-src/crypto/smartcont/new-testgiver.fif b/submodules/ton/tonlib-src/crypto/smartcont/new-testgiver.fif old mode 100644 new mode 100755 index 504a81bdeb..ad9789fa2f --- a/submodules/ton/tonlib-src/crypto/smartcont/new-testgiver.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/new-testgiver.fif @@ -1,4 +1,4 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include "Asm.fif" include diff --git a/submodules/ton/tonlib-src/crypto/smartcont/new-wallet-v2.fif b/submodules/ton/tonlib-src/crypto/smartcont/new-wallet-v2.fif old mode 100644 new mode 100755 index 39bb421bf9..d59c6c5201 --- a/submodules/ton/tonlib-src/crypto/smartcont/new-wallet-v2.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/new-wallet-v2.fif @@ -1,4 +1,4 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include "Asm.fif" include @@ -13,7 +13,7 @@ def? $2 { @' $2 } { "new-wallet" } cond constant file-base ."Creating new advanced wallet in workchain " wc . cr -// Create new advanced wallet; code adapted from `wallet-code.fif` +// Create new advanced wallet; code adapted from `auto/wallet-code.fif` <{ SETCP0 DUP IFNOTRET // return if recv_internal DUP 85143 INT EQUAL IFJMP:<{ // "seqno" get-method DROP c4 PUSHCTR CTOS 32 PLDU // cnt diff --git a/submodules/ton/tonlib-src/crypto/smartcont/new-wallet.fif b/submodules/ton/tonlib-src/crypto/smartcont/new-wallet.fif old mode 100644 new mode 100755 index 9bdb0bdb38..ac8d4a0e3a --- a/submodules/ton/tonlib-src/crypto/smartcont/new-wallet.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/new-wallet.fif @@ -1,4 +1,4 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include "Asm.fif" include diff --git a/submodules/ton/tonlib-src/crypto/smartcont/recover-stake.fif b/submodules/ton/tonlib-src/crypto/smartcont/recover-stake.fif old mode 100644 new mode 100755 index 573cb336a2..871b3855bc --- a/submodules/ton/tonlib-src/crypto/smartcont/recover-stake.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/recover-stake.fif @@ -1,4 +1,4 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include { ."usage: " @' $0 type ." []" cr diff --git a/submodules/ton/tonlib-src/crypto/smartcont/restricted-wallet-code.fc b/submodules/ton/tonlib-src/crypto/smartcont/restricted-wallet-code.fc new file mode 100644 index 0000000000..83639dfdff --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/restricted-wallet-code.fc @@ -0,0 +1,67 @@ +;; Restricted wallet (a variant of wallet-code.fc) +;; until configuration parameter -13 is set, accepts messages only to elector smc + +() recv_internal(slice in_msg) impure { + ;; do nothing for internal messages +} + +_ restricted?() inline { + var p = config_param(-13); + return null?(p) ? true : begin_parse(p).preload_uint(32) > now(); +} + +_ check_destination(msg, dest) inline_ref { + var cs = msg.begin_parse(); + var flags = cs~load_uint(4); + if (flags & 8) { + ;; external messages are always valid + return true; + } + var (s_addr, d_addr) = (cs~load_msg_addr(), cs~load_msg_addr()); + var (dest_wc, dest_addr) = parse_std_addr(d_addr); + return (dest_wc == -1) & (dest_addr == dest); +} + +() recv_external(slice in_msg) impure { + var signature = in_msg~load_bits(512); + var cs = in_msg; + var (msg_seqno, valid_until) = (cs~load_uint(32), cs~load_uint(32)); + throw_if(35, valid_until <= now()); + var ds = get_data().begin_parse(); + var (stored_seqno, public_key) = (ds~load_uint(32), ds~load_uint(256)); + ds.end_parse(); + throw_unless(33, msg_seqno == stored_seqno); + ifnot (msg_seqno) { + accept_message(); + set_data(begin_cell().store_uint(stored_seqno + 1, 32).store_uint(public_key, 256).end_cell()); + return (); + } + throw_unless(34, check_signature(slice_hash(in_msg), signature, public_key)); + accept_message(); + var restrict = restricted?(); + var elector = config_param(1).begin_parse().preload_uint(256); + cs~touch(); + while (cs.slice_refs()) { + var mode = cs~load_uint(8); + var msg = cs~load_ref(); + var ok = true; + if (restrict) { + ok = check_destination(msg, elector); + } + if (ok) { + send_raw_message(msg, mode); + } + } + cs.end_parse(); + set_data(begin_cell().store_uint(stored_seqno + 1, 32).store_uint(public_key, 256).end_cell()); +} + +;; Get methods + +int seqno() method_id { + return get_data().begin_parse().preload_uint(32); +} + +int balance() method_id { + return restricted?() ? 0 : get_balance().first(); +} diff --git a/submodules/ton/tonlib-src/crypto/smartcont/restricted-wallet2-code.fc b/submodules/ton/tonlib-src/crypto/smartcont/restricted-wallet2-code.fc new file mode 100644 index 0000000000..fa57e77d24 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/restricted-wallet2-code.fc @@ -0,0 +1,69 @@ +;; Restricted wallet (a variant of wallet-code.fc) +;; until configuration parameter -13 is set, accepts messages only to elector smc + +() recv_internal(slice in_msg) impure { + ;; do nothing for internal messages +} + +_ days_passed() inline { + var p = config_param(-13); + return null?(p) ? -1 : (now() - begin_parse(p).preload_uint(32)) / 86400; +} + +() recv_external(slice in_msg) impure { + var signature = in_msg~load_bits(512); + var cs = in_msg; + var (msg_seqno, valid_until) = (cs~load_uint(32), cs~load_uint(32)); + throw_if(35, valid_until <= now()); + var ds = get_data().begin_parse(); + var (stored_seqno, public_key, rdict) = (ds~load_uint(32), ds~load_uint(256), ds~load_dict()); + ds.end_parse(); + throw_unless(33, msg_seqno == stored_seqno); + ifnot (msg_seqno) { + accept_message(); + set_data(begin_cell() + .store_uint(stored_seqno + 1, 32) + .store_uint(public_key, 256) + .store_dict(rdict) + .end_cell()); + return (); + } + throw_unless(34, check_signature(slice_hash(in_msg), signature, public_key)); + accept_message(); + var ts = days_passed(); + var (_, value, found) = rdict.idict_get_preveq?(16, ts); + if (found) { + raw_reserve(value~load_grams(), 2); + } + cs~touch(); + while (cs.slice_refs()) { + var mode = cs~load_uint(8); + var msg = cs~load_ref(); + send_raw_message(msg, mode); + } + cs.end_parse(); + set_data(begin_cell() + .store_uint(stored_seqno + 1, 32) + .store_uint(public_key, 256) + .store_dict(rdict) + .end_cell()); +} + +;; Get methods + +int seqno() method_id { + return get_data().begin_parse().preload_uint(32); +} + +int balance() method_id { + var ds = get_data().begin_parse().skip_bits(32 + 256); + var rdict = ds~load_dict(); + ds.end_parse(); + var ts = days_passed(); + var balance = get_balance().first(); + var (_, value, found) = rdict.idict_get_preveq?(16, ts); + if (found) { + balance = max(balance - value~load_grams(), 0); + } + return balance; +} diff --git a/submodules/ton/tonlib-src/crypto/smartcont/show-addr.fif b/submodules/ton/tonlib-src/crypto/smartcont/show-addr.fif old mode 100644 new mode 100755 index 74536528f8..5d3094644f --- a/submodules/ton/tonlib-src/crypto/smartcont/show-addr.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/show-addr.fif @@ -1,4 +1,4 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include { ."usage: " @' $0 type ." " cr diff --git a/submodules/ton/tonlib-src/crypto/smartcont/simple-wallet-ext-code.fc b/submodules/ton/tonlib-src/crypto/smartcont/simple-wallet-ext-code.fc new file mode 100644 index 0000000000..a20b96a861 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smartcont/simple-wallet-ext-code.fc @@ -0,0 +1,67 @@ +;; Simple wallet smart contract + +cell create_state(int seqno, int public_key) { + return begin_cell().store_uint(seqno, 32).store_uint(public_key, 256).end_cell(); +} + +(int, int) load_state() { + var cs2 = begin_parse(get_data()); + return (cs2~load_uint(32), cs2~load_uint(256)); +} + +() save_state(int seqno, int public_key) impure { + set_data(create_state(seqno, public_key)); +} + +() recv_internal(slice in_msg) impure { + ;; do nothing for internal messages +} + +slice do_verify_message(slice in_msg, int seqno, int public_key) { + var signature = in_msg~load_bits(512); + var cs = in_msg; + int msg_seqno = cs~load_uint(32); + throw_unless(33, msg_seqno == seqno); + throw_unless(34, check_signature(slice_hash(in_msg), signature, public_key)); + return cs; +} + +() recv_external(slice in_msg) impure { + (int stored_seqno, int public_key) = load_state(); + var cs = do_verify_message(in_msg, stored_seqno, public_key); + accept_message(); + cs~touch_slice(); + if (cs.slice_refs()) { + var mode = cs~load_uint(8); + send_raw_message(cs~load_ref(), mode); + } + cs.end_parse(); + save_state(stored_seqno + 1, public_key); +} + +;; Get methods + +int seqno() method_id { + return get_data().begin_parse().preload_uint(32); +} + +cell create_init_state(int public_key) method_id { + return create_state(0, public_key); +} + +cell prepare_send_message_with_seqno(int mode, cell msg, int seqno) method_id { + return begin_cell().store_uint(seqno, 32).store_uint(mode, 8).store_ref(msg).end_cell(); +} + +cell prepare_send_message(int mode, cell msg) method_id { + return prepare_send_message_with_seqno(mode, msg, seqno()); +} + + +slice verify_message(slice msg) method_id { + var (stored_seqno, public_key) = load_state(); + return do_verify_message(msg, stored_seqno, public_key); +} + + + diff --git a/submodules/ton/tonlib-src/crypto/smartcont/stdlib.fc b/submodules/ton/tonlib-src/crypto/smartcont/stdlib.fc index fb9b49f56a..d78f9ef1a5 100644 --- a/submodules/ton/tonlib-src/crypto/smartcont/stdlib.fc +++ b/submodules/ton/tonlib-src/crypto/smartcont/stdlib.fc @@ -1,8 +1,25 @@ ;; Standard library for funC ;; +forall X -> tuple cons(X head, tuple tail) asm "CONS"; +forall X -> (X, tuple) uncons(tuple list) asm "UNCONS"; +forall X -> (tuple, X) list_next(tuple list) asm( -> 1 0) "UNCONS"; +forall X -> X car(tuple list) asm "CAR"; +tuple cdr(tuple list) asm "CDR"; +forall X, Y -> tuple pair(X x, Y y) asm "PAIR"; +forall X, Y -> (X, Y) unpair(tuple t) asm "UNPAIR"; +forall X, Y, Z -> tuple triple(X x, Y y, Z z) asm "TRIPLE"; +forall X, Y, Z -> (X, Y, Z) untriple(tuple t) asm "UNTRIPLE"; +forall X, Y, Z, W -> tuple tuple4(X x, Y y, Z z, W w) asm "4 TUPLE"; +forall X, Y, Z, W -> (X, Y, Z, W) untuple4(tuple t) asm "4 UNTUPLE"; +forall X -> X first(tuple t) asm "FIRST"; +forall X -> X second(tuple t) asm "SECOND"; +forall X -> X third(tuple t) asm "THIRD"; +forall X -> X fourth(tuple t) asm "3 INDEX"; + int now() asm "NOW"; slice my_address() asm "MYADDR"; +tuple get_balance() asm "BALANCE"; int cell_hash(cell c) asm "HASHCU"; int slice_hash(slice s) asm "HASHSU"; @@ -17,8 +34,10 @@ int check_data_signature(slice data, slice signature, int public_key) asm "CHKSI cell get_data() asm "c4 PUSH"; () set_data(cell c) impure asm "c4 POP"; +cell get_c3() impure asm "c3 PUSH"; () set_c3(cell c) impure asm "c3 POP"; () accept_message() impure asm "ACCEPT"; +() commit() impure asm "COMMIT"; int min(int x, int y) asm "MIN"; int max(int x, int y) asm "MAX"; @@ -36,6 +55,7 @@ cell preload_ref(slice s) asm "PLDREF"; (slice, int) load_grams(slice s) asm( -> 1 0) "LDGRAMS"; slice skip_bits(slice s, int len) asm "SDSKIPFIRST"; slice first_bits(slice s, int len) asm "SDCUTFIRST"; +(slice, ()) skip_last_bits(slice s, int len) asm "SDSKIPLAST"; (slice, cell) load_dict(slice s) asm( -> 1 0) "LDDICT"; cell preload_dict(slice s) asm "PLDDICT"; slice skip_dict(slice s) asm "SKIPDICT"; @@ -63,15 +83,30 @@ tuple parse_addr(slice s) asm "PARSEMSGADDR"; cell idict_set_ref(cell dict, int key_len, int index, cell value) asm(value index dict key_len) "DICTISETREF"; (cell, ()) ~idict_set_ref(cell dict, int key_len, int index, cell value) asm(value index dict key_len) "DICTISETREF"; +cell udict_set_ref(cell dict, int key_len, int index, cell value) asm(value index dict key_len) "DICTUSETREF"; +(cell, ()) ~udict_set_ref(cell dict, int key_len, int index, cell value) asm(value index dict key_len) "DICTUSETREF"; cell idict_get_ref(cell dict, int key_len, int index) asm(index dict key_len) "DICTIGETOPTREF"; +cell udict_get_ref(cell dict, int key_len, int index) asm(index dict key_len) "DICTUGETOPTREF"; (cell, cell) idict_set_get_ref(cell dict, int key_len, int index, cell value) asm(value index dict key_len) "DICTISETGETOPTREF"; +(cell, cell) udict_set_get_ref(cell dict, int key_len, int index, cell value) asm(value index dict key_len) "DICTUSETGETOPTREF"; (cell, int) idict_delete?(cell dict, int key_len, int index) asm(index dict key_len) "DICTIDEL"; +(cell, int) udict_delete?(cell dict, int key_len, int index) asm(index dict key_len) "DICTUDEL"; (slice, int) idict_get?(cell dict, int key_len, int index) asm(index dict key_len) "DICTIGET" "NULLSWAPIFNOT"; (slice, int) udict_get?(cell dict, int key_len, int index) asm(index dict key_len) "DICTUGET" "NULLSWAPIFNOT"; (cell, slice, int) idict_delete_get?(cell dict, int key_len, int index) asm(index dict key_len) "DICTIDELGET" "NULLSWAPIFNOT"; (cell, slice, int) udict_delete_get?(cell dict, int key_len, int index) asm(index dict key_len) "DICTUDELGET" "NULLSWAPIFNOT"; (cell, (slice, int)) ~idict_delete_get?(cell dict, int key_len, int index) asm(index dict key_len) "DICTIDELGET" "NULLSWAPIFNOT"; (cell, (slice, int)) ~udict_delete_get?(cell dict, int key_len, int index) asm(index dict key_len) "DICTUDELGET" "NULLSWAPIFNOT"; +cell udict_set(cell dict, int key_len, int index, slice value) asm(value index dict key_len) "DICTUSET"; +(cell, ()) ~udict_set(cell dict, int key_len, int index, slice value) asm(value index dict key_len) "DICTUSET"; +cell idict_set(cell dict, int key_len, int index, slice value) asm(value index dict key_len) "DICTISET"; +(cell, ()) ~idict_set(cell dict, int key_len, int index, slice value) asm(value index dict key_len) "DICTISET"; +cell dict_set(cell dict, int key_len, slice index, slice value) asm(value index dict key_len) "DICTSET"; +(cell, ()) ~dict_set(cell dict, int key_len, slice index, slice value) asm(value index dict key_len) "DICTSET"; +(cell, int) udict_add?(cell dict, int key_len, int index, slice value) asm(value index dict key_len) "DICTUADD"; +(cell, int) udict_replace?(cell dict, int key_len, int index, slice value) asm(value index dict key_len) "DICTUREPLACE"; +(cell, int) idict_add?(cell dict, int key_len, int index, slice value) asm(value index dict key_len) "DICTIADD"; +(cell, int) idict_replace?(cell dict, int key_len, int index, slice value) asm(value index dict key_len) "DICTIREPLACE"; cell udict_set_builder(cell dict, int key_len, int index, builder value) asm(value index dict key_len) "DICTUSETB"; (cell, ()) ~udict_set_builder(cell dict, int key_len, int index, builder value) asm(value index dict key_len) "DICTUSETB"; cell idict_set_builder(cell dict, int key_len, int index, builder value) asm(value index dict key_len) "DICTISETB"; @@ -80,14 +115,28 @@ cell dict_set_builder(cell dict, int key_len, slice index, builder value) asm(va (cell, ()) ~dict_set_builder(cell dict, int key_len, slice index, builder value) asm(value index dict key_len) "DICTSETB"; (cell, int) udict_add_builder?(cell dict, int key_len, int index, builder value) asm(value index dict key_len) "DICTUADDB"; (cell, int) udict_replace_builder?(cell dict, int key_len, int index, builder value) asm(value index dict key_len) "DICTUREPLACEB"; +(cell, int) idict_add_builder?(cell dict, int key_len, int index, builder value) asm(value index dict key_len) "DICTIADDB"; +(cell, int) idict_replace_builder?(cell dict, int key_len, int index, builder value) asm(value index dict key_len) "DICTIREPLACEB"; (cell, int, slice, int) udict_delete_get_min(cell dict, int key_len) asm(-> 0 2 1 3) "DICTUREMMIN" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; (cell, (int, slice, int)) ~udict::delete_get_min(cell dict, int key_len) asm(-> 0 2 1 3) "DICTUREMMIN" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; +(cell, int, slice, int) idict_delete_get_min(cell dict, int key_len) asm(-> 0 2 1 3) "DICTIREMMIN" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; +(cell, (int, slice, int)) ~idict::delete_get_min(cell dict, int key_len) asm(-> 0 2 1 3) "DICTIREMMIN" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; (cell, slice, slice, int) dict_delete_get_min(cell dict, int key_len) asm(-> 0 2 1 3) "DICTREMMIN" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; (cell, (slice, slice, int)) ~dict::delete_get_min(cell dict, int key_len) asm(-> 0 2 1 3) "DICTREMMIN" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; +(cell, int, slice, int) udict_delete_get_max(cell dict, int key_len) asm(-> 0 2 1 3) "DICTUREMMAX" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; +(cell, (int, slice, int)) ~udict::delete_get_max(cell dict, int key_len) asm(-> 0 2 1 3) "DICTUREMMAX" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; +(cell, int, slice, int) idict_delete_get_max(cell dict, int key_len) asm(-> 0 2 1 3) "DICTIREMMAX" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; +(cell, (int, slice, int)) ~idict::delete_get_max(cell dict, int key_len) asm(-> 0 2 1 3) "DICTIREMMAX" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; +(cell, slice, slice, int) dict_delete_get_max(cell dict, int key_len) asm(-> 0 2 1 3) "DICTREMMAX" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; +(cell, (slice, slice, int)) ~dict::delete_get_max(cell dict, int key_len) asm(-> 0 2 1 3) "DICTREMMAX" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; (int, slice, int) udict_get_next?(cell dict, int key_len, int pivot) asm(pivot dict key_len -> 1 0 2) "DICTUGETNEXT" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; +(int, slice, int) udict_get_nexteq?(cell dict, int key_len, int pivot) asm(pivot dict key_len -> 1 0 2) "DICTUGETNEXTEQ" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; (int, slice, int) udict_get_prev?(cell dict, int key_len, int pivot) asm(pivot dict key_len -> 1 0 2) "DICTUGETPREV" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; +(int, slice, int) udict_get_preveq?(cell dict, int key_len, int pivot) asm(pivot dict key_len -> 1 0 2) "DICTUGETPREVEQ" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; (int, slice, int) idict_get_next?(cell dict, int key_len, int pivot) asm(pivot dict key_len -> 1 0 2) "DICTIGETNEXT" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; +(int, slice, int) idict_get_nexteq?(cell dict, int key_len, int pivot) asm(pivot dict key_len -> 1 0 2) "DICTIGETNEXTEQ" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; (int, slice, int) idict_get_prev?(cell dict, int key_len, int pivot) asm(pivot dict key_len -> 1 0 2) "DICTIGETPREV" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; +(int, slice, int) idict_get_preveq?(cell dict, int key_len, int pivot) asm(pivot dict key_len -> 1 0 2) "DICTIGETPREVEQ" "NULLSWAPIFNOT" "NULLSWAPIFNOT"; cell new_dict() asm "NEWDICT"; int dict_empty?(cell c) asm "DICTEMPTY"; diff --git a/submodules/ton/tonlib-src/crypto/smartcont/testgiver.fif b/submodules/ton/tonlib-src/crypto/smartcont/testgiver.fif old mode 100644 new mode 100755 index fe812487a5..c48735aca1 --- a/submodules/ton/tonlib-src/crypto/smartcont/testgiver.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/testgiver.fif @@ -1,4 +1,4 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include { ."usage: " @' $0 type ." []" cr diff --git a/submodules/ton/tonlib-src/crypto/smartcont/update-config-smc.fif b/submodules/ton/tonlib-src/crypto/smartcont/update-config-smc.fif old mode 100644 new mode 100755 index 22f01f0456..33e5fbcebc --- a/submodules/ton/tonlib-src/crypto/smartcont/update-config-smc.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/update-config-smc.fif @@ -1,8 +1,8 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include { ."usage: " @' $0 type ." []" cr - ."Creates a request to simple configuration smart contract requesting to change configuration smart contract code to the one currently stored in config-code.fif, " + ."Creates a request to simple configuration smart contract requesting to change configuration smart contract code to the one currently stored in auto/config-code.fif, " ."with private key loaded from file .pk, " ."and saves it into .boc ('config-query.boc' by default)" cr 1 halt } : usage @@ -12,7 +12,7 @@ $# dup 2 < swap 3 > or ' usage if 0 constant seqno -1 constant idx true constant bounce -"config-code.fif" constant config-source +"auto/config-code.fif" constant config-source 100 constant interval // valid for 100 seconds $1 =: file-base diff --git a/submodules/ton/tonlib-src/crypto/smartcont/update-config.fif b/submodules/ton/tonlib-src/crypto/smartcont/update-config.fif old mode 100644 new mode 100755 index f58b5cf4f1..fcb8cf161b --- a/submodules/ton/tonlib-src/crypto/smartcont/update-config.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/update-config.fif @@ -1,4 +1,4 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include { ."usage: " @' $0 type ." []" cr diff --git a/submodules/ton/tonlib-src/crypto/smartcont/update-elector-smc.fif b/submodules/ton/tonlib-src/crypto/smartcont/update-elector-smc.fif old mode 100644 new mode 100755 index 2531345e1e..b9ce501f3f --- a/submodules/ton/tonlib-src/crypto/smartcont/update-elector-smc.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/update-elector-smc.fif @@ -1,8 +1,8 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include { ."usage: " @' $0 type ." []" cr - ."Creates a request to simple configuration smart contract requesting to change elector smart contract code to the one currently stored in elector-code.fif, " + ."Creates a request to simple configuration smart contract requesting to change elector smart contract code to the one currently stored in auto/elector-code.fif, " ."with private key loaded from file .pk, " ."and saves it into .boc ('config-query.boc' by default)" cr 1 halt } : usage @@ -12,7 +12,7 @@ $# dup 2 < swap 3 > or ' usage if 0 constant seqno -1 constant idx true constant bounce -"elector-code.fif" constant elector-source +"auto/elector-code.fif" constant elector-source 100 constant interval // valid for 100 seconds $1 =: file-base diff --git a/submodules/ton/tonlib-src/crypto/smartcont/validator-elect-req.fif b/submodules/ton/tonlib-src/crypto/smartcont/validator-elect-req.fif old mode 100644 new mode 100755 index c2aca4b5b6..215fe9c15c --- a/submodules/ton/tonlib-src/crypto/smartcont/validator-elect-req.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/validator-elect-req.fif @@ -1,4 +1,4 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include { ."usage: " @' $0 type ." []" cr diff --git a/submodules/ton/tonlib-src/crypto/smartcont/validator-elect-signed.fif b/submodules/ton/tonlib-src/crypto/smartcont/validator-elect-signed.fif old mode 100644 new mode 100755 index 9755bfac67..55e3d9ddac --- a/submodules/ton/tonlib-src/crypto/smartcont/validator-elect-signed.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/validator-elect-signed.fif @@ -1,4 +1,4 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include { ."usage: " @' $0 type ." []" cr diff --git a/submodules/ton/tonlib-src/crypto/smartcont/wallet-v2.fif b/submodules/ton/tonlib-src/crypto/smartcont/wallet-v2.fif old mode 100644 new mode 100755 index 910f7d41f1..3d36643b45 --- a/submodules/ton/tonlib-src/crypto/smartcont/wallet-v2.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/wallet-v2.fif @@ -1,4 +1,4 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include { ."usage: " @' $0 type ." [-B ] []" cr diff --git a/submodules/ton/tonlib-src/crypto/smartcont/wallet.fif b/submodules/ton/tonlib-src/crypto/smartcont/wallet.fif old mode 100644 new mode 100755 index 59dbf71c28..f4eb280255 --- a/submodules/ton/tonlib-src/crypto/smartcont/wallet.fif +++ b/submodules/ton/tonlib-src/crypto/smartcont/wallet.fif @@ -1,12 +1,17 @@ -#!/usr/bin/env fift -s +#!/usr/bin/fift -s "TonUtil.fif" include -{ ."usage: " @' $0 type ." [-B ] []" cr +{ ."usage: " @' $0 type ." [-B ] [-C ] []" cr ."Creates a request to simple wallet created by new-wallet.fif, with private key loaded from file .pk " ."and address from .addr, and saves it into .boc ('wallet-query.boc' by default)" cr 1 halt } : usage -def? $6 { @' $5 "-B" $= { @' $6 =: body-boc-file [forget] $6 def? $7 { @' $7 =: $5 [forget] $7 } { [forget] $5 } cond - @' $# 2- =: $# } if } if +"" =: comment // comment for simple transfers +def? $6 { @' $5 dup "-B" $= swap "-C" $= tuck or + { @' $6 swap { =: comment } { =: body-boc-file } cond [forget] $6 + def? $7 { @' $7 =: $5 [forget] $7 } { [forget] $5 } cond + @' $# 2- =: $# + } if +} if $# dup 4 < swap 5 > or ' usage if true constant bounce @@ -17,13 +22,14 @@ $3 parse-int =: seqno $4 $>GR =: amount def? $5 { @' $5 } { "wallet-query" } cond constant savefile 3 constant send-mode // mode for SENDRAWMSG: +1 - sender pays fees, +2 - ignore errors +// "" 1 { 69091 * 1+ 65535 and tuck 2521 / 65 + hold swap } 1000 times drop =: comment file-base +".addr" load-address 2dup 2constant wallet_addr ."Source wallet address = " 2dup .addr cr 6 .Addr cr file-base +".pk" load-keypair nip constant wallet_pk -def? body-boc-file { @' body-boc-file file>B B>boc } { } cond +def? body-boc-file { @' body-boc-file file>B B>boc } { comment simple-transfer-body } cond constant body-cell ."Transferring " amount .GR ."to account " diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/GenericAccount.cpp b/submodules/ton/tonlib-src/crypto/smc-envelope/GenericAccount.cpp new file mode 100644 index 0000000000..20750fcbad --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/GenericAccount.cpp @@ -0,0 +1,99 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#include "GenericAccount.h" + +#include "block/block-auto.h" +#include "block/block-parse.h" +namespace ton { +td::Ref GenericAccount::get_init_state(td::Ref code, td::Ref data) noexcept { + return vm::CellBuilder() + .store_zeroes(2) + .store_ones(2) + .store_zeroes(1) + .store_ref(std::move(code)) + .store_ref(std::move(data)) + .finalize(); +} +block::StdAddress GenericAccount::get_address(ton::WorkchainId workchain_id, + const td::Ref& init_state) noexcept { + return block::StdAddress(workchain_id, init_state->get_hash().bits(), true /*bounce*/); +} + +void GenericAccount::store_int_message(vm::CellBuilder& cb, const block::StdAddress& dest_address, td::int64 gramms) { + td::BigInt256 dest_addr; + dest_addr.import_bits(dest_address.addr.as_bitslice()); + cb.store_zeroes(1) + .store_ones(1) + .store_long(dest_address.bounceable, 1) + .store_zeroes(3) + .store_ones(1) + .store_zeroes(2) + .store_long(dest_address.workchain, 8) + .store_int256(dest_addr, 256); + block::tlb::t_Grams.store_integer_value(cb, td::BigInt256(gramms)); + cb.store_zeroes(9 + 64 + 32 + 1 + 1); +} + +td::Ref GenericAccount::create_ext_message(const block::StdAddress& address, td::Ref new_state, + td::Ref body) noexcept { + block::gen::Message::Record message; + /*info*/ { + block::gen::CommonMsgInfo::Record_ext_in_msg_info info; + /* src */ + tlb::csr_pack(info.src, block::gen::MsgAddressExt::Record_addr_none{}); + /* dest */ { + block::gen::MsgAddressInt::Record_addr_std dest; + dest.anycast = vm::CellBuilder().store_zeroes(1).as_cellslice_ref(); + dest.workchain_id = address.workchain; + dest.address = address.addr; + + tlb::csr_pack(info.dest, dest); + } + /* import_fee */ { + vm::CellBuilder cb; + block::tlb::t_Grams.store_integer_value(cb, td::BigInt256(0)); + info.import_fee = cb.as_cellslice_ref(); + } + + tlb::csr_pack(message.info, info); + } + /* init */ { + if (new_state.not_null()) { + // Just(Left(new_state)) + message.init = vm::CellBuilder() + .store_ones(1) + .store_zeroes(1) + .append_cellslice(vm::load_cell_slice(new_state)) + .as_cellslice_ref(); + } else { + message.init = vm::CellBuilder().store_zeroes(1).as_cellslice_ref(); + CHECK(message.init.not_null()); + } + } + /* body */ { + message.body = vm::CellBuilder().store_zeroes(1).append_cellslice(vm::load_cell_slice_ref(body)).as_cellslice_ref(); + } + + td::Ref res; + tlb::type_pack_cell(res, block::gen::t_Message_Any, message); + CHECK(res.not_null()); + + return res; +} +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/GenericAccount.h b/submodules/ton/tonlib-src/crypto/smc-envelope/GenericAccount.h new file mode 100644 index 0000000000..003b8e1b76 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/GenericAccount.h @@ -0,0 +1,31 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#pragma once +#include "vm/cells.h" +#include "block/block.h" +namespace ton { +class GenericAccount { + public: + static td::Ref get_init_state(td::Ref code, td::Ref data) noexcept; + static block::StdAddress get_address(ton::WorkchainId workchain_id, const td::Ref& init_state) noexcept; + static td::Ref create_ext_message(const block::StdAddress& address, td::Ref new_state, + td::Ref body) noexcept; + static void store_int_message(vm::CellBuilder& cb, const block::StdAddress& dest_address, td::int64 gramms); +}; +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/MultisigWallet.cpp b/submodules/ton/tonlib-src/crypto/smc-envelope/MultisigWallet.cpp new file mode 100644 index 0000000000..36830179c5 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/MultisigWallet.cpp @@ -0,0 +1,171 @@ +#include "MultisigWallet.h" + +#include "SmartContractCode.h" + +#include "vm/dict.h" + +#include "td/utils/misc.h" + +namespace ton { + +MultisigWallet::QueryBuilder::QueryBuilder(td::int64 query_id, td::Ref msg, int mode) { + msg_ = vm::CellBuilder().store_long(query_id, 64).store_long(mode, 8).store_ref(std::move(msg)).finalize(); +} +void MultisigWallet::QueryBuilder::sign(td::int32 id, td::Ed25519::PrivateKey& pk) { + CHECK(id < td::narrow_cast(mask_.size())); + auto signature = pk.sign(msg_->get_hash().as_slice()).move_as_ok(); + mask_.set(id); + vm::CellBuilder cb; + cb.store_bytes(signature.as_slice()); + cb.store_long(id, 8); + cb.ensure_throw(cb.store_maybe_ref(std::move(dict_))); + dict_ = cb.finalize(); +} + +td::Ref MultisigWallet::QueryBuilder::create_inner() const { + vm::CellBuilder cb; + cb.ensure_throw(cb.store_maybe_ref(dict_)); + return cb.append_cellslice(vm::load_cell_slice(msg_)).finalize(); +} + +td::Ref MultisigWallet::QueryBuilder::create(td::int32 id, td::Ed25519::PrivateKey& pk) const { + auto cell = create_inner(); + vm::CellBuilder cb; + cb.store_long(id, 8); + cb.append_cellslice(vm::load_cell_slice(cell)); + cell = cb.finalize(); + + auto signature = pk.sign(cell->get_hash().as_slice()).move_as_ok(); + vm::CellBuilder cb2; + cb2.store_bytes(signature.as_slice()); + cb2.append_cellslice(vm::load_cell_slice(cell)); + return cb2.finalize(); +} + +td::Ref MultisigWallet::create(td::Ref data) { + return td::Ref(true, State{ton::SmartContractCode::multisig(), std::move(data)}); +} + +int MultisigWallet::processed(td::uint64 query_id) const { + auto res = run_get_method("processed?", {td::make_refint(query_id)}); + return res.stack.write().pop_smallint_range(1, -1); +} + +MultisigWallet::QueryState MultisigWallet::get_query_state(td::uint64 query_id) const { + auto ans = run_get_method("get_query_state", {td::make_refint(query_id)}); + + auto mask = ans.stack.write().pop_int(); + auto state = ans.stack.write().pop_smallint_range(1, -1); + + QueryState res; + if (state == 1) { + res.state = QueryState::Unknown; + } else if (state == 0) { + res.state = QueryState::NotReady; + for (size_t i = 0; i < res.mask.size(); i++) { + if (mask->get_bit(static_cast(i))) { + res.mask.set(i); + } + } + } else { + res.state = QueryState::Sent; + } + return res; +} + +std::vector MultisigWallet::get_public_keys() const { + auto ans = run_get_method("get_public_keys"); + auto dict_root = ans.stack.write().pop_cell(); + vm::Dictionary dict(std::move(dict_root), 8); + std::vector res; + dict.check_for_each([&](auto cs, auto x, auto y) { + td::SecureString key(32); + cs->prefetch_bytes(key.as_mutable_slice().ubegin(), td::narrow_cast(key.size())); + res.push_back(std::move(key)); + return true; + }); + return res; +} + +td::Ref MultisigWallet::create_init_data(std::vector public_keys, int k) const { + vm::Dictionary pk(8); + for (size_t i = 0; i < public_keys.size(); i++) { + auto key = pk.integer_key(td::make_refint(i), 8, false); + pk.set_builder(key.bits(), 8, vm::CellBuilder().store_bytes(public_keys[i].as_slice())); + } + auto res = run_get_method("create_init_state", + {td::make_refint(public_keys.size()), td::make_refint(k), pk.get_root_cell()}); + CHECK(res.code == 0); + return res.stack.write().pop_cell(); +} + +td::Ref MultisigWallet::create_init_data_fast(std::vector public_keys, int k) { + vm::Dictionary pk(8); + for (size_t i = 0; i < public_keys.size(); i++) { + auto key = pk.integer_key(td::make_refint(i), 8, false); + pk.set_builder(key.bits(), 8, vm::CellBuilder().store_bytes(public_keys[i].as_slice())); + } + + vm::CellBuilder cb; + cb.store_long(public_keys.size(), 8).store_long(k, 8).store_long(0, 64); + cb.ensure_throw(cb.store_maybe_ref(pk.get_root_cell())); + cb.ensure_throw(cb.store_maybe_ref({})); + return cb.finalize(); +} + +td::Ref MultisigWallet::merge_queries(td::Ref a, td::Ref b) const { + auto res = run_get_method("merge_queries", {a, b}); + return res.stack.write().pop_cell(); +} + +MultisigWallet::Mask MultisigWallet::to_mask(td::RefInt256 mask) const { + Mask res_mask; + for (size_t i = 0; i < res_mask.size(); i++) { + if (mask->get_bit(static_cast(i))) { + res_mask.set(i); + } + } + return res_mask; +} + +std::pair MultisigWallet::check_query_signatures(td::Ref a) const { + auto ans = run_get_method("check_query_signatures", {a}); + + auto mask = ans.stack.write().pop_int(); + auto cnt = ans.stack.write().pop_smallint_range(128); + return std::make_pair(cnt, to_mask(mask)); +} + +std::pair MultisigWallet::get_n_k() const { + auto ans = run_get_method("get_n_k"); + auto k = ans.stack.write().pop_smallint_range(128); + auto n = ans.stack.write().pop_smallint_range(128); + return std::make_pair(n, k); +} + +std::vector MultisigWallet::get_unsigned_messaged(int id) const { + SmartContract::Answer ans; + if (id == -1) { + ans = run_get_method("get_messages_unsigned"); + } else { + ans = run_get_method("get_messages_unsigned_by_id", {td::make_refint(id)}); + } + auto n_k = get_n_k(); + + auto cell = ans.stack.write().pop_maybe_cell(); + vm::Dictionary dict(std::move(cell), 64); + std::vector res; + dict.check_for_each([&](auto cs, auto ptr, auto ptr_bits) { + cs.write().skip_first(8); + Message message; + td::BigInt256 query_id; + query_id.import_bits(ptr, ptr_bits, false); + message.query_id = static_cast(query_id.to_long()); + message.signed_by = to_mask(cs.write().fetch_int256(n_k.first, false)); + message.message = cs.write().fetch_ref(); + res.push_back(std::move(message)); + return true; + }); + return res; +} +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/MultisigWallet.h b/submodules/ton/tonlib-src/crypto/smc-envelope/MultisigWallet.h new file mode 100644 index 0000000000..10c6d07604 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/MultisigWallet.h @@ -0,0 +1,64 @@ +#pragma once +#include "vm/cells.h" + +#include "SmartContract.h" +#include "Ed25519.h" + +#include + +namespace ton { +class MultisigWallet : public ton::SmartContract { + public: + MultisigWallet(State state) : SmartContract(std::move(state)) { + } + + using Mask = std::bitset<128>; + struct QueryState { + enum State { Unknown, NotReady, Sent } state = Unknown; + Mask mask; + }; + + class QueryBuilder { + public: + QueryBuilder(td::int64 query_id, td::Ref msg, int mode = 3); + void sign(td::int32 id, td::Ed25519::PrivateKey& pk); + + td::Ref create_inner() const; + td::Ref create(td::int32 id, td::Ed25519::PrivateKey& pk) const; + Mask get_mask() const { + return mask_; + } + + private: + vm::Ref dict_; + td::Ref msg_; + Mask mask_; + }; + + MultisigWallet* make_copy() const override { + return new MultisigWallet{state_}; + } + + // creation + static td::Ref create(td::Ref data = {}); + + td::Ref create_init_data(std::vector public_keys, int k) const; + static td::Ref create_init_data_fast(std::vector public_keys, int k); + + // get methods + int processed(td::uint64 query_id) const; + QueryState get_query_state(td::uint64 query_id) const; + std::vector get_public_keys() const; + td::Ref merge_queries(td::Ref a, td::Ref b) const; + std::pair check_query_signatures(td::Ref a) const; + std::pair get_n_k() const; + Mask to_mask(td::RefInt256 mask) const; + + struct Message { + td::uint64 query_id; + Mask signed_by; + td::Ref message; + }; + std::vector get_unsigned_messaged(int id = -1) const; +}; +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/SmartContract.cpp b/submodules/ton/tonlib-src/crypto/smc-envelope/SmartContract.cpp new file mode 100644 index 0000000000..ea76423763 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/SmartContract.cpp @@ -0,0 +1,188 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#include "SmartContract.h" + +#include "GenericAccount.h" + +#include "block/block.h" +#include "block/block-auto.h" +#include "vm/cellslice.h" +#include "vm/cp0.h" +#include "vm/continuation.h" + +#include "td/utils/crypto.h" + +namespace ton { +namespace { +td::int32 get_method_id(td::Slice method_name) { + unsigned crc = td::crc16(method_name); + return (crc & 0xffff) | 0x10000; +} +td::Ref prepare_vm_stack(td::Ref body) { + td::Ref stack_ref{true}; + td::RefInt256 acc_addr{true}; + //CHECK(acc_addr.write().import_bits(account.addr.cbits(), 256)); + vm::Stack& stack = stack_ref.write(); + stack.push_int(td::RefInt256{true, 10000000000}); + stack.push_int(td::RefInt256{true, 10000000000}); + stack.push_cell(vm::CellBuilder().finalize()); + stack.push_cellslice(std::move(body)); + return stack_ref; +} + +td::Ref prepare_vm_c7() { + // TODO: fix initialization of c7 + td::BitArray<256> rand_seed; + rand_seed.as_slice().fill(0); + td::RefInt256 rand_seed_int{true}; + rand_seed_int.unique_write().import_bits(rand_seed.cbits(), 256, false); + auto tuple = vm::make_tuple_ref( + td::make_refint(0x076ef1ea), // [ magic:0x076ef1ea + td::make_refint(0), // actions:Integer + td::make_refint(0), // msgs_sent:Integer + td::make_refint(0), // unixtime:Integer + td::make_refint(0), // block_lt:Integer + td::make_refint(0), // trans_lt:Integer + std::move(rand_seed_int), // rand_seed:Integer + block::CurrencyCollection(1000000000).as_vm_tuple(), // balance_remaining:[Integer (Maybe Cell)] + vm::load_cell_slice_ref(vm::CellBuilder().finalize()) // myself:MsgAddressInt + //vm::StackEntry::maybe(td::Ref()) + ); // global_config:(Maybe Cell) ] = SmartContractInfo; + //LOG(DEBUG) << "SmartContractInfo initialized with " << vm::StackEntry(tuple).to_string(); + return vm::make_tuple_ref(std::move(tuple)); +} + +SmartContract::Answer run_smartcont(SmartContract::State state, td::Ref stack, td::Ref c7, + vm::GasLimits gas, bool ignore_chksig) { + auto gas_credit = gas.gas_credit; + vm::init_op_cp0(); + vm::DictionaryBase::get_empty_dictionary(); + + class Logger : public td::LogInterface { + public: + void append(td::CSlice slice) override { + res.append(slice.data(), slice.size()); + } + std::string res; + }; + Logger logger; + vm::VmLog log{&logger, td::LogOptions::plain()}; + + if (GET_VERBOSITY_LEVEL() >= VERBOSITY_NAME(DEBUG)) { + log.log_options.level = 4; + log.log_options.fix_newlines = true; + log.log_mask |= vm::VmLog::DumpStack; + } else { + log.log_options.level = 0; + log.log_mask = 0; + } + + SmartContract::Answer res; + vm::VmState vm{state.code, std::move(stack), gas, 1, state.data, log}; + vm.set_c7(std::move(c7)); + vm.set_chksig_always_succeed(ignore_chksig); + try { + res.code = ~vm.run(); + } catch (...) { + LOG(FATAL) << "catch unhandled exception"; + } + res.new_state = std::move(state); + res.stack = vm.get_stack_ref(); + gas = vm.get_gas_limits(); + res.gas_used = gas.gas_consumed(); + res.accepted = gas.gas_credit == 0; + res.success = (res.accepted && (unsigned)res.code <= 1); + if (GET_VERBOSITY_LEVEL() >= VERBOSITY_NAME(DEBUG)) { + LOG(DEBUG) << "VM log\n" << logger.res; + std::ostringstream os; + res.stack->dump(os); + LOG(DEBUG) << "VM stack:\n" << os.str(); + LOG(DEBUG) << "VM exit code: " << res.code; + LOG(DEBUG) << "VM accepted: " << res.accepted; + LOG(DEBUG) << "VM success: " << res.success; + } + if (res.success) { + res.new_state.data = vm.get_c4(); + res.actions = vm.get_d(5); + } + LOG_IF(ERROR, gas_credit != 0 && (res.accepted && !res.success)) + << "Accepted but failed with code " << res.code << "\n" + << res.gas_used << "\n"; + return res; +} +} // namespace + +td::Ref SmartContract::empty_slice() { + return vm::load_cell_slice_ref(vm::CellBuilder().finalize()); +} + +size_t SmartContract::code_size() const { + return vm::std_boc_serialize(state_.code).ok().size(); +} +size_t SmartContract::data_size() const { + return vm::std_boc_serialize(state_.data).ok().size(); +} + +block::StdAddress SmartContract::get_address(WorkchainId workchain_id) const { + return GenericAccount::get_address(workchain_id, get_init_state()); +} + +td::Ref SmartContract::get_init_state() const { + return GenericAccount::get_init_state(get_state().code, get_state().data); +} + +SmartContract::Answer SmartContract::run_method(Args args) { + if (!args.c7) { + args.c7 = prepare_vm_c7(); + } + if (!args.limits) { + args.limits = vm::GasLimits{(long long)0, (long long)1000000, (long long)10000}; + } + CHECK(args.stack); + CHECK(args.method_id); + args.stack.value().write().push_smallint(args.method_id.unwrap()); + auto res = + run_smartcont(get_state(), args.stack.unwrap(), args.c7.unwrap(), args.limits.unwrap(), args.ignore_chksig); + state_ = res.new_state; + return res; +} + +SmartContract::Answer SmartContract::run_get_method(Args args) const { + if (!args.c7) { + args.c7 = prepare_vm_c7(); + } + if (!args.limits) { + args.limits = vm::GasLimits{1000000}; + } + if (!args.stack) { + args.stack = td::Ref(true); + } + CHECK(args.method_id); + args.stack.value().write().push_smallint(args.method_id.unwrap()); + return run_smartcont(get_state(), args.stack.unwrap(), args.c7.unwrap(), args.limits.unwrap(), args.ignore_chksig); +} + +SmartContract::Answer SmartContract::run_get_method(td::Slice method, Args args) const { + return run_get_method(args.set_method_id(method)); +} + +SmartContract::Answer SmartContract::send_external_message(td::Ref cell, Args args) { + return run_method(args.set_stack(prepare_vm_stack(vm::load_cell_slice_ref(cell))).set_method_id(-1)); +} +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/SmartContract.h b/submodules/ton/tonlib-src/crypto/smc-envelope/SmartContract.h new file mode 100644 index 0000000000..d586436195 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/SmartContract.h @@ -0,0 +1,116 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#pragma once + +#include "vm/cells.h" +#include "vm/stack.hpp" +#include "vm/continuation.h" + +#include "td/utils/optional.h" +#include "td/utils/crypto.h" + +#include "block/block.h" + +namespace ton { +class SmartContract : public td::CntObject { + static td::Ref empty_slice(); + + public: + struct State { + td::Ref code; + td::Ref data; + }; + + SmartContract(State state) : state_(std::move(state)) { + } + + struct Answer { + SmartContract::State new_state; + bool accepted; + bool success; + td::Ref stack; + td::Ref actions; + td::int32 code; + td::int64 gas_used; + }; + + struct Args { + td::optional method_id; + td::optional limits; + td::optional> c7; + td::optional> stack; + bool ignore_chksig{false}; + + Args() { + } + Args(std::initializer_list stack) + : stack(td::Ref(true, std::vector(std::move(stack)))) { + } + Args&& set_method_id(td::Slice method_name) { + unsigned crc = td::crc16(method_name); + return set_method_id((crc & 0xffff) | 0x10000); + } + Args&& set_method_id(td::int32 method_id) { + this->method_id = method_id; + return std::move(*this); + } + Args&& set_limits(vm::GasLimits limits) { + this->limits = std::move(limits); + return std::move(*this); + } + Args&& set_c7(td::Ref c7) { + this->c7 = std::move(c7); + return std::move(*this); + } + Args&& set_stack(std::vector stack) { + this->stack = td::Ref(true, std::move(stack)); + return std::move(*this); + } + Args&& set_stack(td::Ref stack) { + this->stack = std::move(stack); + return std::move(*this); + } + Args&& set_ignore_chksig(bool ignore_chksig) { + this->ignore_chksig = ignore_chksig; + return std::move(*this); + } + }; + + Answer run_method(Args args = {}); + Answer run_get_method(Args args = {}) const; + Answer run_get_method(td::Slice method, Args args = {}) const; + Answer send_external_message(td::Ref cell, Args args = {}); + + size_t code_size() const; + size_t data_size() const; + static td::Ref create(State state) { + return td::Ref{true, std::move(state)}; + } + + block::StdAddress get_address(WorkchainId workchain_id = basechainId) const; + td::Ref get_init_state() const; + + const State& get_state() const { + return state_; + } + + protected: + State state_; +}; +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/SmartContractCode.cpp b/submodules/ton/tonlib-src/crypto/smc-envelope/SmartContractCode.cpp new file mode 100644 index 0000000000..c187131d71 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/SmartContractCode.cpp @@ -0,0 +1,72 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#include "SmartContractCode.h" + +#include "vm/boc.h" +#include + +#include "td/utils/base64.h" + +namespace ton { +namespace { +const auto& get_map() { + static auto map = [] { + class Cmp : public std::less<> { + public: + using is_transparent = void; + }; + std::map, Cmp> map; + auto with_tvm_code = [&](auto name, td::Slice code_str) { + map[name] = vm::std_boc_deserialize(td::base64_decode(code_str).move_as_ok()).move_as_ok(); + }; +#include "smartcont/auto/multisig-code.cpp" +#include "smartcont/auto/simple-wallet-ext-code.cpp" +#include "smartcont/auto/simple-wallet-code.cpp" +#include "smartcont/auto/wallet-code.cpp" + return map; + }(); + return map; +} +} // namespace + +td::Result> SmartContractCode::load(td::Slice name) { + auto& map = get_map(); + auto it = map.find(name); + if (it == map.end()) { + return td::Status::Error(PSLICE() << "Can't load td::refsecond; +} +td::Ref SmartContractCode::multisig() { + auto res = load("multisig").move_as_ok(); + return res; +} +td::Ref SmartContractCode::wallet() { + auto res = load("wallet").move_as_ok(); + return res; +} +td::Ref SmartContractCode::simple_wallet() { + auto res = load("simple-wallet").move_as_ok(); + return res; +} +td::Ref SmartContractCode::simple_wallet_ext() { + static auto res = load("simple-wallet-ext").move_as_ok(); + return res; +} +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/SmartContractCode.h b/submodules/ton/tonlib-src/crypto/smc-envelope/SmartContractCode.h new file mode 100644 index 0000000000..059215e445 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/SmartContractCode.h @@ -0,0 +1,30 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#include "vm/cells.h" + +namespace ton { +class SmartContractCode { + public: + static td::Result> load(td::Slice name); + static td::Ref multisig(); + static td::Ref wallet(); + static td::Ref simple_wallet(); + static td::Ref simple_wallet_ext(); +}; +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/TestGiver.cpp b/submodules/ton/tonlib-src/crypto/smc-envelope/TestGiver.cpp new file mode 100644 index 0000000000..2d44d73073 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/TestGiver.cpp @@ -0,0 +1,62 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#include "TestGiver.h" +#include "GenericAccount.h" + +#include "td/utils/base64.h" + +namespace ton { +const block::StdAddress& TestGiver::address() noexcept { + static block::StdAddress res = + block::StdAddress::parse("kf_8uRo6OBbQ97jCx2EIuKm8Wmt6Vb15-KsQHFLbKSMiYIny").move_as_ok(); + //static block::StdAddress res = + //block::StdAddress::parse("kf9tswzQaryeJ4aAYLy_phLhx4afF1aEvpUVak-2BuA0CmZi").move_as_ok(); + return res; +} + +vm::CellHash TestGiver::get_init_code_hash() noexcept { + return vm::CellHash::from_slice(td::base64_decode("wDkZp0yR4xo+9+BnuAPfGVjBzK6FPzqdv2DwRq3z3KE=").move_as_ok()); + //return vm::CellHash::from_slice(td::base64_decode("YV/IANhoI22HVeatFh6S5LbCHp+5OilARfzW+VQPZgQ=").move_as_ok()); +} + +td::Ref TestGiver::make_a_gift_message(td::uint32 seqno, td::uint64 gramms, td::Slice message, + const block::StdAddress& dest_address) noexcept { + vm::CellBuilder cb; + GenericAccount::store_int_message(cb, dest_address, gramms); + cb.store_bytes("\0\0\0\0", 4); + vm::CellString::store(cb, message, 35 * 8).ensure(); + auto message_inner = cb.finalize(); + return vm::CellBuilder().store_long(seqno, 32).store_long(1, 8).store_ref(message_inner).finalize(); +} + +td::Result TestGiver::get_seqno() const { + return TRY_VM(get_seqno_or_throw()); +} + +td::Result TestGiver::get_seqno_or_throw() const { + if (state_.data.is_null()) { + return 0; + } + auto seqno = vm::load_cell_slice(state_.data).fetch_ulong(32); + if (seqno == vm::CellSlice::fetch_ulong_eof) { + return td::Status::Error("Failed to parse seq_no"); + } + return static_cast(seqno); +} +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/TestGiver.h b/submodules/ton/tonlib-src/crypto/smc-envelope/TestGiver.h new file mode 100644 index 0000000000..210b691240 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/TestGiver.h @@ -0,0 +1,39 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#pragma once +#include "SmartContract.h" +#include "block/block.h" +#include "vm/cells/CellString.h" +namespace ton { +class TestGiver : public SmartContract { + public: + explicit TestGiver(State state) : ton::SmartContract(std::move(state)) { + } + static constexpr unsigned max_message_size = vm::CellString::max_bytes; + static const block::StdAddress& address() noexcept; + static vm::CellHash get_init_code_hash() noexcept; + static td::Ref make_a_gift_message(td::uint32 seqno, td::uint64 gramms, td::Slice message, + const block::StdAddress& dest_address) noexcept; + + td::Result get_seqno() const; + + private: + td::Result get_seqno_or_throw() const; +}; +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/TestWallet.cpp b/submodules/ton/tonlib-src/crypto/smc-envelope/TestWallet.cpp new file mode 100644 index 0000000000..1edf59f911 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/TestWallet.cpp @@ -0,0 +1,91 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . +Copyright 2017-2019 Telegram Systems LLP +*/ +#include "TestWallet.h" +#include "GenericAccount.h" + +#include "vm/boc.h" +#include "td/utils/base64.h" + +namespace ton { +td::Ref TestWallet::get_init_state(const td::Ed25519::PublicKey& public_key) noexcept { + auto code = get_init_code(); + auto data = get_init_data(public_key); + return GenericAccount::get_init_state(std::move(code), std::move(data)); +} + +td::Ref TestWallet::get_init_message(const td::Ed25519::PrivateKey& private_key) noexcept { + std::string seq_no(4, 0); + auto signature = + private_key.sign(vm::CellBuilder().store_bytes(seq_no).finalize()->get_hash().as_slice()).move_as_ok(); + return vm::CellBuilder().store_bytes(signature).store_bytes(seq_no).finalize(); +} + +td::Ref TestWallet::make_a_gift_message(const td::Ed25519::PrivateKey& private_key, td::uint32 seqno, + td::int64 gramms, td::Slice message, + const block::StdAddress& dest_address) noexcept { + td::int32 send_mode = 3; + if (gramms == -1) { + gramms = 0; + send_mode += 128; + } + vm::CellBuilder cb; + GenericAccount::store_int_message(cb, dest_address, gramms); + cb.store_bytes("\0\0\0\0", 4); + vm::CellString::store(cb, message, 35 * 8).ensure(); + auto message_inner = cb.finalize(); + auto message_outer = + vm::CellBuilder().store_long(seqno, 32).store_long(send_mode, 8).store_ref(message_inner).finalize(); + auto signature = private_key.sign(message_outer->get_hash().as_slice()).move_as_ok(); + return vm::CellBuilder().store_bytes(signature).append_cellslice(vm::load_cell_slice(message_outer)).finalize(); +} + +td::Ref TestWallet::get_init_code() noexcept { + static auto res = [] { + auto serialized_code = td::base64_decode( + "te6ccgEEAQEAAAAAUwAAov8AIN0gggFMl7qXMO1E0NcLH+Ck8mCBAgDXGCDXCx/tRNDTH9P/" + "0VESuvKhIvkBVBBE+RDyovgAAdMfMSDXSpbTB9QC+wDe0aTIyx/L/8ntVA==") + .move_as_ok(); + return vm::std_boc_deserialize(serialized_code).move_as_ok(); + }(); + return res; +} + +vm::CellHash TestWallet::get_init_code_hash() noexcept { + return get_init_code()->get_hash(); +} + +td::Ref TestWallet::get_init_data(const td::Ed25519::PublicKey& public_key) noexcept { + return vm::CellBuilder().store_long(0, 32).store_bytes(public_key.as_octet_string()).finalize(); +} + +td::Result TestWallet::get_seqno() const { + return TRY_VM(get_seqno_or_throw()); +} + +td::Result TestWallet::get_seqno_or_throw() const { + if (state_.data.is_null()) { + return 0; + } + auto seqno = vm::load_cell_slice(state_.data).fetch_ulong(32); + if (seqno == vm::CellSlice::fetch_ulong_eof) { + return td::Status::Error("Failed to parse seq_no"); + } + return static_cast(seqno); +} + +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/TestWallet.h b/submodules/ton/tonlib-src/crypto/smc-envelope/TestWallet.h new file mode 100644 index 0000000000..161aef58b5 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/TestWallet.h @@ -0,0 +1,48 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#pragma once + +#include "smc-envelope/SmartContract.h" +#include "vm/cells.h" +#include "Ed25519.h" +#include "block/block.h" +#include "vm/cells/CellString.h" + +namespace ton { +class TestWallet : public ton::SmartContract { + public: + explicit TestWallet(State state) : ton::SmartContract(std::move(state)) { + } + static constexpr unsigned max_message_size = vm::CellString::max_bytes; + static td::Ref get_init_state(const td::Ed25519::PublicKey& public_key) noexcept; + static td::Ref get_init_message(const td::Ed25519::PrivateKey& private_key) noexcept; + static td::Ref make_a_gift_message(const td::Ed25519::PrivateKey& private_key, td::uint32 seqno, + td::int64 gramms, td::Slice message, + const block::StdAddress& dest_address) noexcept; + + static td::Ref get_init_code() noexcept; + static vm::CellHash get_init_code_hash() noexcept; + static td::Ref get_init_data(const td::Ed25519::PublicKey& public_key) noexcept; + + td::Result get_seqno() const; + + private: + td::Result get_seqno_or_throw() const; +}; +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/Wallet.cpp b/submodules/ton/tonlib-src/crypto/smc-envelope/Wallet.cpp new file mode 100644 index 0000000000..61958ed959 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/Wallet.cpp @@ -0,0 +1,100 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#include "Wallet.h" +#include "GenericAccount.h" + +#include "vm/boc.h" +#include "vm/cells/CellString.h" +#include "td/utils/base64.h" + +#include + +namespace ton { +td::Ref Wallet::get_init_state(const td::Ed25519::PublicKey& public_key) noexcept { + auto code = get_init_code(); + auto data = get_init_data(public_key); + return GenericAccount::get_init_state(std::move(code), std::move(data)); +} + +td::Ref Wallet::get_init_message(const td::Ed25519::PrivateKey& private_key) noexcept { + td::uint32 seqno = 0; + td::uint32 valid_until = std::numeric_limits::max(); + auto signature = + private_key + .sign(vm::CellBuilder().store_long(seqno, 32).store_long(valid_until, 32).finalize()->get_hash().as_slice()) + .move_as_ok(); + return vm::CellBuilder().store_bytes(signature).store_long(seqno, 32).store_long(valid_until, 32).finalize(); +} + +td::Ref Wallet::make_a_gift_message(const td::Ed25519::PrivateKey& private_key, td::uint32 seqno, + td::uint32 valid_until, td::int64 gramms, td::Slice message, + const block::StdAddress& dest_address) noexcept { + td::int32 send_mode = 3; + if (gramms == -1) { + gramms = 0; + send_mode += 128; + } + vm::CellBuilder cb; + GenericAccount::store_int_message(cb, dest_address, gramms); + cb.store_bytes("\0\0\0\0", 4); + vm::CellString::store(cb, message, 35 * 8).ensure(); + auto message_inner = cb.finalize(); + + auto message_outer = vm::CellBuilder() + .store_long(seqno, 32) + .store_long(valid_until, 32) + .store_long(send_mode, 8) + .store_ref(message_inner) + .finalize(); + auto signature = private_key.sign(message_outer->get_hash().as_slice()).move_as_ok(); + return vm::CellBuilder().store_bytes(signature).append_cellslice(vm::load_cell_slice(message_outer)).finalize(); +} + +td::Ref Wallet::get_init_code() noexcept { + static auto res = [] { + auto serialized_code = td::base64_decode( + "te6ccgEEAQEAAAAAVwAAqv8AIN0gggFMl7qXMO1E0NcLH+Ck8mCDCNcYINMf0x8B+CO78mPtRNDTH9P/" + "0VExuvKhA/kBVBBC+RDyovgAApMg10qW0wfUAvsA6NGkyMsfy//J7VQ=") + .move_as_ok(); + return vm::std_boc_deserialize(serialized_code).move_as_ok(); + }(); + return res; +} + +vm::CellHash Wallet::get_init_code_hash() noexcept { + return get_init_code()->get_hash(); +} + +td::Ref Wallet::get_init_data(const td::Ed25519::PublicKey& public_key) noexcept { + return vm::CellBuilder().store_long(0, 32).store_bytes(public_key.as_octet_string()).finalize(); +} + +td::Result Wallet::get_seqno() const { + return TRY_VM(get_seqno_or_throw()); +} + +td::Result Wallet::get_seqno_or_throw() const { + if (state_.data.is_null()) { + return 0; + } + //FIXME use get method + return static_cast(vm::load_cell_slice(state_.data).fetch_ulong(32)); +} + +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/smc-envelope/Wallet.h b/submodules/ton/tonlib-src/crypto/smc-envelope/Wallet.h new file mode 100644 index 0000000000..7cd33c81d1 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/smc-envelope/Wallet.h @@ -0,0 +1,48 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#pragma once + +#include "smc-envelope/SmartContract.h" +#include "vm/cells.h" +#include "Ed25519.h" +#include "block/block.h" +#include "vm/cells/CellString.h" + +namespace ton { +class Wallet : ton::SmartContract { + public: + explicit Wallet(State state) : ton::SmartContract(std::move(state)) { + } + static constexpr unsigned max_message_size = vm::CellString::max_bytes; + static td::Ref get_init_state(const td::Ed25519::PublicKey& public_key) noexcept; + static td::Ref get_init_message(const td::Ed25519::PrivateKey& private_key) noexcept; + static td::Ref make_a_gift_message(const td::Ed25519::PrivateKey& private_key, td::uint32 seqno, + td::uint32 valid_until, td::int64 gramms, td::Slice message, + const block::StdAddress& dest_address) noexcept; + + static td::Ref get_init_code() noexcept; + static vm::CellHash get_init_code_hash() noexcept; + static td::Ref get_init_data(const td::Ed25519::PublicKey& public_key) noexcept; + + td::Result get_seqno() const; + + private: + td::Result get_seqno_or_throw() const; +}; +} // namespace ton diff --git a/submodules/ton/tonlib-src/crypto/test/Ed25519.cpp b/submodules/ton/tonlib-src/crypto/test/Ed25519.cpp index 4d943abbfd..f4509791c4 100644 --- a/submodules/ton/tonlib-src/crypto/test/Ed25519.cpp +++ b/submodules/ton/tonlib-src/crypto/test/Ed25519.cpp @@ -21,8 +21,12 @@ #include "td/utils/misc.h" #include "td/utils/Slice.h" #include "td/utils/tests.h" +#include "td/utils/JsonBuilder.h" + +#include "wycheproof.h" #include +#include unsigned char fixed_privkey[32] = "abacabadabacabaeabacabadabacaba"; unsigned char fixed_pubkey[32] = {0x6f, 0x9e, 0x5b, 0xde, 0xce, 0x87, 0x21, 0xeb, 0x57, 0x37, 0xfb, @@ -142,3 +146,74 @@ TEST(Crypto, ed25519) { assert(!std::memcmp(secret12, secret21, 32)); */ } + +TEST(Crypto, wycheproof) { + std::vector> bad_tests; + auto json_str = wycheproof_ed25519(); + auto value = td::json_decode(json_str).move_as_ok(); + auto &root = value.get_object(); + auto test_groups_o = get_json_object_field(root, "testGroups", td::JsonValue::Type::Array, false).move_as_ok(); + auto &test_groups = test_groups_o.get_array(); + auto from_hexc = [](char c) { + if (c >= '0' && c <= '9') { + return c - '0'; + } + return c - 'a' + 10; + }; + auto from_hex = [&](td::Slice s) { + CHECK(s.size() % 2 == 0); + std::string res(s.size() / 2, 0); + for (size_t i = 0; i < s.size(); i += 2) { + res[i / 2] = char(from_hexc(s[i]) * 16 + from_hexc(s[i + 1])); + } + return res; + }; + for (auto &test_o : test_groups) { + auto &test = test_o.get_object(); + auto key_o = get_json_object_field(test, "key", td::JsonValue::Type::Object, false).move_as_ok(); + auto sk_str = td::get_json_object_string_field(key_o.get_object(), "sk", false).move_as_ok(); + auto pk_str = td::get_json_object_string_field(key_o.get_object(), "pk", false).move_as_ok(); + auto pk = td::Ed25519::PublicKey(td::SecureString(from_hex(pk_str))); + auto sk = td::Ed25519::PrivateKey(td::SecureString(from_hex(sk_str))); + CHECK(sk.get_public_key().move_as_ok().as_octet_string().as_slice() == pk.as_octet_string().as_slice()); + + //auto key = + //td::Ed25519::PrivateKey::from_pem( + //td::SecureString(td::get_json_object_string_field(test, "keyPem", false).move_as_ok()), td::SecureString()) + //.move_as_ok(); + + auto tests_o = get_json_object_field(test, "tests", td::JsonValue::Type::Array, false).move_as_ok(); + auto &tests = tests_o.get_array(); + for (auto &test_o : tests) { + auto &test = test_o.get_object(); + auto id = td::get_json_object_string_field(test, "tcId", false).move_as_ok(); + auto comment = td::get_json_object_string_field(test, "comment", false).move_as_ok(); + auto sig = from_hex(td::get_json_object_string_field(test, "sig", false).move_as_ok()); + auto msg = from_hex(td::get_json_object_string_field(test, "msg", false).move_as_ok()); + auto result = td::get_json_object_string_field(test, "result", false).move_as_ok(); + auto has_result = pk.verify_signature(msg, sig).is_ok() ? "valid" : "invalid"; + if (result != has_result) { + bad_tests.push_back({id, comment}); + } + } + } + if (bad_tests.empty()) { + return; + } + LOG(ERROR) << "FAILED: " << td::format::as_array(bad_tests); +} + +TEST(Crypto, almost_zero) { + td::SecureString pub(32); + td::SecureString sig(64); + td::SecureString msg(1); + + pub.as_mutable_slice()[31] = (char)128; + for (td::int32 j = 0; j < 256; j++) { + msg.as_mutable_slice()[0] = (char)j; + if (td::Ed25519::PublicKey(pub.copy()).verify_signature(msg, sig).is_ok()) { + LOG(ERROR) << "FAILED: " << j; + break; + } + } +} diff --git a/submodules/ton/tonlib-src/crypto/test/fift.cpp b/submodules/ton/tonlib-src/crypto/test/fift.cpp index 59b912c34e..694dc7a83c 100644 --- a/submodules/ton/tonlib-src/crypto/test/fift.cpp +++ b/submodules/ton/tonlib-src/crypto/test/fift.cpp @@ -90,3 +90,23 @@ TEST(Fift, test) { TEST(Fift, bug_div) { run_fift("bug_div.fif"); } + +TEST(Fift, bug_ufits) { + run_fift("bug_ufits.fif"); +} + +TEST(Fift, test_dict) { + run_fift("testdict.fif"); +} + +TEST(Fift, test_fixed) { + run_fift("fixed.fif"); +} + +TEST(Fift, test_sort) { + run_fift("sort.fif"); +} + +TEST(Fift, test_sort2) { + run_fift("sort2.fif"); +} diff --git a/submodules/ton/tonlib-src/crypto/test/fift/bug_ufits.fif b/submodules/ton/tonlib-src/crypto/test/fift/bug_ufits.fif new file mode 100644 index 0000000000..6c607ea220 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/test/fift/bug_ufits.fif @@ -0,0 +1 @@ +100000000000000000 dup =: amount 56 ufits . amount 56 ufits . diff --git a/submodules/ton/tonlib-src/crypto/test/fift/testvm2.fif b/submodules/ton/tonlib-src/crypto/test/fift/testvm2.fif index 523c6a7d27..7e91a87701 100644 --- a/submodules/ton/tonlib-src/crypto/test/fift/testvm2.fif +++ b/submodules/ton/tonlib-src/crypto/test/fift/testvm2.fif @@ -17,6 +17,6 @@ x{917720ED50D8} runvmcode drop .s 20 x{9720C11401C20CB0D8} runvmcode drop .s x{E3C03077F001A4} x{3020A8} |_ runvmdict drop .s x{71B0E30277F001A4} x{20A8} |_ runvmdict .s -17 x{30ED44D0D71131A020C8CB3FC9ED54} runvm .s +17 0 x{30ED44D0D71131A020C8CB3FC9ED54} runvm .s 100 19 7 x{92A9069620C004F2F571F321A0} runvmcode .s 19 0 x{92A9069620C004F2F571F321A0} runvmcode .s diff --git a/submodules/ton/tonlib-src/crypto/test/test-db.cpp b/submodules/ton/tonlib-src/crypto/test/test-db.cpp index 28f05ff8e5..148a185494 100644 --- a/submodules/ton/tonlib-src/crypto/test/test-db.cpp +++ b/submodules/ton/tonlib-src/crypto/test/test-db.cpp @@ -51,34 +51,6 @@ #include -struct Step { - std::function func; - td::uint32 weight; -}; -class RandomSteps { - public: - RandomSteps(std::vector steps) : steps_(std::move(steps)) { - for (auto &step : steps_) { - steps_sum_ += step.weight; - } - } - template - void step(Random &rnd) { - auto w = rnd() % steps_sum_; - for (auto &step : steps_) { - if (w < step.weight) { - step.func(); - break; - } - w -= step.weight; - } - } - - private: - std::vector steps_; - td::int32 steps_sum_ = 0; -}; - namespace vm { std::vector do_get_serialization_modes() { @@ -879,7 +851,7 @@ TEST(TonDb, DynamicBoc2) { VLOG(boc) << " OK"; }; - RandomSteps steps({{new_root, 10}, {delete_root, 9}, {commit, 2}, {reset, 1}}); + td::RandomSteps steps({{new_root, 10}, {delete_root, 9}, {commit, 2}, {reset, 1}}); while (first_root_id != total_roots) { VLOG(boc) << first_root_id << " " << last_root_id << " " << kv->count("").ok(); steps.step(rnd); @@ -1732,7 +1704,7 @@ TEST(TonDb, CompactArray) { fast_array = vm::FastCompactArray(size); }; - RandomSteps steps({{reset_array, 1}, {set_value, 1000}, {validate, 10}, {validate_full, 2}, {flush_to_db, 1}}); + td::RandomSteps steps({{reset_array, 1}, {set_value, 1000}, {validate, 10}, {validate_full, 2}, {flush_to_db, 1}}); for (size_t t = 0; t < 100000; t++) { if (t % 10000 == 0) { LOG(ERROR) << t; diff --git a/submodules/ton/tonlib-src/crypto/test/test-smartcont.cpp b/submodules/ton/tonlib-src/crypto/test/test-smartcont.cpp new file mode 100644 index 0000000000..f9dd86522f --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/test/test-smartcont.cpp @@ -0,0 +1,524 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#include "vm/dict.h" +#include "common/bigint.hpp" + +#include "Ed25519.h" + +#include "block/block.h" + +#include "fift/Fift.h" +#include "fift/words.h" +#include "fift/utils.h" + +#include "smc-envelope/GenericAccount.h" +#include "smc-envelope/MultisigWallet.h" +#include "smc-envelope/SmartContract.h" +#include "smc-envelope/SmartContractCode.h" +#include "smc-envelope/TestGiver.h" +#include "smc-envelope/TestWallet.h" +#include "smc-envelope/Wallet.h" + +#include "td/utils/base64.h" +#include "td/utils/crypto.h" +#include "td/utils/Random.h" +#include "td/utils/tests.h" +#include "td/utils/ScopeGuard.h" +#include "td/utils/StringBuilder.h" +#include "td/utils/Timer.h" +#include "td/utils/PathView.h" +#include "td/utils/filesystem.h" +#include "td/utils/port/path.h" + +#include +#include +#include + +std::string current_dir() { + return td::PathView(td::realpath(__FILE__).move_as_ok()).parent_dir().str(); +} + +std::string load_source(std::string name) { + return td::read_file_str(current_dir() + "../../crypto/" + name).move_as_ok(); +} + +td::Ref get_test_wallet_source() { + std::string code = R"ABCD( +SETCP0 DUP IFNOTRET // return if recv_internal +DUP 85143 INT EQUAL IFJMP:<{ // "seqno" get-method + DROP c4 PUSHCTR CTOS 32 PLDU // cnt +}> +INC 32 THROWIF // fail unless recv_external +512 INT LDSLICEX DUP 32 PLDU // sign cs cnt +c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS // sign cs cnt cnt' pubk +s1 s2 XCPU // sign cs cnt pubk cnt' cnt +EQUAL 33 THROWIFNOT // ( seqno mismatch? ) +s2 PUSH HASHSU // sign cs cnt pubk hash +s0 s4 s4 XC2PU // pubk cs cnt hash sign pubk +CHKSIGNU // pubk cs cnt ? +34 THROWIFNOT // signature mismatch +ACCEPT +SWAP 32 LDU NIP +DUP SREFS IF:<{ + // 3 INT 35 LSHIFT# 3 INT RAWRESERVE // reserve all but 103 Grams from the balance + 8 LDU LDREF // pubk cnt mode msg cs + s0 s2 XCHG SENDRAWMSG // pubk cnt cs ; ( message sent ) +}> +ENDS +INC NEWC 32 STU 256 STU ENDC c4 POPCTR +)ABCD"; + return fift::compile_asm(code).move_as_ok(); +} + +td::Ref get_wallet_source() { + std::string code = R"ABCD( +SETCP0 DUP IFNOTRET // return if recv_internal + DUP 85143 INT EQUAL IFJMP:<{ // "seqno" get-method + DROP c4 PUSHCTR CTOS 32 PLDU // cnt + }> + INC 32 THROWIF // fail unless recv_external + 9 PUSHPOW2 LDSLICEX DUP 32 LDU 32 LDU // signature in_msg msg_seqno valid_until cs + SWAP NOW LEQ 35 THROWIF // signature in_msg msg_seqno cs + c4 PUSH CTOS 32 LDU 256 LDU ENDS // signature in_msg msg_seqno cs stored_seqno public_key + s3 s1 XCPU // signature in_msg public_key cs stored_seqno msg_seqno stored_seqno + EQUAL 33 THROWIFNOT // signature in_msg public_key cs stored_seqno + s0 s3 XCHG HASHSU // signature stored_seqno public_key cs hash + s0 s4 s2 XC2PU CHKSIGNU 34 THROWIFNOT // cs stored_seqno public_key + ACCEPT + s0 s2 XCHG // public_key stored_seqno cs + WHILE:<{ + DUP SREFS // public_key stored_seqno cs _40 + }>DO<{ // public_key stored_seqno cs + // 3 INT 35 LSHIFT# 3 INT RAWRESERVE // reserve all but 103 Grams from the balance + 8 LDU LDREF s0 s2 XCHG // public_key stored_seqno cs _45 mode + SENDRAWMSG // public_key stored_seqno cs + }> + ENDS INC // public_key seqno' + NEWC 32 STU 256 STU ENDC c4 POP +)ABCD"; + return fift::compile_asm(code).move_as_ok(); +} + +TEST(Tonlib, TestWallet) { + LOG(ERROR) << td::base64_encode(std_boc_serialize(get_test_wallet_source()).move_as_ok()); + CHECK(get_test_wallet_source()->get_hash() == ton::TestWallet::get_init_code()->get_hash()); + auto fift_output = fift::mem_run_fift(load_source("smartcont/new-wallet.fif"), {"aba", "0"}).move_as_ok(); + + auto new_wallet_pk = fift_output.source_lookup.read_file("new-wallet.pk").move_as_ok().data; + auto new_wallet_query = fift_output.source_lookup.read_file("new-wallet-query.boc").move_as_ok().data; + auto new_wallet_addr = fift_output.source_lookup.read_file("new-wallet.addr").move_as_ok().data; + + td::Ed25519::PrivateKey priv_key{td::SecureString{new_wallet_pk}}; + auto pub_key = priv_key.get_public_key().move_as_ok(); + auto init_state = ton::TestWallet::get_init_state(pub_key); + auto init_message = ton::TestWallet::get_init_message(priv_key); + auto address = ton::GenericAccount::get_address(0, init_state); + + CHECK(address.addr.as_slice() == td::Slice(new_wallet_addr).substr(0, 32)); + + td::Ref res = ton::GenericAccount::create_ext_message(address, init_state, init_message); + + LOG(ERROR) << "-------"; + vm::load_cell_slice(res).print_rec(std::cerr); + LOG(ERROR) << "-------"; + vm::load_cell_slice(vm::std_boc_deserialize(new_wallet_query).move_as_ok()).print_rec(std::cerr); + CHECK(vm::std_boc_deserialize(new_wallet_query).move_as_ok()->get_hash() == res->get_hash()); + + fift_output.source_lookup.write_file("/main.fif", load_source("smartcont/wallet.fif")).ensure(); + auto dest = block::StdAddress::parse("Ef9Tj6fMJP+OqhAdhKXxq36DL+HYSzCc3+9O6UNzqsgPfYFX").move_as_ok(); + fift_output = fift::mem_run_fift(std::move(fift_output.source_lookup), + {"aba", "new-wallet", "Ef9Tj6fMJP+OqhAdhKXxq36DL+HYSzCc3+9O6UNzqsgPfYFX", "123", + "321", "-C", "TEST"}) + .move_as_ok(); + auto wallet_query = fift_output.source_lookup.read_file("wallet-query.boc").move_as_ok().data; + auto gift_message = ton::GenericAccount::create_ext_message( + address, {}, ton::TestWallet::make_a_gift_message(priv_key, 123, 321000000000ll, "TEST", dest)); + LOG(ERROR) << "-------"; + vm::load_cell_slice(gift_message).print_rec(std::cerr); + LOG(ERROR) << "-------"; + vm::load_cell_slice(vm::std_boc_deserialize(wallet_query).move_as_ok()).print_rec(std::cerr); + CHECK(vm::std_boc_deserialize(wallet_query).move_as_ok()->get_hash() == gift_message->get_hash()); +} + +td::Ref get_wallet_source_fc() { + return fift::compile_asm(load_source("smartcont/wallet-code.fif"), "", false).move_as_ok(); +} + +TEST(Tonlib, Wallet) { + LOG(ERROR) << td::base64_encode(std_boc_serialize(get_wallet_source()).move_as_ok()); + CHECK(get_wallet_source()->get_hash() == ton::Wallet::get_init_code()->get_hash()); + + auto fift_output = fift::mem_run_fift(load_source("smartcont/new-wallet-v2.fif"), {"aba", "0"}).move_as_ok(); + + auto new_wallet_pk = fift_output.source_lookup.read_file("new-wallet.pk").move_as_ok().data; + auto new_wallet_query = fift_output.source_lookup.read_file("new-wallet-query.boc").move_as_ok().data; + auto new_wallet_addr = fift_output.source_lookup.read_file("new-wallet.addr").move_as_ok().data; + + td::Ed25519::PrivateKey priv_key{td::SecureString{new_wallet_pk}}; + auto pub_key = priv_key.get_public_key().move_as_ok(); + auto init_state = ton::Wallet::get_init_state(pub_key); + auto init_message = ton::Wallet::get_init_message(priv_key); + auto address = ton::GenericAccount::get_address(0, init_state); + + CHECK(address.addr.as_slice() == td::Slice(new_wallet_addr).substr(0, 32)); + + td::Ref res = ton::GenericAccount::create_ext_message(address, init_state, init_message); + + LOG(ERROR) << "-------"; + vm::load_cell_slice(res).print_rec(std::cerr); + LOG(ERROR) << "-------"; + vm::load_cell_slice(vm::std_boc_deserialize(new_wallet_query).move_as_ok()).print_rec(std::cerr); + CHECK(vm::std_boc_deserialize(new_wallet_query).move_as_ok()->get_hash() == res->get_hash()); + + fift_output.source_lookup.write_file("/main.fif", load_source("smartcont/wallet-v2.fif")).ensure(); + class ZeroOsTime : public fift::OsTime { + public: + td::uint32 now() override { + return 0; + } + }; + fift_output.source_lookup.set_os_time(std::make_unique()); + auto dest = block::StdAddress::parse("Ef9Tj6fMJP+OqhAdhKXxq36DL+HYSzCc3+9O6UNzqsgPfYFX").move_as_ok(); + fift_output = + fift::mem_run_fift(std::move(fift_output.source_lookup), + {"aba", "new-wallet", "Ef9Tj6fMJP+OqhAdhKXxq36DL+HYSzCc3+9O6UNzqsgPfYFX", "123", "321"}) + .move_as_ok(); + auto wallet_query = fift_output.source_lookup.read_file("wallet-query.boc").move_as_ok().data; + auto gift_message = ton::GenericAccount::create_ext_message( + address, {}, ton::Wallet::make_a_gift_message(priv_key, 123, 60, 321000000000ll, "TESTv2", dest)); + LOG(ERROR) << "-------"; + vm::load_cell_slice(gift_message).print_rec(std::cerr); + LOG(ERROR) << "-------"; + vm::load_cell_slice(vm::std_boc_deserialize(wallet_query).move_as_ok()).print_rec(std::cerr); + CHECK(vm::std_boc_deserialize(wallet_query).move_as_ok()->get_hash() == gift_message->get_hash()); +} + +TEST(Tonlib, TestGiver) { + auto address = + block::StdAddress::parse("-1:60c04141c6a7b96d68615e7a91d265ad0f3a9a922e9ae9c901d4fa83f5d3c0d0").move_as_ok(); + LOG(ERROR) << address.bounceable; + auto fift_output = fift::mem_run_fift(load_source("smartcont/testgiver.fif"), + {"aba", address.rserialize(), "0", "6.666", "wallet-query"}) + .move_as_ok(); + LOG(ERROR) << fift_output.output; + + auto wallet_query = fift_output.source_lookup.read_file("wallet-query.boc").move_as_ok().data; + + auto res = ton::GenericAccount::create_ext_message( + ton::TestGiver::address(), {}, + ton::TestGiver::make_a_gift_message(0, 1000000000ll * 6666 / 1000, "GIFT", address)); + vm::CellSlice(vm::NoVm(), res).print_rec(std::cerr); + CHECK(vm::std_boc_deserialize(wallet_query).move_as_ok()->get_hash() == res->get_hash()); +} + +class SimpleWallet : public ton::SmartContract { + public: + SimpleWallet(State state) : SmartContract(std::move(state)) { + } + + const State& get_state() const { + return state_; + } + SimpleWallet* make_copy() const override { + return new SimpleWallet{state_}; + } + + static td::Ref create_empty() { + return td::Ref(true, State{ton::SmartContractCode::simple_wallet_ext(), {}}); + } + static td::Ref create(td::Ref data) { + return td::Ref(true, State{ton::SmartContractCode::simple_wallet_ext(), std::move(data)}); + } + static td::Ref create_fast(td::Ref data) { + return td::Ref(true, State{ton::SmartContractCode::simple_wallet(), std::move(data)}); + } + + td::int32 seqno() const { + auto res = run_get_method("seqno"); + return res.stack.write().pop_smallint_range(1000000000); + } + + td::Ref create_init_state(td::Slice public_key) const { + td::RefInt256 pk{true}; + pk.write().import_bytes(public_key.ubegin(), public_key.size(), false); + auto res = run_get_method("create_init_state", {pk}); + return res.stack.write().pop_cell(); + } + + td::Ref prepare_send_message(td::Ref msg, td::int8 mode = 3) const { + auto res = run_get_method("prepare_send_message", {td::make_refint(mode), msg}); + return res.stack.write().pop_cell(); + } + + static td::Ref sign_message(vm::Ref body, const td::Ed25519::PrivateKey& pk) { + auto signature = pk.sign(body->get_hash().as_slice()).move_as_ok(); + return vm::CellBuilder().store_bytes(signature.as_slice()).append_cellslice(vm::load_cell_slice(body)).finalize(); + } +}; + +TEST(Smartcon, Simple) { + auto private_key = td::Ed25519::generate_private_key().move_as_ok(); + auto public_key = private_key.get_public_key().move_as_ok().as_octet_string(); + + auto w_lib = SimpleWallet::create_empty(); + auto init_data = w_lib->create_init_state(public_key); + + auto w = SimpleWallet::create(init_data); + LOG(ERROR) << w->code_size(); + auto fw = SimpleWallet::create_fast(init_data); + LOG(ERROR) << fw->code_size(); + LOG(ERROR) << w->seqno(); + + for (int i = 0; i < 20; i++) { + auto msg = w->sign_message(w->prepare_send_message(vm::CellBuilder().finalize()), private_key); + w.write().send_external_message(msg); + fw.write().send_external_message(msg); + } + ASSERT_EQ(20, w->seqno()); + CHECK(w->get_state().data->get_hash() == fw->get_state().data->get_hash()); +} + +namespace std { // ouch +bool operator<(const ton::MultisigWallet::Mask& a, const ton::MultisigWallet::Mask& b) { + for (size_t i = 0; i < a.size(); i++) { + if (a[i] != b[i]) { + return a[i] < b[i]; + } + } + return false; +} +} // namespace std + +TEST(Smartcon, Multisig) { + auto ms_lib = ton::MultisigWallet::create(); + + int n = 100; + int k = 99; + std::vector keys; + for (int i = 0; i < n; i++) { + keys.push_back(td::Ed25519::generate_private_key().move_as_ok()); + } + auto init_state = ms_lib->create_init_data( + td::transform(keys, [](auto& key) { return key.get_public_key().ok().as_octet_string(); }), k); + auto ms = ton::MultisigWallet::create(init_state); + + td::uint64 query_id = 123; + ton::MultisigWallet::QueryBuilder qb(query_id, vm::CellBuilder().finalize()); + // first empty query (init) + CHECK(ms.write().send_external_message(vm::CellBuilder().finalize()).code == 0); + // first empty query + CHECK(ms.write().send_external_message(vm::CellBuilder().finalize()).code > 0); + + for (int i = 0; i < 10; i++) { + auto query = qb.create(i, keys[i]); + auto ans = ms.write().send_external_message(query); + LOG(INFO) << "CODE: " << ans.code; + LOG(INFO) << "GAS: " << ans.gas_used; + } + for (int i = 0; i + 1 < 50; i++) { + qb.sign(i, keys[i]); + } + auto query = qb.create(49, keys[49]); + + CHECK(ms->get_n_k() == std::make_pair(n, k)); + auto ans = ms.write().send_external_message(query); + LOG(INFO) << "CODE: " << ans.code; + LOG(INFO) << "GAS: " << ans.gas_used; + CHECK(ans.success); + ASSERT_EQ(0, ms->processed(query_id)); + CHECK(ms.write().send_external_message(query).code > 0); + ASSERT_EQ(0, ms->processed(query_id)); + + { + ton::MultisigWallet::QueryBuilder qb(query_id, vm::CellBuilder().finalize()); + for (int i = 50; i + 1 < 100; i++) { + qb.sign(i, keys[i]); + } + query = qb.create(99, keys[99]); + } + + ans = ms.write().send_external_message(query); + LOG(INFO) << "CODE: " << ans.code; + LOG(INFO) << "GAS: " << ans.gas_used; + ASSERT_EQ(-1, ms->processed(query_id)); +} + +TEST(Smartcont, MultisigStress) { + int n = 10; + int k = 5; + + std::vector keys; + for (int i = 0; i < n; i++) { + keys.push_back(td::Ed25519::generate_private_key().move_as_ok()); + } + auto public_keys = td::transform(keys, [](auto& key) { return key.get_public_key().ok().as_octet_string(); }); + auto ms_lib = ton::MultisigWallet::create(); + auto init_state_old = + ms_lib->create_init_data_fast(td::transform(public_keys, [](auto& key) { return key.copy(); }), k); + auto init_state = ms_lib->create_init_data(td::transform(public_keys, [](auto& key) { return key.copy(); }), k); + CHECK(init_state_old->get_hash() == init_state->get_hash()); + auto ms = ton::MultisigWallet::create(init_state); + CHECK(ms->get_public_keys() == public_keys); + + td::int32 now = 0; + td::int32 qid = 1; + using Mask = std::bitset<128>; + struct Query { + td::int64 id; + td::Ref message; + Mask signed_mask; + }; + + std::vector queries; + int max_queries = 300; + + td::Random::Xorshift128plus rnd(123); + + auto new_query = [&] { + if (qid > max_queries) { + return; + } + Query query; + query.id = (static_cast(now) << 32) | qid++; + query.message = vm::CellBuilder().store_bytes(td::rand_string('a', 'z', rnd.fast(0, 100))).finalize(); + queries.push_back(std::move(query)); + }; + + auto verify = [&] { + auto messages = ms->get_unsigned_messaged(); + std::set> s; + std::set> t; + + for (auto& m : messages) { + auto x = std::make_tuple(m.query_id, m.signed_by, m.message->get_hash().as_slice().str()); + s.insert(std::move(x)); + } + + for (auto& q : queries) { + if (q.signed_mask.none()) { + continue; + } + t.insert(std::make_tuple(q.id, q.signed_mask, q.message->get_hash().as_slice().str())); + } + ASSERT_EQ(t.size(), s.size()); + CHECK(s == t); + }; + + auto sign_query = [&](Query& query, Mask mask) { + auto qb = ton::MultisigWallet::QueryBuilder(query.id, query.message); + int first_i = -1; + for (int i = 0; i < (int)mask.size(); i++) { + if (mask.test(i)) { + if (first_i == -1) { + first_i = i; + } else { + qb.sign(i, keys[i]); + } + } + } + return qb.create(first_i, keys[first_i]); + }; + + auto send_signature = [&](td::Ref query) { + auto ans = ms.write().send_external_message(query); + LOG(ERROR) << "GAS: " << ans.gas_used; + return ans.code == 0; + }; + + auto is_ready = [&](Query& query) { return ms->processed(query.id) == -1; }; + + auto gen_query = [&](Query& query) { + auto x = rnd.fast(1, n); + Mask mask; + for (int t = 0; t < x; t++) { + mask.set(rnd() % n); + } + + auto signature = sign_query(query, mask); + return std::make_pair(signature, mask); + }; + + auto rand_sign = [&] { + if (queries.empty()) { + return; + } + + size_t query_i = rnd() % queries.size(); + auto& query = queries[query_i]; + + Mask mask; + td::Ref signature; + std::tie(signature, mask) = gen_query(query); + if (false && rnd() % 6 == 0) { + Mask mask2; + td::Ref signature2; + std::tie(signature2, mask2) = gen_query(query); + for (int i = 0; i < (int)keys.size(); i++) { + if (mask[i]) { + signature = ms->merge_queries(std::move(signature), std::move(signature2)); + break; + } + if (mask2[i]) { + signature = ms->merge_queries(std::move(signature2), std::move(signature)); + break; + } + } + //signature = ms->merge_queries(std::move(signature), std::move(signature2)); + mask |= mask2; + } + + int got_cnt; + Mask got_cnt_bits; + std::tie(got_cnt, got_cnt_bits) = ms->check_query_signatures(signature); + CHECK(mask == got_cnt_bits); + + bool expect_ok = true; + { + auto new_mask = mask & ~query.signed_mask; + expect_ok &= new_mask.any(); + for (size_t i = 0; i < mask.size(); i++) { + if (mask[i]) { + expect_ok &= new_mask[i]; + break; + } + } + } + + ASSERT_EQ(expect_ok, send_signature(std::move(signature))); + if (expect_ok) { + query.signed_mask |= mask; + } + auto expect_is_ready = query.signed_mask.count() >= (size_t)k; + auto state = ms->get_query_state(query.id); + ASSERT_EQ(expect_is_ready, (state.state == ton::MultisigWallet::QueryState::Sent)); + CHECK(expect_is_ready || state.mask == query.signed_mask); + ASSERT_EQ(expect_is_ready, is_ready(query)); + if (expect_is_ready) { + queries.erase(queries.begin() + query_i); + } + verify(); + }; + td::RandomSteps steps({{rand_sign, 2}, {new_query, 1}}); + while (!queries.empty() || qid <= max_queries) { + steps.step(rnd); + //LOG(ERROR) << ms->data_size(); + } + LOG(INFO) << "Final code size: " << ms->code_size(); + LOG(INFO) << "Final data size: " << ms->data_size(); +} diff --git a/submodules/ton/tonlib-src/crypto/test/wycheproof.h b/submodules/ton/tonlib-src/crypto/test/wycheproof.h new file mode 100644 index 0000000000..e94559da90 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/test/wycheproof.h @@ -0,0 +1,1160 @@ +#pragma once + +#include + +std::string wycheproof_ed25519() { + return + R"abcd({ + "algorithm" : "EDDSA", + "generatorVersion" : "0.4.12", + "notes" : { + "SignatureMalleability" : "EdDSA signatures are non-malleable, if implemented accordingly. Failing to check the range of S allows to modify signatures. See RFC 8032, Section 5.2.7 and Section 8.4." + }, + "numberOfTests" : 111, + "header" : [], + "testGroups" : [ + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa", + "sk" : "add4bb8103785baf9ac534258e8aaf65f5f1adb5ef5f3df19bb80ab989c4d64b", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b65700321007d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAfU0Of2FTpptiQrUiq77mhf2kQg+INLEIw72uNp71Sfo=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 1, + "comment" : "", + "msg" : "", + "sig" : "d4fbdb52bfa726b44d1786a8c0d171c3e62ca83c9e5bbe63de0bb2483f8fd6cc1429ab72cafc41ab56af02ff8fcc43b99bfe4c7ae940f60f38ebaa9d311c4007", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 2, + "comment" : "", + "msg" : "78", + "sig" : "d80737358ede548acb173ef7e0399f83392fe8125b2ce877de7975d8b726ef5b1e76632280ee38afad12125ea44b961bf92f1178c9fa819d020869975bcbe109", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 3, + "comment" : "", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 4, + "comment" : "", + "msg" : "48656c6c6f", + "sig" : "1c1ad976cbaae3b31dee07971cf92c928ce2091a85f5899f5e11ecec90fc9f8e93df18c5037ec9b29c07195ad284e63d548cd0a6fe358cc775bd6c1608d2c905", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 5, + "comment" : "", + "msg" : "313233343030", + "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bf0cf5b3a289976458a1be6277a5055545253b45b07dcc1abd96c8b989c00f301", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 6, + "comment" : "", + "msg" : "000000000000000000000000", + "sig" : "d46543bfb892f84ec124dcdfc847034c19363bf3fc2fa89b1267833a14856e52e60736918783f950b6f1dd8d40dc343247cd43ce054c2d68ef974f7ed0f3c60f", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 7, + "comment" : "", + "msg" : "6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "sig" : "879350045543bc14ed2c08939b68c30d22251d83e018cacbaf0c9d7a48db577e80bdf76ce99e5926762bc13b7b3483260a5ef63d07e34b58eb9c14621ac92f00", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 8, + "comment" : "", + "msg" : "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60", + "sig" : "7bdc3f9919a05f1d5db4a3ada896094f6871c1f37afc75db82ec3147d84d6f237b7e5ecc26b59cfea0c7eaf1052dc427b0f724615be9c3d3e01356c65b9b5109", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 9, + "comment" : "", + "msg" : "ffffffffffffffffffffffffffffffff", + "sig" : "5dbd7360e55aa38e855d6ad48c34bd35b7871628508906861a7c4776765ed7d1e13d910faabd689ec8618b78295c8ab8f0e19c8b4b43eb8685778499e943ae04", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 10, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 11, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "00000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 12, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "0000000000000000000000000000000000000000000000000000000000000000ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 13, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "0000000000000000000000000000000000000000000000000000000000000000edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 14, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "0000000000000000000000000000000000000000000000000000000000000000edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 15, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 16, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "01000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 17, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "0100000000000000000000000000000000000000000000000000000000000000ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 18, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "0100000000000000000000000000000000000000000000000000000000000000edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 19, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "0100000000000000000000000000000000000000000000000000000000000000edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 20, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "edd3f55c1a631258d69cf7a2def9de14000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 21, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "edd3f55c1a631258d69cf7a2def9de14000000000000000000000000000000100100000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 22, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 23, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 24, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 25, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 26, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0100000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 27, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 28, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fedd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 29, + "comment" : "special values for r and s", + "msg" : "3f", + "sig" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fedffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 30, + "comment" : "empty signature", + "msg" : "54657374", + "sig" : "", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 31, + "comment" : "s missing", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 32, + "comment" : "signature too short", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 33, + "comment" : "signature too long", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d2020", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 34, + "comment" : "include pk in signature", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 35, + "comment" : "prepending 0 byte to signature", + "msg" : "54657374", + "sig" : "007c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 36, + "comment" : "prepending 0 byte to s", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0007a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 37, + "comment" : "appending 0 byte to signature", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d00", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 38, + "comment" : "removing 0 byte from signature", + "msg" : "546573743137", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b3", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 39, + "comment" : "removing 0 byte from signature", + "msg" : "54657374313236", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab09155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 40, + "comment" : "removing leading 0 byte from signature", + "msg" : "546573743530", + "sig" : "38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 41, + "comment" : "dropping byte from signature", + "msg" : "54657374333437", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab09155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 42, + "comment" : "modified bit 0 in R", + "msg" : "313233343030", + "sig" : "647c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b1d125e5538f38afbcc1c84e489521083041d24bc6240767029da063271a1ff0c", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 43, + "comment" : "modified bit 1 in R", + "msg" : "313233343030", + "sig" : "677c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bc108ca4b87a49c9ed2cf383aecad8f54a962b2899da891e12004d7993a627e01", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 44, + "comment" : "modified bit 2 in R", + "msg" : "313233343030", + "sig" : "617c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b9ce23fc6213ed5b87912e9bbf92f5e2c780eae26d15c50a112d1e97d2ea33c06", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 45, + "comment" : "modified bit 7 in R", + "msg" : "313233343030", + "sig" : "e57c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bbb3eb51cd98dddb235a5f46f2bded6af184a58d09cce928bda43f41d69118a03", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 46, + "comment" : "modified bit 8 in R", + "msg" : "313233343030", + "sig" : "657d1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bcd237dda9a116501f67a5705a854b9adc304f34720803a91b324f2c13e0f5a09", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 47, + "comment" : "modified bit 16 in R", + "msg" : "313233343030", + "sig" : "657c1592402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b6b167bbdc0d881cc04d28905552c1876f3709851abc5007376940cc8a435c300", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 48, + "comment" : "modified bit 31 in R", + "msg" : "313233343030", + "sig" : "657c1412402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b7fd2ac7da14afffcceeb13f2a0d6b887941cb1a5eb57a52f3cb131a16cce7b0e", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 49, + "comment" : "modified bit 32 in R", + "msg" : "313233343030", + "sig" : "657c1492412ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b7373ba13ebbef99cd2a8ead55ce735c987d85a35320925a8e871702dc7c5c40d", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 50, + "comment" : "modified bit 63 in R", + "msg" : "313233343030", + "sig" : "657c1492402ab54e03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bd35bd331c03f0855504ca1cab87b83c36a028425a3cf007ede4f4254c261cb00", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 51, + "comment" : "modified bit 64 in R", + "msg" : "313233343030", + "sig" : "657c1492402ab5ce02e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bcb35101f73cf467deac8c1a03b6c3dc35af544132734b7e57ab20c89b2e4750d", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 52, + "comment" : "modified bit 97 in R", + "msg" : "313233343030", + "sig" : "657c1492402ab5ce03e2c3a7f2384d051b9cf3570f1207fc78c1bcc98c281c2bb58d2e8878290bff8d3355fdd4ea381924ee578752354eb6dee678ab4011c301", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 53, + "comment" : "modified bit 127 in R", + "msg" : "313233343030", + "sig" : "657c1492402ab5ce03e2c3a7f0384d851b9cf3570f1207fc78c1bcc98c281c2bb978c866187ffb1cc7b29a0b4045aefc08768df65717194ff0c6e63f4dea0d02", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 54, + "comment" : "modified bit 240 in R", + "msg" : "313233343030", + "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281d2b0576ecf8eaf675f00f3dfbe19f75b83b7607a6c96414f6821af920a2498d0305", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 55, + "comment" : "modified bit 247 in R", + "msg" : "313233343030", + "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c289c2be5241a345c7b5428054c74b7c382fa10d4a5f1e8f8b79a71d3fdea2254f1ff0e", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 56, + "comment" : "modified bit 248 in R", + "msg" : "313233343030", + "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2a63950c85cd6dc96364e768de50ff7732b538f8a0b1615d799190ab600849230e", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 57, + "comment" : "modified bit 253 in R", + "msg" : "313233343030", + "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c0b543bd3da0a56a8c9c152f59c9fec12f31fa66434d48b817b30d90cb4efa8b501", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 58, + "comment" : "modified bit 254 in R", + "msg" : "313233343030", + "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c6b8da07efd07a6dafb015ed6a32fe136319a972ffbc341f3a0beae97ccf8136505", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 59, + "comment" : "modified bit 255 in R", + "msg" : "313233343030", + "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281cab227aedf259f910f0f3a759a335062665217925d019173b88917eae294f75d40f", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 60, + "comment" : "R==0", + "msg" : "313233343030", + "sig" : "0000000000000000000000000000000000000000000000000000000000000000e0b8e7770d51c7a36375d006c5bffd6af43ff54aaf47e4330dc118c71d61ec02", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 61, + "comment" : "invalid R", + "msg" : "313233343030", + "sig" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff463a1908382e7eb7693acef9884f7cf931a215e0791876be22c631a59881fd0e", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 62, + "comment" : "all bits flipped in R", + "msg" : "313233343030", + "sig" : "9a83eb6dbfd54a31fc1d3c580fc7b2fae4630ca8f0edf803873e433673d7e3d40e94254586cb6188c5386c3febed477cb9a6cb29e3979adc4cb27cf5278fb70a", + "result" : "invalid", + "flags" : [] + }, + { + "tcId" : 63, + "comment" : "checking malleability ", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab067654bce3832c2d76f8f6f5dafc08d9339d4eef676573336a5c51eb6f946b31d", + "result" : "invalid", + "flags" : [ + "SignatureMalleability" + ] + }, + { + "tcId" : 64, + "comment" : "checking malleability ", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab05439412b5395d42f462c67008eba6ca839d4eef676573336a5c51eb6f946b32d", + "result" : "invalid", + "flags" : [ + "SignatureMalleability" + ] + }, + { + "tcId" : 65, + "comment" : "checking malleability ", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab02ee12ce5875bf9dff26556464bae2ad239d4eef676573336a5c51eb6f946b34d", + "result" : "invalid", + "flags" : [ + "SignatureMalleability" + ] + }, + { + "tcId" : 66, + "comment" : "checking malleability ", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0e2300459f1e742404cd934d2c595a6253ad4eef676573336a5c51eb6f946b38d", + "result" : "invalid", + "flags" : [ + "SignatureMalleability" + ] + }, + { + "tcId" : 67, + "comment" : "checking malleability ", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b32d", + "result" : "invalid", + "flags" : [ + "SignatureMalleability" + ] + }, + { + "tcId" : 68, + "comment" : "checking malleability ", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b34d", + "result" : "invalid", + "flags" : [ + "SignatureMalleability" + ] + }, + { + "tcId" : 69, + "comment" : "checking malleability ", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b38d", + "result" : "invalid", + "flags" : [ + "SignatureMalleability" + ] + }, + { + "tcId" : 70, + "comment" : "checking malleability ", + "msg" : "54657374", + "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0679155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b38d", + "result" : "invalid", + "flags" : [ + "SignatureMalleability" + ] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c", + "sk" : "0a23a20072891237aa0864b5765139514908787878cd77135a0059881d313f00", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b6570032100a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAoSwr63cmXyqslTtQCTSdlBVaA62kFqrUUTGUgOmDykw=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 71, + "comment" : "", + "msg" : "", + "sig" : "5056325d2ab440bf30bbf0f7173199aa8b4e6fbc091cf3eb6bc6cf87cd73d992ffc216c85e4ab5b8a0bbc7e9a6e9f8d33b7f6e5ac0ffdc22d9fcaf784af84302", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 72, + "comment" : "", + "msg" : "78", + "sig" : "481fafbf4364d7b682475282f517a3ac0538c9a6b6a562e99a3d8e5afb4f90a559b056b9f07af023905753b02d95eb329a35c77f154b79abbcd291615ce42f02", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 73, + "comment" : "", + "msg" : "54657374", + "sig" : "8a9bb4c465a3863abc9fd0dd35d80bb28f7d33d37d74679802d63f82b20da114b8d765a1206b3e9ad7cf2b2d8d778bb8651f1fa992db293c0039eacb6161480f", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 74, + "comment" : "", + "msg" : "48656c6c6f", + "sig" : "d839c20abfda1fd429531831c64f813f84b913e9928540310cf060b44c3dbf9457d44a7721fdc0d67724ff81cb450dd39b10cfb65db15dda4b8bf09d26bd3801", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 75, + "comment" : "", + "msg" : "313233343030", + "sig" : "9bbb1052dcfa8ad2715c2eb716ae4f1902dea353d42ee09fd4c0b4fcb8b52b5219e2200016e1199d0061891c263e31b0bc3b55673c19610c4e0fa5408004160b", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 76, + "comment" : "", + "msg" : "000000000000000000000000", + "sig" : "f63b5c0667c7897fc283296416f7f60e84bbde9cbd832e56be463ed9f568069702b17a2f7c341ebf590706a6388ac76ac613c1675ec0f2c7118f2573422a500b", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 77, + "comment" : "", + "msg" : "6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "sig" : "1bc44d7001e6b5b9090fef34b2ca480f9786bbefa7d279353e5881e8dfb91b803ccd46500e270ef0109bfd741037558832120bc2a4f20fbe7b5fb3c3aaf23e08", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 78, + "comment" : "", + "msg" : "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60", + "sig" : "ea8e22143b02372e76e99aece3ed36aec529768a27e2bb49bdc135d44378061e1f62d1ac518f33ebf37b2ee8cc6dde68a4bd7d4a2f4d6cb77f015f71ca9fc30d", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 79, + "comment" : "", + "msg" : "ffffffffffffffffffffffffffffffff", + "sig" : "8acd679e1a914fc45d5fa83d3021f0509c805c8d271df54e52f43cfbd00cb6222bf81d58fe1de2de378df67ee9f453786626961fe50a9b05f12b6f0899ebdd0a", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "sk" : "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b6570032100d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 80, + "comment" : "draft-josefsson-eddsa-ed25519-02: Test 1", + "msg" : "", + "sig" : "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c", + "sk" : "4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b65700321003d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAPUAXw+hDiVqStwqnTRt+vJyYLM8uxJaMwM1V8Sr0Zgw=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 81, + "comment" : "draft-josefsson-eddsa-ed25519-02: Test 2", + "msg" : "72", + "sig" : "92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025", + "sk" : "c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b6570032100fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA/FHNjmIYoaONpH7QAjDwWAgW7RO6MwOsXeuRFUiQgCU=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 82, + "comment" : "draft-josefsson-eddsa-ed25519-02: Test 3", + "msg" : "af82", + "sig" : "6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e", + "sk" : "f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b6570032100278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAJ4EX/BRMcjQPZ9DyMW6Dhs7/vyskKMnFH+98WX8dQm4=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 83, + "comment" : "draft-josefsson-eddsa-ed25519-02: Test 1024", + "msg" : "08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0", + "sig" : "0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "8fd659b77b558ed93882c1157438450ac86ec62d421d568e98ee236f3810295a", + "sk" : "d7ad3f1f6bbe0477c3c357a806a19eb41ae3f94025035bc87f281f8ee9fc0e34", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b65700321008fd659b77b558ed93882c1157438450ac86ec62d421d568e98ee236f3810295a", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAj9ZZt3tVjtk4gsEVdDhFCshuxi1CHVaOmO4jbzgQKVo=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 84, + "comment" : "Random test failure 1", + "msg" : "b0729a713593a92e46b56eaa66b9e435f7a09a8e7de03b078f6f282285276635f301e7aaafe42187c45d6f5b13f9f16b11195cc125c05b90d24dfe4c", + "sig" : "7db17557ac470c0eda4eedaabce99197ab62565653cf911f632ee8be0e5ffcfc88fb94276b42e0798fd3aa2f0318be7fc6a29fae75f70c3dcdc414a0ad866601", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "2a606bf67ac770c607038b004101b325edb569efd3413d2d1f2c3e6b4e6e3082", + "sk" : "ad9b22793336fcdac10e136c4deea599be187a38eef91c1cf7c7a4ec884dda08", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b65700321002a606bf67ac770c607038b004101b325edb569efd3413d2d1f2c3e6b4e6e3082", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAKmBr9nrHcMYHA4sAQQGzJe21ae/TQT0tHyw+a05uMII=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 85, + "comment" : "Random test failure 2", + "msg" : "a8546e50ba31cae3234310d32672447be213fad91a227a19669c53d309b959782b0e6b71f8791fdb470043b58122003157d2d96a43a6cbd7d3a8d86bf4c97391883e268d50af80e1e6e12939c2bd50ca746cdadfad4edf1bda875299740724148efb1ebe73fb60088cda890317658627a5f7ab5a0c075d9d8f3f97b6492b35519e50ff6b38377432a7081f9176bb1c29a862deac1336ca20b097a47829cec10a6a7cec178eda2d12f6dc6c87f910454af0123555ba184e68804d9cced60fd5c8c90943e56599c8f0ba59a38491ba5e5a53460682474c07e40ca142983314fd762856bb1093f359da6eb0a756bd93a3160c10dd8feea6b97e7c6a17cb54bd5d7649c05c66d7bdee056671dfdaf689fa3945bb8e29a429f4bd5d355dce9687b06f01d5e33e3999f0e8", + "sig" : "67d84d4c3945aaf06e06d524be63acbfb5dbb1988c4aea96a5ee9f7a9b9eecc29df4f66b8aa1d9e8607a58fb1ef0c2ad69aac005b4f58e34103344a9c8871a09", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 86, + "comment" : "Random test failure 24", + "msg" : "b477b0480bb84642608b908d29a51cf2fce63f24ee95", + "sig" : "28fafbb62b4d688fa79e1ac92851f46e319b161f801d4dc09acc21fdd6780a2c4292b8c1003c61c2bcebe7f3f88ccc4bb26d407387c5f27cb8c94cf6ce810405", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "c9c946cbc5544ac74eef491f07c5881c16faf7ec31ce4aa91bb60ae7b4539051", + "sk" : "04a6553d68a9baef78a2175af375458eaa01cdb77350c61e282ef5f0c7116599", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b6570032100c9c946cbc5544ac74eef491f07c5881c16faf7ec31ce4aa91bb60ae7b4539051", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAyclGy8VUSsdO70kfB8WIHBb69+wxzkqpG7YK57RTkFE=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 87, + "comment" : "Random test failure 3", + "msg" : "cd2212eddb0706f62c995cef958634f0cb7793444cbf4d30e81c27c41ebea6cb02607510131f9c015692dfd521b148841e9a2d3564d20ac401f6cb8e40f520fe0cafbeaa88840b83013369d879f013463fe52a13267aa0c8c59c45cde9399cd1e6be8cc64cf48315ac2eb31a1c567a4fb7d601746d1f63b5ac020712adbbe07519bded6f", + "sig" : "24087d47f3e20af51b9668ae0a88ce76586802d0ec75d8c0f28fc30962b5e1d1a1d509571a1624ed125a8df92a6e963728d6b5de99200b8e285f70feb6f05207", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 88, + "comment" : "Random test failure 20", + "msg" : "27d465bc632743522aefa23c", + "sig" : "c2656951e2a0285585a51ff0eda7e9a23c2dfd2ffa273aee7808f4604e8f9a8c8ea49e9fce4eb2d8d75d36b7238fe6fc13b6c5d9427dd58f8c6615d033c0bd0f", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e", + "sk" : "c367c8d2ebeeecd70c1e8985b70c3808b75657f243b21ba4f322792540e92257", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b657003210032ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAMq0Cb2k9DSr+f0OI2RxMlkQm/LnjZlw+vYZQAJuBXI4=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 89, + "comment" : "Random test failure 4", + "msg" : "ec5c7cb078", + "sig" : "d920d421a5956b69bfe1ba834c025e2babb6c7a6d78c97de1d9bb1116dfdd1185147b2887e34e15578172e150774275ea2aad9e02106f7e8ca1caa669a066f0c", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 90, + "comment" : "Random test failure 5", + "msg" : "4668c6a76f0e482190a7175b9f3806a5fe4314a004fa69f988373f7a", + "sig" : "4f62daf7f7c162038552ad7d306e195baa37ecf6ca7604142679d7d1128e1f8af52e4cb3545748c44ef1ff1c64e877e4f4d248259b7f6eb56e3ef72097dc8e0c", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 91, + "comment" : "Random test failure 8", + "msg" : "5dc9bb87eb11621a93f92abe53515697d2611b2eef73", + "sig" : "deecafb6f2ede73fec91a6f10e45b9c1c61c4b9bfbe6b6147e2de0b1df6938971f7896c3ab83851fb5d9e537037bff0fca0ccb4a3cc38f056f91f7d7a0557e08", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 92, + "comment" : "Random test failure 10", + "msg" : "7dcfe60f881e1285676f35b68a1b2dbcdd7be6f719a288ababc28d36e3a42ac3010a1ca54b32760e74", + "sig" : "7f8663cf98cbd39d5ff553f00bcf3d0d520605794f8866ce75714d77cc51e66c91818b657d7b0dae430a68353506edc4a714c345f5ddb5c8b958ba3d035f7a01", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 93, + "comment" : "Random test failure 12", + "msg" : "58e456064dff471109def4ca27fa8310a1df32739655b624f27e6418d34b7f007173f3faa5", + "sig" : "6aab49e5c0bc309b783378ee03ffda282f0185cdf94c847701ff307a6ee8d0865411c44e0a8206f6a5f606107451940c2593af790ce1860f4c14ab25b2deae08", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 94, + "comment" : "Random test failure 15", + "msg" : "a1", + "sig" : "1a74ed2cbdc7d8f3827014e8e6ecf8fd2698ac8f86833acccdd400df710fe0d6b0543c9cfa00d52bf024ab7ce0d91981944097233ec134d5c7abbd44bfd32d0d", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 95, + "comment" : "Random test failure 19", + "msg" : "11cb1eafa4c42a8402c4193c4696f7b2e6d4585e4b42dcf1a8b67a80b2da80bc9d4b649fb2f35eaf1f56c426fd0b", + "sig" : "14ceb2eaf4688d995d482f44852d71ad878cd7c77b41e60b0065fd01a59b054ee74759224187dbde9e59a763a70277c960892ef89fba997aba2576b2c54ba608", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 96, + "comment" : "Random test failure 25", + "msg" : "aa365b442d12b7f3c925", + "sig" : "83c40ce13d483cc58ff65844875862d93df4bd367af77efa469ec06a8ed9e6d7905a04879535708ddf225567a815c9b941d405c98e918fd0c151165cea7fb101", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 97, + "comment" : "Random test failure 28", + "msg" : "475f", + "sig" : "71a4a06a34075f2fd47bc3abf4714d46db7e97b08cb6180d3f1539ac50b18ce51f8af8ae95ed21d4fa0daab7235925631ecea1fd9d0d8a2ba7a7583fd04b900c", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "c29ec1894e06d27b4e40486b4fa5063d66a746c7f9c323b12203c03b72b8b78a", + "sk" : "56c1e22d616cbb6dea869288b4b1c02bb98696583c2f6e650013a03e17049c62", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b6570032100c29ec1894e06d27b4e40486b4fa5063d66a746c7f9c323b12203c03b72b8b78a", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAwp7BiU4G0ntOQEhrT6UGPWanRsf5wyOxIgPAO3K4t4o=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 98, + "comment" : "Random test failure 6", + "msg" : "0f325ffd87e58131ffa23c05ea4579513b287fdba87b44", + "sig" : "6669acf94667c5b541afe5307bde9476b13ae7e0e6058a772101ac8eb0a94331428eb4db0a2c68a9b6c1763b8624dab259b0876cdcfaeacc17b21a18e3fc010a", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 99, + "comment" : "Random test failure 21", + "msg" : "5ffa", + "sig" : "931e5152fcef078c22cc5d6a3a65f06e396289f6f5f2d1efa6340254a53526ef5dc6874eeddf35c3f50991c53cd02bf06313e37d93ee1f7022128ffa3b8f300b", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "cfda5b899e35764c5229e59295fe1222b7ddce176643697c29e46ecbba10cf10", + "sk" : "b7d2f64276df417fed27d8e15b4e90f6fd93dace707294c338bd32bc4bbd8fdb", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b6570032100cfda5b899e35764c5229e59295fe1222b7ddce176643697c29e46ecbba10cf10", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAz9pbiZ41dkxSKeWSlf4SIrfdzhdmQ2l8KeRuy7oQzxA=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 100, + "comment" : "Random test failure 7", + "msg" : "ec5c7cb078", + "sig" : "30490c28f806298225df62103521dcee047153912c33ab8ab8bbdd1ffabd70fd4fdb360f05be535b067d1cf4e78c2cb432206bf280aab3bd21aaa1cb894c5b06", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 101, + "comment" : "Random test failure 9", + "msg" : "67484059b2490b1a0a4f8dee77979e26", + "sig" : "4cd4f77ed473a6647387f3163541c67a1708a3c3bd1673247cb87f0cb68b3c56f04bfa72970c8a483efe659c87009ab4020b590b6641316b3deddb5450544e02", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 102, + "comment" : "Random test failure 11", + "msg" : "a020a4381dc9141f47ee508871ab7a8b5a3648727c4281ae9932376f23a8e1bcda0626b7129197d864178631ec89c4332dbb18", + "sig" : "1e41a24fe732bd7cab14c2a2f5134ee8c87fcbd2e987e60957ed9239e5c32404d56977e1b4282871896cb10625a1937468e4dc266e16a9c1b8e9891177eca802", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 103, + "comment" : "Random test failure 14", + "msg" : "a25176b3afea318b2ec11ddacb10caf7179c0b3f8eabbfa2895581138d3c1e0e", + "sig" : "2a833aadecd9f28235cb5896bf3781521dc71f28af2e91dbe1735a61dce3e31ac15ca24b3fc47817a59d386bbbb2ce60a6adc0a2703bb2bdea8f70f91051f706", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 104, + "comment" : "Random test failure 18", + "msg" : "a9e6d94870a67a9fe1cf13b1e6f9150cdd407bf6480ec841ea586ae3935e9787163cf419c1", + "sig" : "c97e3190f83bae7729ba473ad46b420b8aad735f0808ea42c0f898ccfe6addd4fd9d9fa3355d5e67ee21ab7e1f805cd07f1fce980e307f4d7ad36cc924eef00c", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "529919c9c780985a841c42ba6c180ff2d67a276ccfbe281080e47ab71a758f56", + "sk" : "7d597c3b7283929d07ed8f01f31d2596823e5e46ab226c7be4234d1a9dcaef37", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b6570032100529919c9c780985a841c42ba6c180ff2d67a276ccfbe281080e47ab71a758f56", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAUpkZyceAmFqEHEK6bBgP8tZ6J2zPvigQgOR6txp1j1Y=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 105, + "comment" : "Random test failure 13", + "msg" : "e1cbf2d86827825613fb7a85811d", + "sig" : "01abfa4d6bbc726b196928ec84fd03f0c953a4fa2b228249562ff1442a4f63a7150b064f3712b51c2af768d2c2711a71aabf8d186833e941a0301b82f0502905", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 106, + "comment" : "Random test failure 22", + "msg" : "25", + "sig" : "e4ae21f7a8f4b3b325c161a8c6e53e2edd7005b9c2f8a2e3b0ac4ba94aa80be6f2ee22ac8d4a96b9a3eb73a825e7bb5aff4a3393bf5b4a38119e9c9b1b041106", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "2252b3d57c74cbf8bc460dc2e082847926bc022f09ab6ae95756362bfd1167c1", + "sk" : "f401cee4bfb1732f0e9b8d8ba79469565c3115296141dbdf7e9c311a0ac1823b", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b65700321002252b3d57c74cbf8bc460dc2e082847926bc022f09ab6ae95756362bfd1167c1", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAIlKz1Xx0y/i8Rg3C4IKEeSa8Ai8Jq2rpV1Y2K/0RZ8E=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 107, + "comment" : "Random test failure 16", + "msg" : "975ef941710071a9e1e6325a0c860becd7c695b5117c3107b686e330e5", + "sig" : "af0fd9dda7e03e12313410d8d8844ebb6fe6b7f65141f22d7bcba5695a25414a9e54326fb44d59fb14707899a8aae70857b23d4080d7ab2c396ef3a36d45ce02", + "result" : "valid", + "flags" : [] + }, + { + "tcId" : 108, + "comment" : "Random test failure 23", + "msg" : "80fdd6218f29c8c8f6bd820945f9b0854e3a8824", + "sig" : "e097e0bd0370bff5bde359175a11b728ee9639095d5df8eda496395565616edfe079977f7d4dc8c75d6113a83d6a55e6e1676408c0967a2906339b43337dcb01", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "c0a773110f975de3732355bb7ec7f0c41c091c0252966070205516693b992a4a", + "sk" : "3d658956410377d0644676d2599542412a4f3b0e4eadfb7f3f836615f42b18bc", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b6570032100c0a773110f975de3732355bb7ec7f0c41c091c0252966070205516693b992a4a", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAwKdzEQ+XXeNzI1W7fsfwxBwJHAJSlmBwIFUWaTuZKko=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 109, + "comment" : "Random test failure 17", + "msg" : "", + "sig" : "0280427e713378f49d478df6373c6cac847b622b567daa2376c839e7ac10e22c380ab0fa8617c9dcfe76c4d9db5459b21dc1413726e46cc8f387d359e344f407", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "54cda623245759ad6d43e620a606908befc633d60792bc7798447a0ef38e7311", + "sk" : "bccb61323840c2a96fc36f7e54ea6c8e55f9d221f7f05791ed60025e06064439", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b657003210054cda623245759ad6d43e620a606908befc633d60792bc7798447a0ef38e7311", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAVM2mIyRXWa1tQ+YgpgaQi+/GM9YHkrx3mER6DvOOcxE=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 110, + "comment" : "Random test failure 26", + "msg" : "27e792b28b2f1702", + "sig" : "14d9b497c19b91d43481c55bb6f5056de252d9ecb637575c807e58e9b4c5eac8b284089d97e2192dc242014363208e2c9a3435edf8928fb1d893553e9be4c703", + "result" : "valid", + "flags" : [] + } + ] + }, + { + "key" : { + "curve" : "edwards25519", + "keySize" : 255, + "pk" : "2362bac514d5fad33802642e979a1e82de6eb6f1bcbf6a5b304f2bb02b9e57fe", + "sk" : "f2d3023b9c19e241748bc4039a7a43c595701f23675505015213a8a2a0274c1b", + "type" : "EDDSAKeyPair" + }, + "keyDer" : "302a300506032b65700321002362bac514d5fad33802642e979a1e82de6eb6f1bcbf6a5b304f2bb02b9e57fe", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAI2K6xRTV+tM4AmQul5oegt5utvG8v2pbME8rsCueV/4=\n-----END PUBLIC KEY-----\n", + "type" : "EDDSAVer", + "tests" : [ + { + "tcId" : 111, + "comment" : "Random test failure 27", + "msg" : "eef3bb0f617c17d0420c115c21c28e3762edc7b7fb048529b84a9c2bc6", + "sig" : "242ddb3a5d938d07af690b1b0ef0fa75842c5f9549bf39c8750f75614c712e7cbaf2e37cc0799db38b858d41aec5b9dd2fca6a3c8e082c10408e2cf3932b9d08", + "result" : "valid", + "flags" : [] + } + ] + } + ] +})abcd"; +} diff --git a/submodules/ton/tonlib-src/crypto/vm/cells/CellString.cpp b/submodules/ton/tonlib-src/crypto/vm/cells/CellString.cpp new file mode 100644 index 0000000000..ad2cbf5f8f --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/vm/cells/CellString.cpp @@ -0,0 +1,64 @@ +#include "CellString.h" +#include "td/utils/misc.h" + +#include "vm/cells/CellSlice.h" + +namespace vm { +td::Status CellString::store(CellBuilder &cb, td::Slice slice, unsigned int top_bits) { + td::uint32 size = td::narrow_cast(slice.size() * 8); + return store(cb, td::BitSlice(slice.ubegin(), size), top_bits); +} + +td::Status CellString::store(CellBuilder &cb, td::BitSlice slice, unsigned int top_bits) { + if (slice.size() > max_bytes * 8) { + return td::Status::Error("String is too long (1)"); + } + unsigned int head = td::min(slice.size(), td::min(cb.remaining_bits(), top_bits)) / 8 * 8; + auto max_bits = vm::Cell::max_bits / 8 * 8; + auto depth = 1 + (slice.size() - head + max_bits - 1) / max_bits; + if (depth > max_chain_length) { + return td::Status::Error("String is too long (2)"); + } + cb.append_bitslice(slice.subslice(0, head)); + slice.advance(head); + if (slice.size() == 0) { + return td::Status::OK(); + } + CellBuilder child_cb; + store(child_cb, std::move(slice)); + cb.store_ref(child_cb.finalize()); + return td::Status::OK(); +} + +template +void CellString::for_each(F &&f, CellSlice &cs, unsigned int top_bits) { + unsigned int head = td::min(cs.size(), top_bits); + f(cs.prefetch_bits(head)); + if (!cs.have_refs()) { + return; + } + auto ref = cs.prefetch_ref(); + while (true) { + auto cs = vm::load_cell_slice(ref); + f(cs.prefetch_bits(cs.size())); + if (!cs.have_refs()) { + return; + } + ref = cs.prefetch_ref(); + } +} + +td::Result CellString::load(CellSlice &cs, unsigned int top_bits) { + unsigned int size = 0; + for_each([&](auto slice) { size += slice.size(); }, cs, top_bits); + if (size % 8 != 0) { + return td::Status::Error("Size is not divisible by 8"); + } + std::string res(size / 8, 0); + + td::BitPtr to(td::MutableSlice(res).ubegin()); + for_each([&](auto slice) { to.concat(slice); }, cs, top_bits); + CHECK(to.offs == (int)size); + return res; +} +} // namespace vm diff --git a/submodules/ton/tonlib-src/crypto/vm/cells/CellString.h b/submodules/ton/tonlib-src/crypto/vm/cells/CellString.h new file mode 100644 index 0000000000..89c933d876 --- /dev/null +++ b/submodules/ton/tonlib-src/crypto/vm/cells/CellString.h @@ -0,0 +1,22 @@ +#pragma once + +#include "td/utils/Status.h" + +#include "vm/cells/CellBuilder.h" + +namespace vm { +class CellString { + public: + static constexpr unsigned int max_bytes = 1024; + static constexpr unsigned int max_chain_length = 16; + + static td::Status store(CellBuilder &cb, td::Slice slice, unsigned int top_bits = Cell::max_bits); + static td::Status store(CellBuilder &cb, td::BitSlice slice, unsigned int top_bits = Cell::max_bits); + static td::Result load(CellSlice &cs, unsigned int top_bits = Cell::max_bits); + + private: + template + static void for_each(F &&f, CellSlice &cs, unsigned int top_bits = Cell::max_bits); +}; + +} // namespace vm diff --git a/submodules/ton/tonlib-src/crypto/vm/continuation.cpp b/submodules/ton/tonlib-src/crypto/vm/continuation.cpp index 24157d3b2a..d4952769a5 100644 --- a/submodules/ton/tonlib-src/crypto/vm/continuation.cpp +++ b/submodules/ton/tonlib-src/crypto/vm/continuation.cpp @@ -349,7 +349,7 @@ VmState::VmState(Ref _code) } VmState::VmState(Ref _code, Ref _stack, int flags, Ref _data, VmLog log, - std::vector> _libraries) + std::vector> _libraries, Ref init_c7) : code(std::move(_code)) , stack(std::move(_stack)) , cp(-1) @@ -360,11 +360,14 @@ VmState::VmState(Ref _code, Ref _stack, int flags, Ref _ , libraries(std::move(_libraries)) { ensure_throw(init_cp(0)); set_c4(std::move(_data)); + if (init_c7.not_null()) { + set_c7(std::move(init_c7)); + } init_cregs(flags & 1, flags & 2); } VmState::VmState(Ref _code, Ref _stack, const GasLimits& gas, int flags, Ref _data, VmLog log, - std::vector> _libraries) + std::vector> _libraries, Ref init_c7) : code(std::move(_code)) , stack(std::move(_stack)) , cp(-1) @@ -376,6 +379,9 @@ VmState::VmState(Ref _code, Ref _stack, const GasLimits& gas, , libraries(std::move(_libraries)) { ensure_throw(init_cp(0)); set_c4(std::move(_data)); + if (init_c7.not_null()) { + set_c7(std::move(init_c7)); + } init_cregs(flags & 1, flags & 2); } @@ -738,6 +744,9 @@ int VmState::run() { } } while (!res); // LOG(INFO) << "[EN] data cells: " << DataCell::get_total_data_cells(); + if ((res | 1) == -1) { + commit(); + } return res; } @@ -755,10 +764,15 @@ ControlRegs* force_cregs(Ref& cont) { } int run_vm_code(Ref code, Ref& stack, int flags, Ref* data_ptr, VmLog log, long long* steps, - GasLimits* gas_limits, std::vector> libraries) { - VmState vm{ - code, std::move(stack), gas_limits ? *gas_limits : GasLimits{}, flags, data_ptr ? *data_ptr : Ref{}, - log, std::move(libraries)}; + GasLimits* gas_limits, std::vector> libraries, Ref init_c7) { + VmState vm{code, + std::move(stack), + gas_limits ? *gas_limits : GasLimits{}, + flags, + data_ptr ? *data_ptr : Ref{}, + log, + std::move(libraries), + std::move(init_c7)}; int res = vm.run(); stack = vm.get_stack_ref(); if (res == -1 && data_ptr) { @@ -785,11 +799,11 @@ int run_vm_code(Ref code, Ref& stack, int flags, Ref* da } int run_vm_code(Ref code, Stack& stack, int flags, Ref* data_ptr, VmLog log, long long* steps, - GasLimits* gas_limits, std::vector> libraries) { + GasLimits* gas_limits, std::vector> libraries, Ref init_c7) { Ref stk{true}; stk.unique_write().set_contents(std::move(stack)); stack.clear(); - int res = run_vm_code(code, stk, flags, data_ptr, log, steps, gas_limits, std::move(libraries)); + int res = run_vm_code(code, stk, flags, data_ptr, log, steps, gas_limits, std::move(libraries), std::move(init_c7)); CHECK(stack.is_unique()); if (stk.is_null()) { stack.clear(); diff --git a/submodules/ton/tonlib-src/crypto/vm/continuation.h b/submodules/ton/tonlib-src/crypto/vm/continuation.h index 80f19e156d..c6c9d320ed 100644 --- a/submodules/ton/tonlib-src/crypto/vm/continuation.h +++ b/submodules/ton/tonlib-src/crypto/vm/continuation.h @@ -154,7 +154,7 @@ struct ControlData { class Continuation : public td::CntObject { public: - virtual int jump(VmState* st) const & = 0; + virtual int jump(VmState* st) const& = 0; virtual int jump_w(VmState* st) &; virtual ControlData* get_cdata() { return 0; @@ -184,7 +184,7 @@ class QuitCont : public Continuation { QuitCont(int _code = 0) : exit_code(_code) { } ~QuitCont() override = default; - int jump(VmState* st) const & override { + int jump(VmState* st) const& override { return ~exit_code; } }; @@ -193,7 +193,7 @@ class ExcQuitCont : public Continuation { public: ExcQuitCont() = default; ~ExcQuitCont() override = default; - int jump(VmState* st) const & override; + int jump(VmState* st) const& override; }; class PushIntCont : public Continuation { @@ -204,7 +204,7 @@ class PushIntCont : public Continuation { PushIntCont(int val, Ref _next) : push_val(val), next(_next) { } ~PushIntCont() override = default; - int jump(VmState* st) const & override; + int jump(VmState* st) const& override; int jump_w(VmState* st) & override; }; @@ -217,7 +217,7 @@ class RepeatCont : public Continuation { : body(std::move(_body)), after(std::move(_after)), count(_count) { } ~RepeatCont() override = default; - int jump(VmState* st) const & override; + int jump(VmState* st) const& override; int jump_w(VmState* st) & override; }; @@ -228,7 +228,7 @@ class AgainCont : public Continuation { AgainCont(Ref _body) : body(std::move(_body)) { } ~AgainCont() override = default; - int jump(VmState* st) const & override; + int jump(VmState* st) const& override; int jump_w(VmState* st) & override; }; @@ -239,7 +239,7 @@ class UntilCont : public Continuation { UntilCont(Ref _body, Ref _after) : body(std::move(_body)), after(std::move(_after)) { } ~UntilCont() override = default; - int jump(VmState* st) const & override; + int jump(VmState* st) const& override; int jump_w(VmState* st) & override; }; @@ -252,7 +252,7 @@ class WhileCont : public Continuation { : cond(std::move(_cond)), body(std::move(_body)), after(std::move(_after)), chkcond(_chk) { } ~WhileCont() override = default; - int jump(VmState* st) const & override; + int jump(VmState* st) const& override; int jump_w(VmState* st) & override; }; @@ -268,7 +268,7 @@ class ArgContExt : public Continuation { ArgContExt(const ArgContExt&) = default; ArgContExt(ArgContExt&&) = default; ~ArgContExt() override = default; - int jump(VmState* st) const & override; + int jump(VmState* st) const& override; int jump_w(VmState* st) & override; ControlData* get_cdata() override { return &data; @@ -303,7 +303,7 @@ class OrdCont : public Continuation { td::CntObject* make_copy() const override { return new OrdCont{*this}; } - int jump(VmState* st) const & override; + int jump(VmState* st) const& override; int jump_w(VmState* st) & override; ControlData* get_cdata() override { @@ -321,7 +321,7 @@ class OrdCont : public Continuation { Ref get_stack_ref() const { return data.stack; } - Ref copy_ord() const & { + Ref copy_ord() const& { return Ref{true, *this}; } Ref copy_ord() && { @@ -375,10 +375,16 @@ struct GasLimits { } }; +struct CommittedState { + Ref c4, c5; + bool committed{false}; +}; + class VmState final : public VmStateInterface { Ref code; Ref stack; ControlRegs cr; + CommittedState cstate; int cp; long long steps{0}; const DispatchTable* dispatch; @@ -388,19 +394,25 @@ class VmState final : public VmStateInterface { std::vector> libraries; int stack_trace{0}, debug_off{0}; + bool chksig_always_succeed{false}; + public: static constexpr unsigned cell_load_gas_price = 100, cell_create_gas_price = 500, exception_gas_price = 50, tuple_entry_gas_price = 1; VmState(); VmState(Ref _code); VmState(Ref _code, Ref _stack, int flags = 0, Ref _data = {}, VmLog log = {}, - std::vector> _libraries = {}); + std::vector> _libraries = {}, Ref init_c7 = {}); VmState(Ref _code, Ref _stack, const GasLimits& _gas, int flags = 0, Ref _data = {}, - VmLog log = {}, std::vector> _libraries = {}); + VmLog log = {}, std::vector> _libraries = {}, Ref init_c7 = {}); template VmState(Ref code_cell, Args&&... args) : VmState(convert_code_cell(std::move(code_cell)), std::forward(args)...) { } + VmState(const VmState&) = delete; + VmState(VmState&&) = delete; + VmState& operator=(const VmState&) = delete; + VmState& operator=(VmState&&) = delete; bool set_gas_limits(long long _max, long long _limit, long long _credit = 0); bool final_gas_ok() const { return gas.final_ok(); @@ -408,6 +420,12 @@ class VmState final : public VmStateInterface { long long gas_consumed() const { return gas.gas_consumed(); } + bool committed() const { + return cstate.committed; + } + const CommittedState& get_committed_state() const { + return cstate; + } void consume_gas(long long amount) { gas.consume(amount); } @@ -567,15 +585,29 @@ class VmState final : public VmStateInterface { return cont->is_unique() ? cont.unique_write().jump_w(this) : cont->jump(this); } static Ref convert_code_cell(Ref code_cell); + void commit() { + cstate.c4 = cr.d[0]; + cstate.c5 = cr.d[1]; + cstate.committed = true; + } + + void set_chksig_always_succeed(bool flag) { + chksig_always_succeed = flag; + } + bool get_chksig_always_succeed() const { + return chksig_always_succeed; + } private: void init_cregs(bool same_c3 = false, bool push_0 = true); }; int run_vm_code(Ref _code, Ref& _stack, int flags = 0, Ref* data_ptr = 0, VmLog log = {}, - long long* steps = nullptr, GasLimits* gas_limits = nullptr, std::vector> libraries = {}); + long long* steps = nullptr, GasLimits* gas_limits = nullptr, std::vector> libraries = {}, + Ref init_c7 = {}); int run_vm_code(Ref _code, Stack& _stack, int flags = 0, Ref* data_ptr = 0, VmLog log = {}, - long long* steps = nullptr, GasLimits* gas_limits = nullptr, std::vector> libraries = {}); + long long* steps = nullptr, GasLimits* gas_limits = nullptr, std::vector> libraries = {}, + Ref init_c7 = {}); ControlData* force_cdata(Ref& cont); ControlRegs* force_cregs(Ref& cont); diff --git a/submodules/ton/tonlib-src/crypto/vm/excno.hpp b/submodules/ton/tonlib-src/crypto/vm/excno.hpp index f67d8a4e92..a18f890a36 100644 --- a/submodules/ton/tonlib-src/crypto/vm/excno.hpp +++ b/submodules/ton/tonlib-src/crypto/vm/excno.hpp @@ -18,6 +18,8 @@ */ #pragma once +#include "td/utils/Status.h" + namespace vm { enum class Excno : int { @@ -95,4 +97,19 @@ struct VmVirtError { struct VmFatal {}; +template +auto try_f(F&& f) noexcept -> decltype(f()) { + try { + return f(); + } catch (vm::VmError error) { + return td::Status::Error(PSLICE() << "Got a vm exception: " << error.get_msg()); + } catch (vm::VmVirtError error) { + return td::Status::Error(PSLICE() << "Got a vm virtualization exception: " << error.get_msg()); + } catch (vm::VmNoGas error) { + return td::Status::Error(PSLICE() << "Got a vm no gas exception: " << error.get_msg()); + } +} + +#define TRY_VM(f) ::vm::try_f([&] { return f; }) + } // namespace vm diff --git a/submodules/ton/tonlib-src/crypto/vm/tonops.cpp b/submodules/ton/tonlib-src/crypto/vm/tonops.cpp index 30d3d14b88..e2142f072f 100644 --- a/submodules/ton/tonlib-src/crypto/vm/tonops.cpp +++ b/submodules/ton/tonlib-src/crypto/vm/tonops.cpp @@ -75,10 +75,17 @@ int exec_set_gas_limit(VmState* st) { return exec_set_gas_generic(st, gas); } +int exec_commit(VmState* st) { + VM_LOG(st) << "execute COMMIT"; + st->commit(); + return 0; +} + void register_basic_gas_ops(OpcodeTable& cp0) { using namespace std::placeholders; cp0.insert(OpcodeInstr::mksimple(0xf800, 16, "ACCEPT", exec_accept)) - .insert(OpcodeInstr::mksimple(0xf801, 16, "SETGASLIMIT", exec_set_gas_limit)); + .insert(OpcodeInstr::mksimple(0xf801, 16, "SETGASLIMIT", exec_set_gas_limit)) + .insert(OpcodeInstr::mksimple(0xf80f, 16, "COMMIT", exec_commit)); } void register_ton_gas_ops(OpcodeTable& cp0) { @@ -268,7 +275,7 @@ int exec_ed25519_check_signature(VmState* st, bool from_slice) { } td::Ed25519::PublicKey pub_key{td::SecureString(td::Slice{key, 32})}; auto res = pub_key.verify_signature(td::Slice{data, data_len}, td::Slice{signature, 64}); - stack.push_bool(res.is_ok()); + stack.push_bool(res.is_ok() || st->get_chksig_always_succeed()); return 0; } diff --git a/submodules/ton/tonlib-src/lite-client/lite-client-common.cpp b/submodules/ton/tonlib-src/lite-client/lite-client-common.cpp index cc6949deac..82503faf35 100644 --- a/submodules/ton/tonlib-src/lite-client/lite-client-common.cpp +++ b/submodules/ton/tonlib-src/lite-client/lite-client-common.cpp @@ -4,6 +4,7 @@ #include "tl-utils/lite-utils.hpp" #include "ton/lite-tl.hpp" #include "td/utils/overloaded.h" +#include "td/utils/Random.h" using namespace std::literals::string_literals; @@ -74,4 +75,25 @@ td::Result> deserialize_proof_chain( LOG(DEBUG) << "deserialized a BlkProofChain of " << chain->link_count() << " links"; return std::move(chain); } +td::Ref prepare_vm_c7(ton::UnixTime now, ton::LogicalTime lt, td::Ref my_addr, + const block::CurrencyCollection& balance) { + td::BitArray<256> rand_seed; + td::RefInt256 rand_seed_int{true}; + td::Random::secure_bytes(rand_seed.as_slice()); + if (!rand_seed_int.unique_write().import_bits(rand_seed.cbits(), 256, false)) { + return {}; + } + auto tuple = vm::make_tuple_ref(td::make_refint(0x076ef1ea), // [ magic:0x076ef1ea + td::make_refint(0), // actions:Integer + td::make_refint(0), // msgs_sent:Integer + td::make_refint(now), // unixtime:Integer + td::make_refint(lt), // block_lt:Integer + td::make_refint(lt), // trans_lt:Integer + std::move(rand_seed_int), // rand_seed:Integer + balance.as_vm_tuple(), // balance_remaining:[Integer (Maybe Cell)] + my_addr, // myself:MsgAddressInt + vm::StackEntry()); // global_config:(Maybe Cell) ] = SmartContractInfo; + LOG(DEBUG) << "SmartContractInfo initialized with " << vm::StackEntry(tuple).to_string(); + return vm::make_tuple_ref(std::move(tuple)); +} } // namespace liteclient diff --git a/submodules/ton/tonlib-src/lite-client/lite-client-common.h b/submodules/ton/tonlib-src/lite-client/lite-client-common.h index cbadd2b429..bca2c3079d 100644 --- a/submodules/ton/tonlib-src/lite-client/lite-client-common.h +++ b/submodules/ton/tonlib-src/lite-client/lite-client-common.h @@ -7,4 +7,7 @@ namespace liteclient { td::Result> deserialize_proof_chain( ton::lite_api::object_ptr f); -} + +td::Ref prepare_vm_c7(ton::UnixTime now, ton::LogicalTime lt, td::Ref my_addr, + const block::CurrencyCollection& balance); +} // namespace liteclient diff --git a/submodules/ton/tonlib-src/lite-client/lite-client.cpp b/submodules/ton/tonlib-src/lite-client/lite-client.cpp index 3817e987f8..54eb61b6ac 100644 --- a/submodules/ton/tonlib-src/lite-client/lite-client.cpp +++ b/submodules/ton/tonlib-src/lite-client/lite-client.cpp @@ -58,6 +58,7 @@ #include "vm/continuation.h" #include "vm/cp0.h" #include "ton/ton-shard.h" +#include "openssl/rand.hpp" #if TD_DARWIN || TD_LINUX #include @@ -1153,16 +1154,24 @@ void TestNode::got_account_state(ton::BlockIdExt ref_blk, ton::BlockIdExt blk, t vm::load_cell_slice(info.root).print_rec(outp); out << outp.str(); out << "last transaction lt = " << info.last_trans_lt << " hash = " << info.last_trans_hash.to_hex() << std::endl; + block::gen::Account::Record_account acc; + block::gen::AccountStorage::Record store; + block::CurrencyCollection balance; + if (tlb::unpack_cell(info.root, acc) && tlb::csr_unpack(acc.storage, store) && balance.unpack(store.balance)) { + out << "account balance is " << balance.to_str() << std::endl; + } } else { out << "account state is empty" << std::endl; } } else if (info.root.not_null()) { block::gen::Account::Record_account acc; block::gen::AccountStorage::Record store; - if (!(tlb::unpack_cell(info.root, acc) && tlb::csr_unpack(acc.storage, store))) { + block::CurrencyCollection balance; + if (!(tlb::unpack_cell(info.root, acc) && tlb::csr_unpack(acc.storage, store) && balance.unpack(store.balance))) { LOG(ERROR) << "error unpacking account state"; return; } + out << "account balance is " << balance.to_str() << std::endl; int tag = block::gen::t_AccountState.get_tag(*store.state); switch (tag) { case block::gen::AccountState::account_uninit: @@ -1240,7 +1249,9 @@ void TestNode::run_smc_method(ton::BlockIdExt ref_blk, ton::BlockIdExt blk, ton: } block::gen::Account::Record_account acc; block::gen::AccountStorage::Record store; - if (!(tlb::unpack_cell(info.root, acc) && tlb::csr_unpack(acc.storage, store))) { + block::CurrencyCollection balance; + if (!(tlb::unpack_cell(info.root, acc) && tlb::csr_unpack(acc.storage, store) && + balance.validate_unpack(store.balance))) { LOG(ERROR) << "error unpacking account state"; return; } @@ -1276,6 +1287,8 @@ void TestNode::run_smc_method(ton::BlockIdExt ref_blk, ton::BlockIdExt blk, ton: vm::GasLimits gas{gas_limit}; LOG(DEBUG) << "creating VM"; vm::VmState vm{code, std::move(stack), gas, 1, data, vm::VmLog()}; + vm.set_c7(liteclient::prepare_vm_c7(info.gen_utime, info.gen_lt, acc.addr, balance)); // tuple with SmartContractInfo + // vm.incr_stack_trace(1); // enable stack dump after each step LOG(INFO) << "starting VM to run method `" << method << "` (" << method_id << ") of smart contract " << workchain << ":" << addr.to_hex(); int exit_code = ~vm.run(); @@ -1680,7 +1693,7 @@ bool TestNode::get_config_params(ton::BlockIdExt blkid, int mode, std::string fi true); LOG(INFO) << "requesting " << params.size() << " configuration parameters with respect to masterchain block " << blkid.to_str(); - return envelope_send_query(std::move(b), [ Self = actor_id(this), mode, filename, + return envelope_send_query(std::move(b), [ Self = actor_id(this), mode, filename, blkid, params = std::move(params) ](td::Result R) mutable { if (R.is_error()) { return; @@ -1690,20 +1703,25 @@ bool TestNode::get_config_params(ton::BlockIdExt blkid, int mode, std::string fi LOG(ERROR) << "cannot parse answer to liteServer.getConfigParams"; } else { auto f = F.move_as_ok(); - td::actor::send_closure_later(Self, &TestNode::got_config_params, ton::create_block_id(f->id_), + td::actor::send_closure_later(Self, &TestNode::got_config_params, blkid, ton::create_block_id(f->id_), std::move(f->state_proof_), std::move(f->config_proof_), mode, filename, std::move(params)); } }); } -void TestNode::got_config_params(ton::BlockIdExt blkid, td::BufferSlice state_proof, td::BufferSlice cfg_proof, - int mode, std::string filename, std::vector params) { +void TestNode::got_config_params(ton::BlockIdExt req_blkid, ton::BlockIdExt blkid, td::BufferSlice state_proof, + td::BufferSlice cfg_proof, int mode, std::string filename, std::vector params) { LOG(INFO) << "got configuration parameters"; if (!blkid.is_masterchain_ext()) { LOG(ERROR) << "reference block " << blkid.to_str() << " for the configuration is not a valid masterchain block"; return; } + if (blkid != req_blkid) { + LOG(ERROR) << "got configuration parameters with respect to block " << blkid.to_str() << " instead of " + << req_blkid.to_str(); + return; + } auto R = block::check_extract_state_proof(blkid, state_proof.as_slice(), cfg_proof.as_slice()); if (R.is_error()) { LOG(ERROR) << "masterchain state proof for " << blkid.to_str() << " is invalid : " << R.move_as_error().to_string(); diff --git a/submodules/ton/tonlib-src/lite-client/lite-client.h b/submodules/ton/tonlib-src/lite-client/lite-client.h index 19fe481e13..36830e8d5b 100644 --- a/submodules/ton/tonlib-src/lite-client/lite-client.h +++ b/submodules/ton/tonlib-src/lite-client/lite-client.h @@ -122,8 +122,8 @@ class TestNode : public td::actor::Actor { bool get_all_shards(bool use_last = true, ton::BlockIdExt blkid = {}); void got_all_shards(ton::BlockIdExt blk, td::BufferSlice proof, td::BufferSlice data); bool get_config_params(ton::BlockIdExt blkid, int mode = 0, std::string filename = ""); - void got_config_params(ton::BlockIdExt blkid, td::BufferSlice state_proof, td::BufferSlice cfg_proof, int mode, - std::string filename, std::vector params); + void got_config_params(ton::BlockIdExt req_blkid, ton::BlockIdExt blkid, td::BufferSlice state_proof, + td::BufferSlice cfg_proof, int mode, std::string filename, std::vector params); bool get_block(ton::BlockIdExt blk, bool dump = false); void got_block(ton::BlockIdExt blkid, td::BufferSlice data, bool dump); bool get_state(ton::BlockIdExt blk, bool dump = false); diff --git a/submodules/ton/tonlib-src/tdactor/td/actor/PromiseFuture.h b/submodules/ton/tonlib-src/tdactor/td/actor/PromiseFuture.h index 1070e482df..cb2016196e 100644 --- a/submodules/ton/tonlib-src/tdactor/td/actor/PromiseFuture.h +++ b/submodules/ton/tonlib-src/tdactor/td/actor/PromiseFuture.h @@ -225,6 +225,7 @@ class Promise { promise_->set_error(std::move(error)); promise_.reset(); } + void set_result(Result &&result) { if (!promise_) { return; @@ -260,6 +261,26 @@ class Promise { explicit operator bool() { return static_cast(promise_); } + template + auto do_wrap(V &&value, F &&func) { + if (value.is_ok()) { + set_result(func(value.move_as_ok())); + } else { + set_error(value.move_as_error()); + } + } + + template + auto do_wrap(td::Status status, F &&func) { + set_error(std::move(status)); + } + + template + auto wrap(F &&func) { + return [promise = std::move(*this), func = std::move(func)](auto &&res) mutable { + promise.do_wrap(std::move(res), std::move(func)); + }; + } private: std::unique_ptr> promise_; diff --git a/submodules/ton/tonlib-src/tdactor/td/actor/core/ActorExecutor.cpp b/submodules/ton/tonlib-src/tdactor/td/actor/core/ActorExecutor.cpp index 7554a05d10..8894266204 100644 --- a/submodules/ton/tonlib-src/tdactor/td/actor/core/ActorExecutor.cpp +++ b/submodules/ton/tonlib-src/tdactor/td/actor/core/ActorExecutor.cpp @@ -76,7 +76,7 @@ void ActorExecutor::send(ActorSignals signals) { } void ActorExecutor::start() noexcept { - //LOG(ERROR) << "START " << actor_info_.get_name() << " " << tag("from_queue", options.from_queue); + //LOG(ERROR) << "START " << actor_info_.get_name() << " " << tag("from_queue", options_.from_queue); if (is_closed()) { return; } diff --git a/submodules/ton/tonlib-src/tdactor/td/actor/core/Scheduler.cpp b/submodules/ton/tonlib-src/tdactor/td/actor/core/Scheduler.cpp index 7e343c4dea..9569fac360 100644 --- a/submodules/ton/tonlib-src/tdactor/td/actor/core/Scheduler.cpp +++ b/submodules/ton/tonlib-src/tdactor/td/actor/core/Scheduler.cpp @@ -133,6 +133,7 @@ void Scheduler::ContextImpl::add_to_queue(ActorInfoPtr actor_info_ptr, Scheduler if (!scheduler_id.is_valid()) { scheduler_id = get_scheduler_id(); } + //LOG(ERROR) << "Add to queue: " << actor_info_ptr->get_name() << " " << scheduler_id.value(); auto &info = scheduler_group()->schedulers.at(scheduler_id.value()); if (need_poll || !info.cpu_queue) { info.io_queue->writer_put(std::move(actor_info_ptr)); diff --git a/submodules/ton/tonlib-src/tdnet/td/net/TcpListener.cpp b/submodules/ton/tonlib-src/tdnet/td/net/TcpListener.cpp index dfc97e608d..5e187342be 100644 --- a/submodules/ton/tonlib-src/tdnet/td/net/TcpListener.cpp +++ b/submodules/ton/tonlib-src/tdnet/td/net/TcpListener.cpp @@ -73,5 +73,57 @@ void TcpListener::loop() { return stop(); } } +TcpInfiniteListener::TcpInfiniteListener(int32 port, std::unique_ptr callback) + : port_(port), callback_(std::move(callback)) { +} + +void TcpInfiniteListener::start_up() { + loop(); +} + +void TcpInfiniteListener::hangup() { + close_flag_ = true; + tcp_listener_.reset(); + if (refcnt_ == 0) { + stop(); + } +} + +void TcpInfiniteListener::loop() { + if (!tcp_listener_.empty()) { + return; + } + class Callback : public TcpListener::Callback { + public: + Callback(actor::ActorShared parent) : parent_(std::move(parent)) { + } + void accept(SocketFd fd) override { + actor::send_closure(parent_, &TcpInfiniteListener::accept, std::move(fd)); + } + + private: + actor::ActorShared parent_; + }; + refcnt_++; + tcp_listener_ = actor::create_actor( + actor::ActorOptions().with_name(PSLICE() << "TcpListener" << tag("port", port_)).with_poll(), port_, + std::make_unique(actor_shared(this))); +} + +void TcpInfiniteListener::accept(SocketFd fd) { + callback_->accept(std::move(fd)); +} + +void TcpInfiniteListener::hangup_shared() { + refcnt_--; + tcp_listener_.reset(); + if (close_flag_) { + if (refcnt_ == 0) { + stop(); + } + } else { + alarm_timestamp() = Timestamp::in(5 /*5 seconds*/); + } +} } // namespace td diff --git a/submodules/ton/tonlib-src/tdnet/td/net/TcpListener.h b/submodules/ton/tonlib-src/tdnet/td/net/TcpListener.h index bccf9e52f7..d83030eb0f 100644 --- a/submodules/ton/tonlib-src/tdnet/td/net/TcpListener.h +++ b/submodules/ton/tonlib-src/tdnet/td/net/TcpListener.h @@ -49,4 +49,23 @@ class TcpListener : public td::actor::Actor, private td::ObserverBase { void loop() override; }; + +class TcpInfiniteListener : public actor::Actor { + public: + TcpInfiniteListener(int32 port, std::unique_ptr callback); + + private: + int32 port_; + std::unique_ptr callback_; + actor::ActorOwn tcp_listener_; + int32 refcnt_{0}; + bool close_flag_{false}; + + void start_up() override; + + void hangup() override; + void loop() override; + void accept(SocketFd fd); + void hangup_shared() override; +}; } // namespace td diff --git a/submodules/ton/tonlib-src/tdnet/td/net/UdpServer.cpp b/submodules/ton/tonlib-src/tdnet/td/net/UdpServer.cpp index 1a88d17f14..7dff5e761a 100644 --- a/submodules/ton/tonlib-src/tdnet/td/net/UdpServer.cpp +++ b/submodules/ton/tonlib-src/tdnet/td/net/UdpServer.cpp @@ -130,70 +130,6 @@ void UdpServerImpl::hangup_shared() { stop(); } -class TcpInfiniteListener : public actor::Actor { - public: - TcpInfiniteListener(int32 port, std::unique_ptr callback) - : port_(port), callback_(std::move(callback)) { - } - - private: - int32 port_; - std::unique_ptr callback_; - actor::ActorOwn tcp_listener_; - int32 refcnt_{0}; - bool close_flag_{false}; - - void start_up() override { - loop(); - } - - void hangup() override { - close_flag_ = true; - tcp_listener_.reset(); - if (refcnt_ == 0) { - stop(); - } - } - - void loop() override { - if (!tcp_listener_.empty()) { - return; - } - class Callback : public TcpListener::Callback { - public: - Callback(actor::ActorShared parent) : parent_(std::move(parent)) { - } - void accept(SocketFd fd) override { - actor::send_closure(parent_, &TcpInfiniteListener::accept, std::move(fd)); - } - - private: - actor::ActorShared parent_; - }; - VLOG(udp_server) << "Create listener"; - refcnt_++; - tcp_listener_ = actor::create_actor( - actor::ActorOptions().with_name(PSLICE() << "TcpListener" << tag("port", port_)).with_poll(), port_, - std::make_unique(actor_shared(this))); - } - - void accept(SocketFd fd) { - callback_->accept(std::move(fd)); - } - - void hangup_shared() override { - refcnt_--; - tcp_listener_.reset(); - if (close_flag_) { - if (refcnt_ == 0) { - stop(); - } - } else { - alarm_timestamp() = Timestamp::in(5 /*5 seconds*/); - } - } -}; - class TcpClient : public td::actor::Actor, td::ObserverBase { public: class Callback { diff --git a/submodules/ton/tonlib-src/tdutils/td/utils/CancellationToken.h b/submodules/ton/tonlib-src/tdutils/td/utils/CancellationToken.h index f3bca2fcde..08f413c4b4 100644 --- a/submodules/ton/tonlib-src/tdutils/td/utils/CancellationToken.h +++ b/submodules/ton/tonlib-src/tdutils/td/utils/CancellationToken.h @@ -32,8 +32,13 @@ struct RawCancellationToken { class CancellationToken { public: explicit operator bool() const { + // Empty CancellationToken is never cancelled + if (!token_) { + return false; + } return token_->is_cancelled_.load(std::memory_order_acquire); } + CancellationToken() = default; explicit CancellationToken(std::shared_ptr token) : token_(std::move(token)) { } diff --git a/submodules/ton/tonlib-src/tdutils/td/utils/Status.h b/submodules/ton/tonlib-src/tdutils/td/utils/Status.h index 1759c0abef..6ac9210059 100644 --- a/submodules/ton/tonlib-src/tdutils/td/utils/Status.h +++ b/submodules/ton/tonlib-src/tdutils/td/utils/Status.h @@ -48,6 +48,15 @@ } \ } +#define TRY_STATUS_PROMISE(promise_name, status) \ + { \ + auto try_status = (status); \ + if (try_status.is_error()) { \ + promise_name.set_error(std::move(try_status)); \ + return; \ + } \ + } + #define TRY_RESULT(name, result) TRY_RESULT_IMPL(TD_CONCAT(TD_CONCAT(r_, name), __LINE__), auto name, result) #define TRY_RESULT_PROMISE(promise_name, name, result) \ @@ -309,6 +318,11 @@ class Status { return std::move(*this); } + Auto move_as_ok() { + UNREACHABLE(); + return {}; + } + Status move_as_error_prefix(const Status &status) const TD_WARN_UNUSED_RESULT { return status.move_as_error_suffix(message()); } diff --git a/submodules/ton/tonlib-src/tdutils/td/utils/tests.h b/submodules/ton/tonlib-src/tdutils/td/utils/tests.h index eb1fc3a82c..464fa0ea87 100644 --- a/submodules/ton/tonlib-src/tdutils/td/utils/tests.h +++ b/submodules/ton/tonlib-src/tdutils/td/utils/tests.h @@ -38,6 +38,34 @@ namespace td { +class RandomSteps { + public: + struct Step { + std::function func; + td::uint32 weight; + }; + RandomSteps(std::vector steps) : steps_(std::move(steps)) { + for (auto &step : steps_) { + steps_sum_ += step.weight; + } + } + template + void step(Random &rnd) { + auto w = rnd() % steps_sum_; + for (auto &step : steps_) { + if (w < step.weight) { + step.func(); + break; + } + w -= step.weight; + } + } + + private: + std::vector steps_; + td::int32 steps_sum_ = 0; +}; + class RegressionTester { public: virtual ~RegressionTester() = default; diff --git a/submodules/ton/tonlib-src/test/regression-tests.ans b/submodules/ton/tonlib-src/test/regression-tests.ans index ba4b51d503..29e26328dc 100644 --- a/submodules/ton/tonlib-src/test/regression-tests.ans +++ b/submodules/ton/tonlib-src/test/regression-tests.ans @@ -4,11 +4,16 @@ Test_Bitstrings_main_default a8b08af3116923c4c2a14e138d168375abd0c059f2f780d3267 Test_Cells_simple_default 832502642fe4fe5db70de82681aedb7d54d7f3530e0069861fff405fe6f6cf23 Test_Fift_bug_div_default 1ac42861ce96b2896001c587f65e9afe1617db48859f19c2f4e3063a20ea60b0 Test_Fift_bug_newlize_default e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +Test_Fift_bug_ufits_default 51bf5a9f1ed7633a193f6fdd17a7a3af8e032dfe72a9669c85e8639aa8a7c195 Test_Fift_contfrac_default 09ebce5c91bcb70696c6fb6981d82dc3b9e3444dab608a7a1b044c0ddd778a96 Test_Fift_test_default 4e44b3382963ec89f7b5c8f2ebd85da3bc8aebad5b49f5b11b14075061477b4d -Test_Fift_testvm2_default 4dcb0f98fd689cbdd81a3a1f937a497dd64d27ecebdcd67cf28fd6888469d93d +Test_Fift_test_dict_default 480d22a6ec25a232febf4eec8ff64747573f79721327e7ff3b1aa7ea4921bbb4 +Test_Fift_test_fixed_default 278a19d56b773102caf5c1fe2997ea6c8d0d9e720eff8503feede6398a197eec +Test_Fift_test_sort2_default 9b57d47e6a10e7d1bbb565db35400debf2f963031f434742a702ec76555a5d3a +Test_Fift_test_sort_default 9b57d47e6a10e7d1bbb565db35400debf2f963031f434742a702ec76555a5d3a +Test_Fift_testvm2_default 8a6e35fc0224398be9d2de39d31c86ea96965ef1eca2aa9e0af2303150ed4a7b Test_Fift_testvm3_default 3c1b77471c5fd914ed8b5f528b9faed618e278693f5030b953ff150e543864ae -Test_Fift_testvm4_default 4dcb0f98fd689cbdd81a3a1f937a497dd64d27ecebdcd67cf28fd6888469d93d +Test_Fift_testvm4_default 8a6e35fc0224398be9d2de39d31c86ea96965ef1eca2aa9e0af2303150ed4a7b Test_Fift_testvm4a_default 523b561d6bf2f5ebb26a755e687bfbda8e33462c98e9978119755f79a086cf5e Test_Fift_testvm4b_default daf8567bd58f05c10bb6596cea33b63e1061fa02dd5560db18ff22f96736f0d5 Test_Fift_testvm4c_default 2bbd67831d90bceaae29546ee3a58c4d376c2e8fb6a5b8ea2eae3ab8787e063e diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api.cpp b/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api.cpp index 810c29527e..5c8b605177 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api.cpp +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api.cpp @@ -178,6 +178,8 @@ object_ptr Object::fetch(td::TlParser &p) { return db_candidate::fetch(p); case db_block_info::ID: return db_block_info::fetch(p); + case db_block_packedInfo::ID: + return db_block_packedInfo::fetch(p); case db_block_archivedInfo::ID: return db_block_archivedInfo::fetch(p); case db_blockdb_key_lru::ID: @@ -4330,6 +4332,8 @@ object_ptr db_block_Info::fetch(td::TlParser &p) { switch (constructor) { case db_block_info::ID: return db_block_info::fetch(p); + case db_block_packedInfo::ID: + return db_block_packedInfo::fetch(p); case db_block_archivedInfo::ID: return db_block_archivedInfo::fetch(p); default: @@ -4427,6 +4431,56 @@ void db_block_info::store(td::TlStorerToString &s, const char *field_name) const } } +db_block_packedInfo::db_block_packedInfo() + : id_() + , unixtime_() + , offset_() +{} + +db_block_packedInfo::db_block_packedInfo(object_ptr &&id_, std::int32_t unixtime_, std::int64_t offset_) + : id_(std::move(id_)) + , unixtime_(unixtime_) + , offset_(offset_) +{} + +const std::int32_t db_block_packedInfo::ID; + +object_ptr db_block_packedInfo::fetch(td::TlParser &p) { + return make_object(p); +} + +db_block_packedInfo::db_block_packedInfo(td::TlParser &p) +#define FAIL(error) p.set_error(error) + : id_(TlFetchObject::parse(p)) + , unixtime_(TlFetchInt::parse(p)) + , offset_(TlFetchLong::parse(p)) +#undef FAIL +{} + +void db_block_packedInfo::store(td::TlStorerCalcLength &s) const { + (void)sizeof(s); + TlStoreObject::store(id_, s); + TlStoreBinary::store(unixtime_, s); + TlStoreBinary::store(offset_, s); +} + +void db_block_packedInfo::store(td::TlStorerUnsafe &s) const { + (void)sizeof(s); + TlStoreObject::store(id_, s); + TlStoreBinary::store(unixtime_, s); + TlStoreBinary::store(offset_, s); +} + +void db_block_packedInfo::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "db_block_packedInfo"); + if (id_ == nullptr) { s.store_field("id", "null"); } else { id_->store(s, "id"); } + s.store_field("unixtime", unixtime_); + s.store_field("offset", offset_); + s.store_class_end(); + } +} + db_block_archivedInfo::db_block_archivedInfo() : id_() , flags_() diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api.h b/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api.h index 3f3f8e8ad8..8bf7d8ff9b 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api.h +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api.h @@ -2382,6 +2382,32 @@ class db_block_info final : public db_block_Info { void store(td::TlStorerToString &s, const char *field_name) const final; }; +class db_block_packedInfo final : public db_block_Info { + public: + object_ptr id_; + std::int32_t unixtime_; + std::int64_t offset_; + + db_block_packedInfo(); + + db_block_packedInfo(object_ptr &&id_, std::int32_t unixtime_, std::int64_t offset_); + + static const std::int32_t ID = 1186697618; + std::int32_t get_id() const final { + return ID; + } + + static object_ptr fetch(td::TlParser &p); + + explicit db_block_packedInfo(td::TlParser &p); + + void store(td::TlStorerCalcLength &s) const final; + + void store(td::TlStorerUnsafe &s) const final; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + class db_block_archivedInfo final : public db_block_Info { public: object_ptr id_; diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api.hpp b/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api.hpp index 29f45bb527..9216c063dc 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api.hpp +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api.hpp @@ -245,6 +245,9 @@ bool downcast_call(Object &obj, const T &func) { case db_block_info::ID: func(static_cast(obj)); return true; + case db_block_packedInfo::ID: + func(static_cast(obj)); + return true; case db_block_archivedInfo::ID: func(static_cast(obj)); return true; @@ -1340,6 +1343,9 @@ bool downcast_call(db_block_Info &obj, const T &func) { case db_block_info::ID: func(static_cast(obj)); return true; + case db_block_packedInfo::ID: + func(static_cast(obj)); + return true; case db_block_archivedInfo::ID: func(static_cast(obj)); return true; diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api_json.cpp b/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api_json.cpp index df0f134a1d..dde2c4fd45 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api_json.cpp +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api_json.cpp @@ -159,6 +159,7 @@ Result tl_constructor_from_string(ton_api::catchain_block_inner_Data *obj Result tl_constructor_from_string(ton_api::db_block_Info *object, const std::string &str) { static const std::unordered_map m = { {"db.block.info", 1254549287}, + {"db.block.packedInfo", 1186697618}, {"db.block.archivedInfo", 543128145} }; auto it = m.find(str); @@ -575,6 +576,7 @@ Result tl_constructor_from_string(ton_api::Object *object, const std::str {"control.config.local", 1964895469}, {"db.candidate", 1708747482}, {"db.block.info", 1254549287}, + {"db.block.packedInfo", 1186697618}, {"db.block.archivedInfo", 543128145}, {"db.blockdb.key.lru", 1354536506}, {"db.blockdb.key.value", 2136461683}, @@ -2116,6 +2118,27 @@ Status from_json(ton_api::db_block_info &to, JsonObject &from) { } return Status::OK(); } +Status from_json(ton_api::db_block_packedInfo &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "id", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.id_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "unixtime", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.unixtime_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "offset", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.offset_, value)); + } + } + return Status::OK(); +} Status from_json(ton_api::db_block_archivedInfo &to, JsonObject &from) { { TRY_RESULT(value, get_json_object_field(from, "id", JsonValue::Type::Null, true)); @@ -6446,6 +6469,15 @@ void to_json(JsonValueScope &jv, const ton_api::db_block_info &object) { jo << ctie("ts", ToJson(object.ts_)); jo << ctie("state", ToJson(object.state_)); } +void to_json(JsonValueScope &jv, const ton_api::db_block_packedInfo &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "db.block.packedInfo"); + if (object.id_) { + jo << ctie("id", ToJson(object.id_)); + } + jo << ctie("unixtime", ToJson(object.unixtime_)); + jo << ctie("offset", ToJson(JsonInt64{object.offset_})); +} void to_json(JsonValueScope &jv, const ton_api::db_block_archivedInfo &object) { auto jo = jv.enter_object(); jo << ctie("@type", "db.block.archivedInfo"); diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api_json.h b/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api_json.h index da8fa1524d..b7fbcebbc5 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api_json.h +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/ton_api_json.h @@ -128,6 +128,7 @@ Status from_json(ton_api::config_local &to, JsonObject &from); Status from_json(ton_api::control_config_local &to, JsonObject &from); Status from_json(ton_api::db_candidate &to, JsonObject &from); Status from_json(ton_api::db_block_info &to, JsonObject &from); +Status from_json(ton_api::db_block_packedInfo &to, JsonObject &from); Status from_json(ton_api::db_block_archivedInfo &to, JsonObject &from); Status from_json(ton_api::db_blockdb_key_lru &to, JsonObject &from); Status from_json(ton_api::db_blockdb_key_value &to, JsonObject &from); @@ -472,6 +473,7 @@ void to_json(JsonValueScope &jv, const ton_api::control_config_local &object); void to_json(JsonValueScope &jv, const ton_api::db_candidate &object); void to_json(JsonValueScope &jv, const ton_api::db_block_Info &object); void to_json(JsonValueScope &jv, const ton_api::db_block_info &object); +void to_json(JsonValueScope &jv, const ton_api::db_block_packedInfo &object); void to_json(JsonValueScope &jv, const ton_api::db_block_archivedInfo &object); void to_json(JsonValueScope &jv, const ton_api::db_blockdb_Key &object); void to_json(JsonValueScope &jv, const ton_api::db_blockdb_key_lru &object); diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.cpp b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.cpp index 99ac12bb06..8e3b60dd62 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.cpp +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.cpp @@ -175,6 +175,33 @@ void exportedPemKey::store(td::TlStorerToString &s, const char *field_name) cons } } +fees::fees() + : in_fwd_fee_() + , storage_fee_() + , gas_fee_() + , fwd_fee_() +{} + +fees::fees(std::int64_t in_fwd_fee_, std::int64_t storage_fee_, std::int64_t gas_fee_, std::int64_t fwd_fee_) + : in_fwd_fee_(in_fwd_fee_) + , storage_fee_(storage_fee_) + , gas_fee_(gas_fee_) + , fwd_fee_(fwd_fee_) +{} + +const std::int32_t fees::ID; + +void fees::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "fees"); + s.store_field("in_fwd_fee", in_fwd_fee_); + s.store_field("storage_fee", storage_fee_); + s.store_field("gas_fee", gas_fee_); + s.store_field("fwd_fee", fwd_fee_); + s.store_class_end(); + } +} + inputKey::inputKey() : key_() , local_password_() @@ -196,6 +223,18 @@ void inputKey::store(td::TlStorerToString &s, const char *field_name) const { } } +inputKeyFake::inputKeyFake() { +} + +const std::int32_t inputKeyFake::ID; + +void inputKeyFake::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "inputKeyFake"); + s.store_class_end(); + } +} + key::key() : public_key_() , secret_() @@ -382,6 +421,42 @@ void sendGramsResult::store(td::TlStorerToString &s, const char *field_name) con } } +syncStateDone::syncStateDone() { +} + +const std::int32_t syncStateDone::ID; + +void syncStateDone::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "syncStateDone"); + s.store_class_end(); + } +} + +syncStateInProgress::syncStateInProgress() + : from_seqno_() + , to_seqno_() + , current_seqno_() +{} + +syncStateInProgress::syncStateInProgress(std::int32_t from_seqno_, std::int32_t to_seqno_, std::int32_t current_seqno_) + : from_seqno_(from_seqno_) + , to_seqno_(to_seqno_) + , current_seqno_(current_seqno_) +{} + +const std::int32_t syncStateInProgress::ID; + +void syncStateInProgress::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "syncStateInProgress"); + s.store_field("from_seqno", from_seqno_); + s.store_field("to_seqno", to_seqno_); + s.store_field("current_seqno", current_seqno_); + s.store_class_end(); + } +} + unpackedAccountAddress::unpackedAccountAddress() : workchain_id_() , bounceable_() @@ -430,6 +505,24 @@ void updateSendLiteServerQuery::store(td::TlStorerToString &s, const char *field } } +updateSyncState::updateSyncState() + : sync_state_() +{} + +updateSyncState::updateSyncState(object_ptr &&sync_state_) + : sync_state_(std::move(sync_state_)) +{} + +const std::int32_t updateSyncState::ID; + +void updateSyncState::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "updateSyncState"); + if (sync_state_ == nullptr) { s.store_field("sync_state", "null"); } else { sync_state_->store(s, "sync_state"); } + s.store_class_end(); + } +} + generic_accountStateRaw::generic_accountStateRaw() : account_state_() {} @@ -541,6 +634,75 @@ void internal_transactionId::store(td::TlStorerToString &s, const char *field_na } } +liteServer_info::liteServer_info() + : now_() + , version_() + , capabilities_() +{} + +liteServer_info::liteServer_info(std::int64_t now_, std::int32_t version_, std::int64_t capabilities_) + : now_(now_) + , version_(version_) + , capabilities_(capabilities_) +{} + +const std::int32_t liteServer_info::ID; + +void liteServer_info::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "liteServer_info"); + s.store_field("now", now_); + s.store_field("version", version_); + s.store_field("capabilities", capabilities_); + s.store_class_end(); + } +} + +query_fees::query_fees() + : source_fees_() + , destination_fees_() +{} + +query_fees::query_fees(object_ptr &&source_fees_, object_ptr &&destination_fees_) + : source_fees_(std::move(source_fees_)) + , destination_fees_(std::move(destination_fees_)) +{} + +const std::int32_t query_fees::ID; + +void query_fees::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "query_fees"); + if (source_fees_ == nullptr) { s.store_field("source_fees", "null"); } else { source_fees_->store(s, "source_fees"); } + if (destination_fees_ == nullptr) { s.store_field("destination_fees", "null"); } else { destination_fees_->store(s, "destination_fees"); } + s.store_class_end(); + } +} + +query_info::query_info() + : id_() + , valid_until_() + , body_hash_() +{} + +query_info::query_info(std::int64_t id_, std::int64_t valid_until_, std::string const &body_hash_) + : id_(id_) + , valid_until_(valid_until_) + , body_hash_(std::move(body_hash_)) +{} + +const std::int32_t query_info::ID; + +void query_info::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "query_info"); + s.store_field("id", id_); + s.store_field("valid_until", valid_until_); + s.store_bytes_field("body_hash", body_hash_); + s.store_class_end(); + } +} + raw_accountState::raw_accountState() : balance_() , code_() @@ -864,7 +1026,7 @@ changeLocalPassword::changeLocalPassword() , new_local_password_() {} -changeLocalPassword::changeLocalPassword(object_ptr &&input_key_, td::SecureString &&new_local_password_) +changeLocalPassword::changeLocalPassword(object_ptr &&input_key_, td::SecureString &&new_local_password_) : input_key_(std::move(input_key_)) , new_local_password_(std::move(new_local_password_)) {} @@ -993,7 +1155,7 @@ exportEncryptedKey::exportEncryptedKey() , key_password_() {} -exportEncryptedKey::exportEncryptedKey(object_ptr &&input_key_, td::SecureString &&key_password_) +exportEncryptedKey::exportEncryptedKey(object_ptr &&input_key_, td::SecureString &&key_password_) : input_key_(std::move(input_key_)) , key_password_(std::move(key_password_)) {} @@ -1013,7 +1175,7 @@ exportKey::exportKey() : input_key_() {} -exportKey::exportKey(object_ptr &&input_key_) +exportKey::exportKey(object_ptr &&input_key_) : input_key_(std::move(input_key_)) {} @@ -1032,7 +1194,7 @@ exportPemKey::exportPemKey() , key_password_() {} -exportPemKey::exportPemKey(object_ptr &&input_key_, td::SecureString &&key_password_) +exportPemKey::exportPemKey(object_ptr &&input_key_, td::SecureString &&key_password_) : input_key_(std::move(input_key_)) , key_password_(std::move(key_password_)) {} @@ -1048,6 +1210,42 @@ void exportPemKey::store(td::TlStorerToString &s, const char *field_name) const } } +generic_createSendGramsQuery::generic_createSendGramsQuery() + : private_key_() + , source_() + , destination_() + , amount_() + , timeout_() + , allow_send_to_uninited_() + , message_() +{} + +generic_createSendGramsQuery::generic_createSendGramsQuery(object_ptr &&private_key_, object_ptr &&source_, object_ptr &&destination_, std::int64_t amount_, std::int32_t timeout_, bool allow_send_to_uninited_, std::string const &message_) + : private_key_(std::move(private_key_)) + , source_(std::move(source_)) + , destination_(std::move(destination_)) + , amount_(amount_) + , timeout_(timeout_) + , allow_send_to_uninited_(allow_send_to_uninited_) + , message_(std::move(message_)) +{} + +const std::int32_t generic_createSendGramsQuery::ID; + +void generic_createSendGramsQuery::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "generic_createSendGramsQuery"); + if (private_key_ == nullptr) { s.store_field("private_key", "null"); } else { private_key_->store(s, "private_key"); } + if (source_ == nullptr) { s.store_field("source", "null"); } else { source_->store(s, "source"); } + if (destination_ == nullptr) { s.store_field("destination", "null"); } else { destination_->store(s, "destination"); } + s.store_field("amount", amount_); + s.store_field("timeout", timeout_); + s.store_field("allow_send_to_uninited", allow_send_to_uninited_); + s.store_bytes_field("message", message_); + s.store_class_end(); + } +} + generic_getAccountState::generic_getAccountState() : account_address_() {} @@ -1076,7 +1274,7 @@ generic_sendGrams::generic_sendGrams() , message_() {} -generic_sendGrams::generic_sendGrams(object_ptr &&private_key_, object_ptr &&source_, object_ptr &&destination_, std::int64_t amount_, std::int32_t timeout_, bool allow_send_to_uninited_, std::string const &message_) +generic_sendGrams::generic_sendGrams(object_ptr &&private_key_, object_ptr &&source_, object_ptr &&destination_, std::int64_t amount_, std::int32_t timeout_, bool allow_send_to_uninited_, std::string const &message_) : private_key_(std::move(private_key_)) , source_(std::move(source_)) , destination_(std::move(destination_)) @@ -1288,6 +1486,18 @@ void kdf::store(td::TlStorerToString &s, const char *field_name) const { } } +liteServer_getInfo::liteServer_getInfo() { +} + +const std::int32_t liteServer_getInfo::ID; + +void liteServer_getInfo::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "liteServer_getInfo"); + s.store_class_end(); + } +} + onLiteServerQueryError::onLiteServerQueryError() : id_() , error_() @@ -1366,6 +1576,132 @@ void packAccountAddress::store(td::TlStorerToString &s, const char *field_name) } } +query_estimateFees::query_estimateFees() + : id_() + , ignore_chksig_() +{} + +query_estimateFees::query_estimateFees(std::int64_t id_, bool ignore_chksig_) + : id_(id_) + , ignore_chksig_(ignore_chksig_) +{} + +const std::int32_t query_estimateFees::ID; + +void query_estimateFees::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "query_estimateFees"); + s.store_field("id", id_); + s.store_field("ignore_chksig", ignore_chksig_); + s.store_class_end(); + } +} + +query_forget::query_forget() + : id_() +{} + +query_forget::query_forget(std::int64_t id_) + : id_(id_) +{} + +const std::int32_t query_forget::ID; + +void query_forget::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "query_forget"); + s.store_field("id", id_); + s.store_class_end(); + } +} + +query_getInfo::query_getInfo() + : id_() +{} + +query_getInfo::query_getInfo(std::int64_t id_) + : id_(id_) +{} + +const std::int32_t query_getInfo::ID; + +void query_getInfo::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "query_getInfo"); + s.store_field("id", id_); + s.store_class_end(); + } +} + +query_send::query_send() + : id_() +{} + +query_send::query_send(std::int64_t id_) + : id_(id_) +{} + +const std::int32_t query_send::ID; + +void query_send::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "query_send"); + s.store_field("id", id_); + s.store_class_end(); + } +} + +raw_createAndSendMessage::raw_createAndSendMessage() + : destination_() + , initial_account_state_() + , data_() +{} + +raw_createAndSendMessage::raw_createAndSendMessage(object_ptr &&destination_, std::string const &initial_account_state_, std::string const &data_) + : destination_(std::move(destination_)) + , initial_account_state_(std::move(initial_account_state_)) + , data_(std::move(data_)) +{} + +const std::int32_t raw_createAndSendMessage::ID; + +void raw_createAndSendMessage::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "raw_createAndSendMessage"); + if (destination_ == nullptr) { s.store_field("destination", "null"); } else { destination_->store(s, "destination"); } + s.store_bytes_field("initial_account_state", initial_account_state_); + s.store_bytes_field("data", data_); + s.store_class_end(); + } +} + +raw_createQuery::raw_createQuery() + : destination_() + , init_code_() + , init_data_() + , body_() +{} + +raw_createQuery::raw_createQuery(object_ptr &&destination_, std::string const &init_code_, std::string const &init_data_, std::string const &body_) + : destination_(std::move(destination_)) + , init_code_(std::move(init_code_)) + , init_data_(std::move(init_data_)) + , body_(std::move(body_)) +{} + +const std::int32_t raw_createQuery::ID; + +void raw_createQuery::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "raw_createQuery"); + if (destination_ == nullptr) { s.store_field("destination", "null"); } else { destination_->store(s, "destination"); } + s.store_bytes_field("init_code", init_code_); + s.store_bytes_field("init_data", init_data_); + s.store_bytes_field("body", body_); + s.store_class_end(); + } +} + raw_getAccountAddress::raw_getAccountAddress() : initital_account_state_() {} @@ -1424,15 +1760,11 @@ void raw_getTransactions::store(td::TlStorerToString &s, const char *field_name) } raw_sendMessage::raw_sendMessage() - : destination_() - , initial_account_state_() - , data_() + : body_() {} -raw_sendMessage::raw_sendMessage(object_ptr &&destination_, std::string const &initial_account_state_, std::string const &data_) - : destination_(std::move(destination_)) - , initial_account_state_(std::move(initial_account_state_)) - , data_(std::move(data_)) +raw_sendMessage::raw_sendMessage(std::string const &body_) + : body_(std::move(body_)) {} const std::int32_t raw_sendMessage::ID; @@ -1440,9 +1772,7 @@ const std::int32_t raw_sendMessage::ID; void raw_sendMessage::store(td::TlStorerToString &s, const char *field_name) const { if (!LOG_IS_STRIPPED(ERROR)) { s.store_class_begin(field_name, "raw_sendMessage"); - if (destination_ == nullptr) { s.store_field("destination", "null"); } else { destination_->store(s, "destination"); } - s.store_bytes_field("initial_account_state", initial_account_state_); - s.store_bytes_field("data", data_); + s.store_bytes_field("body", body_); s.store_class_end(); } } @@ -1522,6 +1852,18 @@ void setLogVerbosityLevel::store(td::TlStorerToString &s, const char *field_name } } +sync::sync() { +} + +const std::int32_t sync::ID; + +void sync::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "sync"); + s.store_class_end(); + } +} + testGiver_getAccountAddress::testGiver_getAccountAddress() { } @@ -1613,7 +1955,7 @@ testWallet_init::testWallet_init() : private_key_() {} -testWallet_init::testWallet_init(object_ptr &&private_key_) +testWallet_init::testWallet_init(object_ptr &&private_key_) : private_key_(std::move(private_key_)) {} @@ -1635,7 +1977,7 @@ testWallet_sendGrams::testWallet_sendGrams() , message_() {} -testWallet_sendGrams::testWallet_sendGrams(object_ptr &&private_key_, object_ptr &&destination_, std::int32_t seqno_, std::int64_t amount_, std::string const &message_) +testWallet_sendGrams::testWallet_sendGrams(object_ptr &&private_key_, object_ptr &&destination_, std::int32_t seqno_, std::int64_t amount_, std::string const &message_) : private_key_(std::move(private_key_)) , destination_(std::move(destination_)) , seqno_(seqno_) @@ -1715,7 +2057,7 @@ wallet_init::wallet_init() : private_key_() {} -wallet_init::wallet_init(object_ptr &&private_key_) +wallet_init::wallet_init(object_ptr &&private_key_) : private_key_(std::move(private_key_)) {} @@ -1738,7 +2080,7 @@ wallet_sendGrams::wallet_sendGrams() , message_() {} -wallet_sendGrams::wallet_sendGrams(object_ptr &&private_key_, object_ptr &&destination_, std::int32_t seqno_, std::int64_t valid_until_, std::int64_t amount_, std::string const &message_) +wallet_sendGrams::wallet_sendGrams(object_ptr &&private_key_, object_ptr &&destination_, std::int32_t seqno_, std::int64_t valid_until_, std::int64_t amount_, std::string const &message_) : private_key_(std::move(private_key_)) , destination_(std::move(destination_)) , seqno_(seqno_) diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.h b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.h index a9f5430c73..e7862ec366 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.h +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.h @@ -60,7 +60,9 @@ class exportedKey; class exportedPemKey; -class inputKey; +class fees; + +class InputKey; class key; @@ -78,14 +80,22 @@ class options; class sendGramsResult; +class SyncState; + class unpackedAccountAddress; -class updateSendLiteServerQuery; +class Update; class generic_AccountState; class internal_transactionId; +class liteServer_info; + +class query_fees; + +class query_info; + class raw_accountState; class raw_initialAccountState; @@ -250,7 +260,30 @@ class exportedPemKey final : public Object { void store(td::TlStorerToString &s, const char *field_name) const final; }; -class inputKey final : public Object { +class fees final : public Object { + public: + std::int64_t in_fwd_fee_; + std::int64_t storage_fee_; + std::int64_t gas_fee_; + std::int64_t fwd_fee_; + + fees(); + + fees(std::int64_t in_fwd_fee_, std::int64_t storage_fee_, std::int64_t gas_fee_, std::int64_t fwd_fee_); + + static const std::int32_t ID = 1676273340; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class InputKey: public Object { + public: +}; + +class inputKey final : public InputKey { public: object_ptr key_; td::SecureString local_password_; @@ -267,6 +300,19 @@ class inputKey final : public Object { void store(td::TlStorerToString &s, const char *field_name) const final; }; +class inputKeyFake final : public InputKey { + public: + + inputKeyFake(); + + static const std::int32_t ID = -1074054722; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + class key final : public Object { public: std::string public_key_; @@ -443,6 +489,41 @@ class sendGramsResult final : public Object { void store(td::TlStorerToString &s, const char *field_name) const final; }; +class SyncState: public Object { + public: +}; + +class syncStateDone final : public SyncState { + public: + + syncStateDone(); + + static const std::int32_t ID = 1408448777; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class syncStateInProgress final : public SyncState { + public: + std::int32_t from_seqno_; + std::int32_t to_seqno_; + std::int32_t current_seqno_; + + syncStateInProgress(); + + syncStateInProgress(std::int32_t from_seqno_, std::int32_t to_seqno_, std::int32_t current_seqno_); + + static const std::int32_t ID = 107726023; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + class unpackedAccountAddress final : public Object { public: std::int32_t workchain_id_; @@ -462,7 +543,11 @@ class unpackedAccountAddress final : public Object { void store(td::TlStorerToString &s, const char *field_name) const final; }; -class updateSendLiteServerQuery final : public Object { +class Update: public Object { + public: +}; + +class updateSendLiteServerQuery final : public Update { public: std::int64_t id_; std::string data_; @@ -479,6 +564,22 @@ class updateSendLiteServerQuery final : public Object { void store(td::TlStorerToString &s, const char *field_name) const final; }; +class updateSyncState final : public Update { + public: + object_ptr sync_state_; + + updateSyncState(); + + explicit updateSyncState(object_ptr &&sync_state_); + + static const std::int32_t ID = 1204298718; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + class generic_AccountState: public Object { public: }; @@ -580,6 +681,59 @@ class internal_transactionId final : public Object { void store(td::TlStorerToString &s, const char *field_name) const final; }; +class liteServer_info final : public Object { + public: + std::int64_t now_; + std::int32_t version_; + std::int64_t capabilities_; + + liteServer_info(); + + liteServer_info(std::int64_t now_, std::int32_t version_, std::int64_t capabilities_); + + static const std::int32_t ID = -1250165133; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class query_fees final : public Object { + public: + object_ptr source_fees_; + object_ptr destination_fees_; + + query_fees(); + + query_fees(object_ptr &&source_fees_, object_ptr &&destination_fees_); + + static const std::int32_t ID = 725267759; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class query_info final : public Object { + public: + std::int64_t id_; + std::int64_t valid_until_; + std::string body_hash_; + + query_info(); + + query_info(std::int64_t id_, std::int64_t valid_until_, std::string const &body_hash_); + + static const std::int32_t ID = 1588635915; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + class raw_accountState final : public Object { public: std::int64_t balance_; @@ -810,14 +964,14 @@ class addLogMessage final : public Function { class changeLocalPassword final : public Function { public: - object_ptr input_key_; + object_ptr input_key_; td::SecureString new_local_password_; changeLocalPassword(); - changeLocalPassword(object_ptr &&input_key_, td::SecureString &&new_local_password_); + changeLocalPassword(object_ptr &&input_key_, td::SecureString &&new_local_password_); - static const std::int32_t ID = -1685491421; + static const std::int32_t ID = -401590337; std::int32_t get_id() const final { return ID; } @@ -935,14 +1089,14 @@ class encrypt final : public Function { class exportEncryptedKey final : public Function { public: - object_ptr input_key_; + object_ptr input_key_; td::SecureString key_password_; exportEncryptedKey(); - exportEncryptedKey(object_ptr &&input_key_, td::SecureString &&key_password_); + exportEncryptedKey(object_ptr &&input_key_, td::SecureString &&key_password_); - static const std::int32_t ID = 155352861; + static const std::int32_t ID = 218237311; std::int32_t get_id() const final { return ID; } @@ -954,13 +1108,13 @@ class exportEncryptedKey final : public Function { class exportKey final : public Function { public: - object_ptr input_key_; + object_ptr input_key_; exportKey(); - explicit exportKey(object_ptr &&input_key_); + explicit exportKey(object_ptr &&input_key_); - static const std::int32_t ID = 399723440; + static const std::int32_t ID = -1622353549; std::int32_t get_id() const final { return ID; } @@ -972,14 +1126,14 @@ class exportKey final : public Function { class exportPemKey final : public Function { public: - object_ptr input_key_; + object_ptr input_key_; td::SecureString key_password_; exportPemKey(); - exportPemKey(object_ptr &&input_key_, td::SecureString &&key_password_); + exportPemKey(object_ptr &&input_key_, td::SecureString &&key_password_); - static const std::int32_t ID = -2047752448; + static const std::int32_t ID = -643259462; std::int32_t get_id() const final { return ID; } @@ -989,6 +1143,30 @@ class exportPemKey final : public Function { void store(td::TlStorerToString &s, const char *field_name) const final; }; +class generic_createSendGramsQuery final : public Function { + public: + object_ptr private_key_; + object_ptr source_; + object_ptr destination_; + std::int64_t amount_; + std::int32_t timeout_; + bool allow_send_to_uninited_; + std::string message_; + + generic_createSendGramsQuery(); + + generic_createSendGramsQuery(object_ptr &&private_key_, object_ptr &&source_, object_ptr &&destination_, std::int64_t amount_, std::int32_t timeout_, bool allow_send_to_uninited_, std::string const &message_); + + static const std::int32_t ID = 208206338; + std::int32_t get_id() const final { + return ID; + } + + using ReturnType = object_ptr; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + class generic_getAccountState final : public Function { public: object_ptr account_address_; @@ -1009,7 +1187,7 @@ class generic_getAccountState final : public Function { class generic_sendGrams final : public Function { public: - object_ptr private_key_; + object_ptr private_key_; object_ptr source_; object_ptr destination_; std::int64_t amount_; @@ -1019,9 +1197,9 @@ class generic_sendGrams final : public Function { generic_sendGrams(); - generic_sendGrams(object_ptr &&private_key_, object_ptr &&source_, object_ptr &&destination_, std::int64_t amount_, std::int32_t timeout_, bool allow_send_to_uninited_, std::string const &message_); + generic_sendGrams(object_ptr &&private_key_, object_ptr &&source_, object_ptr &&destination_, std::int64_t amount_, std::int32_t timeout_, bool allow_send_to_uninited_, std::string const &message_); - static const std::int32_t ID = -758801136; + static const std::int32_t ID = -553513162; std::int32_t get_id() const final { return ID; } @@ -1210,6 +1388,21 @@ class kdf final : public Function { void store(td::TlStorerToString &s, const char *field_name) const final; }; +class liteServer_getInfo final : public Function { + public: + + liteServer_getInfo(); + + static const std::int32_t ID = 1435327470; + std::int32_t get_id() const final { + return ID; + } + + using ReturnType = object_ptr; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + class onLiteServerQueryError final : public Function { public: std::int64_t id_; @@ -1284,6 +1477,120 @@ class packAccountAddress final : public Function { void store(td::TlStorerToString &s, const char *field_name) const final; }; +class query_estimateFees final : public Function { + public: + std::int64_t id_; + bool ignore_chksig_; + + query_estimateFees(); + + query_estimateFees(std::int64_t id_, bool ignore_chksig_); + + static const std::int32_t ID = -957002175; + std::int32_t get_id() const final { + return ID; + } + + using ReturnType = object_ptr; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class query_forget final : public Function { + public: + std::int64_t id_; + + query_forget(); + + explicit query_forget(std::int64_t id_); + + static const std::int32_t ID = -1211985313; + std::int32_t get_id() const final { + return ID; + } + + using ReturnType = object_ptr; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class query_getInfo final : public Function { + public: + std::int64_t id_; + + query_getInfo(); + + explicit query_getInfo(std::int64_t id_); + + static const std::int32_t ID = -799333669; + std::int32_t get_id() const final { + return ID; + } + + using ReturnType = object_ptr; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class query_send final : public Function { + public: + std::int64_t id_; + + query_send(); + + explicit query_send(std::int64_t id_); + + static const std::int32_t ID = 925242739; + std::int32_t get_id() const final { + return ID; + } + + using ReturnType = object_ptr; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class raw_createAndSendMessage final : public Function { + public: + object_ptr destination_; + std::string initial_account_state_; + std::string data_; + + raw_createAndSendMessage(); + + raw_createAndSendMessage(object_ptr &&destination_, std::string const &initial_account_state_, std::string const &data_); + + static const std::int32_t ID = -772224603; + std::int32_t get_id() const final { + return ID; + } + + using ReturnType = object_ptr; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class raw_createQuery final : public Function { + public: + object_ptr destination_; + std::string init_code_; + std::string init_data_; + std::string body_; + + raw_createQuery(); + + raw_createQuery(object_ptr &&destination_, std::string const &init_code_, std::string const &init_data_, std::string const &body_); + + static const std::int32_t ID = -1928557909; + std::int32_t get_id() const final { + return ID; + } + + using ReturnType = object_ptr; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + class raw_getAccountAddress final : public Function { public: object_ptr initital_account_state_; @@ -1341,15 +1648,13 @@ class raw_getTransactions final : public Function { class raw_sendMessage final : public Function { public: - object_ptr destination_; - std::string initial_account_state_; - std::string data_; + std::string body_; raw_sendMessage(); - raw_sendMessage(object_ptr &&destination_, std::string const &initial_account_state_, std::string const &data_); + explicit raw_sendMessage(std::string const &body_); - static const std::int32_t ID = 473889461; + static const std::int32_t ID = -1789427488; std::int32_t get_id() const final { return ID; } @@ -1432,6 +1737,21 @@ class setLogVerbosityLevel final : public Function { void store(td::TlStorerToString &s, const char *field_name) const final; }; +class sync final : public Function { + public: + + sync(); + + static const std::int32_t ID = -1617065525; + std::int32_t get_id() const final { + return ID; + } + + using ReturnType = object_ptr; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + class testGiver_getAccountAddress final : public Function { public: @@ -1521,13 +1841,13 @@ class testWallet_getAccountState final : public Function { class testWallet_init final : public Function { public: - object_ptr private_key_; + object_ptr private_key_; testWallet_init(); - explicit testWallet_init(object_ptr &&private_key_); + explicit testWallet_init(object_ptr &&private_key_); - static const std::int32_t ID = 419055225; + static const std::int32_t ID = -1417409140; std::int32_t get_id() const final { return ID; } @@ -1539,7 +1859,7 @@ class testWallet_init final : public Function { class testWallet_sendGrams final : public Function { public: - object_ptr private_key_; + object_ptr private_key_; object_ptr destination_; std::int32_t seqno_; std::int64_t amount_; @@ -1547,9 +1867,9 @@ class testWallet_sendGrams final : public Function { testWallet_sendGrams(); - testWallet_sendGrams(object_ptr &&private_key_, object_ptr &&destination_, std::int32_t seqno_, std::int64_t amount_, std::string const &message_); + testWallet_sendGrams(object_ptr &&private_key_, object_ptr &&destination_, std::int32_t seqno_, std::int64_t amount_, std::string const &message_); - static const std::int32_t ID = 1290131585; + static const std::int32_t ID = 573748322; std::int32_t get_id() const final { return ID; } @@ -1615,13 +1935,13 @@ class wallet_getAccountState final : public Function { class wallet_init final : public Function { public: - object_ptr private_key_; + object_ptr private_key_; wallet_init(); - explicit wallet_init(object_ptr &&private_key_); + explicit wallet_init(object_ptr &&private_key_); - static const std::int32_t ID = 1528056782; + static const std::int32_t ID = -395706309; std::int32_t get_id() const final { return ID; } @@ -1633,7 +1953,7 @@ class wallet_init final : public Function { class wallet_sendGrams final : public Function { public: - object_ptr private_key_; + object_ptr private_key_; object_ptr destination_; std::int32_t seqno_; std::int64_t valid_until_; @@ -1642,9 +1962,9 @@ class wallet_sendGrams final : public Function { wallet_sendGrams(); - wallet_sendGrams(object_ptr &&private_key_, object_ptr &&destination_, std::int32_t seqno_, std::int64_t valid_until_, std::int64_t amount_, std::string const &message_); + wallet_sendGrams(object_ptr &&private_key_, object_ptr &&destination_, std::int32_t seqno_, std::int64_t valid_until_, std::int64_t amount_, std::string const &message_); - static const std::int32_t ID = -1837893526; + static const std::int32_t ID = 297317621; std::int32_t get_id() const final { return ID; } diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.hpp b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.hpp index 6ab06e09bc..bd5e0fad7e 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.hpp +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.hpp @@ -38,9 +38,15 @@ bool downcast_call(Object &obj, const T &func) { case exportedPemKey::ID: func(static_cast(obj)); return true; + case fees::ID: + func(static_cast(obj)); + return true; case inputKey::ID: func(static_cast(obj)); return true; + case inputKeyFake::ID: + func(static_cast(obj)); + return true; case key::ID: func(static_cast(obj)); return true; @@ -74,12 +80,21 @@ bool downcast_call(Object &obj, const T &func) { case sendGramsResult::ID: func(static_cast(obj)); return true; + case syncStateDone::ID: + func(static_cast(obj)); + return true; + case syncStateInProgress::ID: + func(static_cast(obj)); + return true; case unpackedAccountAddress::ID: func(static_cast(obj)); return true; case updateSendLiteServerQuery::ID: func(static_cast(obj)); return true; + case updateSyncState::ID: + func(static_cast(obj)); + return true; case generic_accountStateRaw::ID: func(static_cast(obj)); return true; @@ -98,6 +113,15 @@ bool downcast_call(Object &obj, const T &func) { case internal_transactionId::ID: func(static_cast(obj)); return true; + case liteServer_info::ID: + func(static_cast(obj)); + return true; + case query_fees::ID: + func(static_cast(obj)); + return true; + case query_info::ID: + func(static_cast(obj)); + return true; case raw_accountState::ID: func(static_cast(obj)); return true; @@ -178,6 +202,9 @@ bool downcast_call(Function &obj, const T &func) { case exportPemKey::ID: func(static_cast(obj)); return true; + case generic_createSendGramsQuery::ID: + func(static_cast(obj)); + return true; case generic_getAccountState::ID: func(static_cast(obj)); return true; @@ -214,6 +241,9 @@ bool downcast_call(Function &obj, const T &func) { case kdf::ID: func(static_cast(obj)); return true; + case liteServer_getInfo::ID: + func(static_cast(obj)); + return true; case onLiteServerQueryError::ID: func(static_cast(obj)); return true; @@ -226,6 +256,24 @@ bool downcast_call(Function &obj, const T &func) { case packAccountAddress::ID: func(static_cast(obj)); return true; + case query_estimateFees::ID: + func(static_cast(obj)); + return true; + case query_forget::ID: + func(static_cast(obj)); + return true; + case query_getInfo::ID: + func(static_cast(obj)); + return true; + case query_send::ID: + func(static_cast(obj)); + return true; + case raw_createAndSendMessage::ID: + func(static_cast(obj)); + return true; + case raw_createQuery::ID: + func(static_cast(obj)); + return true; case raw_getAccountAddress::ID: func(static_cast(obj)); return true; @@ -250,6 +298,9 @@ bool downcast_call(Function &obj, const T &func) { case setLogVerbosityLevel::ID: func(static_cast(obj)); return true; + case sync::ID: + func(static_cast(obj)); + return true; case testGiver_getAccountAddress::ID: func(static_cast(obj)); return true; @@ -291,6 +342,26 @@ bool downcast_call(Function &obj, const T &func) { } } +/** + * Calls specified function object with the specified object downcasted to the most-derived type. + * \param[in] obj Object to pass as an argument to the function object. + * \param[in] func Function object to which the object will be passed. + * \returns whether function object call has happened. Should always return true for correct parameters. + */ +template +bool downcast_call(InputKey &obj, const T &func) { + switch (obj.get_id()) { + case inputKey::ID: + func(static_cast(obj)); + return true; + case inputKeyFake::ID: + func(static_cast(obj)); + return true; + default: + return false; + } +} + /** * Calls specified function object with the specified object downcasted to the most-derived type. * \param[in] obj Object to pass as an argument to the function object. @@ -334,6 +405,46 @@ bool downcast_call(LogStream &obj, const T &func) { } } +/** + * Calls specified function object with the specified object downcasted to the most-derived type. + * \param[in] obj Object to pass as an argument to the function object. + * \param[in] func Function object to which the object will be passed. + * \returns whether function object call has happened. Should always return true for correct parameters. + */ +template +bool downcast_call(SyncState &obj, const T &func) { + switch (obj.get_id()) { + case syncStateDone::ID: + func(static_cast(obj)); + return true; + case syncStateInProgress::ID: + func(static_cast(obj)); + return true; + default: + return false; + } +} + +/** + * Calls specified function object with the specified object downcasted to the most-derived type. + * \param[in] obj Object to pass as an argument to the function object. + * \param[in] func Function object to which the object will be passed. + * \returns whether function object call has happened. Should always return true for correct parameters. + */ +template +bool downcast_call(Update &obj, const T &func) { + switch (obj.get_id()) { + case updateSendLiteServerQuery::ID: + func(static_cast(obj)); + return true; + case updateSyncState::ID: + func(static_cast(obj)); + return true; + default: + return false; + } +} + /** * Calls specified function object with the specified object downcasted to the most-derived type. * \param[in] obj Object to pass as an argument to the function object. diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.cpp b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.cpp index 4a891190db..a0448c9d68 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.cpp +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.cpp @@ -14,6 +14,17 @@ namespace ton { namespace tonlib_api{ using namespace td; +Result tl_constructor_from_string(tonlib_api::InputKey *object, const std::string &str) { + static const std::unordered_map m = { + {"inputKey", 869287093}, + {"inputKeyFake", -1074054722} + }; + auto it = m.find(str); + if (it == m.end()) { + return Status::Error(str + "Unknown class"); + } + return it->second; +} Result tl_constructor_from_string(tonlib_api::KeyStoreType *object, const std::string &str) { static const std::unordered_map m = { {"keyStoreTypeDirectory", -378990038}, @@ -37,6 +48,28 @@ Result tl_constructor_from_string(tonlib_api::LogStream *object, const st } return it->second; } +Result tl_constructor_from_string(tonlib_api::SyncState *object, const std::string &str) { + static const std::unordered_map m = { + {"syncStateDone", 1408448777}, + {"syncStateInProgress", 107726023} + }; + auto it = m.find(str); + if (it == m.end()) { + return Status::Error(str + "Unknown class"); + } + return it->second; +} +Result tl_constructor_from_string(tonlib_api::Update *object, const std::string &str) { + static const std::unordered_map m = { + {"updateSendLiteServerQuery", -1555130916}, + {"updateSyncState", 1204298718} + }; + auto it = m.find(str); + if (it == m.end()) { + return Status::Error(str + "Unknown class"); + } + return it->second; +} Result tl_constructor_from_string(tonlib_api::generic_AccountState *object, const std::string &str) { static const std::unordered_map m = { {"generic.accountStateRaw", -1387096685}, @@ -61,7 +94,9 @@ Result tl_constructor_from_string(tonlib_api::Object *object, const std:: {"exportedEncryptedKey", 2024406612}, {"exportedKey", -1449248297}, {"exportedPemKey", 1425473725}, + {"fees", 1676273340}, {"inputKey", 869287093}, + {"inputKeyFake", -1074054722}, {"key", -1978362923}, {"keyStoreTypeDirectory", -378990038}, {"keyStoreTypeInMemory", -2106848825}, @@ -73,14 +108,20 @@ Result tl_constructor_from_string(tonlib_api::Object *object, const std:: {"ok", -722616727}, {"options", -1924388359}, {"sendGramsResult", 426872238}, + {"syncStateDone", 1408448777}, + {"syncStateInProgress", 107726023}, {"unpackedAccountAddress", 1892946998}, {"updateSendLiteServerQuery", -1555130916}, + {"updateSyncState", 1204298718}, {"generic.accountStateRaw", -1387096685}, {"generic.accountStateTestWallet", -1041955397}, {"generic.accountStateWallet", 942582925}, {"generic.accountStateTestGiver", 1134654598}, {"generic.accountStateUninited", -908702008}, {"internal.transactionId", -989527262}, + {"liteServer.info", -1250165133}, + {"query.fees", 725267759}, + {"query.info", 1588635915}, {"raw.accountState", 1205935434}, {"raw.initialAccountState", 777456197}, {"raw.message", -906281442}, @@ -102,18 +143,19 @@ Result tl_constructor_from_string(tonlib_api::Object *object, const std:: Result tl_constructor_from_string(tonlib_api::Function *object, const std::string &str) { static const std::unordered_map m = { {"addLogMessage", 1597427692}, - {"changeLocalPassword", -1685491421}, + {"changeLocalPassword", -401590337}, {"close", -1187782273}, {"createNewKey", -1861385712}, {"decrypt", 357991854}, {"deleteAllKeys", 1608776483}, {"deleteKey", -1579595571}, {"encrypt", -1821422820}, - {"exportEncryptedKey", 155352861}, - {"exportKey", 399723440}, - {"exportPemKey", -2047752448}, + {"exportEncryptedKey", 218237311}, + {"exportKey", -1622353549}, + {"exportPemKey", -643259462}, + {"generic.createSendGramsQuery", 208206338}, {"generic.getAccountState", -657000446}, - {"generic.sendGrams", -758801136}, + {"generic.sendGrams", -553513162}, {"getBip39Hints", -1889640982}, {"getLogStream", 1167608667}, {"getLogTagVerbosityLevel", 951004547}, @@ -124,30 +166,38 @@ Result tl_constructor_from_string(tonlib_api::Function *object, const std {"importPemKey", 76385617}, {"init", -2014661877}, {"kdf", -1667861635}, + {"liteServer.getInfo", 1435327470}, {"onLiteServerQueryError", -677427533}, {"onLiteServerQueryResult", 2056444510}, {"options.setConfig", 646497241}, {"packAccountAddress", -1388561940}, + {"query.estimateFees", -957002175}, + {"query.forget", -1211985313}, + {"query.getInfo", -799333669}, + {"query.send", 925242739}, + {"raw.createAndSendMessage", -772224603}, + {"raw.createQuery", -1928557909}, {"raw.getAccountAddress", -521283849}, {"raw.getAccountState", 663706721}, {"raw.getTransactions", 935377269}, - {"raw.sendMessage", 473889461}, + {"raw.sendMessage", -1789427488}, {"runTests", -2039925427}, {"setLogStream", -1364199535}, {"setLogTagVerbosityLevel", -2095589738}, {"setLogVerbosityLevel", -303429678}, + {"sync", -1617065525}, {"testGiver.getAccountAddress", -540100768}, {"testGiver.getAccountState", 267738275}, {"testGiver.sendGrams", -1785750375}, {"testWallet.getAccountAddress", -1557748223}, {"testWallet.getAccountState", 654082364}, - {"testWallet.init", 419055225}, - {"testWallet.sendGrams", 1290131585}, + {"testWallet.init", -1417409140}, + {"testWallet.sendGrams", 573748322}, {"unpackAccountAddress", -682459063}, {"wallet.getAccountAddress", -1004103180}, {"wallet.getAccountState", 462294850}, - {"wallet.init", 1528056782}, - {"wallet.sendGrams", -1837893526} + {"wallet.init", -395706309}, + {"wallet.sendGrams", 297317621} }; auto it = m.find(str); if (it == m.end()) { @@ -251,6 +301,33 @@ Status from_json(tonlib_api::exportedPemKey &to, JsonObject &from) { } return Status::OK(); } +Status from_json(tonlib_api::fees &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "in_fwd_fee", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.in_fwd_fee_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "storage_fee", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.storage_fee_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "gas_fee", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.gas_fee_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "fwd_fee", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.fwd_fee_, value)); + } + } + return Status::OK(); +} Status from_json(tonlib_api::inputKey &to, JsonObject &from) { { TRY_RESULT(value, get_json_object_field(from, "key", JsonValue::Type::Null, true)); @@ -266,6 +343,9 @@ Status from_json(tonlib_api::inputKey &to, JsonObject &from) { } return Status::OK(); } +Status from_json(tonlib_api::inputKeyFake &to, JsonObject &from) { + return Status::OK(); +} Status from_json(tonlib_api::key &to, JsonObject &from) { { TRY_RESULT(value, get_json_object_field(from, "public_key", JsonValue::Type::Null, true)); @@ -365,6 +445,30 @@ Status from_json(tonlib_api::sendGramsResult &to, JsonObject &from) { } return Status::OK(); } +Status from_json(tonlib_api::syncStateDone &to, JsonObject &from) { + return Status::OK(); +} +Status from_json(tonlib_api::syncStateInProgress &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "from_seqno", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.from_seqno_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "to_seqno", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.to_seqno_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "current_seqno", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.current_seqno_, value)); + } + } + return Status::OK(); +} Status from_json(tonlib_api::unpackedAccountAddress &to, JsonObject &from) { { TRY_RESULT(value, get_json_object_field(from, "workchain_id", JsonValue::Type::Null, true)); @@ -407,6 +511,15 @@ Status from_json(tonlib_api::updateSendLiteServerQuery &to, JsonObject &from) { } return Status::OK(); } +Status from_json(tonlib_api::updateSyncState &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "sync_state", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.sync_state_, value)); + } + } + return Status::OK(); +} Status from_json(tonlib_api::generic_accountStateRaw &to, JsonObject &from) { { TRY_RESULT(value, get_json_object_field(from, "account_state", JsonValue::Type::Null, true)); @@ -467,6 +580,63 @@ Status from_json(tonlib_api::internal_transactionId &to, JsonObject &from) { } return Status::OK(); } +Status from_json(tonlib_api::liteServer_info &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "now", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.now_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "version", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.version_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "capabilities", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.capabilities_, value)); + } + } + return Status::OK(); +} +Status from_json(tonlib_api::query_fees &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "source_fees", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.source_fees_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "destination_fees", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.destination_fees_, value)); + } + } + return Status::OK(); +} +Status from_json(tonlib_api::query_info &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "id", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.id_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "valid_until", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.valid_until_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "body_hash", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json_bytes(to.body_hash_, value)); + } + } + return Status::OK(); +} Status from_json(tonlib_api::raw_accountState &to, JsonObject &from) { { TRY_RESULT(value, get_json_object_field(from, "balance", JsonValue::Type::Null, true)); @@ -899,6 +1069,51 @@ Status from_json(tonlib_api::exportPemKey &to, JsonObject &from) { } return Status::OK(); } +Status from_json(tonlib_api::generic_createSendGramsQuery &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "private_key", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.private_key_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "source", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.source_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "destination", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.destination_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "amount", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.amount_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "timeout", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.timeout_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "allow_send_to_uninited", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.allow_send_to_uninited_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "message", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json_bytes(to.message_, value)); + } + } + return Status::OK(); +} Status from_json(tonlib_api::generic_getAccountState &to, JsonObject &from) { { TRY_RESULT(value, get_json_object_field(from, "account_address", JsonValue::Type::Null, true)); @@ -1073,6 +1288,9 @@ Status from_json(tonlib_api::kdf &to, JsonObject &from) { } return Status::OK(); } +Status from_json(tonlib_api::liteServer_getInfo &to, JsonObject &from) { + return Status::OK(); +} Status from_json(tonlib_api::onLiteServerQueryError &to, JsonObject &from) { { TRY_RESULT(value, get_json_object_field(from, "id", JsonValue::Type::Null, true)); @@ -1121,6 +1339,96 @@ Status from_json(tonlib_api::packAccountAddress &to, JsonObject &from) { } return Status::OK(); } +Status from_json(tonlib_api::query_estimateFees &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "id", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.id_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "ignore_chksig", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.ignore_chksig_, value)); + } + } + return Status::OK(); +} +Status from_json(tonlib_api::query_forget &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "id", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.id_, value)); + } + } + return Status::OK(); +} +Status from_json(tonlib_api::query_getInfo &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "id", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.id_, value)); + } + } + return Status::OK(); +} +Status from_json(tonlib_api::query_send &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "id", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.id_, value)); + } + } + return Status::OK(); +} +Status from_json(tonlib_api::raw_createAndSendMessage &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "destination", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.destination_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "initial_account_state", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json_bytes(to.initial_account_state_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "data", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json_bytes(to.data_, value)); + } + } + return Status::OK(); +} +Status from_json(tonlib_api::raw_createQuery &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "destination", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.destination_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "init_code", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json_bytes(to.init_code_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "init_data", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json_bytes(to.init_data_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "body", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json_bytes(to.body_, value)); + } + } + return Status::OK(); +} Status from_json(tonlib_api::raw_getAccountAddress &to, JsonObject &from) { { TRY_RESULT(value, get_json_object_field(from, "initital_account_state", JsonValue::Type::Null, true)); @@ -1156,21 +1464,9 @@ Status from_json(tonlib_api::raw_getTransactions &to, JsonObject &from) { } Status from_json(tonlib_api::raw_sendMessage &to, JsonObject &from) { { - TRY_RESULT(value, get_json_object_field(from, "destination", JsonValue::Type::Null, true)); + TRY_RESULT(value, get_json_object_field(from, "body", JsonValue::Type::Null, true)); if (value.type() != JsonValue::Type::Null) { - TRY_STATUS(from_json(to.destination_, value)); - } - } - { - TRY_RESULT(value, get_json_object_field(from, "initial_account_state", JsonValue::Type::Null, true)); - if (value.type() != JsonValue::Type::Null) { - TRY_STATUS(from_json_bytes(to.initial_account_state_, value)); - } - } - { - TRY_RESULT(value, get_json_object_field(from, "data", JsonValue::Type::Null, true)); - if (value.type() != JsonValue::Type::Null) { - TRY_STATUS(from_json_bytes(to.data_, value)); + TRY_STATUS(from_json_bytes(to.body_, value)); } } return Status::OK(); @@ -1217,6 +1513,9 @@ Status from_json(tonlib_api::setLogVerbosityLevel &to, JsonObject &from) { } return Status::OK(); } +Status from_json(tonlib_api::sync &to, JsonObject &from) { + return Status::OK(); +} Status from_json(tonlib_api::testGiver_getAccountAddress &to, JsonObject &from) { return Status::OK(); } @@ -1429,6 +1728,17 @@ void to_json(JsonValueScope &jv, const tonlib_api::exportedPemKey &object) { jo << ctie("@type", "exportedPemKey"); jo << ctie("pem", ToJson(object.pem_)); } +void to_json(JsonValueScope &jv, const tonlib_api::fees &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "fees"); + jo << ctie("in_fwd_fee", ToJson(object.in_fwd_fee_)); + jo << ctie("storage_fee", ToJson(object.storage_fee_)); + jo << ctie("gas_fee", ToJson(object.gas_fee_)); + jo << ctie("fwd_fee", ToJson(object.fwd_fee_)); +} +void to_json(JsonValueScope &jv, const tonlib_api::InputKey &object) { + tonlib_api::downcast_call(const_cast(object), [&jv](const auto &object) { to_json(jv, object); }); +} void to_json(JsonValueScope &jv, const tonlib_api::inputKey &object) { auto jo = jv.enter_object(); jo << ctie("@type", "inputKey"); @@ -1437,6 +1747,10 @@ void to_json(JsonValueScope &jv, const tonlib_api::inputKey &object) { } jo << ctie("local_password", ToJson(JsonBytes{object.local_password_})); } +void to_json(JsonValueScope &jv, const tonlib_api::inputKeyFake &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "inputKeyFake"); +} void to_json(JsonValueScope &jv, const tonlib_api::key &object) { auto jo = jv.enter_object(); jo << ctie("@type", "key"); @@ -1502,6 +1816,20 @@ void to_json(JsonValueScope &jv, const tonlib_api::sendGramsResult &object) { jo << ctie("sent_until", ToJson(object.sent_until_)); jo << ctie("body_hash", ToJson(JsonBytes{object.body_hash_})); } +void to_json(JsonValueScope &jv, const tonlib_api::SyncState &object) { + tonlib_api::downcast_call(const_cast(object), [&jv](const auto &object) { to_json(jv, object); }); +} +void to_json(JsonValueScope &jv, const tonlib_api::syncStateDone &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "syncStateDone"); +} +void to_json(JsonValueScope &jv, const tonlib_api::syncStateInProgress &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "syncStateInProgress"); + jo << ctie("from_seqno", ToJson(object.from_seqno_)); + jo << ctie("to_seqno", ToJson(object.to_seqno_)); + jo << ctie("current_seqno", ToJson(object.current_seqno_)); +} void to_json(JsonValueScope &jv, const tonlib_api::unpackedAccountAddress &object) { auto jo = jv.enter_object(); jo << ctie("@type", "unpackedAccountAddress"); @@ -1510,12 +1838,22 @@ void to_json(JsonValueScope &jv, const tonlib_api::unpackedAccountAddress &objec jo << ctie("testnet", ToJson(object.testnet_)); jo << ctie("addr", ToJson(JsonBytes{object.addr_})); } +void to_json(JsonValueScope &jv, const tonlib_api::Update &object) { + tonlib_api::downcast_call(const_cast(object), [&jv](const auto &object) { to_json(jv, object); }); +} void to_json(JsonValueScope &jv, const tonlib_api::updateSendLiteServerQuery &object) { auto jo = jv.enter_object(); jo << ctie("@type", "updateSendLiteServerQuery"); jo << ctie("id", ToJson(JsonInt64{object.id_})); jo << ctie("data", ToJson(JsonBytes{object.data_})); } +void to_json(JsonValueScope &jv, const tonlib_api::updateSyncState &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "updateSyncState"); + if (object.sync_state_) { + jo << ctie("sync_state", ToJson(object.sync_state_)); + } +} void to_json(JsonValueScope &jv, const tonlib_api::generic_AccountState &object) { tonlib_api::downcast_call(const_cast(object), [&jv](const auto &object) { to_json(jv, object); }); } @@ -1560,6 +1898,30 @@ void to_json(JsonValueScope &jv, const tonlib_api::internal_transactionId &objec jo << ctie("lt", ToJson(JsonInt64{object.lt_})); jo << ctie("hash", ToJson(JsonBytes{object.hash_})); } +void to_json(JsonValueScope &jv, const tonlib_api::liteServer_info &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "liteServer.info"); + jo << ctie("now", ToJson(object.now_)); + jo << ctie("version", ToJson(object.version_)); + jo << ctie("capabilities", ToJson(JsonInt64{object.capabilities_})); +} +void to_json(JsonValueScope &jv, const tonlib_api::query_fees &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "query.fees"); + if (object.source_fees_) { + jo << ctie("source_fees", ToJson(object.source_fees_)); + } + if (object.destination_fees_) { + jo << ctie("destination_fees", ToJson(object.destination_fees_)); + } +} +void to_json(JsonValueScope &jv, const tonlib_api::query_info &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "query.info"); + jo << ctie("id", ToJson(object.id_)); + jo << ctie("valid_until", ToJson(object.valid_until_)); + jo << ctie("body_hash", ToJson(JsonBytes{object.body_hash_})); +} void to_json(JsonValueScope &jv, const tonlib_api::raw_accountState &object) { auto jo = jv.enter_object(); jo << ctie("@type", "raw.accountState"); @@ -1735,6 +2097,23 @@ void to_json(JsonValueScope &jv, const tonlib_api::exportPemKey &object) { } jo << ctie("key_password", ToJson(JsonBytes{object.key_password_})); } +void to_json(JsonValueScope &jv, const tonlib_api::generic_createSendGramsQuery &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "generic.createSendGramsQuery"); + if (object.private_key_) { + jo << ctie("private_key", ToJson(object.private_key_)); + } + if (object.source_) { + jo << ctie("source", ToJson(object.source_)); + } + if (object.destination_) { + jo << ctie("destination", ToJson(object.destination_)); + } + jo << ctie("amount", ToJson(JsonInt64{object.amount_})); + jo << ctie("timeout", ToJson(object.timeout_)); + jo << ctie("allow_send_to_uninited", ToJson(object.allow_send_to_uninited_)); + jo << ctie("message", ToJson(JsonBytes{object.message_})); +} void to_json(JsonValueScope &jv, const tonlib_api::generic_getAccountState &object) { auto jo = jv.enter_object(); jo << ctie("@type", "generic.getAccountState"); @@ -1822,6 +2201,10 @@ void to_json(JsonValueScope &jv, const tonlib_api::kdf &object) { jo << ctie("salt", ToJson(JsonBytes{object.salt_})); jo << ctie("iterations", ToJson(object.iterations_)); } +void to_json(JsonValueScope &jv, const tonlib_api::liteServer_getInfo &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "liteServer.getInfo"); +} void to_json(JsonValueScope &jv, const tonlib_api::onLiteServerQueryError &object) { auto jo = jv.enter_object(); jo << ctie("@type", "onLiteServerQueryError"); @@ -1850,6 +2233,46 @@ void to_json(JsonValueScope &jv, const tonlib_api::packAccountAddress &object) { jo << ctie("account_address", ToJson(object.account_address_)); } } +void to_json(JsonValueScope &jv, const tonlib_api::query_estimateFees &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "query.estimateFees"); + jo << ctie("id", ToJson(object.id_)); + jo << ctie("ignore_chksig", ToJson(object.ignore_chksig_)); +} +void to_json(JsonValueScope &jv, const tonlib_api::query_forget &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "query.forget"); + jo << ctie("id", ToJson(object.id_)); +} +void to_json(JsonValueScope &jv, const tonlib_api::query_getInfo &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "query.getInfo"); + jo << ctie("id", ToJson(object.id_)); +} +void to_json(JsonValueScope &jv, const tonlib_api::query_send &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "query.send"); + jo << ctie("id", ToJson(object.id_)); +} +void to_json(JsonValueScope &jv, const tonlib_api::raw_createAndSendMessage &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "raw.createAndSendMessage"); + if (object.destination_) { + jo << ctie("destination", ToJson(object.destination_)); + } + jo << ctie("initial_account_state", ToJson(JsonBytes{object.initial_account_state_})); + jo << ctie("data", ToJson(JsonBytes{object.data_})); +} +void to_json(JsonValueScope &jv, const tonlib_api::raw_createQuery &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "raw.createQuery"); + if (object.destination_) { + jo << ctie("destination", ToJson(object.destination_)); + } + jo << ctie("init_code", ToJson(JsonBytes{object.init_code_})); + jo << ctie("init_data", ToJson(JsonBytes{object.init_data_})); + jo << ctie("body", ToJson(JsonBytes{object.body_})); +} void to_json(JsonValueScope &jv, const tonlib_api::raw_getAccountAddress &object) { auto jo = jv.enter_object(); jo << ctie("@type", "raw.getAccountAddress"); @@ -1877,11 +2300,7 @@ void to_json(JsonValueScope &jv, const tonlib_api::raw_getTransactions &object) void to_json(JsonValueScope &jv, const tonlib_api::raw_sendMessage &object) { auto jo = jv.enter_object(); jo << ctie("@type", "raw.sendMessage"); - if (object.destination_) { - jo << ctie("destination", ToJson(object.destination_)); - } - jo << ctie("initial_account_state", ToJson(JsonBytes{object.initial_account_state_})); - jo << ctie("data", ToJson(JsonBytes{object.data_})); + jo << ctie("body", ToJson(JsonBytes{object.body_})); } void to_json(JsonValueScope &jv, const tonlib_api::runTests &object) { auto jo = jv.enter_object(); @@ -1906,6 +2325,10 @@ void to_json(JsonValueScope &jv, const tonlib_api::setLogVerbosityLevel &object) jo << ctie("@type", "setLogVerbosityLevel"); jo << ctie("new_verbosity_level", ToJson(object.new_verbosity_level_)); } +void to_json(JsonValueScope &jv, const tonlib_api::sync &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "sync"); +} void to_json(JsonValueScope &jv, const tonlib_api::testGiver_getAccountAddress &object) { auto jo = jv.enter_object(); jo << ctie("@type", "testGiver.getAccountAddress"); diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.h b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.h index 2341004613..5eea809726 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.h +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.h @@ -11,8 +11,11 @@ namespace ton { namespace tonlib_api{ using namespace td; +Result tl_constructor_from_string(tonlib_api::InputKey *object, const std::string &str); Result tl_constructor_from_string(tonlib_api::KeyStoreType *object, const std::string &str); Result tl_constructor_from_string(tonlib_api::LogStream *object, const std::string &str); +Result tl_constructor_from_string(tonlib_api::SyncState *object, const std::string &str); +Result tl_constructor_from_string(tonlib_api::Update *object, const std::string &str); Result tl_constructor_from_string(tonlib_api::generic_AccountState *object, const std::string &str); Result tl_constructor_from_string(tonlib_api::Object *object, const std::string &str); Result tl_constructor_from_string(tonlib_api::Function *object, const std::string &str); @@ -24,7 +27,9 @@ Status from_json(tonlib_api::error &to, JsonObject &from); Status from_json(tonlib_api::exportedEncryptedKey &to, JsonObject &from); Status from_json(tonlib_api::exportedKey &to, JsonObject &from); Status from_json(tonlib_api::exportedPemKey &to, JsonObject &from); +Status from_json(tonlib_api::fees &to, JsonObject &from); Status from_json(tonlib_api::inputKey &to, JsonObject &from); +Status from_json(tonlib_api::inputKeyFake &to, JsonObject &from); Status from_json(tonlib_api::key &to, JsonObject &from); Status from_json(tonlib_api::keyStoreTypeDirectory &to, JsonObject &from); Status from_json(tonlib_api::keyStoreTypeInMemory &to, JsonObject &from); @@ -36,14 +41,20 @@ Status from_json(tonlib_api::logVerbosityLevel &to, JsonObject &from); Status from_json(tonlib_api::ok &to, JsonObject &from); Status from_json(tonlib_api::options &to, JsonObject &from); Status from_json(tonlib_api::sendGramsResult &to, JsonObject &from); +Status from_json(tonlib_api::syncStateDone &to, JsonObject &from); +Status from_json(tonlib_api::syncStateInProgress &to, JsonObject &from); Status from_json(tonlib_api::unpackedAccountAddress &to, JsonObject &from); Status from_json(tonlib_api::updateSendLiteServerQuery &to, JsonObject &from); +Status from_json(tonlib_api::updateSyncState &to, JsonObject &from); Status from_json(tonlib_api::generic_accountStateRaw &to, JsonObject &from); Status from_json(tonlib_api::generic_accountStateTestWallet &to, JsonObject &from); Status from_json(tonlib_api::generic_accountStateWallet &to, JsonObject &from); Status from_json(tonlib_api::generic_accountStateTestGiver &to, JsonObject &from); Status from_json(tonlib_api::generic_accountStateUninited &to, JsonObject &from); Status from_json(tonlib_api::internal_transactionId &to, JsonObject &from); +Status from_json(tonlib_api::liteServer_info &to, JsonObject &from); +Status from_json(tonlib_api::query_fees &to, JsonObject &from); +Status from_json(tonlib_api::query_info &to, JsonObject &from); Status from_json(tonlib_api::raw_accountState &to, JsonObject &from); Status from_json(tonlib_api::raw_initialAccountState &to, JsonObject &from); Status from_json(tonlib_api::raw_message &to, JsonObject &from); @@ -66,6 +77,7 @@ Status from_json(tonlib_api::encrypt &to, JsonObject &from); Status from_json(tonlib_api::exportEncryptedKey &to, JsonObject &from); Status from_json(tonlib_api::exportKey &to, JsonObject &from); Status from_json(tonlib_api::exportPemKey &to, JsonObject &from); +Status from_json(tonlib_api::generic_createSendGramsQuery &to, JsonObject &from); Status from_json(tonlib_api::generic_getAccountState &to, JsonObject &from); Status from_json(tonlib_api::generic_sendGrams &to, JsonObject &from); Status from_json(tonlib_api::getBip39Hints &to, JsonObject &from); @@ -78,10 +90,17 @@ Status from_json(tonlib_api::importKey &to, JsonObject &from); Status from_json(tonlib_api::importPemKey &to, JsonObject &from); Status from_json(tonlib_api::init &to, JsonObject &from); Status from_json(tonlib_api::kdf &to, JsonObject &from); +Status from_json(tonlib_api::liteServer_getInfo &to, JsonObject &from); Status from_json(tonlib_api::onLiteServerQueryError &to, JsonObject &from); Status from_json(tonlib_api::onLiteServerQueryResult &to, JsonObject &from); Status from_json(tonlib_api::options_setConfig &to, JsonObject &from); Status from_json(tonlib_api::packAccountAddress &to, JsonObject &from); +Status from_json(tonlib_api::query_estimateFees &to, JsonObject &from); +Status from_json(tonlib_api::query_forget &to, JsonObject &from); +Status from_json(tonlib_api::query_getInfo &to, JsonObject &from); +Status from_json(tonlib_api::query_send &to, JsonObject &from); +Status from_json(tonlib_api::raw_createAndSendMessage &to, JsonObject &from); +Status from_json(tonlib_api::raw_createQuery &to, JsonObject &from); Status from_json(tonlib_api::raw_getAccountAddress &to, JsonObject &from); Status from_json(tonlib_api::raw_getAccountState &to, JsonObject &from); Status from_json(tonlib_api::raw_getTransactions &to, JsonObject &from); @@ -90,6 +109,7 @@ Status from_json(tonlib_api::runTests &to, JsonObject &from); Status from_json(tonlib_api::setLogStream &to, JsonObject &from); Status from_json(tonlib_api::setLogTagVerbosityLevel &to, JsonObject &from); Status from_json(tonlib_api::setLogVerbosityLevel &to, JsonObject &from); +Status from_json(tonlib_api::sync &to, JsonObject &from); Status from_json(tonlib_api::testGiver_getAccountAddress &to, JsonObject &from); Status from_json(tonlib_api::testGiver_getAccountState &to, JsonObject &from); Status from_json(tonlib_api::testGiver_sendGrams &to, JsonObject &from); @@ -110,7 +130,10 @@ void to_json(JsonValueScope &jv, const tonlib_api::error &object); void to_json(JsonValueScope &jv, const tonlib_api::exportedEncryptedKey &object); void to_json(JsonValueScope &jv, const tonlib_api::exportedKey &object); void to_json(JsonValueScope &jv, const tonlib_api::exportedPemKey &object); +void to_json(JsonValueScope &jv, const tonlib_api::fees &object); +void to_json(JsonValueScope &jv, const tonlib_api::InputKey &object); void to_json(JsonValueScope &jv, const tonlib_api::inputKey &object); +void to_json(JsonValueScope &jv, const tonlib_api::inputKeyFake &object); void to_json(JsonValueScope &jv, const tonlib_api::key &object); void to_json(JsonValueScope &jv, const tonlib_api::KeyStoreType &object); void to_json(JsonValueScope &jv, const tonlib_api::keyStoreTypeDirectory &object); @@ -124,8 +147,13 @@ void to_json(JsonValueScope &jv, const tonlib_api::logVerbosityLevel &object); void to_json(JsonValueScope &jv, const tonlib_api::ok &object); void to_json(JsonValueScope &jv, const tonlib_api::options &object); void to_json(JsonValueScope &jv, const tonlib_api::sendGramsResult &object); +void to_json(JsonValueScope &jv, const tonlib_api::SyncState &object); +void to_json(JsonValueScope &jv, const tonlib_api::syncStateDone &object); +void to_json(JsonValueScope &jv, const tonlib_api::syncStateInProgress &object); void to_json(JsonValueScope &jv, const tonlib_api::unpackedAccountAddress &object); +void to_json(JsonValueScope &jv, const tonlib_api::Update &object); void to_json(JsonValueScope &jv, const tonlib_api::updateSendLiteServerQuery &object); +void to_json(JsonValueScope &jv, const tonlib_api::updateSyncState &object); void to_json(JsonValueScope &jv, const tonlib_api::generic_AccountState &object); void to_json(JsonValueScope &jv, const tonlib_api::generic_accountStateRaw &object); void to_json(JsonValueScope &jv, const tonlib_api::generic_accountStateTestWallet &object); @@ -133,6 +161,9 @@ void to_json(JsonValueScope &jv, const tonlib_api::generic_accountStateWallet &o void to_json(JsonValueScope &jv, const tonlib_api::generic_accountStateTestGiver &object); void to_json(JsonValueScope &jv, const tonlib_api::generic_accountStateUninited &object); void to_json(JsonValueScope &jv, const tonlib_api::internal_transactionId &object); +void to_json(JsonValueScope &jv, const tonlib_api::liteServer_info &object); +void to_json(JsonValueScope &jv, const tonlib_api::query_fees &object); +void to_json(JsonValueScope &jv, const tonlib_api::query_info &object); void to_json(JsonValueScope &jv, const tonlib_api::raw_accountState &object); void to_json(JsonValueScope &jv, const tonlib_api::raw_initialAccountState &object); void to_json(JsonValueScope &jv, const tonlib_api::raw_message &object); @@ -155,6 +186,7 @@ void to_json(JsonValueScope &jv, const tonlib_api::encrypt &object); void to_json(JsonValueScope &jv, const tonlib_api::exportEncryptedKey &object); void to_json(JsonValueScope &jv, const tonlib_api::exportKey &object); void to_json(JsonValueScope &jv, const tonlib_api::exportPemKey &object); +void to_json(JsonValueScope &jv, const tonlib_api::generic_createSendGramsQuery &object); void to_json(JsonValueScope &jv, const tonlib_api::generic_getAccountState &object); void to_json(JsonValueScope &jv, const tonlib_api::generic_sendGrams &object); void to_json(JsonValueScope &jv, const tonlib_api::getBip39Hints &object); @@ -167,10 +199,17 @@ void to_json(JsonValueScope &jv, const tonlib_api::importKey &object); void to_json(JsonValueScope &jv, const tonlib_api::importPemKey &object); void to_json(JsonValueScope &jv, const tonlib_api::init &object); void to_json(JsonValueScope &jv, const tonlib_api::kdf &object); +void to_json(JsonValueScope &jv, const tonlib_api::liteServer_getInfo &object); void to_json(JsonValueScope &jv, const tonlib_api::onLiteServerQueryError &object); void to_json(JsonValueScope &jv, const tonlib_api::onLiteServerQueryResult &object); void to_json(JsonValueScope &jv, const tonlib_api::options_setConfig &object); void to_json(JsonValueScope &jv, const tonlib_api::packAccountAddress &object); +void to_json(JsonValueScope &jv, const tonlib_api::query_estimateFees &object); +void to_json(JsonValueScope &jv, const tonlib_api::query_forget &object); +void to_json(JsonValueScope &jv, const tonlib_api::query_getInfo &object); +void to_json(JsonValueScope &jv, const tonlib_api::query_send &object); +void to_json(JsonValueScope &jv, const tonlib_api::raw_createAndSendMessage &object); +void to_json(JsonValueScope &jv, const tonlib_api::raw_createQuery &object); void to_json(JsonValueScope &jv, const tonlib_api::raw_getAccountAddress &object); void to_json(JsonValueScope &jv, const tonlib_api::raw_getAccountState &object); void to_json(JsonValueScope &jv, const tonlib_api::raw_getTransactions &object); @@ -179,6 +218,7 @@ void to_json(JsonValueScope &jv, const tonlib_api::runTests &object); void to_json(JsonValueScope &jv, const tonlib_api::setLogStream &object); void to_json(JsonValueScope &jv, const tonlib_api::setLogTagVerbosityLevel &object); void to_json(JsonValueScope &jv, const tonlib_api::setLogVerbosityLevel &object); +void to_json(JsonValueScope &jv, const tonlib_api::sync &object); void to_json(JsonValueScope &jv, const tonlib_api::testGiver_getAccountAddress &object); void to_json(JsonValueScope &jv, const tonlib_api::testGiver_getAccountState &object); void to_json(JsonValueScope &jv, const tonlib_api::testGiver_sendGrams &object); diff --git a/submodules/ton/tonlib-src/tl/generate/scheme/ton_api.tl b/submodules/ton/tonlib-src/tl/generate/scheme/ton_api.tl index 942ec47ef9..7617f1fe09 100644 --- a/submodules/ton/tonlib-src/tl/generate/scheme/ton_api.tl +++ b/submodules/ton/tonlib-src/tl/generate/scheme/ton_api.tl @@ -411,13 +411,14 @@ db.root.key.config = db.root.Key; db.celldb.value block_id:tonNode.blockIdExt prev:int256 next:int256 root_hash:int256 = db.celldb.Value; db.celldb.key.value hash:int256 = db.celldb.key.Value; -db.block.info id:tonNode.blockIdExt flags:# prev_left:flags.1?tonNode.blockIdExt +db.block.info#4ac6e727 id:tonNode.blockIdExt flags:# prev_left:flags.1?tonNode.blockIdExt prev_right:flags.2?tonNode.blockIdExt next_left:flags.3?tonNode.blockIdExt next_right:flags.4?tonNode.blockIdExt lt:flags.13?long ts:flags.14?int state:flags.17?int256 = db.block.Info; +db.block.packedInfo id:tonNode.blockIdExt unixtime:int offset:long = db.block.Info; db.block.archivedInfo id:tonNode.blockIdExt flags:# next:flags.0?tonNode.blockIdExt = db.block.Info; db.blockdb.value next:tonNode.blockIdExt data:bytes = db.blockdb.Value; diff --git a/submodules/ton/tonlib-src/tl/generate/scheme/ton_api.tlo b/submodules/ton/tonlib-src/tl/generate/scheme/ton_api.tlo index 6727841e909c603c2b4c1c5eaf299095414b0573..28e5cfa571a8a4186268ed8c4c1f564769dc4492 100644 GIT binary patch delta 172 zcmeydf_cg+<_#PiqEC2~ba+#e^pbM&le6_a^V0Ge7?>wIif=aI*dWd*wE3xgz78iy z(amE*KAe*kXR1v0wN&1`#7Biu2PDh@1y|*`VkS-8?IsL2s~|BsJ2eGlB1qlj2@x8c v9Hn`g6(yOusgn&0WF{XyBR%!3j9e delta 98 zcmbQTiuuP1<_#PiLS=JjX7Q#Z=_TdlCui$<=B4FNw3FIw!m&Y|QE>B9`FtHtkcykf sgnT$BAM{q<+~DKE$O00YoZ+VdVQk2jm|WmvGWmg@4p?BbfImwc06EGf)&Kwi diff --git a/submodules/ton/tonlib-src/tl/generate/scheme/tonlib_api.tl b/submodules/ton/tonlib-src/tl/generate/scheme/tonlib_api.tl index cf0ed2b837..0963f27230 100644 --- a/submodules/ton/tonlib-src/tl/generate/scheme/tonlib_api.tl +++ b/submodules/ton/tonlib-src/tl/generate/scheme/tonlib_api.tl @@ -25,6 +25,7 @@ options config:config keystore_type:KeyStoreType = Options; key public_key:string secret:secureBytes = Key; inputKey key:key local_password:secureBytes = InputKey; +inputKeyFake = InputKey; exportedKey word_list:vector = ExportedKey; exportedPemKey pem:secureString = ExportedPemKey; exportedEncryptedKey data:secureBytes = ExportedEncryptedKey; @@ -65,7 +66,15 @@ generic.accountStateUninited account_state:uninited.accountState = generic.Accou sendGramsResult sent_until:int53 body_hash:bytes = SendGramsResult; +syncStateDone = SyncState; +syncStateInProgress from_seqno:int32 to_seqno:int32 current_seqno:int32 = SyncState; + +fees in_fwd_fee:int53 storage_fee:int53 gas_fee:int53 fwd_fee:int53= Fees; +query.fees source_fees:fees destination_fees:fees = query.Fees; +query.info id:int53 valid_until:int53 body_hash:bytes = query.Info; + updateSendLiteServerQuery id:int64 data:bytes = Update; +updateSyncState sync_state:SyncState = Update; //@class LogStream @description Describes a stream to which TDLib internal log is written @@ -87,6 +96,8 @@ logTags tags:vector = LogTags; data bytes:secureBytes = Data; +liteServer.info now:int53 version:int32 capabilities:int64 = liteServer.Info; + ---functions--- init options:options = Ok; @@ -97,13 +108,13 @@ options.setConfig config:config = Ok; createNewKey local_password:secureBytes mnemonic_password:secureBytes random_extra_seed:secureBytes = Key; deleteKey key:key = Ok; deleteAllKeys = Ok; -exportKey input_key:inputKey = ExportedKey; -exportPemKey input_key:inputKey key_password:secureBytes = ExportedPemKey; -exportEncryptedKey input_key:inputKey key_password:secureBytes = ExportedEncryptedKey; +exportKey input_key:InputKey = ExportedKey; +exportPemKey input_key:InputKey key_password:secureBytes = ExportedPemKey; +exportEncryptedKey input_key:InputKey key_password:secureBytes = ExportedEncryptedKey; importKey local_password:secureBytes mnemonic_password:secureBytes exported_key:exportedKey = Key; importPemKey local_password:secureBytes key_password:secureBytes exported_key:exportedPemKey = Key; importEncryptedKey local_password:secureBytes key_password:secureBytes exported_encrypted_key:exportedEncryptedKey = Key; -changeLocalPassword input_key:inputKey new_local_password:secureBytes = Key; +changeLocalPassword input_key:InputKey new_local_password:secureBytes = Key; encrypt decrypted_data:secureBytes secret:secureBytes = Data; decrypt encrypted_data:secureBytes secret:secureBytes = Data; @@ -117,32 +128,45 @@ getBip39Hints prefix:string = Bip39Hints; //raw.init initial_account_state:raw.initialAccountState = Ok; raw.getAccountAddress initital_account_state:raw.initialAccountState = AccountAddress; raw.getAccountState account_address:accountAddress = raw.AccountState; -raw.sendMessage destination:accountAddress initial_account_state:bytes data:bytes = Ok; raw.getTransactions account_address:accountAddress from_transaction_id:internal.transactionId = raw.Transactions; +raw.sendMessage body:bytes = Ok; +raw.createAndSendMessage destination:accountAddress initial_account_state:bytes data:bytes = Ok; +raw.createQuery destination:accountAddress init_code:bytes init_data:bytes body:bytes = query.Info; -testWallet.init private_key:inputKey = Ok; +testWallet.init private_key:InputKey = Ok; testWallet.getAccountAddress initital_account_state:testWallet.initialAccountState = AccountAddress; testWallet.getAccountState account_address:accountAddress = testWallet.AccountState; -testWallet.sendGrams private_key:inputKey destination:accountAddress seqno:int32 amount:int64 message:bytes = SendGramsResult; +testWallet.sendGrams private_key:InputKey destination:accountAddress seqno:int32 amount:int64 message:bytes = SendGramsResult; -wallet.init private_key:inputKey = Ok; +wallet.init private_key:InputKey = Ok; wallet.getAccountAddress initital_account_state:wallet.initialAccountState = AccountAddress; wallet.getAccountState account_address:accountAddress = wallet.AccountState; -wallet.sendGrams private_key:inputKey destination:accountAddress seqno:int32 valid_until:int53 amount:int64 message:bytes = SendGramsResult; +wallet.sendGrams private_key:InputKey destination:accountAddress seqno:int32 valid_until:int53 amount:int64 message:bytes = SendGramsResult; testGiver.getAccountState = testGiver.AccountState; testGiver.getAccountAddress = AccountAddress; testGiver.sendGrams destination:accountAddress seqno:int32 amount:int64 message:bytes = SendGramsResult; +sync = Ok; + //generic.getAccountAddress initital_account_state:generic.InitialAccountState = AccountAddress; generic.getAccountState account_address:accountAddress = generic.AccountState; -generic.sendGrams private_key:inputKey source:accountAddress destination:accountAddress amount:int64 timeout:int32 allow_send_to_uninited:Bool message:bytes = SendGramsResult; +generic.sendGrams private_key:InputKey source:accountAddress destination:accountAddress amount:int64 timeout:int32 allow_send_to_uninited:Bool message:bytes = SendGramsResult; + +generic.createSendGramsQuery private_key:InputKey source:accountAddress destination:accountAddress amount:int64 timeout:int32 allow_send_to_uninited:Bool message:bytes = query.Info; + +query.send id:int53 = Ok; +query.forget id:int53 = Ok; +query.estimateFees id:int53 ignore_chksig:Bool = query.Fees; +query.getInfo id:int53 = query.Info; onLiteServerQueryResult id:int64 bytes:bytes = Ok; onLiteServerQueryError id:int64 error:error = Ok; runTests dir:string = Ok; +liteServer.getInfo = liteServer.Info; + //@description Sets new log stream for internal logging of TDLib. This is an offline method. Can be called before authorization. Can be called synchronously @log_stream New log stream setLogStream log_stream:LogStream = Ok; diff --git a/submodules/ton/tonlib-src/tl/generate/scheme/tonlib_api.tlo b/submodules/ton/tonlib-src/tl/generate/scheme/tonlib_api.tlo index 1af5d79a941e63ba7697439dba37f678c9d5f5db..edbbe50fc9e3195b953ea56111d971af4d9d8942 100644 GIT binary patch delta 1639 zcmZuxeP|nH7*DQm+PfxcK9+6C(k+@sNo@L&Ev#K_g<@$ft1=12%EauNT+&uGJAE(^+RJ1w>-?eI9?SbfyA7*29XPdj3ay+?nzVTi;HTm_1Y zqQ(Ckm;57y{tsWjnrIZIY+)v!rO!4voesi*Pym+GUbdmgt7tWhKW+EISU8ZtXshS1 zcQrn;Hn6^j70n*$1NMyB8F=RQ2z=x0>_tm$#JPQco_ARhgZ!jW6NP@tz4b}9@8|`L z(_OB(W0KqVd&aF=j19;V4M7&MPHhC*@Qw$ueSC4UeoHlOSURA{MMY3mE4GgM84MH@ zc`B<4(~=CbFT}B$Y~E6hVa}Z^D~cd#S@@zO42L`{!FY)KHVMuQRugd;@y8C~#VBo7 z|F-3mAy3&DXm#4?gQ)FRWki=%Q3ysT_FdbB#RbOcnm=C`zf}?HwY!ZJV>wV}e@fHTp6{gLh-7CTyoFmzA7=;y^{& z5H<<}+ropSdh>#+i4w2T`c+5zR^z+ZaJE2T5yL=#aC$Y8#wKleH@bw>U0YC~a55c( zb#I*Di~jl6Us-!Me6Z^|a=y!Z1MZ7-I}GXR&qh`lGRHA)NJmW@Oh<=^x-qf@XQQ1J zH~1|YA@9Goya9ohv}u}-cEO8IZyWQ+gsZtINP;5f+H;CP$CVMJ{E)&=sSn~BQpgs( z2Ixz{634l4YN$!))sM|$t4tI8K~G2p}Gshuk?xQ=`NbuxIjNGHI@T3wtdiCQ)% z=V=UFO9!BHJ28#)v&vVE4l*w1XW_ChQjtz?YspToJ^j#2u$m0It=+6TVf*@6+iAP= zv*%w~BDk_N)tu)JeX~8ukOlYr3dB>EX82TujGx&Zh51x3SN-B!=JG+W<_0Sa_B^4@0T-Rg3|n8P!#ptQt0wQ}-DM(NEaOfpQ9D_A19?@aYu z%obXZl30>DF<)}>7nYvQe^^zR7>zb7a=5cdf^}v>bpp)<@oydz@?n~6s3t!-g4cir zB(nJkuLkSn3&L+$K*mizAmRgNY|ar)Vcy&!^@M{_e{!yJJBxB*=j_Qplr306niw~m zs;p*Wk*#;)ocu%$DmGbB-JNBF_hs?PIqC)wWs?`G%d;>X|JXYDh`I?>NKxHMdh!|@ Vh/.. $ ) -target_link_libraries(tonlib PRIVATE tdactor adnllite tl_lite_api tl-lite-utils ton_crypto ton_block lite-client-common) +target_link_libraries(tonlib PRIVATE tdactor adnllite tl_lite_api tl-lite-utils ton_crypto ton_block lite-client-common smc-envelope) target_link_libraries(tonlib PUBLIC tdutils tl_tonlib_api) if (TONLIB_ENABLE_JNI AND NOT ANDROID) # jni is available by default on Android @@ -134,7 +126,7 @@ if (NOT TON_USE_ABSEIL) if (WIN32) set(WINGETOPT_TARGET wingetopt) endif() -install(TARGETS tdnet keys crc32c tdactor adnllite tl_api tl-utils tl_lite_api tl-lite-utils ton_crypto ton_block ${WINGETOPT_TARGET} +install(TARGETS tdnet keys crc32c tdactor adnllite tl_api tl-utils tl_lite_api tl-lite-utils ton_crypto ton_block smc-envelope ${WINGETOPT_TARGET} tdutils tl_tonlib_api tonlib lite-client-common Tonlib EXPORT Tonlib LIBRARY DESTINATION lib ARCHIVE DESTINATION lib diff --git a/submodules/ton/tonlib-src/tonlib/test/offline.cpp b/submodules/ton/tonlib-src/tonlib/test/offline.cpp index 04b55c7804..9e89ba6476 100644 --- a/submodules/ton/tonlib-src/tonlib/test/offline.cpp +++ b/submodules/ton/tonlib-src/tonlib/test/offline.cpp @@ -17,23 +17,14 @@ Copyright 2017-2019 Telegram Systems LLP */ -#include "fift/Fift.h" -#include "fift/words.h" -#include "fift/utils.h" - #include "block/block.h" #include "block/block-auto.h" #include "vm/cells.h" #include "vm/boc.h" -#include "vm/cells/MerkleProof.h" +#include "vm/cells/CellString.h" -#include "tonlib/CellString.h" #include "tonlib/utils.h" -#include "tonlib/TestGiver.h" -#include "tonlib/TestWallet.h" -#include "tonlib/Wallet.h" -#include "tonlib/GenericAccount.h" #include "tonlib/TonlibClient.h" #include "tonlib/Client.h" @@ -70,181 +61,6 @@ TEST(Tonlib, CellString) { using namespace tonlib; -std::string current_dir() { - return td::PathView(td::realpath(__FILE__).move_as_ok()).parent_dir().str(); -} - -std::string load_source(std::string name) { - return td::read_file_str(current_dir() + "../../crypto/" + name).move_as_ok(); -} - -td::Ref get_test_wallet_source() { - std::string code = R"ABCD( -SETCP0 DUP IFNOTRET // return if recv_internal -DUP 85143 INT EQUAL IFJMP:<{ // "seqno" get-method - DROP c4 PUSHCTR CTOS 32 PLDU // cnt -}> -INC 32 THROWIF // fail unless recv_external -512 INT LDSLICEX DUP 32 PLDU // sign cs cnt -c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS // sign cs cnt cnt' pubk -s1 s2 XCPU // sign cs cnt pubk cnt' cnt -EQUAL 33 THROWIFNOT // ( seqno mismatch? ) -s2 PUSH HASHSU // sign cs cnt pubk hash -s0 s4 s4 XC2PU // pubk cs cnt hash sign pubk -CHKSIGNU // pubk cs cnt ? -34 THROWIFNOT // signature mismatch -ACCEPT -SWAP 32 LDU NIP -DUP SREFS IF:<{ - // 3 INT 35 LSHIFT# 3 INT RAWRESERVE // reserve all but 103 Grams from the balance - 8 LDU LDREF // pubk cnt mode msg cs - s0 s2 XCHG SENDRAWMSG // pubk cnt cs ; ( message sent ) -}> -ENDS -INC NEWC 32 STU 256 STU ENDC c4 POPCTR -)ABCD"; - return fift::compile_asm(code).move_as_ok(); -} - -td::Ref get_wallet_source() { - std::string code = R"ABCD( -SETCP0 DUP IFNOTRET // return if recv_internal - DUP 85143 INT EQUAL IFJMP:<{ // "seqno" get-method - DROP c4 PUSHCTR CTOS 32 PLDU // cnt - }> - INC 32 THROWIF // fail unless recv_external - 9 PUSHPOW2 LDSLICEX DUP 32 LDU 32 LDU // signature in_msg msg_seqno valid_until cs - SWAP NOW LEQ 35 THROWIF // signature in_msg msg_seqno cs - c4 PUSH CTOS 32 LDU 256 LDU ENDS // signature in_msg msg_seqno cs stored_seqno public_key - s3 s1 XCPU // signature in_msg public_key cs stored_seqno msg_seqno stored_seqno - EQUAL 33 THROWIFNOT // signature in_msg public_key cs stored_seqno - s0 s3 XCHG HASHSU // signature stored_seqno public_key cs hash - s0 s4 s2 XC2PU CHKSIGNU 34 THROWIFNOT // cs stored_seqno public_key - ACCEPT - s0 s2 XCHG // public_key stored_seqno cs - WHILE:<{ - DUP SREFS // public_key stored_seqno cs _40 - }>DO<{ // public_key stored_seqno cs - // 3 INT 35 LSHIFT# 3 INT RAWRESERVE // reserve all but 103 Grams from the balance - 8 LDU LDREF s0 s2 XCHG // public_key stored_seqno cs _45 mode - SENDRAWMSG // public_key stored_seqno cs - }> - ENDS INC // public_key seqno' - NEWC 32 STU 256 STU ENDC c4 POP -)ABCD"; - return fift::compile_asm(code).move_as_ok(); -} - -TEST(Tonlib, TestWallet) { - LOG(ERROR) << td::base64_encode(std_boc_serialize(get_test_wallet_source()).move_as_ok()); - CHECK(get_test_wallet_source()->get_hash() == TestWallet::get_init_code()->get_hash()); - auto fift_output = fift::mem_run_fift(load_source("smartcont/new-wallet.fif"), {"aba", "0"}).move_as_ok(); - - auto new_wallet_pk = fift_output.source_lookup.read_file("new-wallet.pk").move_as_ok().data; - auto new_wallet_query = fift_output.source_lookup.read_file("new-wallet-query.boc").move_as_ok().data; - auto new_wallet_addr = fift_output.source_lookup.read_file("new-wallet.addr").move_as_ok().data; - - td::Ed25519::PrivateKey priv_key{td::SecureString{new_wallet_pk}}; - auto pub_key = priv_key.get_public_key().move_as_ok(); - auto init_state = TestWallet::get_init_state(pub_key); - auto init_message = TestWallet::get_init_message(priv_key); - auto address = GenericAccount::get_address(0, init_state); - - CHECK(address.addr.as_slice() == td::Slice(new_wallet_addr).substr(0, 32)); - - td::Ref res = GenericAccount::create_ext_message(address, init_state, init_message); - - LOG(ERROR) << "-------"; - vm::load_cell_slice(res).print_rec(std::cerr); - LOG(ERROR) << "-------"; - vm::load_cell_slice(vm::std_boc_deserialize(new_wallet_query).move_as_ok()).print_rec(std::cerr); - CHECK(vm::std_boc_deserialize(new_wallet_query).move_as_ok()->get_hash() == res->get_hash()); - - fift_output.source_lookup.write_file("/main.fif", load_source("smartcont/wallet.fif")).ensure(); - auto dest = block::StdAddress::parse("Ef9Tj6fMJP+OqhAdhKXxq36DL+HYSzCc3+9O6UNzqsgPfYFX").move_as_ok(); - fift_output = - fift::mem_run_fift(std::move(fift_output.source_lookup), - {"aba", "new-wallet", "Ef9Tj6fMJP+OqhAdhKXxq36DL+HYSzCc3+9O6UNzqsgPfYFX", "123", "321"}) - .move_as_ok(); - auto wallet_query = fift_output.source_lookup.read_file("wallet-query.boc").move_as_ok().data; - auto gift_message = GenericAccount::create_ext_message( - address, {}, TestWallet::make_a_gift_message(priv_key, 123, 321000000000ll, "TEST", dest)); - LOG(ERROR) << "-------"; - vm::load_cell_slice(gift_message).print_rec(std::cerr); - LOG(ERROR) << "-------"; - vm::load_cell_slice(vm::std_boc_deserialize(wallet_query).move_as_ok()).print_rec(std::cerr); - CHECK(vm::std_boc_deserialize(wallet_query).move_as_ok()->get_hash() == gift_message->get_hash()); -} - -td::Ref get_wallet_source_fc() { - return fift::compile_asm(load_source("smartcont/wallet-code.fif"), "", false).move_as_ok(); -} - -TEST(Tonlib, Wallet) { - LOG(ERROR) << td::base64_encode(std_boc_serialize(get_wallet_source()).move_as_ok()); - CHECK(get_wallet_source()->get_hash() == Wallet::get_init_code()->get_hash()); - - auto fift_output = fift::mem_run_fift(load_source("smartcont/new-wallet-v2.fif"), {"aba", "0"}).move_as_ok(); - - auto new_wallet_pk = fift_output.source_lookup.read_file("new-wallet.pk").move_as_ok().data; - auto new_wallet_query = fift_output.source_lookup.read_file("new-wallet-query.boc").move_as_ok().data; - auto new_wallet_addr = fift_output.source_lookup.read_file("new-wallet.addr").move_as_ok().data; - - td::Ed25519::PrivateKey priv_key{td::SecureString{new_wallet_pk}}; - auto pub_key = priv_key.get_public_key().move_as_ok(); - auto init_state = Wallet::get_init_state(pub_key); - auto init_message = Wallet::get_init_message(priv_key); - auto address = GenericAccount::get_address(0, init_state); - - CHECK(address.addr.as_slice() == td::Slice(new_wallet_addr).substr(0, 32)); - - td::Ref res = GenericAccount::create_ext_message(address, init_state, init_message); - - LOG(ERROR) << "-------"; - vm::load_cell_slice(res).print_rec(std::cerr); - LOG(ERROR) << "-------"; - vm::load_cell_slice(vm::std_boc_deserialize(new_wallet_query).move_as_ok()).print_rec(std::cerr); - CHECK(vm::std_boc_deserialize(new_wallet_query).move_as_ok()->get_hash() == res->get_hash()); - - fift_output.source_lookup.write_file("/main.fif", load_source("smartcont/wallet-v2.fif")).ensure(); - class ZeroOsTime : public fift::OsTime { - public: - td::uint32 now() override { - return 0; - } - }; - fift_output.source_lookup.set_os_time(std::make_unique()); - auto dest = block::StdAddress::parse("Ef9Tj6fMJP+OqhAdhKXxq36DL+HYSzCc3+9O6UNzqsgPfYFX").move_as_ok(); - fift_output = - fift::mem_run_fift(std::move(fift_output.source_lookup), - {"aba", "new-wallet", "Ef9Tj6fMJP+OqhAdhKXxq36DL+HYSzCc3+9O6UNzqsgPfYFX", "123", "321"}) - .move_as_ok(); - auto wallet_query = fift_output.source_lookup.read_file("wallet-query.boc").move_as_ok().data; - auto gift_message = GenericAccount::create_ext_message( - address, {}, Wallet::make_a_gift_message(priv_key, 123, 60, 321000000000ll, "TESTv2", dest)); - LOG(ERROR) << "-------"; - vm::load_cell_slice(gift_message).print_rec(std::cerr); - LOG(ERROR) << "-------"; - vm::load_cell_slice(vm::std_boc_deserialize(wallet_query).move_as_ok()).print_rec(std::cerr); - CHECK(vm::std_boc_deserialize(wallet_query).move_as_ok()->get_hash() == gift_message->get_hash()); -} - -TEST(Tonlib, TestGiver) { - auto address = - block::StdAddress::parse("-1:60c04141c6a7b96d68615e7a91d265ad0f3a9a922e9ae9c901d4fa83f5d3c0d0").move_as_ok(); - LOG(ERROR) << address.bounceable; - auto fift_output = fift::mem_run_fift(load_source("smartcont/testgiver.fif"), - {"aba", address.rserialize(), "0", "6.666", "wallet-query"}) - .move_as_ok(); - LOG(ERROR) << fift_output.output; - - auto wallet_query = fift_output.source_lookup.read_file("wallet-query.boc").move_as_ok().data; - - auto res = GenericAccount::create_ext_message( - TestGiver::address(), {}, TestGiver::make_a_gift_message(0, 1000000000ll * 6666 / 1000, "GIFT", address)); - vm::CellSlice(vm::NoVm(), res).print_rec(std::cerr); - CHECK(vm::std_boc_deserialize(wallet_query).move_as_ok()->get_hash() == res->get_hash()); -} TEST(Tonlib, PublicKey) { block::PublicKey::parse("pubjns2gp7DGCnEH7EOWeCnb6Lw1akm538YYaz6sdLVHfRB2").ensure_error(); auto key = block::PublicKey::parse("Pubjns2gp7DGCnEH7EOWeCnb6Lw1akm538YYaz6sdLVHfRB2").move_as_ok(); diff --git a/submodules/ton/tonlib-src/tonlib/test/online.cpp b/submodules/ton/tonlib-src/tonlib/test/online.cpp index 6ac47921df..11040e53a1 100644 --- a/submodules/ton/tonlib-src/tonlib/test/online.cpp +++ b/submodules/ton/tonlib-src/tonlib/test/online.cpp @@ -34,10 +34,12 @@ #include "ton/ton-tl.hpp" #include "block/block.h" #include "block/block-auto.h" +#include "Ed25519.h" -#include "tonlib/GenericAccount.h" -#include "tonlib/TestGiver.h" -#include "tonlib/TestWallet.h" +#include "smc-envelope/GenericAccount.h" +#include "smc-envelope/MultisigWallet.h" +#include "smc-envelope/TestGiver.h" +#include "smc-envelope/TestWallet.h" #include "tonlib/LastBlock.h" #include "tonlib/ExtClient.h" #include "tonlib/utils.h" @@ -57,18 +59,21 @@ #include "td/utils/optional.h" #include "td/utils/overloaded.h" #include "td/utils/MpscPollableQueue.h" +#include "td/utils/port/path.h" #include "td/utils/port/signals.h" using namespace tonlib; +constexpr td::int64 Gramm = 1000000000; + auto sync_send = [](auto& client, auto query) { using ReturnTypePtr = typename std::decay_t::ReturnType; using ReturnType = typename ReturnTypePtr::element_type; client.send({1, std::move(query)}); while (true) { auto response = client.receive(100); - if (response.object) { + if (response.object && response.id != 0) { CHECK(response.id == 1); if (response.object->get_id() == tonlib_api::error::ID) { auto error = tonlib_api::move_object_as(response.object); @@ -78,87 +83,295 @@ auto sync_send = [](auto& client, auto query) { } } }; +auto static_send = [](auto query) { + using ReturnTypePtr = typename std::decay_t::ReturnType; + using ReturnType = typename ReturnTypePtr::element_type; + auto response = Client::execute({1, std::move(query)}); + if (response.object->get_id() == tonlib_api::error::ID) { + auto error = tonlib_api::move_object_as(response.object); + return td::Result(td::Status::Error(error->code_, error->message_)); + } + return td::Result(tonlib_api::move_object_as(response.object)); +}; struct Key { std::string public_key; td::SecureString secret; - tonlib_api::object_ptr get_input_key() const { + tonlib_api::object_ptr get_input_key() const { return tonlib_api::make_object( tonlib_api::make_object(public_key, secret.copy()), td::SecureString("local")); } + tonlib_api::object_ptr get_fake_input_key() const { + return tonlib_api::make_object(); + } }; struct Wallet { std::string address; Key key; }; +struct TransactionId { + td::int64 lt{0}; + std::string hash; +}; + +struct AccountState { + enum Type { Empty, Wallet, Unknown } type{Empty}; + td::int64 sync_utime{-1}; + td::int64 balance{-1}; + TransactionId last_transaction_id; + std::string address; + + bool is_inited() const { + return type != Empty; + } +}; + +using tonlib_api::make_object; + +void sync(Client& client) { + sync_send(client, make_object()).ensure(); +} + +std::string wallet_address(Client& client, const Key& key) { + return sync_send(client, make_object( + make_object(key.public_key))) + .move_as_ok() + ->account_address_; +} + +Wallet import_wallet_from_pkey(Client& client, std::string pkey, std::string password) { + auto key = sync_send(client, make_object( + td::SecureString("local"), td::SecureString(password), + make_object(td::SecureString(pkey)))) + .move_as_ok(); + Wallet wallet{"", {key->public_key_, std::move(key->secret_)}}; + wallet.address = wallet_address(client, wallet.key); + return wallet; +} + std::string test_giver_address(Client& client) { using tonlib_api::make_object; return sync_send(client, make_object()).move_as_ok()->account_address_; } -td::int64 get_balance(Client& client, std::string address) { +AccountState get_account_state(Client& client, std::string address) { auto generic_state = sync_send(client, tonlib_api::make_object( tonlib_api::make_object(address))) .move_as_ok(); - td::int64 res = 0; - tonlib_api::downcast_call(*generic_state, [&](auto& state) { res = state.account_state_->balance_; }); + AccountState res; + tonlib_api::downcast_call(*generic_state, [&](auto& state) { + res.balance = state.account_state_->balance_; + res.sync_utime = state.account_state_->sync_utime_; + res.last_transaction_id.lt = state.account_state_->last_transaction_id_->lt_; + res.last_transaction_id.hash = state.account_state_->last_transaction_id_->hash_; + }); + res.address = address; + switch (generic_state->get_id()) { + case tonlib_api::generic_accountStateUninited::ID: + res.type = AccountState::Empty; + break; + case tonlib_api::generic_accountStateWallet::ID: + res.type = AccountState::Wallet; + break; + default: + res.type = AccountState::Unknown; + break; + } return res; } -bool is_inited(Client& client, std::string address) { - auto generic_state = sync_send(client, tonlib_api::make_object( - tonlib_api::make_object(address))) - .move_as_ok(); - return generic_state->get_id() != tonlib_api::generic_accountStateUninited::ID; +struct QueryId { + td::int64 id; +}; + +struct Fee { + td::int64 in_fwd_fee{0}; + td::int64 storage_fee{0}; + td::int64 gas_fee{0}; + td::int64 fwd_fee{0}; + td::int64 sum() const { + return in_fwd_fee + storage_fee + gas_fee + fwd_fee; + } +}; + +template +auto to_fee(const T& fee) { + Fee res; + res.in_fwd_fee = fee->in_fwd_fee_; + res.storage_fee = fee->storage_fee_; + res.gas_fee = fee->gas_fee_; + res.fwd_fee = fee->fwd_fee_; + return res; } -void transfer_grams(Client& client, std::string from, std::string to, td::int64 amount, - tonlib_api::object_ptr input_key) { - auto balance = get_balance(client, to); - sync_send(client, tonlib_api::make_object( - std::move(input_key), tonlib_api::make_object(from), - tonlib_api::make_object(to), amount, 0, true, "GIFT")) - .ensure(); - while (balance == get_balance(client, to)) { +td::StringBuilder& operator<<(td::StringBuilder& sb, const Fee& fees) { + return sb << td::tag("in_fwd_fee", fees.in_fwd_fee) << td::tag("storage_fee", fees.storage_fee) + << td::tag("gas_fee", fees.gas_fee) << td::tag("fwd_fee", fees.fwd_fee); +} + +struct QueryInfo { + td::int64 valid_until; + std::string body_hash; +}; + +td::Result create_send_grams_query(Client& client, const Wallet& source, std::string destination, + td::int64 amount, std::string message, bool force = false, int timeout = 0, + bool fake = false) { + auto r_id = sync_send(client, tonlib_api::make_object( + fake ? source.key.get_fake_input_key() : source.key.get_input_key(), + tonlib_api::make_object(source.address), + tonlib_api::make_object(destination), amount, timeout, + force, std::move(message))); + TRY_RESULT(id, std::move(r_id)); + return QueryId{id->id_}; +} + +td::Result create_raw_query(Client& client, std::string source, std::string init_code, std::string init_data, + std::string body) { + auto r_id = + sync_send(client, tonlib_api::make_object( + tonlib_api::make_object(source), init_code, init_data, body)); + TRY_RESULT(id, std::move(r_id)); + return QueryId{id->id_}; +} + +std::pair query_estimate_fees(Client& client, QueryId query_id, bool ignore_chksig = false) { + auto fees = sync_send(client, tonlib_api::make_object(query_id.id, ignore_chksig)) + .move_as_ok(); + return std::make_pair(to_fee(fees->source_fees_), to_fee(fees->destination_fees_)); +} + +void query_send(Client& client, QueryId query_id) { + sync_send(client, tonlib_api::make_object(query_id.id)).ensure(); +} +QueryInfo query_get_info(Client& client, QueryId query_id) { + auto info = sync_send(client, tonlib_api::make_object(query_id.id)).move_as_ok(); + return QueryInfo{info->valid_until_, info->body_hash_}; +} + +td::Result wait_state_change(Client& client, const AccountState& old_state, td::int64 valid_until) { + while (true) { + auto new_state = get_account_state(client, old_state.address); + if (new_state.last_transaction_id.lt != old_state.last_transaction_id.lt) { + return new_state; + } + if (valid_until != 0 && new_state.sync_utime >= valid_until) { + return td::Status::Error("valid_until expired"); + } client.receive(1); } +}; + +td::Result> get_transactions(Client& client, std::string address, + const TransactionId& from) { + auto got_transactions = sync_send(client, make_object( + make_object(address), + make_object(from.lt, from.hash))) + .move_as_ok(); + return std::move(got_transactions); } + +td::Status transfer_grams(Client& client, const Wallet& wallet, std::string address, td::int64 amount) { + auto src_state = get_account_state(client, wallet.address); + auto dst_state = get_account_state(client, address); + auto message = td::rand_string('a', 'z', 500); + + LOG(INFO) << "Transfer: create query " << (double)amount / Gramm << " from " << wallet.address << " to " << address; + auto r_query_id = create_send_grams_query(client, wallet, address, amount, message); + if (r_query_id.is_error() && td::begins_with(r_query_id.error().message(), "DANGEROUS_TRANSACTION")) { + ASSERT_TRUE(dst_state.type == AccountState::Empty); + LOG(INFO) << "Transfer: recreate query due to DANGEROUS_TRANSACTION error"; + r_query_id = create_send_grams_query(client, wallet, address, amount, message, true); + } + + r_query_id.ensure(); + QueryId query_id = r_query_id.move_as_ok(); + auto query_info = query_get_info(client, query_id); + auto fees = query_estimate_fees(client, query_id); + + LOG(INFO) << "Expected src fees: " << fees.first; + LOG(INFO) << "Expected dst fees: " << fees.second; + + bool transfer_all = amount == src_state.balance; + if (!transfer_all && amount + fees.first.sum() + 10 > src_state.balance) { + return td::Status::Error("Not enough balance for query"); + } + + LOG(INFO) << "Transfer: send query"; + + query_send(client, query_id); + td::Timer timer; + TRY_RESULT(new_src_state, wait_state_change(client, src_state, query_info.valid_until)); + LOG(INFO) << "Transfer: reached source in " << timer; + + td::int64 lt; + td::int64 first_fee; + { + auto tr = get_transactions(client, src_state.address, new_src_state.last_transaction_id).move_as_ok(); + CHECK(tr->transactions_.size() > 0); + const auto& txn = tr->transactions_[0]; + CHECK(txn->in_msg_->body_hash_ == query_info.body_hash); + ASSERT_EQ(1u, txn->out_msgs_.size()); + ASSERT_EQ(message, txn->out_msgs_[0]->message_); + lt = txn->out_msgs_[0]->created_lt_; + auto fee_difference = fees.first.sum() - txn->fee_; + first_fee = txn->fee_; + auto desc = PSTRING() << fee_difference << " storage:[" << fees.first.storage_fee << " vs " << txn->storage_fee_ + << "] other:[" << fees.first.sum() - fees.first.storage_fee << " vs " << txn->other_fee_ + << "]"; + LOG(INFO) << "Source fee difference " << desc; + LOG_IF(ERROR, std::abs(fee_difference) > 1) << "Too big source fee difference " << desc; + } + + TRY_RESULT(new_dst_state, wait_state_change(client, dst_state, new_src_state.sync_utime + 30)); + LOG(INFO) << "Transfer: reached destination in " << timer; + + { + auto tr = get_transactions(client, dst_state.address, new_dst_state.last_transaction_id).move_as_ok(); + CHECK(tr->transactions_.size() > 0); + const auto& txn = tr->transactions_[0]; + ASSERT_EQ(lt, txn->in_msg_->created_lt_); + if (transfer_all) { + ASSERT_EQ(amount - first_fee, txn->in_msg_->value_); + } else { + ASSERT_EQ(new_src_state.address, txn->in_msg_->source_); + } + ASSERT_EQ(new_src_state.address, txn->in_msg_->source_); + ASSERT_EQ(message, txn->in_msg_->message_); + auto fee_difference = fees.second.sum() - txn->fee_; + auto desc = PSTRING() << fee_difference << " storage:[" << fees.second.storage_fee << " vs " << txn->storage_fee_ + << "] other:[" << fees.second.sum() - fees.second.storage_fee << " vs " << txn->other_fee_ + << "]"; + LOG(INFO) << "Destination fee difference " << desc; + LOG_IF(ERROR, std::abs(fee_difference) > 1) << "Too big destination fee difference " << desc; + } + + return td::Status::OK(); +} + Wallet create_empty_wallet(Client& client) { using tonlib_api::make_object; - auto key = sync_send(client, make_object(td::SecureString("local"), - td::SecureString("mnemonic"), td::SecureString())) + auto key = sync_send(client, make_object(td::SecureString("local"), td::SecureString(), + td::SecureString())) .move_as_ok(); Wallet wallet{"", {key->public_key_, std::move(key->secret_)}}; auto account_address = - sync_send(client, make_object( - make_object(wallet.key.public_key))) + sync_send(client, make_object( + make_object(wallet.key.public_key))) .move_as_ok(); wallet.address = account_address->account_address_; + + // get state of empty account + auto state = get_account_state(client, wallet.address); + ASSERT_EQ(-1, state.balance); + ASSERT_EQ(AccountState::Empty, state.type); + return wallet; } -Wallet create_wallet(Client& client) { - using tonlib_api::make_object; - auto wallet = create_empty_wallet(client); - - transfer_grams(client, test_giver_address(client), wallet.address, 6000000000, {}); - sync_send(client, make_object(wallet.key.get_input_key())).ensure(); - while (!is_inited(client, wallet.address)) { - client.receive(1); - } - LOG(ERROR) << get_balance(client, wallet.address); - return wallet; -} - -std::string get_test_giver_address(Client& client) { - return sync_send(client, tonlib_api::make_object()) - .move_as_ok() - ->account_address_; -} - void dump_transaction_history(Client& client, std::string address) { using tonlib_api::make_object; auto state = sync_send(client, make_object()).move_as_ok(); @@ -180,166 +393,156 @@ void dump_transaction_history(Client& client, std::string address) { LOG(ERROR) << cnt; } +void test_estimate_fees_without_key(Client& client, const Wallet& wallet_a, const Wallet& wallet_b) { + LOG(ERROR) << " SUBTEST: estimate fees without key"; + { + auto query_id = create_send_grams_query(client, wallet_a, wallet_b.address, 0, "???", true, 0, true).move_as_ok(); + auto fees1 = query_estimate_fees(client, query_id, false); + auto fees2 = query_estimate_fees(client, query_id, true); + LOG(INFO) << "Fee without ignore_chksig\t" << fees1; + LOG(INFO) << "Fee with ignore_chksig\t" << fees2; + CHECK(fees1.first.gas_fee == 0); + CHECK(fees2.first.gas_fee != 0); + } +} + +void test_back_and_forth_transfer(Client& client, const Wallet& giver_wallet, bool flag) { + LOG(ERROR) << "TEST: back and forth transfer"; + // just generate private key and address + auto wallet_a = create_empty_wallet(client); + LOG(INFO) << wallet_a.address; + + // get state of empty account + auto state = get_account_state(client, wallet_a.address); + ASSERT_EQ(-1, state.balance); + ASSERT_EQ(AccountState::Empty, state.type); + + test_estimate_fees_without_key(client, giver_wallet, wallet_a); + + // transfer from giver to a + transfer_grams(client, giver_wallet, wallet_a.address, 1 * Gramm).ensure(); + state = get_account_state(client, wallet_a.address); + ASSERT_EQ(1 * Gramm, state.balance); + ASSERT_EQ(AccountState::Empty, state.type); + + test_estimate_fees_without_key(client, wallet_a, giver_wallet); + + if (flag) { + // transfer from a to giver + transfer_grams(client, wallet_a, giver_wallet.address, 5 * Gramm / 10).ensure(); + state = get_account_state(client, wallet_a.address); + ASSERT_TRUE(state.balance < 5 * Gramm / 10); + ASSERT_EQ(AccountState::Wallet, state.type); + } + + // transfer all remaining balance (test flag 128) + transfer_grams(client, wallet_a, giver_wallet.address, state.balance).ensure(); + state = get_account_state(client, wallet_a.address); + ASSERT_TRUE(state.balance == 0); + ASSERT_EQ(AccountState::Wallet, state.type); +} + +void test_multisig(Client& client, const Wallet& giver_wallet) { + LOG(ERROR) << "TEST: multisig"; + + int n = 16; + int k = 10; + std::vector private_keys; + for (int i = 0; i < n; i++) { + private_keys.push_back(td::Ed25519::generate_private_key().move_as_ok()); + } + + auto ms = ton::MultisigWallet::create(); + auto init_data = ms->create_init_data( + td::transform(private_keys, [](const auto& pk) { return pk.get_public_key().move_as_ok().as_octet_string(); }), + k); + ms = ton::MultisigWallet::create(init_data); + auto raw_address = ms->get_address(ton::basechainId); + auto address = raw_address.rserialize(); + transfer_grams(client, giver_wallet, address, 1 * Gramm).ensure(); + auto init_state = ms->get_init_state(); + + // Just transfer all (some) money back in one query + vm::CellBuilder icb; + ton::GenericAccount::store_int_message(icb, block::StdAddress::parse(giver_wallet.address).move_as_ok(), + 5 * Gramm / 10); + icb.store_bytes("\0\0\0\0", 4); + vm::CellString::store(icb, "Greatings from multisig", 35 * 8).ensure(); + ton::MultisigWallet::QueryBuilder qb(-1, icb.finalize()); + for (int i = 0; i < k - 1; i++) { + qb.sign(i, private_keys[i]); + } + + auto query_id = + create_raw_query(client, address, vm::std_boc_serialize(ms->get_state().code).move_as_ok().as_slice().str(), + vm::std_boc_serialize(ms->get_state().data).move_as_ok().as_slice().str(), + vm::std_boc_serialize(qb.create(k - 1, private_keys[k - 1])).move_as_ok().as_slice().str()) + .move_as_ok(); + auto fees = query_estimate_fees(client, query_id); + + LOG(INFO) << "Expected src fees: " << fees.first; + LOG(INFO) << "Expected dst fees: " << fees.second; + auto a_state = get_account_state(client, address); + query_send(client, query_id); + auto new_a_state = wait_state_change(client, a_state, a_state.sync_utime + 30).move_as_ok(); +} + int main(int argc, char* argv[]) { td::set_default_failure_signal_handler(); using tonlib_api::make_object; td::OptionsParser p; std::string global_config_str; + std::string giver_key_str; + std::string giver_key_pwd = "cucumber"; + std::string keystore_dir = "test-keystore"; + bool reset_keystore_dir = false; p.add_option('C', "global-config", "file to read global config", [&](td::Slice fname) { TRY_RESULT(str, td::read_file_str(fname.str())); global_config_str = std::move(str); - LOG(ERROR) << global_config_str; + return td::Status::OK(); + }); + p.add_option('G', "giver-key", "file with a wallet key that should be used as a giver", [&](td::Slice fname) { + TRY_RESULT(str, td::read_file_str(fname.str())); + giver_key_str = std::move(str); + return td::Status::OK(); + }); + p.add_option('f', "force", "reser keystore dir", [&]() { + reset_keystore_dir = true; return td::Status::OK(); }); p.run(argc, argv).ensure(); + if (reset_keystore_dir) { + td::rmrf(keystore_dir).ignore(); + td::mkdir(keystore_dir).ensure(); + } + + SET_VERBOSITY_LEVEL(VERBOSITY_NAME(INFO)); + static_send(make_object("tonlib_query", 4)).ensure(); + auto tags = static_send(make_object()).move_as_ok()->tags_; + for (auto& tag : tags) { + static_send(make_object(tag, 4)).ensure(); + } + Client client; { sync_send(client, make_object(make_object( make_object(global_config_str, "", false, false), - make_object(".")))) + make_object(keystore_dir)))) .ensure(); } - //dump_transaction_history(client, get_test_giver_address(client)); - auto wallet_a = create_wallet(client); - auto wallet_b = create_empty_wallet(client); - transfer_grams(client, wallet_a.address, wallet_b.address, 3000000000, wallet_a.key.get_input_key()); - auto a = get_balance(client, wallet_a.address); - auto b = get_balance(client, wallet_b.address); - LOG(ERROR) << a << " " << b; - return 0; - { - // init - sync_send(client, make_object(make_object( - make_object(global_config_str, "", false, false), - make_object(".")))) - .ensure(); - auto key = sync_send(client, make_object( - td::SecureString("local"), td::SecureString("mnemonic"), td::SecureString())) - .move_as_ok(); + // wait till client is synchronized with blockchain. + // not necessary, but synchronized will be trigged anyway later + sync(client); - auto create_input_key = [&] { - return make_object(make_object(key->public_key_, key->secret_.copy()), - td::SecureString("local")); - }; + // give wallet with some test grams to run test + auto giver_wallet = import_wallet_from_pkey(client, giver_key_str, giver_key_pwd); - auto public_key_raw = key->public_key_; - td::Ed25519::PublicKey public_key_std(td::SecureString{public_key_raw}); - - sync_send(client, make_object( - make_object(global_config_str, "", false, false))) - .ensure(); - - auto wallet_addr = GenericAccount::get_address(0, TestWallet::get_init_state(public_key_std)); - { - auto account_address = - sync_send(client, make_object( - make_object(public_key_raw))) - .move_as_ok(); - ASSERT_EQ(wallet_addr.rserialize(), account_address->account_address_); - } - - std::string test_giver_address; - { - auto account_address = sync_send(client, make_object()).move_as_ok(); - test_giver_address = account_address->account_address_; - ASSERT_EQ(TestGiver::address().rserialize(), test_giver_address); - } - - { - auto account_address = - sync_send( - client, - make_object(make_object( - vm::std_boc_serialize(TestWallet::get_init_code()).move_as_ok().as_slice().str(), - vm::std_boc_serialize(TestWallet::get_init_data(public_key_std)).move_as_ok().as_slice().str()))) - .move_as_ok(); - ASSERT_EQ(wallet_addr.rserialize(), account_address->account_address_); - } - - { - auto state = sync_send(client, make_object( - make_object(wallet_addr.rserialize()))) - .move_as_ok(); - LOG(ERROR) << to_string(state); - } - - td::int32 seqno = 0; - { - auto state = sync_send(client, make_object()).move_as_ok(); - LOG(ERROR) << to_string(state); - seqno = state->seqno_; - } - - { - sync_send(client, make_object( - make_object(wallet_addr.rserialize()), seqno, - 1000000000ll * 6666 / 1000, "GIFT")) - .ensure(); - } - - while (true) { - auto state = sync_send(client, make_object()).move_as_ok(); - if (state->seqno_ > seqno) { - break; - } - client.receive(1); - } - - while (true) { - auto state = sync_send(client, make_object( - make_object(wallet_addr.rserialize()))) - .move_as_ok(); - td::int64 grams_count = state->balance_; - if (grams_count > 0) { - LOG(ERROR) << "GOT " << grams_count; - break; - } - client.receive(1); - } - - { sync_send(client, make_object(create_input_key())).ensure(); } - - while (true) { - auto r_state = sync_send(client, make_object( - make_object(wallet_addr.rserialize()))); - if (r_state.is_ok()) { - LOG(ERROR) << to_string(r_state.ok()); - break; - } - client.receive(1); - } - - { - sync_send(client, make_object( - create_input_key(), make_object(wallet_addr.rserialize()), - make_object(test_giver_address), 1000000000ll * 3333 / 1000, 0, - true, "GIFT")) - .ensure(); - } - while (true) { - auto generic_state = sync_send(client, make_object( - make_object(wallet_addr.rserialize()))) - .move_as_ok(); - if (generic_state->get_id() == tonlib_api::generic_accountStateTestWallet::ID) { - auto state = tonlib_api::move_object_as(generic_state); - if (state->account_state_->balance_ < 5617007000) { - LOG(ERROR) << to_string(state); - break; - } - } - client.receive(1); - } - { - auto generic_state = sync_send(client, make_object( - make_object(test_giver_address))) - .move_as_ok(); - CHECK(generic_state->get_id() == tonlib_api::generic_accountStateTestGiver::ID); - LOG(ERROR) << to_string(generic_state); - } - } + test_back_and_forth_transfer(client, giver_wallet, false); + test_back_and_forth_transfer(client, giver_wallet, true); + test_multisig(client, giver_wallet); return 0; } diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/Client.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/Client.cpp index c42b19655a..d22e7ac792 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/Client.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/Client.cpp @@ -56,8 +56,10 @@ class Client::Impl final { std::shared_ptr output_queue_; }; - scheduler_.run_in_context( - [&] { tonlib_ = td::actor::create_actor("Tonlib", td::make_unique(output_queue_)); }); + scheduler_.run_in_context([&] { + tonlib_ = td::actor::create_actor(td::actor::ActorOptions().with_name("Tonlib").with_poll(), + td::make_unique(output_queue_)); + }); scheduler_thread_ = td::thread([&] { scheduler_.run(); }); } @@ -107,7 +109,7 @@ class Client::Impl final { std::atomic receive_lock_{false}; bool is_closed_{false}; - td::actor::Scheduler scheduler_{{0}}; + td::actor::Scheduler scheduler_{{1}}; td::thread scheduler_thread_; td::actor::ActorOwn tonlib_; diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/ExtClient.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/ExtClient.cpp index 442d65033a..6981078efb 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/ExtClient.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/ExtClient.cpp @@ -19,8 +19,27 @@ #include "tonlib/ExtClient.h" #include "tonlib/LastBlock.h" +#include "tonlib/LastConfig.h" namespace tonlib { +ExtClient::~ExtClient() { + last_config_queries_.for_each([](auto id, auto &promise) { promise.set_error(TonlibError::Cancelled()); }); + last_block_queries_.for_each([](auto id, auto &promise) { promise.set_error(TonlibError::Cancelled()); }); + queries_.for_each([](auto id, auto &promise) { promise.set_error(TonlibError::Cancelled()); }); +} +void ExtClient::with_last_config(td::Promise promise) { + auto query_id = last_config_queries_.create(std::move(promise)); + td::Promise P = [query_id, self = this, + actor_id = td::actor::actor_id()](td::Result result) { + send_lambda(actor_id, [self, query_id, result = std::move(result)]() mutable { + self->last_config_queries_.extract(query_id).set_result(std::move(result)); + }); + }; + if (client_.last_block_actor_.empty()) { + return P.set_error(TonlibError::NoLiteServers()); + } + td::actor::send_closure(client_.last_config_actor_, &LastConfig::get_last_config, std::move(P)); +} void ExtClient::with_last_block(td::Promise promise) { auto query_id = last_block_queries_.create(std::move(promise)); td::Promise P = [query_id, self = this, diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/ExtClient.h b/submodules/ton/tonlib-src/tonlib/tonlib/ExtClient.h index 1547337948..b3cbbaf09d 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/ExtClient.h +++ b/submodules/ton/tonlib-src/tonlib/tonlib/ExtClient.h @@ -33,10 +33,13 @@ namespace tonlib { class LastBlock; +class LastConfig; struct LastBlockState; +struct LastConfigState; struct ExtClientRef { td::actor::ActorId andl_ext_client_; td::actor::ActorId last_block_actor_; + td::actor::ActorId last_config_actor_; }; class ExtClient { @@ -53,8 +56,10 @@ class ExtClient { ExtClientRef get_client() { return client_; } + ~ExtClient(); void with_last_block(td::Promise promise); + void with_last_config(td::Promise promise); template void send_query(QueryT query, td::Promise promise, td::int32 seq_no = -1) { @@ -93,6 +98,7 @@ class ExtClient { ExtClientRef client_; td::Container> queries_; td::Container> last_block_queries_; + td::Container> last_config_queries_; void send_raw_query(td::BufferSlice query, td::Promise promise); }; diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/ExtClientLazy.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/ExtClientLazy.cpp index d5adb770e1..cd83e3abde 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/ExtClientLazy.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/ExtClientLazy.cpp @@ -17,6 +17,7 @@ Copyright 2017-2019 Telegram Systems LLP */ #include "ExtClientLazy.h" +#include "TonlibError.h" namespace tonlib { class ExtClientLazyImp : public ton::adnl::AdnlExtClient { @@ -28,12 +29,18 @@ class ExtClientLazyImp : public ton::adnl::AdnlExtClient { void check_ready(td::Promise promise) override { before_query(); + if (client_.empty()) { + return promise.set_error(TonlibError::Cancelled()); + } send_closure(client_, &ton::adnl::AdnlExtClient::check_ready, std::move(promise)); } void send_query(std::string name, td::BufferSlice data, td::Timestamp timeout, td::Promise promise) override { before_query(); + if (client_.empty()) { + return promise.set_error(TonlibError::Cancelled()); + } send_closure(client_, &ton::adnl::AdnlExtClient::send_query, std::move(name), std::move(data), timeout, std::move(promise)); } diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/KeyStorage.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/KeyStorage.cpp index 6e01f2f846..c34468a2de 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/KeyStorage.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/KeyStorage.cpp @@ -106,6 +106,9 @@ td::Result KeyStorage::export_key(InputKey input_key) { } td::Result KeyStorage::load_private_key(InputKey input_key) { + if (is_fake_input_key(input_key)) { + return fake_private_key(); + } TRY_RESULT(decrypted_key, export_decrypted_key(std::move(input_key))); PrivateKey private_key; private_key.private_key = decrypted_key.private_key.as_octet_string(); @@ -182,4 +185,28 @@ td::Result KeyStorage::import_encrypted_key(td::Slice local_pas return save_key(std::move(decrypted_key), local_password); } +KeyStorage::PrivateKey KeyStorage::fake_private_key() { + return PrivateKey{td::SecureString(32, 0)}; +} + +KeyStorage::InputKey KeyStorage::fake_input_key() { + return InputKey{{td::SecureString(32, 0), td::SecureString(32, 0)}, {}}; +} + +bool KeyStorage::is_fake_input_key(InputKey &input_key) { + auto is_zero = [](td::Slice slice, size_t size) { + if (slice.size() != size) { + return false; + } + for (auto c : slice) { + if (c != 0) { + return false; + } + } + return true; + }; + return is_zero(input_key.local_password, 0) && is_zero(input_key.key.secret, 32) && + is_zero(input_key.key.public_key, 32); +} + } // namespace tonlib diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/KeyStorage.h b/submodules/ton/tonlib-src/tonlib/tonlib/KeyStorage.h index 1e37082885..38478bf1f3 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/KeyStorage.h +++ b/submodules/ton/tonlib-src/tonlib/tonlib/KeyStorage.h @@ -69,6 +69,10 @@ class KeyStorage { td::Result load_private_key(InputKey input_key); + static PrivateKey fake_private_key(); + static InputKey fake_input_key(); + static bool is_fake_input_key(InputKey& input_key); + private: std::shared_ptr kv_; diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/KeyValue.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/KeyValue.cpp index 796969241f..ccf9a38372 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/KeyValue.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/KeyValue.cpp @@ -2,6 +2,7 @@ #include "td/utils/filesystem.h" #include "td/utils/port/path.h" +#include "td/utils/PathView.h" #include #include @@ -51,7 +52,7 @@ class KeyValueDir : public KeyValue { return td::WalkPath::Action::SkipDir; } } else if (type == td::WalkPath::Type::NotDir) { - f(path); + f(td::PathView::relative(path, directory_)); } return td::WalkPath::Action::Continue; diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/LastBlock.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/LastBlock.cpp index d498aa7a25..234af99719 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/LastBlock.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/LastBlock.cpp @@ -17,6 +17,7 @@ Copyright 2017-2019 Telegram Systems LLP */ #include "tonlib/LastBlock.h" +#include "tonlib/LastConfig.h" #include "tonlib/utils.h" @@ -36,11 +37,22 @@ td::StringBuilder& operator<<(td::StringBuilder& sb, const LastBlockState& state << td::tag("init_block", state.init_block_id.to_str()); } -LastBlock::LastBlock(ExtClientRef client, LastBlockState state, Config config, td::unique_ptr callback) - : state_(std::move(state)), config_(std::move(config)), callback_(std::move(callback)) { +LastBlock::LastBlock(ExtClientRef client, LastBlockState state, Config config, td::CancellationToken cancellation_token, + td::unique_ptr callback) + : callback_(std::move(callback)) + , state_(std::move(state)) + , config_(std::move(config)) + , cancellation_token_(std::move(cancellation_token)) { client_.set_client(client); state_.last_block_id = state_.last_key_block_id; + if (state_.last_key_block_id.is_valid()) { + min_seqno_ = state_.last_key_block_id.id.seqno; + } + if (config_.init_block_id.is_valid() && config_.init_block_id != state_.init_block_id) { + min_seqno_ = td::min(min_seqno_, config_.init_block_id.id.seqno); + } + current_seqno_ = min_seqno_; VLOG(last_block) << "State: " << state_; } @@ -61,6 +73,9 @@ void LastBlock::get_last_block(td::Promise promise) { } void LastBlock::sync_loop() { + SCOPE_EXIT { + update_sync_state(); + }; if (promises_.empty()) { return; } @@ -147,7 +162,7 @@ td::Result> LastBlock::process_block_pro return td::Status::Error(PSLICE() << "block proof chain starts from block " << chain->from.to_str() << ", not from requested block " << from.to_str()); } - TRY_STATUS(chain->validate()); + TRY_STATUS(chain->validate(cancellation_token_)); return std::move(chain); } @@ -155,6 +170,8 @@ void LastBlock::update_state(block::BlockProofChain& chain) { // Update state_ bool is_changed = false; is_changed |= update_mc_last_block(chain.to); + current_seqno_ = td::max(current_seqno_, chain.to.id.seqno); + max_seqno_ = td::max(max_seqno_, current_seqno_); if (chain.has_key_block) { is_changed |= update_mc_last_key_block(chain.key_blkid); } @@ -193,10 +210,10 @@ void LastBlock::on_block_proof( if (chain->complete) { VLOG(last_block) << "get_last_block: done\n" << get_last_block_stats_; get_last_block_state_ = QueryState::Done; - sync_loop(); } else { do_get_last_block(); } + sync_loop(); } void LastBlock::on_init_block_proof( @@ -209,6 +226,7 @@ void LastBlock::on_init_block_proof( check_init_block_state_ = QueryState::Empty; VLOG(last_block) << "check_init_block: error " << r_chain.error(); on_sync_error(r_chain.move_as_error_suffix("(during check init block)")); + sync_loop(); return; } auto chain = r_chain.move_as_ok(); @@ -220,10 +238,10 @@ void LastBlock::on_init_block_proof( if (update_init_block(config_.init_block_id)) { save_state(); } - sync_loop(); } else { do_check_init_block(chain->to, to); } + sync_loop(); } void LastBlock::on_masterchain_info( @@ -233,6 +251,7 @@ void LastBlock::on_masterchain_info( update_zero_state(create_zero_state_id(info->init_), "masterchain info"); // last block is not validated! Do not update it get_mc_info_state_ = QueryState::Done; + max_seqno_ = td::max(max_seqno_, (unsigned)info->last_->seqno_); VLOG(last_block) << "get_masterchain_info: done"; } else { get_mc_info_state_ = QueryState::Empty; @@ -253,7 +272,7 @@ void LastBlock::update_zero_state(ton::ZeroStateIdExt zero_state_id, td::Slice s } if (!state_.zero_state_id.is_valid()) { - LOG(INFO) << "Init zerostate from " << source << ": " << zero_state_id.to_str(); + VLOG(last_block) << "Init zerostate from " << source << ": " << zero_state_id.to_str(); state_.zero_state_id = std::move(zero_state_id); return; } @@ -277,7 +296,7 @@ bool LastBlock::update_mc_last_block(ton::BlockIdExt mc_block_id) { } if (!state_.last_block_id.is_valid() || state_.last_block_id.id.seqno < mc_block_id.id.seqno) { state_.last_block_id = mc_block_id; - LOG(INFO) << "Update masterchain block id: " << state_.last_block_id.to_str(); + VLOG(last_block) << "Update masterchain block id: " << state_.last_block_id.to_str(); return true; } return false; @@ -293,7 +312,7 @@ bool LastBlock::update_mc_last_key_block(ton::BlockIdExt mc_key_block_id) { } if (!state_.last_key_block_id.is_valid() || state_.last_key_block_id.id.seqno < mc_key_block_id.id.seqno) { state_.last_key_block_id = mc_key_block_id; - LOG(INFO) << "Update masterchain key block id: " << state_.last_key_block_id.to_str(); + VLOG(last_block) << "Update masterchain key block id: " << state_.last_key_block_id.to_str(); //LOG(ERROR) << td::int64(state_.last_key_block_id.id.shard) << " " //<< td::base64_encode(state_.last_key_block_id.file_hash.as_slice()) << " " //<< td::base64_encode(state_.last_key_block_id.root_hash.as_slice()); @@ -312,7 +331,7 @@ bool LastBlock::update_init_block(ton::BlockIdExt init_block_id) { } if (state_.init_block_id != init_block_id) { state_.init_block_id = init_block_id; - LOG(INFO) << "Update init block id: " << state_.init_block_id.to_str(); + VLOG(last_block) << "Update init block id: " << state_.init_block_id.to_str(); return true; } return false; @@ -334,6 +353,9 @@ void LastBlock::on_sync_ok() { } void LastBlock::on_sync_error(td::Status status) { VLOG(last_block) << "sync: error " << status; + if (cancellation_token_) { + status = TonlibError::Cancelled(); + } for (auto& promise : promises_) { promise.set_error(status.clone()); } @@ -348,4 +370,32 @@ void LastBlock::on_fatal_error(td::Status status) { bool LastBlock::has_fatal_error() const { return fatal_error_.is_error(); } + +LastBlockSyncState LastBlock::get_sync_state() { + LastBlockSyncState state; + if (promises_.empty()) { + state.type = LastBlockSyncState::Done; + return state; + } + state.type = LastBlockSyncState::InProgress; + state.from_seqno = min_seqno_; + state.to_seqno = max_seqno_; + state.current_seqno = current_seqno_; + return state; +} + +void LastBlock::update_sync_state() { + auto new_state = get_sync_state(); + if (new_state == sync_state_) { + return; + } + sync_state_ = new_state; + VLOG(last_block) << "Sync state: " << current_seqno_ - min_seqno_ << " / " << max_seqno_ - min_seqno_; + callback_->on_sync_state_changed(sync_state_); +} + +void LastBlock::tear_down() { + on_sync_error(TonlibError::Cancelled()); +} + } // namespace tonlib diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/LastBlock.h b/submodules/ton/tonlib-src/tonlib/tonlib/LastBlock.h index edd8c6f387..e01a7fde71 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/LastBlock.h +++ b/submodules/ton/tonlib-src/tonlib/tonlib/LastBlock.h @@ -22,6 +22,7 @@ #include "tonlib/Config.h" #include "tonlib/ExtClient.h" +#include "td/utils/CancellationToken.h" #include "td/utils/tl_helpers.h" namespace block { @@ -132,6 +133,20 @@ struct LastBlockState { } }; +struct LastBlockSyncState { + enum Type { Invalid, InProgress, Done } type = Invalid; + td::int32 from_seqno{0}; + td::int32 to_seqno{0}; + td::int32 current_seqno{0}; + + auto as_key() const { + return std::tie(type, from_seqno, to_seqno, current_seqno); + } + bool operator==(const LastBlockSyncState &other) const { + return as_key() == other.as_key(); + } +}; + class LastBlock : public td::actor::Actor { public: class Callback { @@ -139,16 +154,19 @@ class LastBlock : public td::actor::Actor { virtual ~Callback() { } virtual void on_state_changed(LastBlockState state) = 0; + virtual void on_sync_state_changed(LastBlockSyncState state) = 0; }; - explicit LastBlock(ExtClientRef client, LastBlockState state, Config config, td::unique_ptr callback); + explicit LastBlock(ExtClientRef client, LastBlockState state, Config config, td::CancellationToken cancellation_token, + td::unique_ptr callback); void get_last_block(td::Promise promise); private: + td::unique_ptr callback_; ExtClient client_; LastBlockState state_; Config config_; - td::unique_ptr callback_; + td::CancellationToken cancellation_token_; td::Status fatal_error_; @@ -157,6 +175,11 @@ class LastBlock : public td::actor::Actor { QueryState check_init_block_state_{QueryState::Empty}; // init_block <---> last_key_block (from older to newer) QueryState get_last_block_state_{QueryState::Empty}; // last_key_block_id --> ? + unsigned min_seqno_ = 0; + unsigned current_seqno_ = 0; + unsigned max_seqno_ = 0; + LastBlockSyncState sync_state_; + // stats struct Stats { td::Timer total_sync_; @@ -209,6 +232,10 @@ class LastBlock : public td::actor::Actor { void on_fatal_error(td::Status status); bool has_fatal_error() const; + LastBlockSyncState get_sync_state(); + void update_sync_state(); void sync_loop(); + + void tear_down() override; }; } // namespace tonlib diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/LastConfig.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/LastConfig.cpp new file mode 100644 index 0000000000..7207b6f0eb --- /dev/null +++ b/submodules/ton/tonlib-src/tonlib/tonlib/LastConfig.cpp @@ -0,0 +1,152 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#include "tonlib/LastConfig.h" + +#include "tonlib/utils.h" + +#include "ton/lite-tl.hpp" +#include "block/check-proof.h" +#include "block/mc-config.h" +#include "block/block-auto.h" + +#include "lite-client/lite-client-common.h" + +#include "LastBlock.h" + +namespace tonlib { + +// init_state <-> last_key_block +// state.valitated_init_state +// last_key_block -> +// +td::StringBuilder& operator<<(td::StringBuilder& sb, const LastConfigState& state) { + return sb; +} + +LastConfig::LastConfig(ExtClientRef client, td::unique_ptr callback) : callback_(std::move(callback)) { + client_.set_client(client); + VLOG(last_block) << "State: " << state_; +} + +void LastConfig::get_last_config(td::Promise promise) { + if (promises_.empty() && get_config_state_ == QueryState::Done) { + VLOG(last_config) << "start"; + VLOG(last_config) << "get_config: reset"; + get_config_state_ = QueryState::Empty; + } + + promises_.push_back(std::move(promise)); + loop(); +} + +void LastConfig::with_last_block(td::Result r_last_block) { + if (r_last_block.is_error()) { + on_error(r_last_block.move_as_error()); + return; + } + + auto last_block = r_last_block.move_as_ok(); + auto params = params_; + client_.send_query(ton::lite_api::liteServer_getConfigParams(0, create_tl_lite_block_id(last_block.last_block_id), + std::move(params)), + [this](auto r_config) { this->on_config(std::move(r_config)); }); +} + +void LastConfig::on_config(td::Result> r_config) { + auto status = process_config(std::move(r_config)); + if (status.is_ok()) { + on_ok(); + get_config_state_ = QueryState::Done; + } else { + on_error(std::move(status)); + get_config_state_ = QueryState::Empty; + } +} + +td::Status LastConfig::process_config( + td::Result> r_config) { + TRY_RESULT(raw_config, std::move(r_config)); + TRY_STATUS_PREFIX(TRY_VM(process_config_proof(std::move(raw_config))), TonlibError::ValidateConfig()); + return td::Status::OK(); +} + +td::Status LastConfig::process_config_proof(ton::ton_api::object_ptr raw_config) { + auto blkid = create_block_id(raw_config->id_); + if (!blkid.is_masterchain_ext()) { + return td::Status::Error(PSLICE() << "reference block " << blkid.to_str() + << " for the configuration is not a valid masterchain block"); + } + TRY_RESULT(state, block::check_extract_state_proof(blkid, raw_config->state_proof_.as_slice(), + raw_config->config_proof_.as_slice())); + TRY_RESULT(config, block::Config::extract_from_state(std::move(state), 0)); + + for (auto i : params_) { + VLOG(last_config) << "ConfigParam(" << i << ") = "; + auto value = config->get_config_param(i); + if (value.is_null()) { + VLOG(last_config) << "(null)\n"; + } else { + std::ostringstream os; + if (i >= 0) { + block::gen::ConfigParam{i}.print_ref(os, value); + os << std::endl; + } + vm::load_cell_slice(value).print_rec(os); + VLOG(last_config) << os.str(); + } + } + state_.config.reset(config.release()); + return td::Status::OK(); +} + +void LastConfig::loop() { + if (promises_.empty()) { + return; + } + + if (get_config_state_ == QueryState::Empty) { + VLOG(last_block) << "get_config: start"; + get_config_state_ = QueryState::Active; + client_.with_last_block( + [self = this](td::Result r_last_block) { self->with_last_block(std::move(r_last_block)); }); + } +} + +void LastConfig::on_ok() { + VLOG(last_block) << "ok " << state_; + for (auto& promise : promises_) { + auto state = state_; + promise.set_value(std::move(state)); + } + promises_.clear(); +} + +void LastConfig::on_error(td::Status status) { + VLOG(last_config) << "error " << status; + for (auto& promise : promises_) { + promise.set_error(status.clone()); + } + promises_.clear(); +} + +void LastConfig::tear_down() { + on_error(TonlibError::Cancelled()); +} + +} // namespace tonlib diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/LastConfig.h b/submodules/ton/tonlib-src/tonlib/tonlib/LastConfig.h new file mode 100644 index 0000000000..2e0cf2a399 --- /dev/null +++ b/submodules/ton/tonlib-src/tonlib/tonlib/LastConfig.h @@ -0,0 +1,70 @@ +/* + This file is part of TON Blockchain Library. + + TON Blockchain Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + TON Blockchain Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with TON Blockchain Library. If not, see . + + Copyright 2017-2019 Telegram Systems LLP +*/ +#pragma once +#include "td/actor/actor.h" + +#include "tonlib/Config.h" +#include "tonlib/ExtClient.h" + +#include "td/utils/CancellationToken.h" +#include "td/utils/tl_helpers.h" + +#include "block/mc-config.h" + +namespace tonlib { +struct LastConfigState { + std::shared_ptr config; +}; + +td::StringBuilder& operator<<(td::StringBuilder& sb, const LastConfigState& state); + +class LastConfig : public td::actor::Actor { + public: + class Callback { + public: + virtual ~Callback() { + } + }; + + explicit LastConfig(ExtClientRef client, td::unique_ptr callback); + void get_last_config(td::Promise promise); + + private: + td::unique_ptr callback_; + ExtClient client_; + LastConfigState state_; + + enum class QueryState { Empty, Active, Done }; + QueryState get_config_state_{QueryState::Empty}; + + std::vector> promises_; + std::vector params_{18, 20, 21, 24, 25}; + + void with_last_block(td::Result r_last_block); + void on_config(td::Result> r_config); + td::Status process_config(td::Result> r_config); + td::Status process_config_proof(ton::ton_api::object_ptr config); + + void on_ok(); + void on_error(td::Status status); + + void loop() override; + void tear_down() override; +}; +} // namespace tonlib diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/Logging.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/Logging.cpp index 31dc275c00..244ce4b4f9 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/Logging.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/Logging.cpp @@ -39,7 +39,8 @@ static td::NullLog null_log; #define ADD_TAG(tag) \ { #tag, &VERBOSITY_NAME(tag) } -static const std::map log_tags{ADD_TAG(tonlib_query), ADD_TAG(last_block)}; +static const std::map log_tags{ADD_TAG(tonlib_query), ADD_TAG(last_block), ADD_TAG(last_config), + ADD_TAG(lite_server)}; #undef ADD_TAG td::Status Logging::set_current_stream(tonlib_api::object_ptr stream) { diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.cpp index ccf44df640..12bb8fe8c1 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.cpp @@ -20,18 +20,19 @@ #include "tonlib/ExtClientLazy.h" #include "tonlib/ExtClientOutbound.h" -#include "tonlib/GenericAccount.h" #include "tonlib/LastBlock.h" +#include "tonlib/LastConfig.h" #include "tonlib/Logging.h" -#include "tonlib/TestWallet.h" -#include "tonlib/Wallet.h" -#include "tonlib/TestGiver.h" #include "tonlib/utils.h" #include "tonlib/keys/Mnemonic.h" #include "tonlib/keys/SimpleEncryption.h" - #include "tonlib/TonlibError.h" +#include "smc-envelope/GenericAccount.h" +#include "smc-envelope/TestWallet.h" +#include "smc-envelope/Wallet.h" +#include "smc-envelope/TestGiver.h" + #include "auto/tl/tonlib_api.hpp" #include "block/block-auto.h" #include "block/check-proof.h" @@ -41,12 +42,43 @@ #include "vm/boc.h" #include "td/utils/Random.h" +#include "td/utils/optional.h" #include "td/utils/overloaded.h" #include "td/utils/tests.h" #include "td/utils/port/path.h" namespace tonlib { +namespace int_api { +struct GetAccountState { + block::StdAddress address; + using ReturnType = td::unique_ptr; +}; +struct GetPrivateKey { + KeyStorage::InputKey input_key; + using ReturnType = KeyStorage::PrivateKey; +}; +struct SendMessage { + td::Ref message; + using ReturnType = td::Unit; +}; +} // namespace int_api + +class TonlibQueryActor : public td::actor::Actor { + public: + TonlibQueryActor(td::actor::ActorShared client) : client_(std::move(client)) { + } + template + void send_query(QueryT query, td::Promise promise) { + td::actor::send_lambda(client_, + [self = client_.get(), query = std::move(query), promise = std::move(promise)]() mutable { + self.get_actor_unsafe().make_request(std::move(query), std::move(promise)); + }); + } + + private: + td::actor::ActorShared client_; +}; tonlib_api::object_ptr status_to_tonlib_api(const td::Status& status) { return tonlib_api::make_object(status.code(), status.message().str()); @@ -63,12 +95,417 @@ static block::AccountState create_account_state(ton::tl_object_ptr code; - td::Ref data; + + ton::UnixTime storage_last_paid{0}; + vm::CellStorageStat storage_stat; + + td::Ref code; + td::Ref data; std::string frozen_hash; block::AccountState::Info info; }; +tonlib_api::object_ptr empty_transaction_id() { + return tonlib_api::make_object(0, std::string(32, 0)); +} + +tonlib_api::object_ptr to_transaction_id(const block::AccountState::Info& info) { + return tonlib_api::make_object(info.last_trans_lt, + info.last_trans_hash.as_slice().str()); +} + +class AccountState { + public: + AccountState(block::StdAddress address, RawAccountState&& raw) : address_(std::move(address)), raw_(std::move(raw)) { + wallet_type_ = guess_type(); + } + + auto to_uninited_accountState() const { + return tonlib_api::make_object(get_balance(), to_transaction_id(raw().info), + raw().frozen_hash, get_sync_time()); + } + + td::Result> to_raw_accountState() const { + auto state = get_smc_state(); + std::string code; + if (state.code.not_null()) { + code = vm::std_boc_serialize(state.code).move_as_ok().as_slice().str(); + } + std::string data; + if (state.data.not_null()) { + data = vm::std_boc_serialize(state.data).move_as_ok().as_slice().str(); + } + return tonlib_api::make_object(get_balance(), std::move(code), std::move(data), + to_transaction_id(raw().info), raw().frozen_hash, + get_sync_time()); + } + + td::Result> to_testWallet_accountState() const { + if (wallet_type_ != SimpleWallet) { + return TonlibError::AccountTypeUnexpected("TestWallet"); + } + TRY_RESULT(seqno, ton::TestWallet(get_smc_state()).get_seqno()); + return tonlib_api::make_object(get_balance(), static_cast(seqno), + to_transaction_id(raw().info), get_sync_time()); + } + + td::Result> to_wallet_accountState() const { + if (wallet_type_ != Wallet) { + return TonlibError::AccountTypeUnexpected("Wallet"); + } + TRY_RESULT(seqno, ton::Wallet(get_smc_state()).get_seqno()); + return tonlib_api::make_object(get_balance(), static_cast(seqno), + to_transaction_id(raw().info), get_sync_time()); + } + + td::Result> to_testGiver_accountState() const { + if (wallet_type_ != Giver) { + return TonlibError::AccountTypeUnexpected("TestGiver"); + } + TRY_RESULT(seqno, ton::TestGiver(get_smc_state()).get_seqno()); + return tonlib_api::make_object(get_balance(), static_cast(seqno), + to_transaction_id(raw().info), get_sync_time()); + } + td::Result> to_generic_accountState() const { + switch (wallet_type_) { + case Empty: + return tonlib_api::make_object(to_uninited_accountState()); + case Unknown: { + TRY_RESULT(res, to_raw_accountState()); + return tonlib_api::make_object(std::move(res)); + } + case Giver: { + TRY_RESULT(res, to_testGiver_accountState()); + return tonlib_api::make_object(std::move(res)); + } + case SimpleWallet: { + TRY_RESULT(res, to_testWallet_accountState()); + return tonlib_api::make_object(std::move(res)); + } + case Wallet: { + TRY_RESULT(res, to_wallet_accountState()); + return tonlib_api::make_object(std::move(res)); + } + } + UNREACHABLE(); + } + + enum WalletType { Empty, Unknown, Giver, SimpleWallet, Wallet }; + WalletType get_wallet_type() const { + return wallet_type_; + } + bool is_frozen() const { + return !raw_.frozen_hash.empty(); + } + + const block::StdAddress& get_address() const { + return address_; + } + + void make_non_bounceable() { + address_.bounceable = false; + } + + td::uint32 get_sync_time() const { + return raw_.info.gen_utime; + } + + td::int64 get_balance() const { + return raw_.balance; + } + + const RawAccountState& raw() const { + return raw_; + } + + WalletType guess_type_by_public_key(td::Ed25519::PublicKey& key) { + if (wallet_type_ != WalletType::Empty) { + return wallet_type_; + } + if (ton::GenericAccount::get_address(address_.workchain, ton::TestWallet::get_init_state(key)).addr == + address_.addr) { + set_new_state({ton::TestWallet::get_init_code(), ton::TestWallet::get_init_data(key)}); + wallet_type_ = WalletType::SimpleWallet; + } else if (ton::GenericAccount::get_address(address_.workchain, ton::Wallet::get_init_state(key)).addr == + address_.addr) { + set_new_state({ton::Wallet::get_init_code(), ton::Wallet::get_init_data(key)}); + wallet_type_ = WalletType::Wallet; + } + return wallet_type_; + } + + WalletType guess_type_default(td::Ed25519::PublicKey& key) { + if (wallet_type_ != WalletType::Empty) { + return wallet_type_; + } + set_new_state({ton::Wallet::get_init_code(), ton::Wallet::get_init_data(key)}); + wallet_type_ = WalletType::Wallet; + return wallet_type_; + } + + ton::SmartContract::State get_smc_state() const { + return {raw_.code, raw_.data}; + } + + void set_new_state(ton::SmartContract::State state) { + raw_.code = std::move(state.code); + raw_.data = std::move(state.data); + has_new_state_ = true; + } + + td::Ref get_new_state() const { + if (!has_new_state_) { + return {}; + } + return ton::GenericAccount::get_init_state(raw_.code, raw_.data); + } + + private: + block::StdAddress address_; + RawAccountState raw_; + WalletType wallet_type_{Unknown}; + bool has_new_state_{false}; + + WalletType guess_type() const { + if (raw_.code.is_null()) { + return WalletType::Empty; + } + auto code_hash = raw_.code->get_hash(); + if (code_hash == ton::TestGiver::get_init_code_hash()) { + return WalletType::Giver; + } + if (code_hash == ton::TestWallet::get_init_code_hash()) { + return WalletType::SimpleWallet; + } + if (code_hash == ton::Wallet::get_init_code_hash()) { + return WalletType::Wallet; + } + LOG(WARNING) << "Unknown code hash: " << td::base64_encode(code_hash.as_slice()); + return WalletType::Unknown; + } +}; + +class Query { + public: + struct Raw { + td::unique_ptr source; + td::unique_ptr destination; + + td::uint32 valid_until{std::numeric_limits::max()}; + + td::Ref message; + td::Ref new_state; + td::Ref message_body; + }; + + Query(Raw&& raw) : raw_(std::move(raw)) { + } + + td::Ref get_message() const { + return raw_.message; + } + + vm::CellHash get_body_hash() const { + return raw_.message_body->get_hash(); + } + + td::uint32 get_valid_until() const { + return raw_.valid_until; + } + + // ported from block/transaction.cpp + // TODO: reuse code + static td::RefInt256 compute_threshold(const block::GasLimitsPrices& cfg) { + auto gas_price256 = td::RefInt256{true, cfg.gas_price}; + if (cfg.gas_limit > cfg.flat_gas_limit) { + return td::rshift(gas_price256 * (cfg.gas_limit - cfg.flat_gas_limit), 16, 1) + + td::make_refint(cfg.flat_gas_price); + } else { + return td::make_refint(cfg.flat_gas_price); + } + } + + static td::uint64 gas_bought_for(td::RefInt256 nanograms, td::RefInt256 max_gas_threshold, + const block::GasLimitsPrices& cfg) { + if (nanograms.is_null() || sgn(nanograms) < 0) { + return 0; + } + if (nanograms >= max_gas_threshold) { + return cfg.gas_limit; + } + if (nanograms < cfg.flat_gas_price) { + return 0; + } + auto gas_price256 = td::RefInt256{true, cfg.gas_price}; + auto res = td::div((std::move(nanograms) - cfg.flat_gas_price) << 16, gas_price256); + return res->to_long() + cfg.flat_gas_limit; + } + + static td::RefInt256 compute_gas_price(td::uint64 gas_used, const block::GasLimitsPrices& cfg) { + auto gas_price256 = td::RefInt256{true, cfg.gas_price}; + return gas_used <= cfg.flat_gas_limit + ? td::make_refint(cfg.flat_gas_price) + : td::rshift(gas_price256 * (gas_used - cfg.flat_gas_limit), 16, 1) + cfg.flat_gas_price; + } + + static vm::GasLimits compute_gas_limits(td::RefInt256 balance, const block::GasLimitsPrices& cfg) { + vm::GasLimits res; + // Compute gas limits + if (false /*account.is_special*/) { + res.gas_max = cfg.special_gas_limit; + } else { + res.gas_max = gas_bought_for(balance, compute_threshold(cfg), cfg); + } + res.gas_credit = 0; + if (false /*trans_type != tr_ord*/) { + // may use all gas that can be bought using remaining balance + res.gas_limit = res.gas_max; + } else { + // originally use only gas bought using remaining message balance + // if the message is "accepted" by the smart contract, the gas limit will be set to gas_max + res.gas_limit = gas_bought_for(td::make_refint(0) /*msg balance remaining*/, compute_threshold(cfg), cfg); + if (true /*!block::tlb::t_Message.is_internal(in_msg)*/) { + // external messages carry no balance, give them some credit to check whether they are accepted + res.gas_credit = std::min(static_cast(cfg.gas_credit), static_cast(res.gas_max)); + } + } + LOG(DEBUG) << "gas limits: max=" << res.gas_max << ", limit=" << res.gas_limit << ", credit=" << res.gas_credit; + return res; + } + + struct Fee { + td::int64 in_fwd_fee{0}; + td::int64 storage_fee{0}; + td::int64 gas_fee{0}; + td::int64 fwd_fee{0}; + auto to_tonlib_api() const { + return tonlib_api::make_object(in_fwd_fee, storage_fee, gas_fee, fwd_fee); + } + }; + + td::Result calc_fwd_fees(td::Ref list, const block::MsgPrices& msg_prices) { + td::int64 res = 0; + std::vector> actions; + int n{0}; + int max_actions = 20; + while (true) { + actions.push_back(list); + auto cs = load_cell_slice(std::move(list)); + if (!cs.size_ext()) { + break; + } + if (!cs.have_refs()) { + return td::Status::Error("action list invalid: entry found with data but no next reference"); + } + list = cs.prefetch_ref(); + n++; + if (n > max_actions) { + return td::Status::Error(PSLICE() << "action list too long: more than " << max_actions << " actions"); + } + } + for (int i = n - 1; i >= 0; --i) { + vm::CellSlice cs = load_cell_slice(actions[i]); + CHECK(cs.fetch_ref().not_null()); + int tag = block::gen::t_OutAction.get_tag(cs); + CHECK(tag >= 0); + switch (tag) { + case block::gen::OutAction::action_set_code: + return td::Status::Error("estimate_fee: action_set_code unsupported"); + case block::gen::OutAction::action_send_msg: { + block::gen::OutAction::Record_action_send_msg act_rec; + // mode: +128 = attach all remaining balance, +64 = attach all remaining balance of the inbound message, +1 = pay message fees, +2 = skip if message cannot be sent + if (!tlb::unpack_exact(cs, act_rec) || (act_rec.mode & ~0xe3) || (act_rec.mode & 0xc0) == 0xc0) { + return td::Status::Error("estimate_fee: can't parse send_msg"); + } + block::gen::MessageRelaxed::Record msg; + if (!tlb::type_unpack_cell(act_rec.out_msg, block::gen::t_MessageRelaxed_Any, msg)) { + return td::Status::Error("estimate_fee: can't parse send_msg"); + } + vm::CellStorageStat sstat; // for message size + sstat.add_used_storage(msg.init, true, 3); // message init + sstat.add_used_storage(msg.body, true, 3); // message body (the root cell itself is not counted) + res += msg_prices.compute_fwd_fees(sstat.cells, sstat.bits); + break; + } + case block::gen::OutAction::action_reserve_currency: + return td::Status::Error("estimate_fee: action_reserve_currency unsupported"); + } + } + return res; + } + td::Result> estimate_fees(bool ignore_chksig, const block::Config& cfg) { + // gas fees + bool is_masterchain = raw_.source->get_address().workchain == ton::masterchainId; + bool dest_is_masterchain = raw_.destination && raw_.destination->get_address().workchain == ton::masterchainId; + TRY_RESULT(gas_limits_prices, cfg.get_gas_limits_prices(is_masterchain)); + TRY_RESULT(dest_gas_limits_prices, cfg.get_gas_limits_prices(dest_is_masterchain)); + TRY_RESULT(msg_prices, cfg.get_msg_prices(is_masterchain || dest_is_masterchain)); + TRY_RESULT(storage_prices, cfg.get_storage_prices()); + + auto storage_fee_256 = block::StoragePrices::compute_storage_fees( + raw_.source->get_sync_time(), storage_prices, raw_.source->raw().storage_stat, + raw_.source->raw().storage_last_paid, false, is_masterchain); + auto storage_fee = storage_fee_256.is_null() ? 0 : storage_fee_256->to_long(); + + auto dest_storage_fee_256 = + raw_.destination ? block::StoragePrices::compute_storage_fees( + raw_.destination->get_sync_time(), storage_prices, raw_.destination->raw().storage_stat, + raw_.destination->raw().storage_last_paid, false, is_masterchain) + : td::make_refint(0); + auto dest_storage_fee = dest_storage_fee_256.is_null() ? 0 : dest_storage_fee_256->to_long(); + + auto smc = ton::SmartContract::create(raw_.source->get_smc_state()); + + td::int64 in_fwd_fee = 0; + { + vm::CellStorageStat sstat; // for message size + sstat.add_used_storage(raw_.message, true, 3); // message init + in_fwd_fee += msg_prices.compute_fwd_fees(sstat.cells, sstat.bits); + } + + vm::GasLimits gas_limits = compute_gas_limits(td::make_refint(raw_.source->get_balance()), gas_limits_prices); + auto res = smc.write().send_external_message( + raw_.message_body, ton::SmartContract::Args().set_limits(gas_limits).set_ignore_chksig(ignore_chksig)); + td::int64 fwd_fee = 0; + if (res.success) { + //std::cerr << "new smart contract data: "; + //load_cell_slice(res.new_state.data).print_rec(std::cerr); + //std::cerr << "output actions: "; + //int out_act_num = output_actions_count(res.actions); + //block::gen::OutList{out_act_num}.print_ref(std::cerr, res.actions); + + TRY_RESULT_ASSIGN(fwd_fee, calc_fwd_fees(res.actions, msg_prices)); + } + + auto gas_fee = res.accepted ? compute_gas_price(res.gas_used, gas_limits_prices)->to_long() : 0; + LOG(ERROR) << storage_fee << " " << in_fwd_fee << " " << gas_fee << " " << fwd_fee; + + Fee fee; + fee.in_fwd_fee = in_fwd_fee; + fee.storage_fee = storage_fee; + fee.gas_fee = gas_fee; + fee.fwd_fee = fwd_fee; + + Fee dst_fee; + if (raw_.destination && raw_.destination->get_wallet_type() != AccountState::WalletType::Empty) { + dst_fee.gas_fee = dest_gas_limits_prices.flat_gas_price; + dst_fee.storage_fee = dest_storage_fee; + } + return std::make_pair(fee, dst_fee); + } + + private: + Raw raw_; + static int output_actions_count(td::Ref list) { + int i = -1; + do { + ++i; + list = load_cell_slice(std::move(list)).prefetch_ref(); + } while (list.not_null()); + return i; + } +}; // namespace tonlib + td::Result to_balance_or_throw(td::Ref balance_ref) { vm::CellSlice balance_slice = *balance_ref; auto balance = block::tlb::t_Grams.as_integer_skip(balance_slice); @@ -139,8 +576,8 @@ class GetTransactionHistory : public td::actor::Actor { td::Result do_with_transactions(std::vector blkids, td::BufferSlice transactions) { - LOG(INFO) << "got up to " << count_ << " transactions for " << address_ << " from last transaction " << lt_ << ":" - << hash_.to_hex(); + //LOG(INFO) << "got up to " << count_ << " transactions for " << address_ << " from last transaction " << lt_ << ":" + //<< hash_.to_hex(); block::TransactionList list; list.blkids = std::move(blkids); list.hash = hash_; @@ -166,6 +603,9 @@ class GetTransactionHistory : public td::actor::Actor { hash_), [self = this](auto r_transactions) { self->with_transactions(std::move(r_transactions)); }); } + void hangup() override { + check(TonlibError::Cancelled()); + } }; class GetRawAccountState : public td::actor::Actor { @@ -208,7 +648,7 @@ class GetRawAccountState : public td::actor::Actor { auto cell = res.info.root; std::ostringstream outp; block::gen::t_Account.print_ref(outp, cell); - LOG(INFO) << outp.str(); + //LOG(INFO) << outp.str(); if (cell.is_null()) { return res; } @@ -216,6 +656,41 @@ class GetRawAccountState : public td::actor::Actor { if (!tlb::unpack_cell(cell, account)) { return td::Status::Error("Failed to unpack Account"); } + { + block::gen::StorageInfo::Record storage_info; + if (!tlb::csr_unpack(account.storage_stat, storage_info)) { + return td::Status::Error("Failed to unpack StorageInfo"); + } + res.storage_last_paid = storage_info.last_paid; + td::RefInt256 due_payment; + if (storage_info.due_payment->prefetch_ulong(1) == 1) { + vm::CellSlice& cs2 = storage_info.due_payment.write(); + cs2.advance(1); + due_payment = block::tlb::t_Grams.as_integer_skip(cs2); + if (due_payment.is_null() || !cs2.empty_ext()) { + return td::Status::Error("Failed to upack due_payment"); + } + } else { + due_payment = td::RefInt256{true, 0}; + } + block::gen::StorageUsed::Record storage_used; + if (!tlb::csr_unpack(storage_info.used, storage_used)) { + return td::Status::Error("Failed to unpack StorageInfo"); + } + unsigned long long u = 0; + vm::CellStorageStat storage_stat; + u |= storage_stat.cells = block::tlb::t_VarUInteger_7.as_uint(*storage_used.cells); + u |= storage_stat.bits = block::tlb::t_VarUInteger_7.as_uint(*storage_used.bits); + u |= storage_stat.public_cells = block::tlb::t_VarUInteger_7.as_uint(*storage_used.public_cells); + //LOG(DEBUG) << "last_paid=" << res.storage_last_paid << "; cells=" << storage_stat.cells + //<< " bits=" << storage_stat.bits << " public_cells=" << storage_stat.public_cells; + if (u == std::numeric_limits::max()) { + return td::Status::Error("Failed to unpack StorageStat"); + } + + res.storage_stat = storage_stat; + } + block::gen::AccountStorage::Record storage; if (!tlb::csr_unpack(account.storage, storage)) { return td::Status::Error("Failed to unpack AccountStorage"); @@ -245,8 +720,8 @@ class GetRawAccountState : public td::actor::Actor { if (!tlb::csr_unpack(state.x, state_init)) { return td::Status::Error("Failed to parse StateInit"); } - res.code = std::move(state_init.code); - res.data = std::move(state_init.data); + state_init.code->prefetch_maybe_ref(res.code); + state_init.data->prefetch_maybe_ref(res.data); return res; } @@ -277,6 +752,9 @@ class GetRawAccountState : public td::actor::Actor { stop(); } } + void hangup() override { + check(TonlibError::Cancelled()); + } }; TonlibClient::TonlibClient(td::unique_ptr callback) : callback_(std::move(callback)) { @@ -284,10 +762,12 @@ TonlibClient::TonlibClient(td::unique_ptr callback) : callback_( TonlibClient::~TonlibClient() = default; void TonlibClient::hangup() { + source_.cancel(); is_closing_ = true; ref_cnt_--; raw_client_ = {}; raw_last_block_ = {}; + raw_last_config_ = {}; try_stop(); } @@ -295,12 +775,13 @@ ExtClientRef TonlibClient::get_client_ref() { ExtClientRef ref; ref.andl_ext_client_ = raw_client_.get(); ref.last_block_actor_ = raw_last_block_.get(); + ref.last_config_actor_ = raw_last_config_.get(); return ref; } void TonlibClient::proxy_request(td::int64 query_id, std::string data) { - callback_->on_result(0, tonlib_api::make_object(query_id, data)); + on_update(tonlib_api::make_object(query_id, data)); } void TonlibClient::init_ext_client() { @@ -342,8 +823,28 @@ void TonlibClient::init_ext_client() { } void TonlibClient::update_last_block_state(LastBlockState state, td::uint32 config_generation) { - if (config_generation == config_generation_) { - last_block_storage_.save_state(blockchain_name_, state); + if (config_generation != config_generation_) { + return; + } + last_block_storage_.save_state(blockchain_name_, state); +} + +void TonlibClient::update_sync_state(LastBlockSyncState state, td::uint32 config_generation) { + if (config_generation != config_generation_) { + return; + } + switch (state.type) { + case LastBlockSyncState::Done: + on_update( + tonlib_api::make_object(tonlib_api::make_object())); + break; + case LastBlockSyncState::InProgress: + on_update( + tonlib_api::make_object(tonlib_api::make_object( + state.from_seqno, state.to_seqno, state.current_seqno))); + break; + default: + LOG(ERROR) << "Unknown LastBlockSyncState type " << state.type; } } @@ -357,6 +858,9 @@ void TonlibClient::init_last_block() { void on_state_changed(LastBlockState state) override { send_closure(client_, &TonlibClient::update_last_block_state, std::move(state), config_generation_); } + void on_sync_state_changed(LastBlockSyncState sync_state) override { + send_closure(client_, &TonlibClient::update_sync_state, std::move(sync_state), config_generation_); + } private: td::actor::ActorShared client_; @@ -379,19 +883,37 @@ void TonlibClient::init_last_block() { state = r_state.move_as_ok(); } - raw_last_block_ = - td::actor::create_actor("LastBlock", get_client_ref(), std::move(state), config_, - td::make_unique(td::actor::actor_shared(this), config_generation_)); + raw_last_block_ = td::actor::create_actor( + td::actor::ActorOptions().with_name("LastBlock").with_poll(false), get_client_ref(), std::move(state), config_, + source_.get_cancellation_token(), td::make_unique(td::actor::actor_shared(this), config_generation_)); +} +void TonlibClient::init_last_config() { + ref_cnt_++; + class Callback : public LastConfig::Callback { + public: + Callback(td::actor::ActorShared client) : client_(std::move(client)) { + } + + private: + td::actor::ActorShared client_; + }; + raw_last_config_ = + td::actor::create_actor(td::actor::ActorOptions().with_name("LastConfig").with_poll(false), + get_client_ref(), td::make_unique(td::actor::actor_shared(this))); } void TonlibClient::on_result(td::uint64 id, tonlib_api::object_ptr response) { - VLOG(tonlib_query) << "Tonlib answer query " << td::tag("id", id) << " " << to_string(response); + VLOG_IF(tonlib_query, id != 0) << "Tonlib answer query " << td::tag("id", id) << " " << to_string(response); + VLOG_IF(tonlib_query, id == 0) << "Tonlib update " << to_string(response); if (response->get_id() == tonlib_api::error::ID) { callback_->on_error(id, tonlib_api::move_object_as(response)); return; } callback_->on_result(id, std::move(response)); } +void TonlibClient::on_update(object_ptr response) { + on_result(0, std::move(response)); +} void TonlibClient::request(td::uint64 id, tonlib_api::object_ptr function) { VLOG(tonlib_query) << "Tonlib got query " << td::tag("id", id) << " " << to_string(function); @@ -415,7 +937,9 @@ void TonlibClient::request(td::uint64 id, tonlib_api::object_ptr::ReturnType; - td::Promise promise = [actor_id = actor_id(self), id](td::Result r_result) { + ref_cnt_++; + td::Promise promise = [actor_id = actor_id(self), id, + tmp = actor_shared(self)](td::Result r_result) { tonlib_api::object_ptr result; if (r_result.is_error()) { result = status_to_tonlib_api(r_result.error()); @@ -425,11 +949,7 @@ void TonlibClient::request(td::uint64 id, tonlib_api::object_ptrdo_request(request, std::move(promise)); - if (status.is_error()) { - CHECK(promise); - promise.set_error(std::move(status)); - } + this->make_request(request, std::move(promise)); }); } void TonlibClient::close() { @@ -502,19 +1022,20 @@ td::Result get_public_key(td::Slice public_key) { td::Result get_account_address(const tonlib_api::raw_initialAccountState& raw_state) { TRY_RESULT_PREFIX(code, vm::std_boc_deserialize(raw_state.code_), TonlibError::InvalidBagOfCells("raw_state.code")); TRY_RESULT_PREFIX(data, vm::std_boc_deserialize(raw_state.data_), TonlibError::InvalidBagOfCells("raw_state.data")); - return GenericAccount::get_address(0 /*zerochain*/, GenericAccount::get_init_state(std::move(code), std::move(data))); + return ton::GenericAccount::get_address(0 /*zerochain*/, + ton::GenericAccount::get_init_state(std::move(code), std::move(data))); } td::Result get_account_address(const tonlib_api::testWallet_initialAccountState& test_wallet_state) { TRY_RESULT(key_bytes, get_public_key(test_wallet_state.public_key_)); auto key = td::Ed25519::PublicKey(td::SecureString(key_bytes.key)); - return GenericAccount::get_address(0 /*zerochain*/, TestWallet::get_init_state(key)); + return ton::GenericAccount::get_address(0 /*zerochain*/, ton::TestWallet::get_init_state(key)); } td::Result get_account_address(const tonlib_api::wallet_initialAccountState& test_wallet_state) { TRY_RESULT(key_bytes, get_public_key(test_wallet_state.public_key_)); auto key = td::Ed25519::PublicKey(td::SecureString(key_bytes.key)); - return GenericAccount::get_address(0 /*zerochain*/, Wallet::get_init_state(key)); + return ton::GenericAccount::get_address(0 /*zerochain*/, ton::Wallet::get_init_state(key)); } td::Result get_account_address(td::Slice account_address) { @@ -551,7 +1072,7 @@ tonlib_api::object_ptr TonlibClient::do_static_request( tonlib_api::object_ptr TonlibClient::do_static_request( const tonlib_api::testGiver_getAccountAddress& request) { - return tonlib_api::make_object(TestGiver::address().rserialize(true)); + return tonlib_api::make_object(ton::TestGiver::address().rserialize(true)); } tonlib_api::object_ptr TonlibClient::do_static_request( @@ -639,6 +1160,7 @@ td::Status TonlibClient::set_config(object_ptr config) { ignore_cache_ = config->ignore_cache_; init_ext_client(); init_last_block(); + init_last_config(); client_.set_client(get_client_ref()); return td::Status::OK(); } @@ -647,6 +1169,7 @@ td::Status TonlibClient::do_request(const tonlib_api::close& request, td::Promise>&& promise) { CHECK(state_ != State::Closed); state_ = State::Closed; + source_.cancel(); promise.set_value(tonlib_api::make_object()); return td::Status::OK(); } @@ -661,35 +1184,6 @@ td::Status TonlibClient::do_request(tonlib_api::options_setConfig& request, return td::Status::OK(); } -tonlib_api::object_ptr empty_transaction_id() { - return tonlib_api::make_object(0, std::string(32, 0)); -} - -tonlib_api::object_ptr to_transaction_id(const block::AccountState::Info& info) { - return tonlib_api::make_object(info.last_trans_lt, - info.last_trans_hash.as_slice().str()); -} - -td::Result> to_raw_accountState(RawAccountState&& raw_state) { - std::string code; - if (raw_state.code.not_null()) { - code = vm::std_boc_serialize(vm::CellBuilder().append_cellslice(std::move(raw_state.code)).finalize()) - .move_as_ok() - .as_slice() - .str(); - } - std::string data; - if (raw_state.data.not_null()) { - data = vm::std_boc_serialize(vm::CellBuilder().append_cellslice(std::move(raw_state.data)).finalize()) - .move_as_ok() - .as_slice() - .str(); - } - return tonlib_api::make_object(raw_state.balance, std::move(code), std::move(data), - to_transaction_id(raw_state.info), raw_state.frozen_hash, - raw_state.info.gen_utime); -} - td::Result to_std_address_or_throw(td::Ref cs) { auto tag = block::gen::MsgAddressInt().get_tag(*cs); if (tag < 0) { @@ -805,9 +1299,9 @@ td::Result> to_raw_transacti TRY_RESULT_ASSIGN(fees, to_balance(trans.total_fees)); - std::ostringstream outp; - block::gen::t_Transaction.print_ref(outp, info.transaction); - LOG(INFO) << outp.str(); + //std::ostringstream outp; + //block::gen::t_Transaction.print_ref(outp, info.transaction); + //LOG(INFO) << outp.str(); auto is_just = trans.r1.in_msg->prefetch_long(1); if (is_just == trans.r1.in_msg->fetch_long_eof) { @@ -862,89 +1356,27 @@ td::Result> to_raw_transact return tonlib_api::make_object(std::move(transactions), std::move(transaction_id)); } -td::Result> to_testWallet_accountState( - RawAccountState&& raw_state) { - if (raw_state.code.is_null()) { - return TonlibError::AccountNotInited(); - } - if (raw_state.code->prefetch_ref()->get_hash() != TestWallet::get_init_code_hash()) { - return TonlibError::AccountTypeUnexpected("TestWallet"); - } - auto ref = raw_state.data->prefetch_ref(); - auto cs = vm::load_cell_slice(std::move(ref)); - auto seqno = cs.fetch_ulong(32); - if (seqno == cs.fetch_ulong_eof) { - return td::Status::Error("Failed to parse seq_no"); - } - return tonlib_api::make_object( - raw_state.balance, static_cast(seqno), to_transaction_id(raw_state.info), raw_state.info.gen_utime); -} - -td::Result> to_wallet_accountState( - RawAccountState&& raw_state) { - if (raw_state.code.is_null()) { - return TonlibError::AccountNotInited(); - } - if (raw_state.code->prefetch_ref()->get_hash() != Wallet::get_init_code_hash()) { - return TonlibError::AccountTypeUnexpected("Wallet"); - } - auto ref = raw_state.data->prefetch_ref(); - auto cs = vm::load_cell_slice(std::move(ref)); - auto seqno = cs.fetch_ulong(32); - if (seqno == cs.fetch_ulong_eof) { - return td::Status::Error("Failed to parse seq_no"); - } - return tonlib_api::make_object( - raw_state.balance, static_cast(seqno), to_transaction_id(raw_state.info), raw_state.info.gen_utime); -} - -td::Result> to_testGiver_accountState( - RawAccountState&& raw_state) { - if (raw_state.code.is_null()) { - return TonlibError::AccountNotInited(); - } - if (raw_state.code->prefetch_ref()->get_hash() != TestGiver::get_init_code_hash()) { - return TonlibError::AccountTypeUnexpected("TestGiver"); - } - auto ref = raw_state.data->prefetch_ref(); - auto cs = vm::load_cell_slice(std::move(ref)); - auto seqno = cs.fetch_ulong(32); - if (seqno == cs.fetch_ulong_eof) { - return td::Status::Error("Failed to parse seq_no"); - } - return tonlib_api::make_object( - raw_state.balance, static_cast(seqno), to_transaction_id(raw_state.info), raw_state.info.gen_utime); -} - -td::Result> to_generic_accountState( - RawAccountState&& raw_state) { - if (raw_state.code.is_null()) { - return tonlib_api::make_object( - tonlib_api::make_object(raw_state.balance, to_transaction_id(raw_state.info), - raw_state.frozen_hash, raw_state.info.gen_utime)); - } - - auto code_hash = raw_state.code->prefetch_ref()->get_hash(); - if (code_hash == TestWallet::get_init_code_hash()) { - TRY_RESULT(test_wallet, to_testWallet_accountState(std::move(raw_state))); - return tonlib_api::make_object(std::move(test_wallet)); - } - if (code_hash == Wallet::get_init_code_hash()) { - TRY_RESULT(wallet, to_wallet_accountState(std::move(raw_state))); - return tonlib_api::make_object(std::move(wallet)); - } - if (code_hash == TestGiver::get_init_code_hash()) { - TRY_RESULT(test_wallet, to_testGiver_accountState(std::move(raw_state))); - return tonlib_api::make_object(std::move(test_wallet)); - } - TRY_RESULT(raw, to_raw_accountState(std::move(raw_state))); - return tonlib_api::make_object(std::move(raw)); -} - // Raw +auto to_any_promise(td::Promise>&& promise) { + return promise.wrap([](auto x) { return tonlib_api::make_object(); }); +} +auto to_any_promise(td::Promise&& promise) { + return promise.wrap([](auto x) { return td::Unit(); }); +} + td::Status TonlibClient::do_request(const tonlib_api::raw_sendMessage& request, td::Promise>&& promise) { + TRY_RESULT_PREFIX(body, vm::std_boc_deserialize(request.body_), TonlibError::InvalidBagOfCells("body")); + std::ostringstream os; + block::gen::t_Message_Any.print_ref(os, body); + LOG(ERROR) << os.str(); + make_request(int_api::SendMessage{std::move(body)}, to_any_promise(std::move(promise))); + return td::Status::OK(); +} + +td::Status TonlibClient::do_request(const tonlib_api::raw_createAndSendMessage& request, + td::Promise>&& promise) { td::Ref init_state; if (!request.initial_account_state_.empty()) { TRY_RESULT_PREFIX(new_init_state, vm::std_boc_deserialize(request.initial_account_state_), @@ -953,12 +1385,9 @@ td::Status TonlibClient::do_request(const tonlib_api::raw_sendMessage& request, } TRY_RESULT_PREFIX(data, vm::std_boc_deserialize(request.data_), TonlibError::InvalidBagOfCells("data")); TRY_RESULT(account_address, get_account_address(request.destination_->account_address_)); - auto message = GenericAccount::create_ext_message(account_address, std::move(init_state), std::move(data)); - client_.send_query(ton::lite_api::liteServer_sendMessage(vm::std_boc_serialize(message).move_as_ok()), - [promise = std::move(promise)](auto r_info) mutable { - TRY_RESULT_PROMISE(promise, info, std::move(r_info)); - promise.set_value(tonlib_api::make_object()); - }); + auto message = ton::GenericAccount::create_ext_message(account_address, std::move(init_state), std::move(data)); + + make_request(int_api::SendMessage{std::move(message)}, to_any_promise(std::move(promise))); return td::Status::OK(); } @@ -968,13 +1397,8 @@ td::Status TonlibClient::do_request(tonlib_api::raw_getAccountState& request, return TonlibError::EmptyField("account_address"); } TRY_RESULT(account_address, get_account_address(request.account_address_->account_address_)); - auto actor_id = actor_id_++; - actors_[actor_id] = td::actor::create_actor( - "GetAccountState", client_.get_client(), std::move(account_address), actor_shared(this, actor_id), - [promise = std::move(promise)](td::Result r_state) mutable { - TRY_RESULT_PROMISE(promise, state, std::move(r_state)); - promise.set_result(to_raw_accountState(std::move(state))); - }); + make_request(int_api::GetAccountState{std::move(account_address)}, + promise.wrap([](auto&& res) { return res->to_raw_accountState(); })); return td::Status::OK(); } @@ -998,13 +1422,9 @@ td::Status TonlibClient::do_request(tonlib_api::raw_getTransactions& request, auto actor_id = actor_id_++; actors_[actor_id] = td::actor::create_actor( "GetTransactionHistory", client_.get_client(), account_address, lt, hash, actor_shared(this, actor_id), - [promise = std::move(promise)](td::Result r_info) mutable { - TRY_RESULT_PROMISE(promise, info, std::move(r_info)); - promise.set_result(to_raw_transactions(std::move(info))); - }); + promise.wrap(to_raw_transactions)); return td::Status::OK(); } - td::Result from_tonlib(tonlib_api::inputKey& input_key) { if (!input_key.key_) { return TonlibError::EmptyField("key"); @@ -1015,22 +1435,28 @@ td::Result from_tonlib(tonlib_api::inputKey& input_key) { std::move(input_key.local_password_)}; } -// TestWallet +td::Result from_tonlib(tonlib_api::InputKey& input_key) { + td::Result r_key; + tonlib_api::downcast_call(input_key, + td::overloaded([&](tonlib_api::inputKey& input_key) { r_key = from_tonlib(input_key); }, + [&](tonlib_api::inputKeyFake&) { r_key = KeyStorage::fake_input_key(); })); + return r_key; +} + +// ton::TestWallet td::Status TonlibClient::do_request(const tonlib_api::testWallet_init& request, td::Promise>&& promise) { if (!request.private_key_) { return td::Status::Error(400, "Field private_key must not be empty"); } TRY_RESULT(input_key, from_tonlib(*request.private_key_)); - auto init_state = TestWallet::get_init_state(td::Ed25519::PublicKey(input_key.key.public_key.copy())); - auto address = GenericAccount::get_address(0 /*zerochain*/, init_state); + auto init_state = ton::TestWallet::get_init_state(td::Ed25519::PublicKey(input_key.key.public_key.copy())); + auto address = ton::GenericAccount::get_address(0 /*zerochain*/, init_state); TRY_RESULT(private_key, key_storage_.load_private_key(std::move(input_key))); - auto init_message = TestWallet::get_init_message(td::Ed25519::PrivateKey(std::move(private_key.private_key))); - return do_request( - tonlib_api::raw_sendMessage(tonlib_api::make_object(address.rserialize(true)), - vm::std_boc_serialize(init_state).move_as_ok().as_slice().str(), - vm::std_boc_serialize(init_message).move_as_ok().as_slice().str()), - std::move(promise)); + auto init_message = ton::TestWallet::get_init_message(td::Ed25519::PrivateKey(std::move(private_key.private_key))); + auto message = ton::GenericAccount::create_ext_message(address, std::move(init_state), std::move(init_message)); + make_request(int_api::SendMessage{std::move(message)}, to_any_promise(std::move(promise))); + return td::Status::OK(); } td::Status TonlibClient::do_request(const tonlib_api::testWallet_sendGrams& request, @@ -1041,33 +1467,30 @@ td::Status TonlibClient::do_request(const tonlib_api::testWallet_sendGrams& requ if (!request.private_key_) { return TonlibError::EmptyField("private_key"); } - if (request.message_.size() > TestWallet::max_message_size) { + if (request.message_.size() > ton::TestWallet::max_message_size) { return TonlibError::MessageTooLong(); } TRY_RESULT(account_address, get_account_address(request.destination_->account_address_)); TRY_RESULT(input_key, from_tonlib(*request.private_key_)); - auto address = GenericAccount::get_address( - 0 /*zerochain*/, TestWallet::get_init_state(td::Ed25519::PublicKey(input_key.key.public_key.copy()))); + auto address = ton::GenericAccount::get_address( + 0 /*zerochain*/, ton::TestWallet::get_init_state(td::Ed25519::PublicKey(input_key.key.public_key.copy()))); TRY_RESULT(private_key_str, key_storage_.load_private_key(std::move(input_key))); auto private_key = td::Ed25519::PrivateKey(std::move(private_key_str.private_key)); - std::string init_state; + td::Ref init_state; if (request.seqno_ == 0) { TRY_RESULT_PREFIX(public_key, private_key.get_public_key(), TonlibError::Internal()); - init_state = vm::std_boc_serialize(TestWallet::get_init_state(public_key)).move_as_ok().as_slice().str(); + init_state = ton::TestWallet::get_init_state(public_key); } - auto message = - TestWallet::make_a_gift_message(private_key, request.seqno_, request.amount_, request.message_, account_address); + auto message = ton::TestWallet::make_a_gift_message(private_key, request.seqno_, request.amount_, request.message_, + account_address); auto message_hash = message->get_hash().as_slice().str(); - td::Promise> new_promise = - [promise = std::move(promise), - message_hash = std::move(message_hash)](td::Result> res) mutable { - TRY_RESULT_PROMISE(promise, ok, std::move(res)); - promise.set_value(tonlib_api::make_object(0, std::move(message_hash))); - }; - return do_request(tonlib_api::raw_sendMessage( - tonlib_api::make_object(address.rserialize(true)), - std::move(init_state), vm::std_boc_serialize(std::move(message)).move_as_ok().as_slice().str()), - std::move(new_promise)); + auto new_promise = promise.wrap([message_hash = std::move(message_hash)](auto&&) { + return tonlib_api::make_object(0, std::move(message_hash)); + }); + + auto ext_message = ton::GenericAccount::create_ext_message(address, std::move(init_state), std::move(message)); + make_request(int_api::SendMessage{std::move(message)}, std::move(new_promise)); + return td::Status::OK(); } td::Status TonlibClient::do_request(tonlib_api::testWallet_getAccountState& request, @@ -1076,32 +1499,27 @@ td::Status TonlibClient::do_request(tonlib_api::testWallet_getAccountState& requ return TonlibError::EmptyField("account_address"); } TRY_RESULT(account_address, get_account_address(request.account_address_->account_address_)); - auto actor_id = actor_id_++; - actors_[actor_id] = td::actor::create_actor( - "GetAccountState", client_.get_client(), std::move(account_address), actor_shared(this, actor_id), - [promise = std::move(promise)](td::Result r_state) mutable { - TRY_RESULT_PROMISE(promise, state, std::move(r_state)); - promise.set_result(to_testWallet_accountState(std::move(state))); - }); + make_request(int_api::GetAccountState{std::move(account_address)}, + promise.wrap([](auto&& res) { return res->to_testWallet_accountState(); })); return td::Status::OK(); } -// Wallet +// ton::Wallet td::Status TonlibClient::do_request(const tonlib_api::wallet_init& request, td::Promise>&& promise) { if (!request.private_key_) { return TonlibError::EmptyField("private_key"); } TRY_RESULT(input_key, from_tonlib(*request.private_key_)); - auto init_state = Wallet::get_init_state(td::Ed25519::PublicKey(input_key.key.public_key.copy())); - auto address = GenericAccount::get_address(0 /*zerochain*/, init_state); + auto init_state = ton::Wallet::get_init_state(td::Ed25519::PublicKey(input_key.key.public_key.copy())); + auto address = ton::GenericAccount::get_address(0 /*zerochain*/, init_state); TRY_RESULT(private_key, key_storage_.load_private_key(std::move(input_key))); - auto init_message = Wallet::get_init_message(td::Ed25519::PrivateKey(std::move(private_key.private_key))); - return do_request( - tonlib_api::raw_sendMessage(tonlib_api::make_object(address.rserialize(true)), - vm::std_boc_serialize(init_state).move_as_ok().as_slice().str(), - vm::std_boc_serialize(init_message).move_as_ok().as_slice().str()), - std::move(promise)); + auto init_message = ton::Wallet::get_init_message(td::Ed25519::PrivateKey(std::move(private_key.private_key))); + auto message = + ton::GenericAccount::create_ext_message(std::move(address), std::move(init_state), std::move(init_message)); + + make_request(int_api::SendMessage{std::move(message)}, to_any_promise(std::move(promise))); + return td::Status::OK(); } td::Status TonlibClient::do_request(const tonlib_api::wallet_sendGrams& request, @@ -1112,35 +1530,31 @@ td::Status TonlibClient::do_request(const tonlib_api::wallet_sendGrams& request, if (!request.private_key_) { return TonlibError::EmptyField("private_key"); } - if (request.message_.size() > Wallet::max_message_size) { + if (request.message_.size() > ton::Wallet::max_message_size) { return TonlibError::MessageTooLong(); } TRY_RESULT_PREFIX(valid_until, td::narrow_cast_safe(request.valid_until_), TonlibError::InvalidField("valid_until", "overflow")); TRY_RESULT(account_address, get_account_address(request.destination_->account_address_)); TRY_RESULT(input_key, from_tonlib(*request.private_key_)); - auto address = GenericAccount::get_address( - 0 /*zerochain*/, Wallet::get_init_state(td::Ed25519::PublicKey(input_key.key.public_key.copy()))); + auto address = ton::GenericAccount::get_address( + 0 /*zerochain*/, ton::Wallet::get_init_state(td::Ed25519::PublicKey(input_key.key.public_key.copy()))); TRY_RESULT(private_key_str, key_storage_.load_private_key(std::move(input_key))); auto private_key = td::Ed25519::PrivateKey(std::move(private_key_str.private_key)); - std::string init_state; + td::Ref init_state; if (request.seqno_ == 0) { TRY_RESULT_PREFIX(public_key, private_key.get_public_key(), TonlibError::Internal()); - init_state = vm::std_boc_serialize(Wallet::get_init_state(public_key)).move_as_ok().as_slice().str(); + init_state = ton::Wallet::get_init_state(public_key); } - auto message = Wallet::make_a_gift_message(private_key, request.seqno_, valid_until, request.amount_, - request.message_, account_address); + auto message = ton::Wallet::make_a_gift_message(private_key, request.seqno_, valid_until, request.amount_, + request.message_, account_address); auto message_hash = message->get_hash().as_slice().str(); - td::Promise> new_promise = - [promise = std::move(promise), valid_until, - message_hash = std::move(message_hash)](td::Result> res) mutable { - TRY_RESULT_PROMISE(promise, ok, std::move(res)); - promise.set_value(tonlib_api::make_object(valid_until, std::move(message_hash))); - }; - return do_request(tonlib_api::raw_sendMessage( - tonlib_api::make_object(address.rserialize(true)), - std::move(init_state), vm::std_boc_serialize(std::move(message)).move_as_ok().as_slice().str()), - std::move(new_promise)); + auto new_promise = promise.wrap([valid_until, message_hash = std::move(message_hash)](auto&&) { + return tonlib_api::make_object(valid_until, std::move(message_hash)); + }); + auto ext_message = ton::GenericAccount::create_ext_message(address, std::move(init_state), std::move(message)); + make_request(int_api::SendMessage{std::move(message)}, std::move(new_promise)); + return td::Status::OK(); } td::Status TonlibClient::do_request(tonlib_api::wallet_getAccountState& request, @@ -1149,49 +1563,37 @@ td::Status TonlibClient::do_request(tonlib_api::wallet_getAccountState& request, return TonlibError::EmptyField("account_address"); } TRY_RESULT(account_address, get_account_address(request.account_address_->account_address_)); - auto actor_id = actor_id_++; - actors_[actor_id] = td::actor::create_actor( - "GetAccountState", client_.get_client(), std::move(account_address), actor_shared(this, actor_id), - [promise = std::move(promise)](td::Result r_state) mutable { - TRY_RESULT_PROMISE(promise, state, std::move(r_state)); - promise.set_result(to_wallet_accountState(std::move(state))); - }); + make_request(int_api::GetAccountState{std::move(account_address)}, + promise.wrap([](auto&& res) { return res->to_wallet_accountState(); })); return td::Status::OK(); } -// TestGiver +// ton::TestGiver td::Status TonlibClient::do_request(const tonlib_api::testGiver_sendGrams& request, td::Promise>&& promise) { if (!request.destination_) { return TonlibError::EmptyField("destination"); } - if (request.message_.size() > TestGiver::max_message_size) { + if (request.message_.size() > ton::TestGiver::max_message_size) { return TonlibError::MessageTooLong(); } TRY_RESULT(account_address, get_account_address(request.destination_->account_address_)); - auto message = TestGiver::make_a_gift_message(request.seqno_, request.amount_, request.message_, account_address); + auto message = + ton::TestGiver::make_a_gift_message(request.seqno_, request.amount_, request.message_, account_address); auto message_hash = message->get_hash().as_slice().str(); - td::Promise> new_promise = - [promise = std::move(promise), - message_hash = std::move(message_hash)](td::Result> res) mutable { - TRY_RESULT_PROMISE(promise, ok, std::move(res)); - promise.set_value(tonlib_api::make_object(0, std::move(message_hash))); - }; - return do_request(tonlib_api::raw_sendMessage( - tonlib_api::make_object(TestGiver::address().rserialize(true)), "", - vm::std_boc_serialize(std::move(message)).move_as_ok().as_slice().str()), - std::move(new_promise)); + auto new_promise = promise.wrap([message_hash = std::move(message_hash)](auto&&) { + return tonlib_api::make_object(0, std::move(message_hash)); + }); + + auto ext_message = ton::GenericAccount::create_ext_message(ton::TestGiver::address(), {}, std::move(message)); + make_request(int_api::SendMessage{std::move(message)}, std::move(new_promise)); + return td::Status::OK(); } td::Status TonlibClient::do_request(const tonlib_api::testGiver_getAccountState& request, td::Promise>&& promise) { - auto actor_id = actor_id_++; - actors_[actor_id] = td::actor::create_actor( - "GetAccountState", client_.get_client(), TestGiver::address(), actor_shared(this, actor_id), - [promise = std::move(promise)](td::Result r_state) mutable { - TRY_RESULT_PROMISE(promise, state, std::move(r_state)); - promise.set_result(to_testGiver_accountState(std::move(state))); - }); + make_request(int_api::GetAccountState{ton::TestGiver::address()}, + promise.wrap([](auto&& res) { return res->to_testGiver_accountState(); })); return td::Status::OK(); } @@ -1201,51 +1603,29 @@ td::Status TonlibClient::do_request(const tonlib_api::generic_getAccountState& r return TonlibError::EmptyField("account_address"); } TRY_RESULT(account_address, get_account_address(request.account_address_->account_address_)); - auto actor_id = actor_id_++; - actors_[actor_id] = td::actor::create_actor( - "GetAccountState", client_.get_client(), std::move(account_address), actor_shared(this, actor_id), - [promise = std::move(promise)](td::Result r_state) mutable { - TRY_RESULT_PROMISE(promise, state, std::move(r_state)); - promise.set_result(to_generic_accountState(std::move(state))); - }); + make_request(int_api::GetAccountState{std::move(account_address)}, + promise.wrap([](auto&& res) { return res->to_generic_accountState(); })); return td::Status::OK(); } -class TonlibQueryActor : public td::actor::Actor { +class GenericCreateSendGrams : public TonlibQueryActor { public: - TonlibQueryActor(td::actor::ActorShared client) : client_(std::move(client)) { - } - template - void send_query(QueryT query, td::Promise promise) { - td::actor::send_lambda(client_, - [self = client_.get(), query = std::move(query), promise = std::move(promise)]() mutable { - auto status = self.get_actor_unsafe().do_request(query, std::move(promise)); - if (status.is_error()) { - promise.set_error(std::move(status)); - } - }); - } - - private: - td::actor::ActorShared client_; -}; - -class GenericSendGrams : public TonlibQueryActor { - public: - GenericSendGrams(td::actor::ActorShared client, tonlib_api::generic_sendGrams send_grams, - td::Promise>&& promise) + GenericCreateSendGrams(td::actor::ActorShared client, + tonlib_api::generic_createSendGramsQuery send_grams, + td::Promise>&& promise) : TonlibQueryActor(std::move(client)), send_grams_(std::move(send_grams)), promise_(std::move(promise)) { } private: - tonlib_api::generic_sendGrams send_grams_; - td::Promise> promise_; + tonlib_api::generic_createSendGramsQuery send_grams_; + td::Promise> promise_; - tonlib_api::object_ptr source_state_; - block::StdAddress source_address_; - - tonlib_api::object_ptr destination_state_; - bool is_destination_bounceable_{false}; + td::unique_ptr source_; + td::unique_ptr destination_; + bool has_private_key_{false}; + bool is_fake_key_{false}; + td::optional private_key_; + td::optional public_key_; void check(td::Status status) { if (status.is_error()) { @@ -1257,172 +1637,324 @@ class GenericSendGrams : public TonlibQueryActor { void start_up() override { check(do_start_up()); } + void hangup() override { + check(TonlibError::Cancelled()); + } td::Status do_start_up() { + if (send_grams_.timeout_ < 0 || send_grams_.timeout_ > 300) { + return TonlibError::InvalidField("timeout", "must be between 0 and 300"); + } if (!send_grams_.destination_) { return TonlibError::EmptyField("destination"); } - TRY_RESULT(destination_address, get_account_address(send_grams_.destination_->account_address_)); - is_destination_bounceable_ = destination_address.bounceable; - if (!send_grams_.source_) { - return TonlibError::EmptyField("destination"); + return TonlibError::EmptyField("source"); } + if (send_grams_.amount_ < 0) { + return TonlibError::InvalidField("amount", "can't be negative"); + } + // Use this limit as a preventive check + if (send_grams_.message_.size() > ton::Wallet::max_message_size) { + return TonlibError::MessageTooLong(); + } + TRY_RESULT(destination_address, get_account_address(send_grams_.destination_->account_address_)); TRY_RESULT(source_address, get_account_address(send_grams_.source_->account_address_)); - source_address_ = std::move(source_address); - send_query(tonlib_api::generic_getAccountState( - tonlib_api::make_object(send_grams_.source_->account_address_)), - [actor_id = actor_id(this)](auto r_res) { - send_closure(actor_id, &GenericSendGrams::on_source_state, std::move(r_res)); - }); - send_query(tonlib_api::generic_getAccountState( - tonlib_api::make_object(send_grams_.destination_->account_address_)), - [actor_id = actor_id(this)](auto r_res) { - send_closure(actor_id, &GenericSendGrams::on_destination_state, std::move(r_res)); - }); + has_private_key_ = bool(send_grams_.private_key_); + if (has_private_key_) { + TRY_RESULT(input_key, from_tonlib(*send_grams_.private_key_)); + is_fake_key_ = send_grams_.private_key_->get_id() == tonlib_api::inputKeyFake::ID; + public_key_ = td::Ed25519::PublicKey(input_key.key.public_key.copy()); + send_query(int_api::GetPrivateKey{std::move(input_key)}, [actor_id = actor_id(this)](auto r_res) { + send_closure(actor_id, &GenericCreateSendGrams::on_private_key, std::move(r_res)); + }); + } + + send_query(int_api::GetAccountState{source_address}, [actor_id = actor_id(this)](auto r_res) { + send_closure(actor_id, &GenericCreateSendGrams::on_source_state, std::move(r_res)); + }); + + send_query(int_api::GetAccountState{destination_address}, [actor_id = actor_id(this)](auto r_res) { + send_closure(actor_id, &GenericCreateSendGrams::on_destination_state, std::move(r_res)); + }); + return do_loop(); } - static tonlib_api::object_ptr clone(const tonlib_api::object_ptr& ptr) { - if (!ptr) { - return nullptr; - } - return tonlib_api::make_object(ptr->public_key_, ptr->secret_.copy()); + void on_private_key(td::Result r_key) { + check(do_on_private_key(std::move(r_key))); } - static tonlib_api::object_ptr clone(const tonlib_api::object_ptr& ptr) { - if (!ptr) { - return nullptr; - } - return tonlib_api::make_object(clone(ptr->key_), ptr->local_password_.copy()); + td::Status do_on_private_key(td::Result r_key) { + TRY_RESULT(key, std::move(r_key)); + private_key_ = td::Ed25519::PrivateKey(std::move(key.private_key)); + return do_loop(); } - void on_source_state(td::Result> r_state) { + void on_source_state(td::Result> r_state) { check(do_on_source_state(std::move(r_state))); } - td::Status do_on_source_state(td::Result> r_state) { + td::Status do_on_source_state(td::Result> r_state) { TRY_RESULT(state, std::move(r_state)); - source_state_ = std::move(state); - if (source_state_->get_id() == tonlib_api::generic_accountStateUninited::ID && send_grams_.private_key_ && - send_grams_.private_key_->key_) { - TRY_RESULT(key_bytes, get_public_key(send_grams_.private_key_->key_->public_key_)); - auto key = td::Ed25519::PublicKey(td::SecureString(key_bytes.key)); - - if (GenericAccount::get_address(0 /*zerochain*/, TestWallet::get_init_state(key)).addr == source_address_.addr) { - auto state = ton::move_tl_object_as(source_state_); - source_state_ = tonlib_api::make_object( - tonlib_api::make_object(state->account_state_->balance_, 0, nullptr, - state->account_state_->sync_utime_)); - } else if (GenericAccount::get_address(0 /*zerochain*/, Wallet::get_init_state(key)).addr == - source_address_.addr) { - auto state = ton::move_tl_object_as(source_state_); - source_state_ = tonlib_api::make_object( - tonlib_api::make_object(state->account_state_->balance_, 0, nullptr, - state->account_state_->sync_utime_)); - } + source_ = std::move(state); + if (source_->get_wallet_type() == AccountState::Empty && public_key_) { + source_->guess_type_by_public_key(public_key_.value()); } + + //TODO: pass default type through api + if (source_->get_wallet_type() == AccountState::Empty && public_key_ && is_fake_key_) { + source_->guess_type_default(public_key_.value()); + } + return do_loop(); } - void on_destination_state(td::Result> r_state) { + void on_destination_state(td::Result> r_state) { check(do_on_destination_state(std::move(r_state))); } - td::Status do_on_destination_state(td::Result> r_state) { + td::Status do_on_destination_state(td::Result> r_state) { TRY_RESULT(state, std::move(r_state)); - destination_state_ = std::move(state); - if (destination_state_->get_id() == tonlib_api::generic_accountStateUninited::ID && is_destination_bounceable_) { + destination_ = std::move(state); + if (destination_->is_frozen()) { //FIXME: after restoration of frozen accounts will be supported - if (!static_cast(*destination_state_) - .account_state_->frozen_hash_.empty()) { - return TonlibError::TransferToFrozen(); - //return TonlibError::DangerousTransaction("Transfer to frozen wallet"); - } - if (send_grams_.allow_send_to_uninited_) { - TRY_RESULT(destination_address, get_account_address(send_grams_.destination_->account_address_)); - destination_address.bounceable = false; - auto new_destination_address = destination_address.rserialize(true); - LOG(INFO) << "Change destination address from bounceable to non-bounceable " - << send_grams_.destination_->account_address_ << " -> " << new_destination_address; - send_grams_.destination_->account_address_ = std::move(new_destination_address); - } else { + return TonlibError::TransferToFrozen(); + } + if (destination_->get_wallet_type() == AccountState::Empty && destination_->get_address().bounceable) { + if (!send_grams_.allow_send_to_uninited_) { return TonlibError::DangerousTransaction("Transfer to uninited wallet"); } + destination_->make_non_bounceable(); + LOG(INFO) << "Change destination address from bounceable to non-bounceable "; } return do_loop(); } td::Status do_loop() { - if (!source_state_ || !destination_state_) { + if (!source_ || !destination_) { return td::Status::OK(); } - downcast_call( - *source_state_, - td::overloaded( - [&](tonlib_api::generic_accountStateTestGiver& test_giver_state) { - auto amount = send_grams_.amount_; - send_query(tonlib_api::testGiver_sendGrams(std::move(send_grams_.destination_), - test_giver_state.account_state_->seqno_, amount, - std::move(send_grams_.message_)), - std::move(promise_)); - stop(); - }, - [&](tonlib_api::generic_accountStateTestWallet& test_wallet_state) { - auto amount = send_grams_.amount_; - auto balance = test_wallet_state.account_state_->balance_; - if (false && amount == balance) { - amount = -1; - } else if (amount >= balance) { - promise_.set_error(TonlibError::NotEnoughFunds()); - return stop(); - } - send_query(tonlib_api::testWallet_sendGrams( - std::move(send_grams_.private_key_), std::move(send_grams_.destination_), - test_wallet_state.account_state_->seqno_, amount, std::move(send_grams_.message_)), - std::move(promise_)); - stop(); - }, - [&](tonlib_api::generic_accountStateWallet& wallet_state) { - auto amount = send_grams_.amount_; - auto balance = wallet_state.account_state_->balance_; - if (false && amount == balance) { - amount = -1; - } else if (amount >= balance) { - promise_.set_error(TonlibError::NotEnoughFunds()); - return stop(); - } - send_query( - tonlib_api::wallet_sendGrams(std::move(send_grams_.private_key_), std::move(send_grams_.destination_), - wallet_state.account_state_->seqno_, - send_grams_.timeout_ == 0 - ? 60 + wallet_state.account_state_->sync_utime_ - : send_grams_.timeout_ + wallet_state.account_state_->sync_utime_, - amount, std::move(send_grams_.message_)), - std::move(promise_)); - stop(); - }, - [&](tonlib_api::generic_accountStateUninited&) { - promise_.set_error(TonlibError::AccountNotInited()); - stop(); - }, - [&](tonlib_api::generic_accountStateRaw&) { - promise_.set_error(TonlibError::AccountTypeUnknown()); - stop(); - })); + if (has_private_key_ && !private_key_) { + return td::Status::OK(); + } + + Query::Raw raw; + + auto amount = send_grams_.amount_; + if (amount > source_->get_balance()) { + return TonlibError::NotEnoughFunds(); + } + if (amount == source_->get_balance()) { + amount = -1; + } + auto message = send_grams_.message_; + switch (source_->get_wallet_type()) { + case AccountState::Empty: + return TonlibError::AccountNotInited(); + case AccountState::Unknown: + return TonlibError::AccountTypeUnknown(); + case AccountState::Giver: { + raw.message_body = ton::TestGiver::make_a_gift_message(0, amount, message, destination_->get_address()); + break; + } + + case AccountState::SimpleWallet: { + if (!private_key_) { + return TonlibError::EmptyField("private_key"); + } + if (message.size() > ton::TestWallet::max_message_size) { + return TonlibError::MessageTooLong(); + } + TRY_RESULT(seqno, ton::TestWallet(source_->get_smc_state()).get_seqno()); + raw.message_body = ton::TestWallet::make_a_gift_message(private_key_.unwrap(), seqno, amount, message, + destination_->get_address()); + break; + } + case AccountState::Wallet: { + if (!private_key_) { + return TonlibError::EmptyField("private_key"); + } + if (message.size() > ton::Wallet::max_message_size) { + return TonlibError::MessageTooLong(); + } + TRY_RESULT(seqno, ton::Wallet(source_->get_smc_state()).get_seqno()); + auto valid_until = source_->get_sync_time(); + valid_until += send_grams_.timeout_ == 0 ? 60 : send_grams_.timeout_; + raw.valid_until = valid_until; + raw.message_body = ton::Wallet::make_a_gift_message(private_key_.unwrap(), seqno, valid_until, amount, message, + destination_->get_address()); + break; + } + } + + raw.new_state = source_->get_new_state(); + raw.message = ton::GenericAccount::create_ext_message(source_->get_address(), raw.new_state, raw.message_body); + raw.source = std::move(source_); + raw.destination = std::move(destination_); + + promise_.set_value(td::make_unique(std::move(raw))); + stop(); return td::Status::OK(); } }; +td::int64 TonlibClient::register_query(td::unique_ptr query) { + auto query_id = ++next_query_id_; + queries_[query_id] = std::move(query); + return query_id; +} + +td::Result> TonlibClient::get_query_info(td::int64 id) { + auto it = queries_.find(id); + if (it == queries_.end()) { + return TonlibError::InvalidQueryId(); + } + return tonlib_api::make_object(id, it->second->get_valid_until(), + it->second->get_body_hash().as_slice().str()); +} + +void TonlibClient::finish_create_query(td::Result> r_query, + td::Promise>&& promise) { + TRY_RESULT_PROMISE(promise, query, std::move(r_query)); + auto id = register_query(std::move(query)); + promise.set_result(get_query_info(id)); +} +void TonlibClient::finish_send_query(td::Result> r_query, + td::Promise>&& promise) { + TRY_RESULT_PROMISE(promise, query, std::move(r_query)); + auto result = tonlib_api::make_object(query->get_valid_until(), + query->get_body_hash().as_slice().str()); + auto id = register_query(std::move(query)); + make_request(tonlib_api::query_send(id), + promise.wrap([result = std::move(result)](auto&&) mutable { return std::move(result); })); +} +td::Status TonlibClient::do_request(tonlib_api::generic_createSendGramsQuery& request, + td::Promise>&& promise) { + auto id = actor_id_++; + actors_[id] = td::actor::create_actor( + "GenericSendGrams", actor_shared(this, id), std::move(request), + [promise = std::move(promise), self = actor_id(this)](td::Result> r_query) mutable { + send_closure(self, &TonlibClient::finish_create_query, std::move(r_query), std::move(promise)); + }); + return td::Status::OK(); +} + +td::Status TonlibClient::do_request(const tonlib_api::raw_createQuery& request, + td::Promise>&& promise) { + if (!request.destination_) { + return TonlibError::EmptyField("destination"); + } + TRY_RESULT(account_address, get_account_address(request.destination_->account_address_)); + + td::optional smc_state; + if (!request.init_code_.empty()) { + TRY_RESULT_PREFIX(code, vm::std_boc_deserialize(request.init_code_), TonlibError::InvalidBagOfCells("init_code")); + TRY_RESULT_PREFIX(data, vm::std_boc_deserialize(request.init_data_), TonlibError::InvalidBagOfCells("init_data")); + smc_state = ton::SmartContract::State{std::move(code), std::move(data)}; + } + TRY_RESULT_PREFIX(body, vm::std_boc_deserialize(request.body_), TonlibError::InvalidBagOfCells("body")); + + td::Promise> new_promise = + [promise = std::move(promise), self = actor_id(this)](td::Result> r_query) mutable { + send_closure(self, &TonlibClient::finish_create_query, std::move(r_query), std::move(promise)); + }; + + make_request(int_api::GetAccountState{account_address}, + new_promise.wrap([smc_state = std::move(smc_state), body = std::move(body)](auto&& source) mutable { + Query::Raw raw; + if (smc_state) { + source->set_new_state(smc_state.unwrap()); + } + raw.new_state = source->get_new_state(); + raw.message_body = std::move(body); + raw.message = + ton::GenericAccount::create_ext_message(source->get_address(), raw.new_state, raw.message_body); + raw.source = std::move(source); + raw.destination = nullptr; + return td::make_unique(std::move(raw)); + })); + return td::Status::OK(); +} + td::Status TonlibClient::do_request(tonlib_api::generic_sendGrams& request, td::Promise>&& promise) { - if (request.timeout_ < 0 || request.timeout_ > 300) { - return TonlibError::InvalidField("timeout", "must be between 0 and 300"); - } auto id = actor_id_++; - actors_[id] = td::actor::create_actor("GenericSendGrams", actor_shared(this, id), - std::move(request), std::move(promise)); + actors_[id] = td::actor::create_actor( + "GenericSendGrams", actor_shared(this, id), + tonlib_api::generic_createSendGramsQuery(std::move(request.private_key_), std::move(request.source_), + std::move(request.destination_), request.amount_, request.timeout_, + request.allow_send_to_uninited_, std::move(request.message_)), + [promise = std::move(promise), self = actor_id(this)](td::Result> r_query) mutable { + send_closure(self, &TonlibClient::finish_send_query, std::move(r_query), std::move(promise)); + }); + return td::Status::OK(); +} + +td::Status TonlibClient::do_request(const tonlib_api::query_getInfo& request, + td::Promise>&& promise) { + promise.set_result(get_query_info(request.id_)); + return td::Status::OK(); +} + +void TonlibClient::query_estimate_fees(td::int64 id, bool ignore_chksig, td::Result r_state, + td::Promise>&& promise) { + auto it = queries_.find(id); + if (it == queries_.end()) { + promise.set_error(TonlibError::InvalidQueryId()); + return; + } + TRY_RESULT_PROMISE(promise, state, std::move(r_state)); + TRY_RESULT_PROMISE_PREFIX(promise, fees, TRY_VM(it->second->estimate_fees(ignore_chksig, *state.config)), + TonlibError::Internal()); + promise.set_value( + tonlib_api::make_object(fees.first.to_tonlib_api(), fees.second.to_tonlib_api())); +} + +td::Status TonlibClient::do_request(const tonlib_api::query_estimateFees& request, + td::Promise>&& promise) { + auto it = queries_.find(request.id_); + if (it == queries_.end()) { + return TonlibError::InvalidQueryId(); + } + + client_.with_last_config([this, id = request.id_, ignore_chksig = request.ignore_chksig_, + promise = std::move(promise)](td::Result r_state) mutable { + this->query_estimate_fees(id, ignore_chksig, std::move(r_state), std::move(promise)); + }); + return td::Status::OK(); +} + +td::Status TonlibClient::do_request(const tonlib_api::query_send& request, + td::Promise>&& promise) { + auto it = queries_.find(request.id_); + if (it == queries_.end()) { + return TonlibError::InvalidQueryId(); + } + + auto message = it->second->get_message(); + if (GET_VERBOSITY_LEVEL() >= VERBOSITY_NAME(DEBUG)) { + std::ostringstream ss; + block::gen::t_Message_Any.print_ref(ss, message); + LOG(DEBUG) << ss.str(); + } + make_request(int_api::SendMessage{std::move(message)}, to_any_promise(std::move(promise))); + return td::Status::OK(); +} + +td::Status TonlibClient::do_request(tonlib_api::query_forget& request, + td::Promise>&& promise) { + auto it = queries_.find(request.id_); + if (it == queries_.end()) { + return TonlibError::InvalidQueryId(); + } + promise.set_value(tonlib_api::make_object()); + return td::Status::OK(); +} + +td::Status TonlibClient::do_request(tonlib_api::sync& request, td::Promise>&& promise) { + client_.with_last_block(to_any_promise(std::move(promise))); return td::Status::OK(); } @@ -1492,13 +2024,7 @@ td::Status TonlibClient::do_request(const tonlib_api::exportPemKey& request, if (!request.input_key_) { return TonlibError::EmptyField("input_key"); } - if (!request.input_key_->key_) { - return TonlibError::EmptyField("key"); - } - - TRY_RESULT(key_bytes, get_public_key(request.input_key_->key_->public_key_)); - KeyStorage::InputKey input_key{{td::SecureString(key_bytes.key), std::move(request.input_key_->key_->secret_)}, - std::move(request.input_key_->local_password_)}; + TRY_RESULT(input_key, from_tonlib(*request.input_key_)); TRY_RESULT(exported_pem_key, key_storage_.export_pem_key(std::move(input_key), std::move(request.key_password_))); promise.set_value(tonlib_api::make_object(std::move(exported_pem_key.pem))); return td::Status::OK(); @@ -1545,26 +2071,16 @@ td::Status TonlibClient::do_request(const tonlib_api::changeLocalPassword& reque if (!request.input_key_) { return TonlibError::EmptyField("input_key"); } - if (!request.input_key_->key_) { - return TonlibError::EmptyField("key"); - } TRY_RESULT(input_key, from_tonlib(*request.input_key_)); TRY_RESULT(key, key_storage_.change_local_password(std::move(input_key), std::move(request.new_local_password_))); - promise.set_value( - tonlib_api::make_object(request.input_key_->key_->public_key_, std::move(key.secret))); + promise.set_value(tonlib_api::make_object(key.public_key.as_slice().str(), std::move(key.secret))); return td::Status::OK(); } td::Status TonlibClient::do_request(const tonlib_api::onLiteServerQueryResult& request, td::Promise>&& promise) { send_closure(ext_client_outbound_, &ExtClientOutbound::on_query_result, request.id_, td::BufferSlice(request.bytes_), - [promise = std::move(promise)](td::Result res) mutable { - if (res.is_ok()) { - promise.set_value(tonlib_api::make_object()); - } else { - promise.set_error(res.move_as_error()); - } - }); + to_any_promise(std::move(promise))); return td::Status::OK(); } td::Status TonlibClient::do_request(const tonlib_api::onLiteServerQueryError& request, @@ -1572,13 +2088,7 @@ td::Status TonlibClient::do_request(const tonlib_api::onLiteServerQueryError& re send_closure(ext_client_outbound_, &ExtClientOutbound::on_query_result, request.id_, td::Status::Error(request.error_->code_, request.error_->message_) .move_as_error_prefix(TonlibError::LiteServerNetwork()), - [promise = std::move(promise)](td::Result res) mutable { - if (res.is_ok()) { - promise.set_value(tonlib_api::make_object()); - } else { - promise.set_error(res.move_as_error()); - } - }); + to_any_promise(std::move(promise))); return td::Status::OK(); } @@ -1661,4 +2171,131 @@ tonlib_api::object_ptr TonlibClient::do_static_request(const SimpleEncryption::kdf(request.password_, request.salt_, request.iterations_)); } +td::Status TonlibClient::do_request(int_api::GetAccountState request, + td::Promise>&& promise) { + auto actor_id = actor_id_++; + actors_[actor_id] = td::actor::create_actor( + "GetAccountState", client_.get_client(), request.address, actor_shared(this, actor_id), + promise.wrap([address = request.address](auto&& state) mutable { + return td::make_unique(std::move(address), std::move(state)); + })); + return td::Status::OK(); +} + +td::Status TonlibClient::do_request(int_api::GetPrivateKey request, td::Promise&& promise) { + TRY_RESULT(pk, key_storage_.load_private_key(std::move(request.input_key))); + promise.set_value(std::move(pk)); + return td::Status::OK(); +} + +td::Status TonlibClient::do_request(int_api::SendMessage request, td::Promise&& promise) { + client_.send_query(ton::lite_api::liteServer_sendMessage(vm::std_boc_serialize(request.message).move_as_ok()), + to_any_promise(std::move(promise))); + return td::Status::OK(); +} + +td::Status TonlibClient::do_request(const tonlib_api::liteServer_getInfo& request, + td::Promise>&& promise) { + client_.send_query(ton::lite_api::liteServer_getVersion(), promise.wrap([](auto&& version) { + return tonlib_api::make_object(version->now_, version->version_, + version->capabilities_); + })); + return td::Status::OK(); +} + +template +td::Status TonlibClient::do_request(const tonlib_api::runTests& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::raw_getAccountAddress& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::testWallet_getAccountAddress& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::wallet_getAccountAddress& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::testGiver_getAccountAddress& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::packAccountAddress& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::unpackAccountAddress& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(tonlib_api::getBip39Hints& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(tonlib_api::setLogStream& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::getLogStream& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::setLogVerbosityLevel& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::setLogTagVerbosityLevel& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::getLogVerbosityLevel& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::getLogTagVerbosityLevel& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::getLogTags& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::addLogMessage& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::encrypt& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::decrypt& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} +template +td::Status TonlibClient::do_request(const tonlib_api::kdf& request, P&&) { + UNREACHABLE(); + return TonlibError::Internal(); +} } // namespace tonlib diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.h b/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.h index e2ea77d1c6..7c22e09aa7 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.h +++ b/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.h @@ -29,9 +29,22 @@ #include "td/actor/actor.h" +#include "td/utils/CancellationToken.h" + #include namespace tonlib { +namespace int_api { +struct GetAccountState; +struct GetPrivateKey; +struct SendMessage; +inline std::string to_string(const int_api::SendMessage&) { + return "Send message"; +} +} // namespace int_api +class AccountState; +class Query; + class TonlibClient : public td::actor::Actor { public: template @@ -64,14 +77,18 @@ class TonlibClient : public td::actor::Actor { td::actor::ActorOwn raw_client_; td::actor::ActorId ext_client_outbound_; td::actor::ActorOwn raw_last_block_; + td::actor::ActorOwn raw_last_config_; ExtClient client_; + td::CancellationTokenSource source_; + std::map> actors_; td::int64 actor_id_{1}; ExtClientRef get_client_ref(); void init_ext_client(); void init_last_block(); + void init_last_config(); bool is_closing_{false}; td::uint32 ref_cnt_{1}; @@ -92,7 +109,9 @@ class TonlibClient : public td::actor::Actor { } void update_last_block_state(LastBlockState state, td::uint32 config_generation_); + void update_sync_state(LastBlockSyncState state, td::uint32 config_generation); void on_result(td::uint64 id, object_ptr response); + void on_update(object_ptr response); static bool is_static_request(td::int32 id); static bool is_uninited_request(td::int32 id); template @@ -121,9 +140,53 @@ class TonlibClient : public td::actor::Actor { static object_ptr do_static_request(const tonlib_api::decrypt& request); static object_ptr do_static_request(const tonlib_api::kdf& request); + template + td::Status do_request(const tonlib_api::runTests& request, P&&); + template + td::Status do_request(const tonlib_api::raw_getAccountAddress& request, P&&); + template + td::Status do_request(const tonlib_api::testWallet_getAccountAddress& request, P&&); + template + td::Status do_request(const tonlib_api::wallet_getAccountAddress& request, P&&); + template + td::Status do_request(const tonlib_api::testGiver_getAccountAddress& request, P&&); + template + td::Status do_request(const tonlib_api::packAccountAddress& request, P&&); + template + td::Status do_request(const tonlib_api::unpackAccountAddress& request, P&&); + template + td::Status do_request(tonlib_api::getBip39Hints& request, P&&); + + template + td::Status do_request(tonlib_api::setLogStream& request, P&&); + template + td::Status do_request(const tonlib_api::getLogStream& request, P&&); + template + td::Status do_request(const tonlib_api::setLogVerbosityLevel& request, P&&); + template + td::Status do_request(const tonlib_api::setLogTagVerbosityLevel& request, P&&); + template + td::Status do_request(const tonlib_api::getLogVerbosityLevel& request, P&&); + template + td::Status do_request(const tonlib_api::getLogTagVerbosityLevel& request, P&&); + template + td::Status do_request(const tonlib_api::getLogTags& request, P&&); + template + td::Status do_request(const tonlib_api::addLogMessage& request, P&&); + + template + td::Status do_request(const tonlib_api::encrypt& request, P&&); + template + td::Status do_request(const tonlib_api::decrypt& request, P&&); + template + td::Status do_request(const tonlib_api::kdf& request, P&&); + template - td::Status do_request(const T& request, P&& promise) { - return td::Status::Error(400, "Function is unsupported"); + void make_request(T&& request, P&& promise) { + auto status = do_request(std::forward(request), std::move(promise)); + if (status.is_error()) { + promise.operator()(std::move(status)); + } } td::Status set_config(object_ptr config); @@ -132,6 +195,11 @@ class TonlibClient : public td::actor::Actor { td::Status do_request(tonlib_api::options_setConfig& request, td::Promise>&& promise); td::Status do_request(const tonlib_api::raw_sendMessage& request, td::Promise>&& promise); + td::Status do_request(const tonlib_api::raw_createAndSendMessage& request, + td::Promise>&& promise); + td::Status do_request(const tonlib_api::raw_createQuery& request, + td::Promise>&& promise); + td::Status do_request(tonlib_api::raw_getAccountState& request, td::Promise>&& promise); td::Status do_request(tonlib_api::raw_getTransactions& request, @@ -159,6 +227,8 @@ class TonlibClient : public td::actor::Actor { td::Status do_request(tonlib_api::generic_sendGrams& request, td::Promise>&& promise); + td::Status do_request(tonlib_api::sync& request, td::Promise>&& promise); + td::Status do_request(const tonlib_api::createNewKey& request, td::Promise>&& promise); td::Status do_request(const tonlib_api::exportKey& request, td::Promise>&& promise); @@ -183,6 +253,34 @@ class TonlibClient : public td::actor::Actor { td::Status do_request(const tonlib_api::onLiteServerQueryError& request, td::Promise>&& promise); + td::int64 next_query_id_{0}; + std::map> queries_; + td::int64 register_query(td::unique_ptr query); + td::Result> get_query_info(td::int64 id); + void finish_create_query(td::Result> r_query, + td::Promise>&& promise); + void finish_send_query(td::Result> r_query, + td::Promise>&& promise); + void query_estimate_fees(td::int64 id, bool ignore_chksig, td::Result r_state, + td::Promise>&& promise); + + td::Status do_request(const tonlib_api::query_getInfo& request, + td::Promise>&& promise); + td::Status do_request(const tonlib_api::query_estimateFees& request, + td::Promise>&& promise); + td::Status do_request(const tonlib_api::query_send& request, td::Promise>&& promise); + td::Status do_request(tonlib_api::query_forget& request, td::Promise>&& promise); + + td::Status do_request(tonlib_api::generic_createSendGramsQuery& request, + td::Promise>&& promise); + + td::Status do_request(int_api::GetAccountState request, td::Promise>&&); + td::Status do_request(int_api::GetPrivateKey request, td::Promise&&); + td::Status do_request(int_api::SendMessage request, td::Promise&& promise); + + td::Status do_request(const tonlib_api::liteServer_getInfo& request, + td::Promise>&& promise); + void proxy_request(td::int64 query_id, std::string data); friend class TonlibQueryActor; diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/TonlibError.h b/submodules/ton/tonlib-src/tonlib/tonlib/TonlibError.h index b521c13689..01447cb1b7 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/TonlibError.h +++ b/submodules/ton/tonlib-src/tonlib/tonlib/TonlibError.h @@ -27,6 +27,7 @@ // INVALID_MNEMONIC // INVALID_BAG_OF_CELLS // INVALID_PUBLIC_KEY +// INVALID_QUERY_ID // INVALID_ACCOUNT_ADDRESS // INVALID_CONFIG // INVALID_PEM_KEY @@ -65,6 +66,9 @@ struct TonlibError { static td::Status InvalidAccountAddress() { return td::Status::Error(400, "INVALID_ACCOUNT_ADDRESS"); } + static td::Status InvalidQueryId() { + return td::Status::Error(400, "INVALID_QUERY_ID"); + } static td::Status InvalidConfig(td::Slice reason) { return td::Status::Error(400, PSLICE() << "INVALID_CONFIG: " << reason); } @@ -110,6 +114,9 @@ struct TonlibError { static td::Status ValidateTransactions() { return td::Status::Error(500, "VALIDATE_TRANSACTION"); } + static td::Status ValidateConfig() { + return td::Status::Error(500, "VALIDATE_CONFIG"); + } static td::Status ValidateZeroState(td::Slice message) { return td::Status::Error(500, PSLICE() << "VALIDATE_ZERO_STATE: " << message); } diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/tonlib-cli.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/tonlib-cli.cpp index f681474e76..f9bcae9447 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/tonlib-cli.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/tonlib-cli.cpp @@ -20,6 +20,57 @@ #include #include +// Consider this as a TODO list: +// +// (from lite-client) +// SUPPORTED +// "time\tGet server time\n" +// "remote-version\tShows server time, version and capabilities\n" +// "help []\tThis help\n" // TODO: support [] +// "quit\tExit\n"; +// "sendfile \tLoad a serialized message from and send it to server\n" +// +// "saveaccount[code|data] []\tSaves into specified file the most recent state " +// "runmethod ...\tRuns GET method of account " +// "with specified parameters\n" +// +// WONTSUPPORT +// +// UNSUPPORTED +//"last\tGet last block and state info from server\n" +//"status\tShow connection and local database status\n" +//"getaccount []\tLoads the most recent state of specified account; is in " +//"[:] format\n" +//"(StateInit) or just the code or data of specified account; is in " +//"[:] format\n" +//"allshards []\tShows shard configuration from the most recent masterchain " +//"state or from masterchain state corresponding to \n" +//"getconfig [...]\tShows specified or all configuration parameters from the latest masterchain state\n" +//"getconfigfrom [...]\tShows specified or all configuration parameters from the " +//"masterchain state of \n" +//"saveconfig []\tSaves all configuration parameters into specified file\n" +//"gethead \tShows block header for \n" +//"getblock \tDownloads block\n" +//"dumpblock \tDownloads and dumps specified block\n" +//"getstate \tDownloads state corresponding to specified block\n" +//"dumpstate \tDownloads and dumps state corresponding to specified block\n" +//"dumptrans \tDumps one transaction of specified account\n" +//"lasttrans[dump] []\tShows or dumps specified transaction and " +//"several preceding " +//"ones\n" +//"listblocktrans[rev] [ ]\tLists block transactions, " +//"starting immediately after or before the specified one\n" +//"blkproofchain[step] []\tDownloads and checks proof of validity of the /"second " +//"indicated block (or the last known masterchain block) starting from given block\n" +//"byseqno \tLooks up a block by workchain, shard and seqno, and shows its " +//"header\n" +//"bylt \tLooks up a block by workchain, shard and logical time, and shows its " +//"header\n" +//"byutime \tLooks up a block by workchain, shard and creation time, and " +//"shows its header\n" +//"known\tShows the list of all known block ids\n" +//"privkey \tLoads a private key from file\n" + class TonlibCli : public td::actor::Actor { public: struct Options { @@ -94,7 +145,7 @@ class TonlibCli : public td::actor::Actor { td::actor::ActorShared id_; }; ref_cnt_++; - client_ = td::actor::create_actor("Tonlib", td::make_unique(actor_shared(this))); + client_ = td::actor::create_actor("Tonlib", td::make_unique(actor_shared(this, 1))); td::mkdir(options_.key_dir).ignore(); @@ -144,6 +195,9 @@ class TonlibCli : public td::actor::Actor { void hangup_shared() override { CHECK(ref_cnt_ > 0); ref_cnt_--; + if (get_link_token() == 1) { + io_.reset(); + } try_stop(); } void try_stop() { @@ -198,8 +252,23 @@ class TonlibCli : public td::actor::Actor { } return true; }; + + td::Promise cmd_promise = [line = line.clone()](td::Result res) { + if (res.is_ok()) { + // on_ok + } else { + td::TerminalIO::out() << "Query {" << line.as_slice() << "} FAILED: \n\t" << res.error() << "\n"; + } + }; + if (cmd == "help") { - td::TerminalIO::out() << "help - show this help\n"; + td::TerminalIO::out() << "help\tThis help\n"; + td::TerminalIO::out() << "time\tGet server time\n"; + td::TerminalIO::out() << "remote-version\tShows server time, version and capabilities\n"; + td::TerminalIO::out() << "sendfile \tLoad a serialized message from and send it to server\n"; + td::TerminalIO::out() << "exit\tExit\n"; + td::TerminalIO::out() << "quit\tExit\n"; + td::TerminalIO::out() << "genkey - generate new secret key\n"; td::TerminalIO::out() << "keys - show all stored keys\n"; td::TerminalIO::out() << "unpackaddress
- validate and parse address\n"; @@ -207,6 +276,7 @@ class TonlibCli : public td::actor::Actor { td::TerminalIO::out() << "importkey - import key\n"; td::TerminalIO::out() << "deletekeys - delete ALL PRIVATE KEYS\n"; td::TerminalIO::out() << "exportkey [] - export key\n"; + td::TerminalIO::out() << "exportkeypem [] - export key\n"; td::TerminalIO::out() << "setconfig [] [] [] - set lite server config\n"; td::TerminalIO::out() << "getstate - get state of simple wallet with requested key\n"; td::TerminalIO::out() @@ -216,12 +286,10 @@ class TonlibCli : public td::actor::Actor { " to .\n" << "\t could also be 'giver'\n" << "\t could also be 'giver' or smartcontract address\n"; - td::TerminalIO::out() << "exit - exit from this programm\n"; } else if (cmd == "genkey") { generate_key(); - } else if (cmd == "exit") { + } else if (cmd == "exit" || cmd == "quit") { is_closing_ = true; - io_.reset(); client_.reset(); ref_cnt_--; try_stop(); @@ -231,8 +299,8 @@ class TonlibCli : public td::actor::Actor { //delete_key(parser.read_word()); } else if (cmd == "deletekeys") { delete_all_keys(); - } else if (cmd == "exportkey") { - export_key(parser.read_word()); + } else if (cmd == "exportkey" || cmd == "exportkeypem") { + export_key(cmd.str(), parser.read_word()); } else if (cmd == "importkey") { import_key(parser.read_all()); } else if (cmd == "setconfig") { @@ -263,7 +331,53 @@ class TonlibCli : public td::actor::Actor { set_bounceable(addr, to_bool(bounceable, true)); } else if (cmd == "netstats") { dump_netstats(); + // reviewed from here + } else if (cmd == "sync") { + sync(std::move(cmd_promise)); + } else if (cmd == "time") { + remote_time(std::move(cmd_promise)); + } else if (cmd == "remote-version") { + remote_version(std::move(cmd_promise)); + } else if (cmd == "sendfile") { + send_file(parser.read_word(), std::move(cmd_promise)); + } else { + cmd_promise.set_error(td::Status::Error(PSLICE() << "Unkwnown query `" << cmd << "`")); } + if (cmd_promise) { + cmd_promise.set_value(td::Unit()); + } + } + + void remote_time(td::Promise promise) { + send_query(tonlib_api::make_object(), promise.wrap([](auto&& info) { + td::TerminalIO::out() << "Lite server time is: " << info->now_ << "\n"; + return td::Unit(); + })); + } + + void remote_version(td::Promise promise) { + send_query(tonlib_api::make_object(), promise.wrap([](auto&& info) { + td::TerminalIO::out() << "Lite server time is: " << info->now_ << "\n"; + td::TerminalIO::out() << "Lite server version is: " << info->version_ << "\n"; + td::TerminalIO::out() << "Lite server capabilities are: " << info->capabilities_ << "\n"; + return td::Unit(); + })); + } + + void send_file(td::Slice name, td::Promise promise) { + TRY_RESULT_PROMISE(promise, data, td::read_file_str(name.str())); + send_query(tonlib_api::make_object(std::move(data)), promise.wrap([](auto&& info) { + td::TerminalIO::out() << "Query was sent\n"; + return td::Unit(); + })); + } + + void sync(td::Promise promise) { + using tonlib_api::make_object; + send_query(make_object(), promise.wrap([](auto&&) { + td::TerminalIO::out() << "synchronized\n"; + return td::Unit(); + })); } void dump_netstats() { @@ -285,15 +399,41 @@ class TonlibCli : public td::actor::Actor { void on_tonlib_result(std::uint64_t id, tonlib_api::object_ptr result) { if (id == 0) { - if (result->get_id() == tonlib_api::updateSendLiteServerQuery::ID) { - auto update = tonlib_api::move_object_as(std::move(result)); - CHECK(!raw_client_.empty()); - snd_bytes_ += update->data_.size(); - send_closure(raw_client_, &ton::adnl::AdnlExtClient::send_query, "query", td::BufferSlice(update->data_), - td::Timestamp::in(5), - [actor_id = actor_id(this), id = update->id_](td::Result res) { - send_closure(actor_id, &TonlibCli::on_adnl_result, id, std::move(res)); - }); + switch (result->get_id()) { + case tonlib_api::updateSendLiteServerQuery::ID: { + auto update = tonlib_api::move_object_as(std::move(result)); + CHECK(!raw_client_.empty()); + snd_bytes_ += update->data_.size(); + send_closure(raw_client_, &ton::adnl::AdnlExtClient::send_query, "query", td::BufferSlice(update->data_), + td::Timestamp::in(5), + [actor_id = actor_id(this), id = update->id_](td::Result res) { + send_closure(actor_id, &TonlibCli::on_adnl_result, id, std::move(res)); + }); + return; + } + case tonlib_api::updateSyncState::ID: { + auto update = tonlib_api::move_object_as(std::move(result)); + switch (update->sync_state_->get_id()) { + case tonlib_api::syncStateDone::ID: { + td::TerminalIO::out() << "synchronization: DONE\n"; + break; + } + case tonlib_api::syncStateInProgress::ID: { + auto progress = tonlib_api::move_object_as(update->sync_state_); + auto from = progress->from_seqno_; + auto to = progress->to_seqno_; + auto at = progress->current_seqno_; + auto d = to - from; + if (d <= 0) { + td::TerminalIO::out() << "synchronization: ???\n"; + } else { + td::TerminalIO::out() << "synchronization: " << 100 * (at - from) / d << "%\n"; + } + break; + } + } + return; + } } } auto it = query_handlers_.find(id); @@ -394,7 +534,7 @@ class TonlibCli : public td::actor::Actor { info.public_key = key->public_key_; info.secret = std::move(key->secret_); keys_.push_back(std::move(info)); - export_key(key->public_key_, keys_.size() - 1, std::move(password)); + export_key("exportkey", key->public_key_, keys_.size() - 1, std::move(password)); store_keys(); }); } @@ -583,11 +723,11 @@ class TonlibCli : public td::actor::Actor { td::TerminalIO::out() << "Ok\n"; }); } - void export_key(td::Slice key) { + void export_key(std::string cmd, td::Slice key) { if (key.empty()) { dump_keys(); td::TerminalIO::out() << "Choose public key (hex prefix or #N)"; - cont_ = [this](td::Slice key) { this->export_key(key); }; + cont_ = [this, cmd](td::Slice key) { this->export_key(cmd, key); }; return; } auto r_key_i = to_key_i(key); @@ -601,24 +741,40 @@ class TonlibCli : public td::actor::Actor { << "public key: " << td::buffer_to_hex(keys_[key_i].public_key) << "\n"; td::TerminalIO::out() << "Enter password (could be empty)"; - cont_ = [this, key = key.str(), key_i](td::Slice password) { this->export_key(key, key_i, password); }; + cont_ = [this, cmd, key = key.str(), key_i](td::Slice password) { this->export_key(cmd, key, key_i, password); }; } - void export_key(std::string key, size_t key_i, td::Slice password) { + void export_key(std::string cmd, std::string key, size_t key_i, td::Slice password) { using tonlib_api::make_object; - send_query(make_object(make_object( - make_object(keys_[key_i].public_key, keys_[key_i].secret.copy()), - td::SecureString(password))), - [this, key = std::move(key), key_i](auto r_res) { - if (r_res.is_error()) { - td::TerminalIO::out() << "Can't export key id: [" << key << "] " << r_res.error() << "\n"; - return; - } - dump_key(key_i); - for (auto& word : r_res.ok()->word_list_) { - td::TerminalIO::out() << " " << word.as_slice() << "\n"; - } - }); + if (cmd == "exportkey") { + send_query(make_object(make_object( + make_object(keys_[key_i].public_key, keys_[key_i].secret.copy()), + td::SecureString(password))), + [this, key = std::move(key), key_i](auto r_res) { + if (r_res.is_error()) { + td::TerminalIO::out() << "Can't export key id: [" << key << "] " << r_res.error() << "\n"; + return; + } + dump_key(key_i); + for (auto& word : r_res.ok()->word_list_) { + td::TerminalIO::out() << " " << word.as_slice() << "\n"; + } + }); + } else { + send_query(make_object( + make_object( + make_object(keys_[key_i].public_key, keys_[key_i].secret.copy()), + td::SecureString(password)), + td::SecureString("cucumber")), + [this, key = std::move(key), key_i](auto r_res) { + if (r_res.is_error()) { + td::TerminalIO::out() << "Can't export key id: [" << key << "] " << r_res.error() << "\n"; + return; + } + dump_key(key_i); + td::TerminalIO::out() << "\n" << r_res.ok()->pem_.as_slice() << "\n"; + }); + } } void import_key(td::Slice slice, std::vector words = {}) { @@ -656,7 +812,7 @@ class TonlibCli : public td::actor::Actor { info.public_key = key->public_key_; info.secret = std::move(key->secret_); keys_.push_back(std::move(info)); - export_key(key->public_key_, keys_.size() - 1, std::move(password)); + export_key("exportkey", key->public_key_, keys_.size() - 1, std::move(password)); store_keys(); }); } @@ -820,18 +976,39 @@ class TonlibCli : public td::actor::Actor { ? make_object( make_object(from.public_key, from.secret.copy()), td::SecureString(password)) : nullptr; - send_query( - make_object(std::move(key), std::move(from.address), std::move(to.address), - grams, 60, allow_send_to_uninited, std::move(msg)), - [this](auto r_res) { - if (r_res.is_error()) { - td::TerminalIO::out() << "Can't transfer: " << r_res.error() << "\n"; - on_error(); - return; - } - td::TerminalIO::out() << to_string(r_res.ok()); - on_ok(); - }); + send_query(make_object(std::move(key), std::move(from.address), + std::move(to.address), grams, 60, + allow_send_to_uninited, std::move(msg)), + [self = this](auto r_res) { + if (r_res.is_error()) { + td::TerminalIO::out() << "Can't transfer: " << r_res.error() << "\n"; + self->on_error(); + return; + } + td::TerminalIO::out() << to_string(r_res.ok()); + self->send_query(make_object(r_res.ok()->id_, false), + [self](auto r_res) { + if (r_res.is_error()) { + td::TerminalIO::out() << "Can't transfer: " << r_res.error() << "\n"; + self->on_error(); + return; + } + td::TerminalIO::out() << to_string(r_res.ok()); + self->on_ok(); + }); + + self->send_query(make_object(r_res.ok()->id_), [self](auto r_res) { + if (r_res.is_error()) { + td::TerminalIO::out() << "Can't transfer: " << r_res.error() << "\n"; + self->on_error(); + return; + } + td::TerminalIO::out() << to_string(r_res.ok()); + self->on_ok(); + }); + + self->on_ok(); + }); } void init_simple_wallet(td::Slice key) { diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/utils.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/utils.cpp index 5cef21f56d..fec9144311 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/utils.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/utils.cpp @@ -20,20 +20,9 @@ #include "td/utils/misc.h" #include "vm/cellslice.h" namespace tonlib { -int VERBOSITY_NAME(tonlib_query) = VERBOSITY_NAME(INFO); -int VERBOSITY_NAME(last_block) = VERBOSITY_NAME(INFO); -int VERBOSITY_NAME(lite_server) = VERBOSITY_NAME(INFO); +int VERBOSITY_NAME(tonlib_query) = VERBOSITY_NAME(DEBUG); +int VERBOSITY_NAME(last_block) = VERBOSITY_NAME(DEBUG); +int VERBOSITY_NAME(last_config) = VERBOSITY_NAME(DEBUG); +int VERBOSITY_NAME(lite_server) = VERBOSITY_NAME(DEBUG); -td::Result> binary_bitstring_to_cellslice(td::Slice literal) { - unsigned char buff[128]; - if (!begins_with(literal, "b{") || !ends_with(literal, "}")) { - return td::Status::Error("Invalid binary bitstring constant"); - } - int bits = - (int)td::bitstring::parse_bitstring_binary_literal(buff, sizeof(buff), literal.begin() + 2, literal.end() - 1); - if (bits < 0) { - return td::Status::Error("Invalid binary bitstring constant"); - } - return td::Ref{true, vm::CellBuilder().store_bits(td::ConstBitPtr{buff}, bits).finalize()}; -} } // namespace tonlib diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/utils.h b/submodules/ton/tonlib-src/tonlib/tonlib/utils.h index 840bc10d20..8bcf9ab9b8 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/utils.h +++ b/submodules/ton/tonlib-src/tonlib/tonlib/utils.h @@ -23,19 +23,8 @@ #include "block/block-parse.h" namespace tonlib { -template -auto try_f(F&& f) noexcept -> decltype(f()) { - try { - return f(); - } catch (vm::VmError error) { - return td::Status::Error(PSLICE() << "Got a vm exception: " << error.get_msg()); - } -} - -#define TRY_VM(f) try_f([&] { return f; }) - extern int VERBOSITY_NAME(tonlib_query); extern int VERBOSITY_NAME(last_block); +extern int VERBOSITY_NAME(last_config); extern int VERBOSITY_NAME(lite_server); -td::Result> binary_bitstring_to_cellslice(td::Slice literal); } // namespace tonlib From cdb9c21de06d3398874351b5ffc492ad8cd8ffc6 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Sat, 19 Oct 2019 20:50:28 +0400 Subject: [PATCH 3/3] Fix fees text --- submodules/Display/Display/TextAlertController.swift | 3 ++- submodules/WalletUI/Sources/WalletSendScreen.swift | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/submodules/Display/Display/TextAlertController.swift b/submodules/Display/Display/TextAlertController.swift index 2f88965a46..6590697d5c 100644 --- a/submodules/Display/Display/TextAlertController.swift +++ b/submodules/Display/Display/TextAlertController.swift @@ -171,6 +171,7 @@ public final class TextAlertContentNode: AlertContentNode { self.textNode.isLayerBacked = false self.textNode.isAccessibilityElement = true self.textNode.accessibilityLabel = text.string + self.textNode.insets = UIEdgeInsets(top: 1.0, left: 1.0, bottom: 1.0, right: 1.0) if text.length != 0 { if let paragraphStyle = text.attribute(.paragraphStyle, at: 0, effectiveRange: nil) as? NSParagraphStyle { self.textNode.textAlignment = paragraphStyle.alignment @@ -292,7 +293,7 @@ public final class TextAlertContentNode: AlertContentNode { transition.updateFrame(node: titleNode, frame: titleFrame) let textFrame = CGRect(origin: CGPoint(x: insets.left + floor((contentWidth - textSize.width) / 2.0), y: titleFrame.maxY + spacing), size: textSize) - transition.updateFrame(node: self.textNode, frame: textFrame) + transition.updateFrame(node: self.textNode, frame: textFrame.offsetBy(dx: -1.0, dy: -1.0)) resultSize = CGSize(width: contentWidth + insets.left + insets.right, height: titleSize.height + spacing + textSize.height + actionsHeight + insets.top + insets.bottom) } else { diff --git a/submodules/WalletUI/Sources/WalletSendScreen.swift b/submodules/WalletUI/Sources/WalletSendScreen.swift index 66cb9f9abe..7282fb1cc8 100644 --- a/submodules/WalletUI/Sources/WalletSendScreen.swift +++ b/submodules/WalletUI/Sources/WalletSendScreen.swift @@ -370,11 +370,15 @@ public func walletSendScreen(context: WalletContext, randomId: Int64, walletInfo let feeAmount = fees.inFwdFee + fees.storageFee + fees.gasFee + fees.fwdFee - let text = presentationData.strings.Wallet_Send_ConfirmationText(formatBalanceText(amount, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator), formattedAddress, "\(formatBalanceText(feeAmount, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator))").0 + let (text, ranges) = presentationData.strings.Wallet_Send_ConfirmationText(formatBalanceText(amount, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator), formattedAddress, "\(formatBalanceText(feeAmount, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator))") let bodyAttributes = MarkdownAttributeSet(font: Font.regular(13.0), textColor: presentationData.theme.list.itemPrimaryTextColor) let boldAttributes = MarkdownAttributeSet(font: Font.semibold(13.0), textColor: presentationData.theme.list.itemPrimaryTextColor) let attributedText = NSMutableAttributedString(attributedString: parseMarkdownIntoAttributedString(text, attributes: MarkdownAttributes(body: bodyAttributes, bold: boldAttributes, link: bodyAttributes, linkAttribute: { _ in return nil }), textAlignment: .center)) - attributedText.addAttribute(.font, value: Font.monospace(14.0), range: NSMakeRange(attributedText.string.count - formattedAddress.count - 1, formattedAddress.count)) + for (index, range) in ranges { + if index == 1 { + attributedText.addAttribute(.font, value: Font.monospace(14.0), range: range) + } + } var dismissAlertImpl: ((Bool) -> Void)? let theme = context.presentationData.theme