diff --git a/.buckconfig b/.buckconfig index 4a7428e624..45e72bada4 100644 --- a/.buckconfig +++ b/.buckconfig @@ -15,8 +15,8 @@ use_swift_delegate = false use_header_maps_in_xcode = false generate_missing_umbrella_headers = true - iphonesimulator_target_sdk_version = 8.0 - iphoneos_target_sdk_version = 8.0 + iphonesimulator_target_sdk_version = 9.0 + iphoneos_target_sdk_version = 9.0 provisioning_profile_read_command = security cms -Di xctool_default_destination_specifier = platform=iOS Simulator,OS=latest xctool_path = tools/xctool/bin/xctool diff --git a/Config/configs.bzl b/Config/configs.bzl index 5ef6de43d9..a9e3f90884 100644 --- a/Config/configs.bzl +++ b/Config/configs.bzl @@ -26,7 +26,7 @@ def pretty(dict, current = ""): return current SHARED_CONFIGS = { - "IPHONEOS_DEPLOYMENT_TARGET": "8.0", + "IPHONEOS_DEPLOYMENT_TARGET": "9.0", "SDKROOT": "iphoneos", "GCC_OPTIMIZATION_LEVEL": "0", "SWIFT_WHOLE_MODULE_OPTIMIZATION": "NO", diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 5cd32281af..a8fcd7afa4 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4752,3 +4752,5 @@ Any member of this group will be able to see messages in the channel."; "Channel.EditAdmin.PermissionDeleteMessagesOfOthers" = "Delete Messages of Others"; "Channel.AdminLog.CanDeleteMessagesOfOthers" = "Delete Messages of Others"; + +"Settings.Wallet" = "Wallet"; diff --git a/Telegram_Buck.xcworkspace/buck-project.meta.json b/Telegram_Buck.xcworkspace/buck-project.meta.json index a7d9390b8d..573f189fa5 100644 --- a/Telegram_Buck.xcworkspace/buck-project.meta.json +++ b/Telegram_Buck.xcworkspace/buck-project.meta.json @@ -1 +1 @@ -{"required-targets":["//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_ac3_parser.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_adts_parser.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_avcodec.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_avdct.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_avfft.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_d3d11va.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_dirac.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_dv_profile.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_dxva2.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_jni.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_mediacodec.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_qsv.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_vaapi.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_vdpau.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_version.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_videotoolbox.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_vorbis_parser.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_xvmc.h","//submodules/FFMpeg:ffmpeg_header_libavformat_sub_avformat.h","//submodules/FFMpeg:ffmpeg_header_libavformat_sub_avio.h","//submodules/FFMpeg:ffmpeg_header_libavformat_sub_version.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_adler32.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_aes.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_aes_ctr.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_attributes.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_audio_fifo.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_avassert.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_avconfig.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_avstring.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_avutil.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_base64.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_blowfish.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_bprint.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_bswap.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_buffer.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_camellia.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_cast5.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_channel_layout.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_common.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_cpu.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_crc.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_des.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_dict.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_display.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_downmix_info.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_encryption_info.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_error.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_eval.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_ffversion.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_fifo.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_file.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_frame.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hash.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hmac.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_cuda.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_d3d11va.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_drm.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_dxva2.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_mediacodec.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_qsv.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_vaapi.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_vdpau.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_videotoolbox.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_imgutils.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_intfloat.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_intreadwrite.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_lfg.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_log.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_lzo.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_macros.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_mastering_display_metadata.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_mathematics.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_md5.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_mem.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_motion_vector.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_murmur3.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_opt.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_parseutils.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_pixdesc.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_pixelutils.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_pixfmt.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_random_seed.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_rational.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_rc4.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_replaygain.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_ripemd.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_samplefmt.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_sha.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_sha512.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_spherical.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_stereo3d.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_tea.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_threadmessage.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_time.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_timecode.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_timestamp.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_tree.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_twofish.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_version.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_xtea.h","//submodules/FFMpeg:ffmpeg_header_libswresample_sub_swresample.h","//submodules/FFMpeg:ffmpeg_header_libswresample_sub_version.h","//submodules/FFMpeg:libffmpeg_build","//submodules/MtProtoKit:openssl_libs","//submodules/Opus:opus_lib_file","//submodules/WebP:WebP_lib_file"],"xcconfig-paths":["buck-out/gen/AppLibrary-Debug.xcconfig","buck-out/gen/AppLibrary-Profile.xcconfig","buck-out/gen/AppLibrary-Release.xcconfig","buck-out/gen/IntentsExtension#iphonesimulator-x86_64-Debug.xcconfig","buck-out/gen/IntentsExtension#iphonesimulator-x86_64-Profile.xcconfig","buck-out/gen/IntentsExtension#iphonesimulator-x86_64-Release.xcconfig","buck-out/gen/NotificationContentExtension#iphonesimulator-x86_64-Debug.xcconfig","buck-out/gen/NotificationContentExtension#iphonesimulator-x86_64-Profile.xcconfig","buck-out/gen/NotificationContentExtension#iphonesimulator-x86_64-Release.xcconfig","buck-out/gen/NotificationServiceExtension#iphonesimulator-x86_64-Debug.xcconfig","buck-out/gen/NotificationServiceExtension#iphonesimulator-x86_64-Profile.xcconfig","buck-out/gen/NotificationServiceExtension#iphonesimulator-x86_64-Release.xcconfig","buck-out/gen/ShareExtension#iphonesimulator-x86_64-Debug.xcconfig","buck-out/gen/ShareExtension#iphonesimulator-x86_64-Profile.xcconfig","buck-out/gen/ShareExtension#iphonesimulator-x86_64-Release.xcconfig","buck-out/gen/Telegram-Debug.xcconfig","buck-out/gen/Telegram-Profile.xcconfig","buck-out/gen/Telegram-Release.xcconfig","buck-out/gen/WatchApp#watchsimulator-i386-Debug.xcconfig","buck-out/gen/WatchApp#watchsimulator-i386-Profile.xcconfig","buck-out/gen/WatchApp#watchsimulator-i386-Release.xcconfig","buck-out/gen/WatchAppExtension#watchsimulator-i386-Debug.xcconfig","buck-out/gen/WatchAppExtension#watchsimulator-i386-Profile.xcconfig","buck-out/gen/WatchAppExtension#watchsimulator-i386-Release.xcconfig","buck-out/gen/WidgetExtension#iphonesimulator-x86_64-Debug.xcconfig","buck-out/gen/WidgetExtension#iphonesimulator-x86_64-Profile.xcconfig","buck-out/gen/WidgetExtension#iphonesimulator-x86_64-Release.xcconfig","buck-out/gen/submodules/AccountContext/AccountContext-Debug.xcconfig","buck-out/gen/submodules/AccountContext/AccountContext-Profile.xcconfig","buck-out/gen/submodules/AccountContext/AccountContext-Release.xcconfig","buck-out/gen/submodules/ActionSheetPeerItem/ActionSheetPeerItem-Debug.xcconfig","buck-out/gen/submodules/ActionSheetPeerItem/ActionSheetPeerItem-Profile.xcconfig","buck-out/gen/submodules/ActionSheetPeerItem/ActionSheetPeerItem-Release.xcconfig","buck-out/gen/submodules/ActivityIndicator/ActivityIndicator-Debug.xcconfig","buck-out/gen/submodules/ActivityIndicator/ActivityIndicator-Profile.xcconfig","buck-out/gen/submodules/ActivityIndicator/ActivityIndicator-Release.xcconfig","buck-out/gen/submodules/AlertUI/AlertUI-Debug.xcconfig","buck-out/gen/submodules/AlertUI/AlertUI-Profile.xcconfig","buck-out/gen/submodules/AlertUI/AlertUI-Release.xcconfig","buck-out/gen/submodules/AnimationUI/AnimationUI-Debug.xcconfig","buck-out/gen/submodules/AnimationUI/AnimationUI-Profile.xcconfig","buck-out/gen/submodules/AnimationUI/AnimationUI-Release.xcconfig","buck-out/gen/submodules/AppBundle/AppBundle-Debug.xcconfig","buck-out/gen/submodules/AppBundle/AppBundle-Profile.xcconfig","buck-out/gen/submodules/AppBundle/AppBundle-Release.xcconfig","buck-out/gen/submodules/AsyncDisplayKit/AsyncDisplayKit#shared-Debug.xcconfig","buck-out/gen/submodules/AsyncDisplayKit/AsyncDisplayKit#shared-Profile.xcconfig","buck-out/gen/submodules/AsyncDisplayKit/AsyncDisplayKit#shared-Release.xcconfig","buck-out/gen/submodules/AuthorizationUI/AuthorizationUI-Debug.xcconfig","buck-out/gen/submodules/AuthorizationUI/AuthorizationUI-Profile.xcconfig","buck-out/gen/submodules/AuthorizationUI/AuthorizationUI-Release.xcconfig","buck-out/gen/submodules/AvatarNode/AvatarNode-Debug.xcconfig","buck-out/gen/submodules/AvatarNode/AvatarNode-Profile.xcconfig","buck-out/gen/submodules/AvatarNode/AvatarNode-Release.xcconfig","buck-out/gen/submodules/BotPaymentsUI/BotPaymentsUI-Debug.xcconfig","buck-out/gen/submodules/BotPaymentsUI/BotPaymentsUI-Profile.xcconfig","buck-out/gen/submodules/BotPaymentsUI/BotPaymentsUI-Release.xcconfig","buck-out/gen/submodules/BuildConfig/BuildConfig-Debug.xcconfig","buck-out/gen/submodules/BuildConfig/BuildConfig-Profile.xcconfig","buck-out/gen/submodules/BuildConfig/BuildConfig-Release.xcconfig","buck-out/gen/submodules/CallListUI/CallListUI-Debug.xcconfig","buck-out/gen/submodules/CallListUI/CallListUI-Profile.xcconfig","buck-out/gen/submodules/CallListUI/CallListUI-Release.xcconfig","buck-out/gen/submodules/ChatListSearchItemHeader/ChatListSearchItemHeader-Debug.xcconfig","buck-out/gen/submodules/ChatListSearchItemHeader/ChatListSearchItemHeader-Profile.xcconfig","buck-out/gen/submodules/ChatListSearchItemHeader/ChatListSearchItemHeader-Release.xcconfig","buck-out/gen/submodules/ChatListSearchItemNode/ChatListSearchItemNode-Debug.xcconfig","buck-out/gen/submodules/ChatListSearchItemNode/ChatListSearchItemNode-Profile.xcconfig","buck-out/gen/submodules/ChatListSearchItemNode/ChatListSearchItemNode-Release.xcconfig","buck-out/gen/submodules/ChatListSearchRecentPeersNode/ChatListSearchRecentPeersNode-Debug.xcconfig","buck-out/gen/submodules/ChatListSearchRecentPeersNode/ChatListSearchRecentPeersNode-Profile.xcconfig","buck-out/gen/submodules/ChatListSearchRecentPeersNode/ChatListSearchRecentPeersNode-Release.xcconfig","buck-out/gen/submodules/ChatListUI/ChatListUI-Debug.xcconfig","buck-out/gen/submodules/ChatListUI/ChatListUI-Profile.xcconfig","buck-out/gen/submodules/ChatListUI/ChatListUI-Release.xcconfig","buck-out/gen/submodules/ChatTitleActivityNode/ChatTitleActivityNode-Debug.xcconfig","buck-out/gen/submodules/ChatTitleActivityNode/ChatTitleActivityNode-Profile.xcconfig","buck-out/gen/submodules/ChatTitleActivityNode/ChatTitleActivityNode-Release.xcconfig","buck-out/gen/submodules/CheckNode/CheckNode-Debug.xcconfig","buck-out/gen/submodules/CheckNode/CheckNode-Profile.xcconfig","buck-out/gen/submodules/CheckNode/CheckNode-Release.xcconfig","buck-out/gen/submodules/ComposePollUI/ComposePollUI-Debug.xcconfig","buck-out/gen/submodules/ComposePollUI/ComposePollUI-Profile.xcconfig","buck-out/gen/submodules/ComposePollUI/ComposePollUI-Release.xcconfig","buck-out/gen/submodules/ContactListUI/ContactListUI-Debug.xcconfig","buck-out/gen/submodules/ContactListUI/ContactListUI-Profile.xcconfig","buck-out/gen/submodules/ContactListUI/ContactListUI-Release.xcconfig","buck-out/gen/submodules/ContactsPeerItem/ContactsPeerItem-Debug.xcconfig","buck-out/gen/submodules/ContactsPeerItem/ContactsPeerItem-Profile.xcconfig","buck-out/gen/submodules/ContactsPeerItem/ContactsPeerItem-Release.xcconfig","buck-out/gen/submodules/ContextUI/ContextUI-Debug.xcconfig","buck-out/gen/submodules/ContextUI/ContextUI-Profile.xcconfig","buck-out/gen/submodules/ContextUI/ContextUI-Release.xcconfig","buck-out/gen/submodules/CounterContollerTitleView/CounterContollerTitleView-Debug.xcconfig","buck-out/gen/submodules/CounterContollerTitleView/CounterContollerTitleView-Profile.xcconfig","buck-out/gen/submodules/CounterContollerTitleView/CounterContollerTitleView-Release.xcconfig","buck-out/gen/submodules/CountrySelectionUI/CountrySelectionUI-Debug.xcconfig","buck-out/gen/submodules/CountrySelectionUI/CountrySelectionUI-Profile.xcconfig","buck-out/gen/submodules/CountrySelectionUI/CountrySelectionUI-Release.xcconfig","buck-out/gen/submodules/Crc32/Crc32-Debug.xcconfig","buck-out/gen/submodules/Crc32/Crc32-Profile.xcconfig","buck-out/gen/submodules/Crc32/Crc32-Release.xcconfig","buck-out/gen/submodules/DateSelectionUI/DateSelectionUI-Debug.xcconfig","buck-out/gen/submodules/DateSelectionUI/DateSelectionUI-Profile.xcconfig","buck-out/gen/submodules/DateSelectionUI/DateSelectionUI-Release.xcconfig","buck-out/gen/submodules/DeleteChatPeerActionSheetItem/DeleteChatPeerActionSheetItem-Debug.xcconfig","buck-out/gen/submodules/DeleteChatPeerActionSheetItem/DeleteChatPeerActionSheetItem-Profile.xcconfig","buck-out/gen/submodules/DeleteChatPeerActionSheetItem/DeleteChatPeerActionSheetItem-Release.xcconfig","buck-out/gen/submodules/DeviceAccess/DeviceAccess-Debug.xcconfig","buck-out/gen/submodules/DeviceAccess/DeviceAccess-Profile.xcconfig","buck-out/gen/submodules/DeviceAccess/DeviceAccess-Release.xcconfig","buck-out/gen/submodules/DeviceLocationManager/DeviceLocationManager-Debug.xcconfig","buck-out/gen/submodules/DeviceLocationManager/DeviceLocationManager-Profile.xcconfig","buck-out/gen/submodules/DeviceLocationManager/DeviceLocationManager-Release.xcconfig","buck-out/gen/submodules/DeviceProximity/DeviceProximity-Debug.xcconfig","buck-out/gen/submodules/DeviceProximity/DeviceProximity-Profile.xcconfig","buck-out/gen/submodules/DeviceProximity/DeviceProximity-Release.xcconfig","buck-out/gen/submodules/DirectionalPanGesture/DirectionalPanGesture-Debug.xcconfig","buck-out/gen/submodules/DirectionalPanGesture/DirectionalPanGesture-Profile.xcconfig","buck-out/gen/submodules/DirectionalPanGesture/DirectionalPanGesture-Release.xcconfig","buck-out/gen/submodules/Display/Display#shared-Debug.xcconfig","buck-out/gen/submodules/Display/Display#shared-Profile.xcconfig","buck-out/gen/submodules/Display/Display#shared-Release.xcconfig","buck-out/gen/submodules/Emoji/Emoji-Debug.xcconfig","buck-out/gen/submodules/Emoji/Emoji-Profile.xcconfig","buck-out/gen/submodules/Emoji/Emoji-Release.xcconfig","buck-out/gen/submodules/EncryptionKeyVisualization/EncryptionKeyVisualization-Debug.xcconfig","buck-out/gen/submodules/EncryptionKeyVisualization/EncryptionKeyVisualization-Profile.xcconfig","buck-out/gen/submodules/EncryptionKeyVisualization/EncryptionKeyVisualization-Release.xcconfig","buck-out/gen/submodules/FFMpeg/FFMpeg-Debug.xcconfig","buck-out/gen/submodules/FFMpeg/FFMpeg-Profile.xcconfig","buck-out/gen/submodules/FFMpeg/FFMpeg-Release.xcconfig","buck-out/gen/submodules/FFMpeg/libffmpeg-Debug.xcconfig","buck-out/gen/submodules/FFMpeg/libffmpeg-Profile.xcconfig","buck-out/gen/submodules/FFMpeg/libffmpeg-Release.xcconfig","buck-out/gen/submodules/GZip/GZip-Debug.xcconfig","buck-out/gen/submodules/GZip/GZip-Profile.xcconfig","buck-out/gen/submodules/GZip/GZip-Release.xcconfig","buck-out/gen/submodules/GalleryUI/GalleryUI-Debug.xcconfig","buck-out/gen/submodules/GalleryUI/GalleryUI-Profile.xcconfig","buck-out/gen/submodules/GalleryUI/GalleryUI-Release.xcconfig","buck-out/gen/submodules/GameUI/GameUI-Debug.xcconfig","buck-out/gen/submodules/GameUI/GameUI-Profile.xcconfig","buck-out/gen/submodules/GameUI/GameUI-Release.xcconfig","buck-out/gen/submodules/Geocoding/Geocoding-Debug.xcconfig","buck-out/gen/submodules/Geocoding/Geocoding-Profile.xcconfig","buck-out/gen/submodules/Geocoding/Geocoding-Release.xcconfig","buck-out/gen/submodules/GridMessageSelectionNode/GridMessageSelectionNode-Debug.xcconfig","buck-out/gen/submodules/GridMessageSelectionNode/GridMessageSelectionNode-Profile.xcconfig","buck-out/gen/submodules/GridMessageSelectionNode/GridMessageSelectionNode-Release.xcconfig","buck-out/gen/submodules/HashtagSearchUI/HashtagSearchUI-Debug.xcconfig","buck-out/gen/submodules/HashtagSearchUI/HashtagSearchUI-Profile.xcconfig","buck-out/gen/submodules/HashtagSearchUI/HashtagSearchUI-Release.xcconfig","buck-out/gen/submodules/HexColor/HexColor-Debug.xcconfig","buck-out/gen/submodules/HexColor/HexColor-Profile.xcconfig","buck-out/gen/submodules/HexColor/HexColor-Release.xcconfig","buck-out/gen/submodules/HockeySDK-iOS/HockeySDK-Debug.xcconfig","buck-out/gen/submodules/HockeySDK-iOS/HockeySDK-Profile.xcconfig","buck-out/gen/submodules/HockeySDK-iOS/HockeySDK-Release.xcconfig","buck-out/gen/submodules/HorizontalPeerItem/HorizontalPeerItem-Debug.xcconfig","buck-out/gen/submodules/HorizontalPeerItem/HorizontalPeerItem-Profile.xcconfig","buck-out/gen/submodules/HorizontalPeerItem/HorizontalPeerItem-Release.xcconfig","buck-out/gen/submodules/ImageBlur/ImageBlur-Debug.xcconfig","buck-out/gen/submodules/ImageBlur/ImageBlur-Profile.xcconfig","buck-out/gen/submodules/ImageBlur/ImageBlur-Release.xcconfig","buck-out/gen/submodules/ImageCompression/ImageCompression-Debug.xcconfig","buck-out/gen/submodules/ImageCompression/ImageCompression-Profile.xcconfig","buck-out/gen/submodules/ImageCompression/ImageCompression-Release.xcconfig","buck-out/gen/submodules/ImageTransparency/ImageTransparency-Debug.xcconfig","buck-out/gen/submodules/ImageTransparency/ImageTransparency-Profile.xcconfig","buck-out/gen/submodules/ImageTransparency/ImageTransparency-Release.xcconfig","buck-out/gen/submodules/InstantPageCache/InstantPageCache-Debug.xcconfig","buck-out/gen/submodules/InstantPageCache/InstantPageCache-Profile.xcconfig","buck-out/gen/submodules/InstantPageCache/InstantPageCache-Release.xcconfig","buck-out/gen/submodules/InstantPageUI/InstantPageUI-Debug.xcconfig","buck-out/gen/submodules/InstantPageUI/InstantPageUI-Profile.xcconfig","buck-out/gen/submodules/InstantPageUI/InstantPageUI-Release.xcconfig","buck-out/gen/submodules/ItemListAddressItem/ItemListAddressItem-Debug.xcconfig","buck-out/gen/submodules/ItemListAddressItem/ItemListAddressItem-Profile.xcconfig","buck-out/gen/submodules/ItemListAddressItem/ItemListAddressItem-Release.xcconfig","buck-out/gen/submodules/ItemListAvatarAndNameInfoItem/ItemListAvatarAndNameInfoItem-Debug.xcconfig","buck-out/gen/submodules/ItemListAvatarAndNameInfoItem/ItemListAvatarAndNameInfoItem-Profile.xcconfig","buck-out/gen/submodules/ItemListAvatarAndNameInfoItem/ItemListAvatarAndNameInfoItem-Release.xcconfig","buck-out/gen/submodules/ItemListPeerActionItem/ItemListPeerActionItem-Debug.xcconfig","buck-out/gen/submodules/ItemListPeerActionItem/ItemListPeerActionItem-Profile.xcconfig","buck-out/gen/submodules/ItemListPeerActionItem/ItemListPeerActionItem-Release.xcconfig","buck-out/gen/submodules/ItemListPeerItem/ItemListPeerItem-Debug.xcconfig","buck-out/gen/submodules/ItemListPeerItem/ItemListPeerItem-Profile.xcconfig","buck-out/gen/submodules/ItemListPeerItem/ItemListPeerItem-Release.xcconfig","buck-out/gen/submodules/ItemListStickerPackItem/ItemListStickerPackItem-Debug.xcconfig","buck-out/gen/submodules/ItemListStickerPackItem/ItemListStickerPackItem-Profile.xcconfig","buck-out/gen/submodules/ItemListStickerPackItem/ItemListStickerPackItem-Release.xcconfig","buck-out/gen/submodules/ItemListUI/ItemListUI-Debug.xcconfig","buck-out/gen/submodules/ItemListUI/ItemListUI-Profile.xcconfig","buck-out/gen/submodules/ItemListUI/ItemListUI-Release.xcconfig","buck-out/gen/submodules/JoinLinkPreviewUI/JoinLinkPreviewUI-Debug.xcconfig","buck-out/gen/submodules/JoinLinkPreviewUI/JoinLinkPreviewUI-Profile.xcconfig","buck-out/gen/submodules/JoinLinkPreviewUI/JoinLinkPreviewUI-Release.xcconfig","buck-out/gen/submodules/LanguageLinkPreviewUI/LanguageLinkPreviewUI-Debug.xcconfig","buck-out/gen/submodules/LanguageLinkPreviewUI/LanguageLinkPreviewUI-Profile.xcconfig","buck-out/gen/submodules/LanguageLinkPreviewUI/LanguageLinkPreviewUI-Release.xcconfig","buck-out/gen/submodules/LanguageSuggestionUI/LanguageSuggestionUI-Debug.xcconfig","buck-out/gen/submodules/LanguageSuggestionUI/LanguageSuggestionUI-Profile.xcconfig","buck-out/gen/submodules/LanguageSuggestionUI/LanguageSuggestionUI-Release.xcconfig","buck-out/gen/submodules/LegacyComponents/LegacyComponents-Debug.xcconfig","buck-out/gen/submodules/LegacyComponents/LegacyComponents-Profile.xcconfig","buck-out/gen/submodules/LegacyComponents/LegacyComponents-Release.xcconfig","buck-out/gen/submodules/LegacyDataImport/LegacyDataImport-Debug.xcconfig","buck-out/gen/submodules/LegacyDataImport/LegacyDataImport-Profile.xcconfig","buck-out/gen/submodules/LegacyDataImport/LegacyDataImport-Release.xcconfig","buck-out/gen/submodules/LegacyMediaPickerUI/LegacyMediaPickerUI-Debug.xcconfig","buck-out/gen/submodules/LegacyMediaPickerUI/LegacyMediaPickerUI-Profile.xcconfig","buck-out/gen/submodules/LegacyMediaPickerUI/LegacyMediaPickerUI-Release.xcconfig","buck-out/gen/submodules/LegacyUI/LegacyUI-Debug.xcconfig","buck-out/gen/submodules/LegacyUI/LegacyUI-Profile.xcconfig","buck-out/gen/submodules/LegacyUI/LegacyUI-Release.xcconfig","buck-out/gen/submodules/LightweightAccountData/LightweightAccountData-Debug.xcconfig","buck-out/gen/submodules/LightweightAccountData/LightweightAccountData-Profile.xcconfig","buck-out/gen/submodules/LightweightAccountData/LightweightAccountData-Release.xcconfig","buck-out/gen/submodules/ListSectionHeaderNode/ListSectionHeaderNode-Debug.xcconfig","buck-out/gen/submodules/ListSectionHeaderNode/ListSectionHeaderNode-Profile.xcconfig","buck-out/gen/submodules/ListSectionHeaderNode/ListSectionHeaderNode-Release.xcconfig","buck-out/gen/submodules/LiveLocationManager/LiveLocationManager-Debug.xcconfig","buck-out/gen/submodules/LiveLocationManager/LiveLocationManager-Profile.xcconfig","buck-out/gen/submodules/LiveLocationManager/LiveLocationManager-Release.xcconfig","buck-out/gen/submodules/LiveLocationPositionNode/LiveLocationPositionNode-Debug.xcconfig","buck-out/gen/submodules/LiveLocationPositionNode/LiveLocationPositionNode-Profile.xcconfig","buck-out/gen/submodules/LiveLocationPositionNode/LiveLocationPositionNode-Release.xcconfig","buck-out/gen/submodules/LiveLocationTimerNode/LiveLocationTimerNode-Debug.xcconfig","buck-out/gen/submodules/LiveLocationTimerNode/LiveLocationTimerNode-Profile.xcconfig","buck-out/gen/submodules/LiveLocationTimerNode/LiveLocationTimerNode-Release.xcconfig","buck-out/gen/submodules/LocalAuth/LocalAuth-Debug.xcconfig","buck-out/gen/submodules/LocalAuth/LocalAuth-Profile.xcconfig","buck-out/gen/submodules/LocalAuth/LocalAuth-Release.xcconfig","buck-out/gen/submodules/LocalMediaResources/LocalMediaResources-Debug.xcconfig","buck-out/gen/submodules/LocalMediaResources/LocalMediaResources-Profile.xcconfig","buck-out/gen/submodules/LocalMediaResources/LocalMediaResources-Release.xcconfig","buck-out/gen/submodules/LocalizedPeerData/LocalizedPeerData-Debug.xcconfig","buck-out/gen/submodules/LocalizedPeerData/LocalizedPeerData-Profile.xcconfig","buck-out/gen/submodules/LocalizedPeerData/LocalizedPeerData-Release.xcconfig","buck-out/gen/submodules/LocationUI/LocationUI-Debug.xcconfig","buck-out/gen/submodules/LocationUI/LocationUI-Profile.xcconfig","buck-out/gen/submodules/LocationUI/LocationUI-Release.xcconfig","buck-out/gen/submodules/MapResourceToAvatarSizes/MapResourceToAvatarSizes-Debug.xcconfig","buck-out/gen/submodules/MapResourceToAvatarSizes/MapResourceToAvatarSizes-Profile.xcconfig","buck-out/gen/submodules/MapResourceToAvatarSizes/MapResourceToAvatarSizes-Release.xcconfig","buck-out/gen/submodules/MediaPlayer/UniversalMediaPlayer-Debug.xcconfig","buck-out/gen/submodules/MediaPlayer/UniversalMediaPlayer-Profile.xcconfig","buck-out/gen/submodules/MediaPlayer/UniversalMediaPlayer-Release.xcconfig","buck-out/gen/submodules/MediaResources/MediaResources-Debug.xcconfig","buck-out/gen/submodules/MediaResources/MediaResources-Profile.xcconfig","buck-out/gen/submodules/MediaResources/MediaResources-Release.xcconfig","buck-out/gen/submodules/MergeLists/MergeLists-Debug.xcconfig","buck-out/gen/submodules/MergeLists/MergeLists-Profile.xcconfig","buck-out/gen/submodules/MergeLists/MergeLists-Release.xcconfig","buck-out/gen/submodules/MessageReactionListUI/MessageReactionListUI-Debug.xcconfig","buck-out/gen/submodules/MessageReactionListUI/MessageReactionListUI-Profile.xcconfig","buck-out/gen/submodules/MessageReactionListUI/MessageReactionListUI-Release.xcconfig","buck-out/gen/submodules/MimeTypes/MimeTypes-Debug.xcconfig","buck-out/gen/submodules/MimeTypes/MimeTypes-Profile.xcconfig","buck-out/gen/submodules/MimeTypes/MimeTypes-Release.xcconfig","buck-out/gen/submodules/MosaicLayout/MosaicLayout-Debug.xcconfig","buck-out/gen/submodules/MosaicLayout/MosaicLayout-Profile.xcconfig","buck-out/gen/submodules/MosaicLayout/MosaicLayout-Release.xcconfig","buck-out/gen/submodules/MtProtoKit/MtProtoKit#shared-Debug.xcconfig","buck-out/gen/submodules/MtProtoKit/MtProtoKit#shared-Profile.xcconfig","buck-out/gen/submodules/MtProtoKit/MtProtoKit#shared-Release.xcconfig","buck-out/gen/submodules/MtProtoKit/openssl-Debug.xcconfig","buck-out/gen/submodules/MtProtoKit/openssl-Profile.xcconfig","buck-out/gen/submodules/MtProtoKit/openssl-Release.xcconfig","buck-out/gen/submodules/MusicAlbumArtResources/MusicAlbumArtResources-Debug.xcconfig","buck-out/gen/submodules/MusicAlbumArtResources/MusicAlbumArtResources-Profile.xcconfig","buck-out/gen/submodules/MusicAlbumArtResources/MusicAlbumArtResources-Release.xcconfig","buck-out/gen/submodules/NotificationMuteSettingsUI/NotificationMuteSettingsUI-Debug.xcconfig","buck-out/gen/submodules/NotificationMuteSettingsUI/NotificationMuteSettingsUI-Profile.xcconfig","buck-out/gen/submodules/NotificationMuteSettingsUI/NotificationMuteSettingsUI-Release.xcconfig","buck-out/gen/submodules/NotificationSoundSelectionUI/NotificationSoundSelectionUI-Debug.xcconfig","buck-out/gen/submodules/NotificationSoundSelectionUI/NotificationSoundSelectionUI-Profile.xcconfig","buck-out/gen/submodules/NotificationSoundSelectionUI/NotificationSoundSelectionUI-Release.xcconfig","buck-out/gen/submodules/OpenInExternalAppUI/OpenInExternalAppUI-Debug.xcconfig","buck-out/gen/submodules/OpenInExternalAppUI/OpenInExternalAppUI-Profile.xcconfig","buck-out/gen/submodules/OpenInExternalAppUI/OpenInExternalAppUI-Release.xcconfig","buck-out/gen/submodules/Opus/opus-Debug.xcconfig","buck-out/gen/submodules/Opus/opus-Profile.xcconfig","buck-out/gen/submodules/Opus/opus-Release.xcconfig","buck-out/gen/submodules/Opus/opus_lib-Debug.xcconfig","buck-out/gen/submodules/Opus/opus_lib-Profile.xcconfig","buck-out/gen/submodules/Opus/opus_lib-Release.xcconfig","buck-out/gen/submodules/OpusBinding/OpusBinding-Debug.xcconfig","buck-out/gen/submodules/OpusBinding/OpusBinding-Profile.xcconfig","buck-out/gen/submodules/OpusBinding/OpusBinding-Release.xcconfig","buck-out/gen/submodules/OverlayStatusController/OverlayStatusController-Debug.xcconfig","buck-out/gen/submodules/OverlayStatusController/OverlayStatusController-Profile.xcconfig","buck-out/gen/submodules/OverlayStatusController/OverlayStatusController-Release.xcconfig","buck-out/gen/submodules/PasscodeUI/PasscodeUI-Debug.xcconfig","buck-out/gen/submodules/PasscodeUI/PasscodeUI-Profile.xcconfig","buck-out/gen/submodules/PasscodeUI/PasscodeUI-Release.xcconfig","buck-out/gen/submodules/PassportUI/PassportUI-Debug.xcconfig","buck-out/gen/submodules/PassportUI/PassportUI-Profile.xcconfig","buck-out/gen/submodules/PassportUI/PassportUI-Release.xcconfig","buck-out/gen/submodules/PasswordSetupUI/PasswordSetupUI-Debug.xcconfig","buck-out/gen/submodules/PasswordSetupUI/PasswordSetupUI-Profile.xcconfig","buck-out/gen/submodules/PasswordSetupUI/PasswordSetupUI-Release.xcconfig","buck-out/gen/submodules/Pdf/Pdf-Debug.xcconfig","buck-out/gen/submodules/Pdf/Pdf-Profile.xcconfig","buck-out/gen/submodules/Pdf/Pdf-Release.xcconfig","buck-out/gen/submodules/PeerAvatarGalleryUI/PeerAvatarGalleryUI-Debug.xcconfig","buck-out/gen/submodules/PeerAvatarGalleryUI/PeerAvatarGalleryUI-Profile.xcconfig","buck-out/gen/submodules/PeerAvatarGalleryUI/PeerAvatarGalleryUI-Release.xcconfig","buck-out/gen/submodules/PeerInfoUI/PeerInfoUI-Debug.xcconfig","buck-out/gen/submodules/PeerInfoUI/PeerInfoUI-Profile.xcconfig","buck-out/gen/submodules/PeerInfoUI/PeerInfoUI-Release.xcconfig","buck-out/gen/submodules/PeerOnlineMarkerNode/PeerOnlineMarkerNode-Debug.xcconfig","buck-out/gen/submodules/PeerOnlineMarkerNode/PeerOnlineMarkerNode-Profile.xcconfig","buck-out/gen/submodules/PeerOnlineMarkerNode/PeerOnlineMarkerNode-Release.xcconfig","buck-out/gen/submodules/PeerPresenceStatusManager/PeerPresenceStatusManager-Debug.xcconfig","buck-out/gen/submodules/PeerPresenceStatusManager/PeerPresenceStatusManager-Profile.xcconfig","buck-out/gen/submodules/PeerPresenceStatusManager/PeerPresenceStatusManager-Release.xcconfig","buck-out/gen/submodules/PeersNearbyIconNode/PeersNearbyIconNode-Debug.xcconfig","buck-out/gen/submodules/PeersNearbyIconNode/PeersNearbyIconNode-Profile.xcconfig","buck-out/gen/submodules/PeersNearbyIconNode/PeersNearbyIconNode-Release.xcconfig","buck-out/gen/submodules/PeersNearbyUI/PeersNearbyUI-Debug.xcconfig","buck-out/gen/submodules/PeersNearbyUI/PeersNearbyUI-Profile.xcconfig","buck-out/gen/submodules/PeersNearbyUI/PeersNearbyUI-Release.xcconfig","buck-out/gen/submodules/PersistentStringHash/PersistentStringHash-Debug.xcconfig","buck-out/gen/submodules/PersistentStringHash/PersistentStringHash-Profile.xcconfig","buck-out/gen/submodules/PersistentStringHash/PersistentStringHash-Release.xcconfig","buck-out/gen/submodules/PhoneInputNode/PhoneInputNode-Debug.xcconfig","buck-out/gen/submodules/PhoneInputNode/PhoneInputNode-Profile.xcconfig","buck-out/gen/submodules/PhoneInputNode/PhoneInputNode-Release.xcconfig","buck-out/gen/submodules/PhotoResources/PhotoResources-Debug.xcconfig","buck-out/gen/submodules/PhotoResources/PhotoResources-Profile.xcconfig","buck-out/gen/submodules/PhotoResources/PhotoResources-Release.xcconfig","buck-out/gen/submodules/PlatformRestrictionMatching/PlatformRestrictionMatching-Debug.xcconfig","buck-out/gen/submodules/PlatformRestrictionMatching/PlatformRestrictionMatching-Profile.xcconfig","buck-out/gen/submodules/PlatformRestrictionMatching/PlatformRestrictionMatching-Release.xcconfig","buck-out/gen/submodules/Postbox/Postbox#shared-Debug.xcconfig","buck-out/gen/submodules/Postbox/Postbox#shared-Profile.xcconfig","buck-out/gen/submodules/Postbox/Postbox#shared-Release.xcconfig","buck-out/gen/submodules/ProgressNavigationButtonNode/ProgressNavigationButtonNode-Debug.xcconfig","buck-out/gen/submodules/ProgressNavigationButtonNode/ProgressNavigationButtonNode-Profile.xcconfig","buck-out/gen/submodules/ProgressNavigationButtonNode/ProgressNavigationButtonNode-Release.xcconfig","buck-out/gen/submodules/QrCode/QrCode-Debug.xcconfig","buck-out/gen/submodules/QrCode/QrCode-Profile.xcconfig","buck-out/gen/submodules/QrCode/QrCode-Release.xcconfig","buck-out/gen/submodules/RMIntro/RMIntro-Debug.xcconfig","buck-out/gen/submodules/RMIntro/RMIntro-Profile.xcconfig","buck-out/gen/submodules/RMIntro/RMIntro-Release.xcconfig","buck-out/gen/submodules/RadialStatusNode/RadialStatusNode-Debug.xcconfig","buck-out/gen/submodules/RadialStatusNode/RadialStatusNode-Profile.xcconfig","buck-out/gen/submodules/RadialStatusNode/RadialStatusNode-Release.xcconfig","buck-out/gen/submodules/RaiseToListen/RaiseToListen-Debug.xcconfig","buck-out/gen/submodules/RaiseToListen/RaiseToListen-Profile.xcconfig","buck-out/gen/submodules/RaiseToListen/RaiseToListen-Release.xcconfig","buck-out/gen/submodules/ReactionSelectionNode/ReactionSelectionNode-Debug.xcconfig","buck-out/gen/submodules/ReactionSelectionNode/ReactionSelectionNode-Profile.xcconfig","buck-out/gen/submodules/ReactionSelectionNode/ReactionSelectionNode-Release.xcconfig","buck-out/gen/submodules/SSignalKit/SSignalKit/SSignalKit-Debug.xcconfig","buck-out/gen/submodules/SSignalKit/SSignalKit/SSignalKit-Profile.xcconfig","buck-out/gen/submodules/SSignalKit/SSignalKit/SSignalKit-Release.xcconfig","buck-out/gen/submodules/SSignalKit/SwiftSignalKit/SwiftSignalKit#shared-Debug.xcconfig","buck-out/gen/submodules/SSignalKit/SwiftSignalKit/SwiftSignalKit#shared-Profile.xcconfig","buck-out/gen/submodules/SSignalKit/SwiftSignalKit/SwiftSignalKit#shared-Release.xcconfig","buck-out/gen/submodules/SaveToCameraRoll/SaveToCameraRoll-Debug.xcconfig","buck-out/gen/submodules/SaveToCameraRoll/SaveToCameraRoll-Profile.xcconfig","buck-out/gen/submodules/SaveToCameraRoll/SaveToCameraRoll-Release.xcconfig","buck-out/gen/submodules/ScreenCaptureDetection/ScreenCaptureDetection-Debug.xcconfig","buck-out/gen/submodules/ScreenCaptureDetection/ScreenCaptureDetection-Profile.xcconfig","buck-out/gen/submodules/ScreenCaptureDetection/ScreenCaptureDetection-Release.xcconfig","buck-out/gen/submodules/SearchBarNode/SearchBarNode-Debug.xcconfig","buck-out/gen/submodules/SearchBarNode/SearchBarNode-Profile.xcconfig","buck-out/gen/submodules/SearchBarNode/SearchBarNode-Release.xcconfig","buck-out/gen/submodules/SearchUI/SearchUI-Debug.xcconfig","buck-out/gen/submodules/SearchUI/SearchUI-Profile.xcconfig","buck-out/gen/submodules/SearchUI/SearchUI-Release.xcconfig","buck-out/gen/submodules/SegmentedControlNode/SegmentedControlNode-Debug.xcconfig","buck-out/gen/submodules/SegmentedControlNode/SegmentedControlNode-Profile.xcconfig","buck-out/gen/submodules/SegmentedControlNode/SegmentedControlNode-Release.xcconfig","buck-out/gen/submodules/SelectablePeerNode/SelectablePeerNode-Debug.xcconfig","buck-out/gen/submodules/SelectablePeerNode/SelectablePeerNode-Profile.xcconfig","buck-out/gen/submodules/SelectablePeerNode/SelectablePeerNode-Release.xcconfig","buck-out/gen/submodules/SettingsUI/SettingsUI-Debug.xcconfig","buck-out/gen/submodules/SettingsUI/SettingsUI-Profile.xcconfig","buck-out/gen/submodules/SettingsUI/SettingsUI-Release.xcconfig","buck-out/gen/submodules/ShareController/ShareController-Debug.xcconfig","buck-out/gen/submodules/ShareController/ShareController-Profile.xcconfig","buck-out/gen/submodules/ShareController/ShareController-Release.xcconfig","buck-out/gen/submodules/ShareItems/ShareItems-Debug.xcconfig","buck-out/gen/submodules/ShareItems/ShareItems-Profile.xcconfig","buck-out/gen/submodules/ShareItems/ShareItems-Release.xcconfig","buck-out/gen/submodules/SinglePhoneInputNode/SinglePhoneInputNode-Debug.xcconfig","buck-out/gen/submodules/SinglePhoneInputNode/SinglePhoneInputNode-Profile.xcconfig","buck-out/gen/submodules/SinglePhoneInputNode/SinglePhoneInputNode-Release.xcconfig","buck-out/gen/submodules/SolidRoundedButtonNode/SolidRoundedButtonNode-Debug.xcconfig","buck-out/gen/submodules/SolidRoundedButtonNode/SolidRoundedButtonNode-Profile.xcconfig","buck-out/gen/submodules/SolidRoundedButtonNode/SolidRoundedButtonNode-Release.xcconfig","buck-out/gen/submodules/StickerPackPreviewUI/StickerPackPreviewUI-Debug.xcconfig","buck-out/gen/submodules/StickerPackPreviewUI/StickerPackPreviewUI-Profile.xcconfig","buck-out/gen/submodules/StickerPackPreviewUI/StickerPackPreviewUI-Release.xcconfig","buck-out/gen/submodules/StickerResources/StickerResources-Debug.xcconfig","buck-out/gen/submodules/StickerResources/StickerResources-Profile.xcconfig","buck-out/gen/submodules/StickerResources/StickerResources-Release.xcconfig","buck-out/gen/submodules/Stripe/Stripe-Debug.xcconfig","buck-out/gen/submodules/Stripe/Stripe-Profile.xcconfig","buck-out/gen/submodules/Stripe/Stripe-Release.xcconfig","buck-out/gen/submodules/SwipeToDismissGesture/SwipeToDismissGesture-Debug.xcconfig","buck-out/gen/submodules/SwipeToDismissGesture/SwipeToDismissGesture-Profile.xcconfig","buck-out/gen/submodules/SwipeToDismissGesture/SwipeToDismissGesture-Release.xcconfig","buck-out/gen/submodules/SwitchNode/SwitchNode-Debug.xcconfig","buck-out/gen/submodules/SwitchNode/SwitchNode-Profile.xcconfig","buck-out/gen/submodules/SwitchNode/SwitchNode-Release.xcconfig","buck-out/gen/submodules/TelegramApi/TelegramApi-Debug.xcconfig","buck-out/gen/submodules/TelegramApi/TelegramApi-Profile.xcconfig","buck-out/gen/submodules/TelegramApi/TelegramApi-Release.xcconfig","buck-out/gen/submodules/TelegramAudio/TelegramAudio-Debug.xcconfig","buck-out/gen/submodules/TelegramAudio/TelegramAudio-Profile.xcconfig","buck-out/gen/submodules/TelegramAudio/TelegramAudio-Release.xcconfig","buck-out/gen/submodules/TelegramBaseController/TelegramBaseController-Debug.xcconfig","buck-out/gen/submodules/TelegramBaseController/TelegramBaseController-Profile.xcconfig","buck-out/gen/submodules/TelegramBaseController/TelegramBaseController-Release.xcconfig","buck-out/gen/submodules/TelegramCallsUI/TelegramCallsUI-Debug.xcconfig","buck-out/gen/submodules/TelegramCallsUI/TelegramCallsUI-Profile.xcconfig","buck-out/gen/submodules/TelegramCallsUI/TelegramCallsUI-Release.xcconfig","buck-out/gen/submodules/TelegramCore/TelegramCore#shared-Debug.xcconfig","buck-out/gen/submodules/TelegramCore/TelegramCore#shared-Profile.xcconfig","buck-out/gen/submodules/TelegramCore/TelegramCore#shared-Release.xcconfig","buck-out/gen/submodules/TelegramNotices/TelegramNotices-Debug.xcconfig","buck-out/gen/submodules/TelegramNotices/TelegramNotices-Profile.xcconfig","buck-out/gen/submodules/TelegramNotices/TelegramNotices-Release.xcconfig","buck-out/gen/submodules/TelegramPermissions/TelegramPermissions-Debug.xcconfig","buck-out/gen/submodules/TelegramPermissions/TelegramPermissions-Profile.xcconfig","buck-out/gen/submodules/TelegramPermissions/TelegramPermissions-Release.xcconfig","buck-out/gen/submodules/TelegramPermissionsUI/TelegramPermissionsUI-Debug.xcconfig","buck-out/gen/submodules/TelegramPermissionsUI/TelegramPermissionsUI-Profile.xcconfig","buck-out/gen/submodules/TelegramPermissionsUI/TelegramPermissionsUI-Release.xcconfig","buck-out/gen/submodules/TelegramPresentationData/TelegramPresentationData-Debug.xcconfig","buck-out/gen/submodules/TelegramPresentationData/TelegramPresentationData-Profile.xcconfig","buck-out/gen/submodules/TelegramPresentationData/TelegramPresentationData-Release.xcconfig","buck-out/gen/submodules/TelegramStringFormatting/TelegramStringFormatting-Debug.xcconfig","buck-out/gen/submodules/TelegramStringFormatting/TelegramStringFormatting-Profile.xcconfig","buck-out/gen/submodules/TelegramStringFormatting/TelegramStringFormatting-Release.xcconfig","buck-out/gen/submodules/TelegramUI/TelegramUI#shared-Debug.xcconfig","buck-out/gen/submodules/TelegramUI/TelegramUI#shared-Profile.xcconfig","buck-out/gen/submodules/TelegramUI/TelegramUI#shared-Release.xcconfig","buck-out/gen/submodules/TelegramUIPreferences/TelegramUIPreferences-Debug.xcconfig","buck-out/gen/submodules/TelegramUIPreferences/TelegramUIPreferences-Profile.xcconfig","buck-out/gen/submodules/TelegramUIPreferences/TelegramUIPreferences-Release.xcconfig","buck-out/gen/submodules/TelegramUniversalVideoContent/TelegramUniversalVideoContent-Debug.xcconfig","buck-out/gen/submodules/TelegramUniversalVideoContent/TelegramUniversalVideoContent-Profile.xcconfig","buck-out/gen/submodules/TelegramUniversalVideoContent/TelegramUniversalVideoContent-Release.xcconfig","buck-out/gen/submodules/TelegramUpdateUI/TelegramUpdateUI-Debug.xcconfig","buck-out/gen/submodules/TelegramUpdateUI/TelegramUpdateUI-Profile.xcconfig","buck-out/gen/submodules/TelegramUpdateUI/TelegramUpdateUI-Release.xcconfig","buck-out/gen/submodules/TelegramVoip/TelegramVoip-Debug.xcconfig","buck-out/gen/submodules/TelegramVoip/TelegramVoip-Profile.xcconfig","buck-out/gen/submodules/TelegramVoip/TelegramVoip-Release.xcconfig","buck-out/gen/submodules/TemporaryCachedPeerDataManager/TemporaryCachedPeerDataManager-Debug.xcconfig","buck-out/gen/submodules/TemporaryCachedPeerDataManager/TemporaryCachedPeerDataManager-Profile.xcconfig","buck-out/gen/submodules/TemporaryCachedPeerDataManager/TemporaryCachedPeerDataManager-Release.xcconfig","buck-out/gen/submodules/TextFormat/TextFormat-Debug.xcconfig","buck-out/gen/submodules/TextFormat/TextFormat-Profile.xcconfig","buck-out/gen/submodules/TextFormat/TextFormat-Release.xcconfig","buck-out/gen/submodules/TextSelectionNode/TextSelectionNode-Debug.xcconfig","buck-out/gen/submodules/TextSelectionNode/TextSelectionNode-Profile.xcconfig","buck-out/gen/submodules/TextSelectionNode/TextSelectionNode-Release.xcconfig","buck-out/gen/submodules/TinyThumbnail/TinyThumbnail-Debug.xcconfig","buck-out/gen/submodules/TinyThumbnail/TinyThumbnail-Profile.xcconfig","buck-out/gen/submodules/TinyThumbnail/TinyThumbnail-Release.xcconfig","buck-out/gen/submodules/TouchDownGesture/TouchDownGesture-Debug.xcconfig","buck-out/gen/submodules/TouchDownGesture/TouchDownGesture-Profile.xcconfig","buck-out/gen/submodules/TouchDownGesture/TouchDownGesture-Release.xcconfig","buck-out/gen/submodules/Tuples/Tuples-Debug.xcconfig","buck-out/gen/submodules/Tuples/Tuples-Profile.xcconfig","buck-out/gen/submodules/Tuples/Tuples-Release.xcconfig","buck-out/gen/submodules/UndoUI/UndoUI-Debug.xcconfig","buck-out/gen/submodules/UndoUI/UndoUI-Profile.xcconfig","buck-out/gen/submodules/UndoUI/UndoUI-Release.xcconfig","buck-out/gen/submodules/UrlEscaping/UrlEscaping-Debug.xcconfig","buck-out/gen/submodules/UrlEscaping/UrlEscaping-Profile.xcconfig","buck-out/gen/submodules/UrlEscaping/UrlEscaping-Release.xcconfig","buck-out/gen/submodules/UrlHandling/UrlHandling-Debug.xcconfig","buck-out/gen/submodules/UrlHandling/UrlHandling-Profile.xcconfig","buck-out/gen/submodules/UrlHandling/UrlHandling-Release.xcconfig","buck-out/gen/submodules/WallpaperResources/WallpaperResources-Debug.xcconfig","buck-out/gen/submodules/WallpaperResources/WallpaperResources-Profile.xcconfig","buck-out/gen/submodules/WallpaperResources/WallpaperResources-Release.xcconfig","buck-out/gen/submodules/WatchBridge/WatchBridge-Debug.xcconfig","buck-out/gen/submodules/WatchBridge/WatchBridge-Profile.xcconfig","buck-out/gen/submodules/WatchBridge/WatchBridge-Release.xcconfig","buck-out/gen/submodules/WatchBridgeAudio/WatchBridgeAudio-Debug.xcconfig","buck-out/gen/submodules/WatchBridgeAudio/WatchBridgeAudio-Profile.xcconfig","buck-out/gen/submodules/WatchBridgeAudio/WatchBridgeAudio-Release.xcconfig","buck-out/gen/submodules/WatchCommon/Host/WatchCommon-Debug.xcconfig","buck-out/gen/submodules/WatchCommon/Host/WatchCommon-Profile.xcconfig","buck-out/gen/submodules/WatchCommon/Host/WatchCommon-Release.xcconfig","buck-out/gen/submodules/WebP/WebPImage-Debug.xcconfig","buck-out/gen/submodules/WebP/WebPImage-Profile.xcconfig","buck-out/gen/submodules/WebP/WebPImage-Release.xcconfig","buck-out/gen/submodules/WebP/WebP_lib-Debug.xcconfig","buck-out/gen/submodules/WebP/WebP_lib-Profile.xcconfig","buck-out/gen/submodules/WebP/WebP_lib-Release.xcconfig","buck-out/gen/submodules/WebSearchUI/WebSearchUI-Debug.xcconfig","buck-out/gen/submodules/WebSearchUI/WebSearchUI-Profile.xcconfig","buck-out/gen/submodules/WebSearchUI/WebSearchUI-Release.xcconfig","buck-out/gen/submodules/WebUI/WebUI-Debug.xcconfig","buck-out/gen/submodules/WebUI/WebUI-Profile.xcconfig","buck-out/gen/submodules/WebUI/WebUI-Release.xcconfig","buck-out/gen/submodules/WebsiteType/WebsiteType-Debug.xcconfig","buck-out/gen/submodules/WebsiteType/WebsiteType-Profile.xcconfig","buck-out/gen/submodules/WebsiteType/WebsiteType-Release.xcconfig","buck-out/gen/submodules/YuvConversion/YuvConversion-Debug.xcconfig","buck-out/gen/submodules/YuvConversion/YuvConversion-Profile.xcconfig","buck-out/gen/submodules/YuvConversion/YuvConversion-Release.xcconfig","buck-out/gen/submodules/libphonenumber/libphonenumber-Debug.xcconfig","buck-out/gen/submodules/libphonenumber/libphonenumber-Profile.xcconfig","buck-out/gen/submodules/libphonenumber/libphonenumber-Release.xcconfig","buck-out/gen/submodules/libtgvoip/libtgvoip-Debug.xcconfig","buck-out/gen/submodules/libtgvoip/libtgvoip-Profile.xcconfig","buck-out/gen/submodules/libtgvoip/libtgvoip-Release.xcconfig","buck-out/gen/submodules/lottie-ios/Lottie-Debug.xcconfig","buck-out/gen/submodules/lottie-ios/Lottie-Profile.xcconfig","buck-out/gen/submodules/lottie-ios/Lottie-Release.xcconfig","buck-out/gen/submodules/rlottie/RLottieBinding-Debug.xcconfig","buck-out/gen/submodules/rlottie/RLottieBinding-Profile.xcconfig","buck-out/gen/submodules/rlottie/RLottieBinding-Release.xcconfig","buck-out/gen/submodules/sqlcipher/sqlcipher-Debug.xcconfig","buck-out/gen/submodules/sqlcipher/sqlcipher-Profile.xcconfig","buck-out/gen/submodules/sqlcipher/sqlcipher-Release.xcconfig"],"copy-in-xcode":[]} \ No newline at end of file +{"required-targets":["//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_ac3_parser.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_adts_parser.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_avcodec.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_avdct.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_avfft.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_d3d11va.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_dirac.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_dv_profile.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_dxva2.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_jni.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_mediacodec.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_qsv.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_vaapi.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_vdpau.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_version.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_videotoolbox.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_vorbis_parser.h","//submodules/FFMpeg:ffmpeg_header_libavcodec_sub_xvmc.h","//submodules/FFMpeg:ffmpeg_header_libavformat_sub_avformat.h","//submodules/FFMpeg:ffmpeg_header_libavformat_sub_avio.h","//submodules/FFMpeg:ffmpeg_header_libavformat_sub_version.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_adler32.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_aes.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_aes_ctr.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_attributes.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_audio_fifo.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_avassert.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_avconfig.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_avstring.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_avutil.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_base64.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_blowfish.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_bprint.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_bswap.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_buffer.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_camellia.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_cast5.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_channel_layout.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_common.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_cpu.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_crc.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_des.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_dict.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_display.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_downmix_info.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_encryption_info.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_error.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_eval.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_ffversion.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_fifo.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_file.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_frame.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hash.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hmac.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_cuda.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_d3d11va.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_drm.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_dxva2.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_mediacodec.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_qsv.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_vaapi.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_vdpau.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_hwcontext_videotoolbox.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_imgutils.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_intfloat.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_intreadwrite.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_lfg.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_log.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_lzo.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_macros.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_mastering_display_metadata.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_mathematics.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_md5.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_mem.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_motion_vector.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_murmur3.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_opt.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_parseutils.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_pixdesc.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_pixelutils.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_pixfmt.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_random_seed.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_rational.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_rc4.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_replaygain.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_ripemd.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_samplefmt.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_sha.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_sha512.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_spherical.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_stereo3d.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_tea.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_threadmessage.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_time.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_timecode.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_timestamp.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_tree.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_twofish.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_version.h","//submodules/FFMpeg:ffmpeg_header_libavutil_sub_xtea.h","//submodules/FFMpeg:ffmpeg_header_libswresample_sub_swresample.h","//submodules/FFMpeg:ffmpeg_header_libswresample_sub_version.h","//submodules/FFMpeg:libffmpeg_build","//submodules/MtProtoKit:openssl_libs","//submodules/MtProtoKit:ton_libs","//submodules/Opus:opus_lib_file","//submodules/WebP:WebP_lib_file"],"xcconfig-paths":["buck-out/gen/AppLibrary-Debug.xcconfig","buck-out/gen/AppLibrary-Profile.xcconfig","buck-out/gen/AppLibrary-Release.xcconfig","buck-out/gen/IntentsExtension#iphonesimulator-x86_64-Debug.xcconfig","buck-out/gen/IntentsExtension#iphonesimulator-x86_64-Profile.xcconfig","buck-out/gen/IntentsExtension#iphonesimulator-x86_64-Release.xcconfig","buck-out/gen/NotificationContentExtension#iphonesimulator-x86_64-Debug.xcconfig","buck-out/gen/NotificationContentExtension#iphonesimulator-x86_64-Profile.xcconfig","buck-out/gen/NotificationContentExtension#iphonesimulator-x86_64-Release.xcconfig","buck-out/gen/NotificationServiceExtension#iphonesimulator-x86_64-Debug.xcconfig","buck-out/gen/NotificationServiceExtension#iphonesimulator-x86_64-Profile.xcconfig","buck-out/gen/NotificationServiceExtension#iphonesimulator-x86_64-Release.xcconfig","buck-out/gen/ShareExtension#iphonesimulator-x86_64-Debug.xcconfig","buck-out/gen/ShareExtension#iphonesimulator-x86_64-Profile.xcconfig","buck-out/gen/ShareExtension#iphonesimulator-x86_64-Release.xcconfig","buck-out/gen/Telegram-Debug.xcconfig","buck-out/gen/Telegram-Profile.xcconfig","buck-out/gen/Telegram-Release.xcconfig","buck-out/gen/WatchApp#watchsimulator-i386-Debug.xcconfig","buck-out/gen/WatchApp#watchsimulator-i386-Profile.xcconfig","buck-out/gen/WatchApp#watchsimulator-i386-Release.xcconfig","buck-out/gen/WatchAppExtension#watchsimulator-i386-Debug.xcconfig","buck-out/gen/WatchAppExtension#watchsimulator-i386-Profile.xcconfig","buck-out/gen/WatchAppExtension#watchsimulator-i386-Release.xcconfig","buck-out/gen/WidgetExtension#iphonesimulator-x86_64-Debug.xcconfig","buck-out/gen/WidgetExtension#iphonesimulator-x86_64-Profile.xcconfig","buck-out/gen/WidgetExtension#iphonesimulator-x86_64-Release.xcconfig","buck-out/gen/submodules/AccountContext/AccountContext-Debug.xcconfig","buck-out/gen/submodules/AccountContext/AccountContext-Profile.xcconfig","buck-out/gen/submodules/AccountContext/AccountContext-Release.xcconfig","buck-out/gen/submodules/ActionSheetPeerItem/ActionSheetPeerItem-Debug.xcconfig","buck-out/gen/submodules/ActionSheetPeerItem/ActionSheetPeerItem-Profile.xcconfig","buck-out/gen/submodules/ActionSheetPeerItem/ActionSheetPeerItem-Release.xcconfig","buck-out/gen/submodules/ActivityIndicator/ActivityIndicator-Debug.xcconfig","buck-out/gen/submodules/ActivityIndicator/ActivityIndicator-Profile.xcconfig","buck-out/gen/submodules/ActivityIndicator/ActivityIndicator-Release.xcconfig","buck-out/gen/submodules/AlertUI/AlertUI-Debug.xcconfig","buck-out/gen/submodules/AlertUI/AlertUI-Profile.xcconfig","buck-out/gen/submodules/AlertUI/AlertUI-Release.xcconfig","buck-out/gen/submodules/AnimationUI/AnimationUI-Debug.xcconfig","buck-out/gen/submodules/AnimationUI/AnimationUI-Profile.xcconfig","buck-out/gen/submodules/AnimationUI/AnimationUI-Release.xcconfig","buck-out/gen/submodules/AppBundle/AppBundle-Debug.xcconfig","buck-out/gen/submodules/AppBundle/AppBundle-Profile.xcconfig","buck-out/gen/submodules/AppBundle/AppBundle-Release.xcconfig","buck-out/gen/submodules/AsyncDisplayKit/AsyncDisplayKit#shared-Debug.xcconfig","buck-out/gen/submodules/AsyncDisplayKit/AsyncDisplayKit#shared-Profile.xcconfig","buck-out/gen/submodules/AsyncDisplayKit/AsyncDisplayKit#shared-Release.xcconfig","buck-out/gen/submodules/AuthorizationUI/AuthorizationUI-Debug.xcconfig","buck-out/gen/submodules/AuthorizationUI/AuthorizationUI-Profile.xcconfig","buck-out/gen/submodules/AuthorizationUI/AuthorizationUI-Release.xcconfig","buck-out/gen/submodules/AvatarNode/AvatarNode-Debug.xcconfig","buck-out/gen/submodules/AvatarNode/AvatarNode-Profile.xcconfig","buck-out/gen/submodules/AvatarNode/AvatarNode-Release.xcconfig","buck-out/gen/submodules/BotPaymentsUI/BotPaymentsUI-Debug.xcconfig","buck-out/gen/submodules/BotPaymentsUI/BotPaymentsUI-Profile.xcconfig","buck-out/gen/submodules/BotPaymentsUI/BotPaymentsUI-Release.xcconfig","buck-out/gen/submodules/BuildConfig/BuildConfig-Debug.xcconfig","buck-out/gen/submodules/BuildConfig/BuildConfig-Profile.xcconfig","buck-out/gen/submodules/BuildConfig/BuildConfig-Release.xcconfig","buck-out/gen/submodules/CallListUI/CallListUI-Debug.xcconfig","buck-out/gen/submodules/CallListUI/CallListUI-Profile.xcconfig","buck-out/gen/submodules/CallListUI/CallListUI-Release.xcconfig","buck-out/gen/submodules/ChatListSearchItemHeader/ChatListSearchItemHeader-Debug.xcconfig","buck-out/gen/submodules/ChatListSearchItemHeader/ChatListSearchItemHeader-Profile.xcconfig","buck-out/gen/submodules/ChatListSearchItemHeader/ChatListSearchItemHeader-Release.xcconfig","buck-out/gen/submodules/ChatListSearchItemNode/ChatListSearchItemNode-Debug.xcconfig","buck-out/gen/submodules/ChatListSearchItemNode/ChatListSearchItemNode-Profile.xcconfig","buck-out/gen/submodules/ChatListSearchItemNode/ChatListSearchItemNode-Release.xcconfig","buck-out/gen/submodules/ChatListSearchRecentPeersNode/ChatListSearchRecentPeersNode-Debug.xcconfig","buck-out/gen/submodules/ChatListSearchRecentPeersNode/ChatListSearchRecentPeersNode-Profile.xcconfig","buck-out/gen/submodules/ChatListSearchRecentPeersNode/ChatListSearchRecentPeersNode-Release.xcconfig","buck-out/gen/submodules/ChatListUI/ChatListUI-Debug.xcconfig","buck-out/gen/submodules/ChatListUI/ChatListUI-Profile.xcconfig","buck-out/gen/submodules/ChatListUI/ChatListUI-Release.xcconfig","buck-out/gen/submodules/ChatTitleActivityNode/ChatTitleActivityNode-Debug.xcconfig","buck-out/gen/submodules/ChatTitleActivityNode/ChatTitleActivityNode-Profile.xcconfig","buck-out/gen/submodules/ChatTitleActivityNode/ChatTitleActivityNode-Release.xcconfig","buck-out/gen/submodules/CheckNode/CheckNode-Debug.xcconfig","buck-out/gen/submodules/CheckNode/CheckNode-Profile.xcconfig","buck-out/gen/submodules/CheckNode/CheckNode-Release.xcconfig","buck-out/gen/submodules/ComposePollUI/ComposePollUI-Debug.xcconfig","buck-out/gen/submodules/ComposePollUI/ComposePollUI-Profile.xcconfig","buck-out/gen/submodules/ComposePollUI/ComposePollUI-Release.xcconfig","buck-out/gen/submodules/ContactListUI/ContactListUI-Debug.xcconfig","buck-out/gen/submodules/ContactListUI/ContactListUI-Profile.xcconfig","buck-out/gen/submodules/ContactListUI/ContactListUI-Release.xcconfig","buck-out/gen/submodules/ContactsPeerItem/ContactsPeerItem-Debug.xcconfig","buck-out/gen/submodules/ContactsPeerItem/ContactsPeerItem-Profile.xcconfig","buck-out/gen/submodules/ContactsPeerItem/ContactsPeerItem-Release.xcconfig","buck-out/gen/submodules/ContextUI/ContextUI-Debug.xcconfig","buck-out/gen/submodules/ContextUI/ContextUI-Profile.xcconfig","buck-out/gen/submodules/ContextUI/ContextUI-Release.xcconfig","buck-out/gen/submodules/CounterContollerTitleView/CounterContollerTitleView-Debug.xcconfig","buck-out/gen/submodules/CounterContollerTitleView/CounterContollerTitleView-Profile.xcconfig","buck-out/gen/submodules/CounterContollerTitleView/CounterContollerTitleView-Release.xcconfig","buck-out/gen/submodules/CountrySelectionUI/CountrySelectionUI-Debug.xcconfig","buck-out/gen/submodules/CountrySelectionUI/CountrySelectionUI-Profile.xcconfig","buck-out/gen/submodules/CountrySelectionUI/CountrySelectionUI-Release.xcconfig","buck-out/gen/submodules/Crc32/Crc32-Debug.xcconfig","buck-out/gen/submodules/Crc32/Crc32-Profile.xcconfig","buck-out/gen/submodules/Crc32/Crc32-Release.xcconfig","buck-out/gen/submodules/DateSelectionUI/DateSelectionUI-Debug.xcconfig","buck-out/gen/submodules/DateSelectionUI/DateSelectionUI-Profile.xcconfig","buck-out/gen/submodules/DateSelectionUI/DateSelectionUI-Release.xcconfig","buck-out/gen/submodules/DeleteChatPeerActionSheetItem/DeleteChatPeerActionSheetItem-Debug.xcconfig","buck-out/gen/submodules/DeleteChatPeerActionSheetItem/DeleteChatPeerActionSheetItem-Profile.xcconfig","buck-out/gen/submodules/DeleteChatPeerActionSheetItem/DeleteChatPeerActionSheetItem-Release.xcconfig","buck-out/gen/submodules/DeviceAccess/DeviceAccess-Debug.xcconfig","buck-out/gen/submodules/DeviceAccess/DeviceAccess-Profile.xcconfig","buck-out/gen/submodules/DeviceAccess/DeviceAccess-Release.xcconfig","buck-out/gen/submodules/DeviceLocationManager/DeviceLocationManager-Debug.xcconfig","buck-out/gen/submodules/DeviceLocationManager/DeviceLocationManager-Profile.xcconfig","buck-out/gen/submodules/DeviceLocationManager/DeviceLocationManager-Release.xcconfig","buck-out/gen/submodules/DeviceProximity/DeviceProximity-Debug.xcconfig","buck-out/gen/submodules/DeviceProximity/DeviceProximity-Profile.xcconfig","buck-out/gen/submodules/DeviceProximity/DeviceProximity-Release.xcconfig","buck-out/gen/submodules/DirectionalPanGesture/DirectionalPanGesture-Debug.xcconfig","buck-out/gen/submodules/DirectionalPanGesture/DirectionalPanGesture-Profile.xcconfig","buck-out/gen/submodules/DirectionalPanGesture/DirectionalPanGesture-Release.xcconfig","buck-out/gen/submodules/Display/Display#shared-Debug.xcconfig","buck-out/gen/submodules/Display/Display#shared-Profile.xcconfig","buck-out/gen/submodules/Display/Display#shared-Release.xcconfig","buck-out/gen/submodules/Emoji/Emoji-Debug.xcconfig","buck-out/gen/submodules/Emoji/Emoji-Profile.xcconfig","buck-out/gen/submodules/Emoji/Emoji-Release.xcconfig","buck-out/gen/submodules/EncryptionKeyVisualization/EncryptionKeyVisualization-Debug.xcconfig","buck-out/gen/submodules/EncryptionKeyVisualization/EncryptionKeyVisualization-Profile.xcconfig","buck-out/gen/submodules/EncryptionKeyVisualization/EncryptionKeyVisualization-Release.xcconfig","buck-out/gen/submodules/FFMpeg/FFMpeg-Debug.xcconfig","buck-out/gen/submodules/FFMpeg/FFMpeg-Profile.xcconfig","buck-out/gen/submodules/FFMpeg/FFMpeg-Release.xcconfig","buck-out/gen/submodules/FFMpeg/libffmpeg-Debug.xcconfig","buck-out/gen/submodules/FFMpeg/libffmpeg-Profile.xcconfig","buck-out/gen/submodules/FFMpeg/libffmpeg-Release.xcconfig","buck-out/gen/submodules/GZip/GZip-Debug.xcconfig","buck-out/gen/submodules/GZip/GZip-Profile.xcconfig","buck-out/gen/submodules/GZip/GZip-Release.xcconfig","buck-out/gen/submodules/GalleryUI/GalleryUI-Debug.xcconfig","buck-out/gen/submodules/GalleryUI/GalleryUI-Profile.xcconfig","buck-out/gen/submodules/GalleryUI/GalleryUI-Release.xcconfig","buck-out/gen/submodules/GameUI/GameUI-Debug.xcconfig","buck-out/gen/submodules/GameUI/GameUI-Profile.xcconfig","buck-out/gen/submodules/GameUI/GameUI-Release.xcconfig","buck-out/gen/submodules/Geocoding/Geocoding-Debug.xcconfig","buck-out/gen/submodules/Geocoding/Geocoding-Profile.xcconfig","buck-out/gen/submodules/Geocoding/Geocoding-Release.xcconfig","buck-out/gen/submodules/GridMessageSelectionNode/GridMessageSelectionNode-Debug.xcconfig","buck-out/gen/submodules/GridMessageSelectionNode/GridMessageSelectionNode-Profile.xcconfig","buck-out/gen/submodules/GridMessageSelectionNode/GridMessageSelectionNode-Release.xcconfig","buck-out/gen/submodules/HashtagSearchUI/HashtagSearchUI-Debug.xcconfig","buck-out/gen/submodules/HashtagSearchUI/HashtagSearchUI-Profile.xcconfig","buck-out/gen/submodules/HashtagSearchUI/HashtagSearchUI-Release.xcconfig","buck-out/gen/submodules/HexColor/HexColor-Debug.xcconfig","buck-out/gen/submodules/HexColor/HexColor-Profile.xcconfig","buck-out/gen/submodules/HexColor/HexColor-Release.xcconfig","buck-out/gen/submodules/HockeySDK-iOS/HockeySDK-Debug.xcconfig","buck-out/gen/submodules/HockeySDK-iOS/HockeySDK-Profile.xcconfig","buck-out/gen/submodules/HockeySDK-iOS/HockeySDK-Release.xcconfig","buck-out/gen/submodules/HorizontalPeerItem/HorizontalPeerItem-Debug.xcconfig","buck-out/gen/submodules/HorizontalPeerItem/HorizontalPeerItem-Profile.xcconfig","buck-out/gen/submodules/HorizontalPeerItem/HorizontalPeerItem-Release.xcconfig","buck-out/gen/submodules/ImageBlur/ImageBlur-Debug.xcconfig","buck-out/gen/submodules/ImageBlur/ImageBlur-Profile.xcconfig","buck-out/gen/submodules/ImageBlur/ImageBlur-Release.xcconfig","buck-out/gen/submodules/ImageCompression/ImageCompression-Debug.xcconfig","buck-out/gen/submodules/ImageCompression/ImageCompression-Profile.xcconfig","buck-out/gen/submodules/ImageCompression/ImageCompression-Release.xcconfig","buck-out/gen/submodules/ImageTransparency/ImageTransparency-Debug.xcconfig","buck-out/gen/submodules/ImageTransparency/ImageTransparency-Profile.xcconfig","buck-out/gen/submodules/ImageTransparency/ImageTransparency-Release.xcconfig","buck-out/gen/submodules/InstantPageCache/InstantPageCache-Debug.xcconfig","buck-out/gen/submodules/InstantPageCache/InstantPageCache-Profile.xcconfig","buck-out/gen/submodules/InstantPageCache/InstantPageCache-Release.xcconfig","buck-out/gen/submodules/InstantPageUI/InstantPageUI-Debug.xcconfig","buck-out/gen/submodules/InstantPageUI/InstantPageUI-Profile.xcconfig","buck-out/gen/submodules/InstantPageUI/InstantPageUI-Release.xcconfig","buck-out/gen/submodules/ItemListAddressItem/ItemListAddressItem-Debug.xcconfig","buck-out/gen/submodules/ItemListAddressItem/ItemListAddressItem-Profile.xcconfig","buck-out/gen/submodules/ItemListAddressItem/ItemListAddressItem-Release.xcconfig","buck-out/gen/submodules/ItemListAvatarAndNameInfoItem/ItemListAvatarAndNameInfoItem-Debug.xcconfig","buck-out/gen/submodules/ItemListAvatarAndNameInfoItem/ItemListAvatarAndNameInfoItem-Profile.xcconfig","buck-out/gen/submodules/ItemListAvatarAndNameInfoItem/ItemListAvatarAndNameInfoItem-Release.xcconfig","buck-out/gen/submodules/ItemListPeerActionItem/ItemListPeerActionItem-Debug.xcconfig","buck-out/gen/submodules/ItemListPeerActionItem/ItemListPeerActionItem-Profile.xcconfig","buck-out/gen/submodules/ItemListPeerActionItem/ItemListPeerActionItem-Release.xcconfig","buck-out/gen/submodules/ItemListPeerItem/ItemListPeerItem-Debug.xcconfig","buck-out/gen/submodules/ItemListPeerItem/ItemListPeerItem-Profile.xcconfig","buck-out/gen/submodules/ItemListPeerItem/ItemListPeerItem-Release.xcconfig","buck-out/gen/submodules/ItemListStickerPackItem/ItemListStickerPackItem-Debug.xcconfig","buck-out/gen/submodules/ItemListStickerPackItem/ItemListStickerPackItem-Profile.xcconfig","buck-out/gen/submodules/ItemListStickerPackItem/ItemListStickerPackItem-Release.xcconfig","buck-out/gen/submodules/ItemListUI/ItemListUI-Debug.xcconfig","buck-out/gen/submodules/ItemListUI/ItemListUI-Profile.xcconfig","buck-out/gen/submodules/ItemListUI/ItemListUI-Release.xcconfig","buck-out/gen/submodules/JoinLinkPreviewUI/JoinLinkPreviewUI-Debug.xcconfig","buck-out/gen/submodules/JoinLinkPreviewUI/JoinLinkPreviewUI-Profile.xcconfig","buck-out/gen/submodules/JoinLinkPreviewUI/JoinLinkPreviewUI-Release.xcconfig","buck-out/gen/submodules/LanguageLinkPreviewUI/LanguageLinkPreviewUI-Debug.xcconfig","buck-out/gen/submodules/LanguageLinkPreviewUI/LanguageLinkPreviewUI-Profile.xcconfig","buck-out/gen/submodules/LanguageLinkPreviewUI/LanguageLinkPreviewUI-Release.xcconfig","buck-out/gen/submodules/LanguageSuggestionUI/LanguageSuggestionUI-Debug.xcconfig","buck-out/gen/submodules/LanguageSuggestionUI/LanguageSuggestionUI-Profile.xcconfig","buck-out/gen/submodules/LanguageSuggestionUI/LanguageSuggestionUI-Release.xcconfig","buck-out/gen/submodules/LegacyComponents/LegacyComponents-Debug.xcconfig","buck-out/gen/submodules/LegacyComponents/LegacyComponents-Profile.xcconfig","buck-out/gen/submodules/LegacyComponents/LegacyComponents-Release.xcconfig","buck-out/gen/submodules/LegacyDataImport/LegacyDataImport-Debug.xcconfig","buck-out/gen/submodules/LegacyDataImport/LegacyDataImport-Profile.xcconfig","buck-out/gen/submodules/LegacyDataImport/LegacyDataImport-Release.xcconfig","buck-out/gen/submodules/LegacyMediaPickerUI/LegacyMediaPickerUI-Debug.xcconfig","buck-out/gen/submodules/LegacyMediaPickerUI/LegacyMediaPickerUI-Profile.xcconfig","buck-out/gen/submodules/LegacyMediaPickerUI/LegacyMediaPickerUI-Release.xcconfig","buck-out/gen/submodules/LegacyUI/LegacyUI-Debug.xcconfig","buck-out/gen/submodules/LegacyUI/LegacyUI-Profile.xcconfig","buck-out/gen/submodules/LegacyUI/LegacyUI-Release.xcconfig","buck-out/gen/submodules/LightweightAccountData/LightweightAccountData-Debug.xcconfig","buck-out/gen/submodules/LightweightAccountData/LightweightAccountData-Profile.xcconfig","buck-out/gen/submodules/LightweightAccountData/LightweightAccountData-Release.xcconfig","buck-out/gen/submodules/ListSectionHeaderNode/ListSectionHeaderNode-Debug.xcconfig","buck-out/gen/submodules/ListSectionHeaderNode/ListSectionHeaderNode-Profile.xcconfig","buck-out/gen/submodules/ListSectionHeaderNode/ListSectionHeaderNode-Release.xcconfig","buck-out/gen/submodules/LiveLocationManager/LiveLocationManager-Debug.xcconfig","buck-out/gen/submodules/LiveLocationManager/LiveLocationManager-Profile.xcconfig","buck-out/gen/submodules/LiveLocationManager/LiveLocationManager-Release.xcconfig","buck-out/gen/submodules/LiveLocationPositionNode/LiveLocationPositionNode-Debug.xcconfig","buck-out/gen/submodules/LiveLocationPositionNode/LiveLocationPositionNode-Profile.xcconfig","buck-out/gen/submodules/LiveLocationPositionNode/LiveLocationPositionNode-Release.xcconfig","buck-out/gen/submodules/LiveLocationTimerNode/LiveLocationTimerNode-Debug.xcconfig","buck-out/gen/submodules/LiveLocationTimerNode/LiveLocationTimerNode-Profile.xcconfig","buck-out/gen/submodules/LiveLocationTimerNode/LiveLocationTimerNode-Release.xcconfig","buck-out/gen/submodules/LocalAuth/LocalAuth-Debug.xcconfig","buck-out/gen/submodules/LocalAuth/LocalAuth-Profile.xcconfig","buck-out/gen/submodules/LocalAuth/LocalAuth-Release.xcconfig","buck-out/gen/submodules/LocalMediaResources/LocalMediaResources-Debug.xcconfig","buck-out/gen/submodules/LocalMediaResources/LocalMediaResources-Profile.xcconfig","buck-out/gen/submodules/LocalMediaResources/LocalMediaResources-Release.xcconfig","buck-out/gen/submodules/LocalizedPeerData/LocalizedPeerData-Debug.xcconfig","buck-out/gen/submodules/LocalizedPeerData/LocalizedPeerData-Profile.xcconfig","buck-out/gen/submodules/LocalizedPeerData/LocalizedPeerData-Release.xcconfig","buck-out/gen/submodules/LocationUI/LocationUI-Debug.xcconfig","buck-out/gen/submodules/LocationUI/LocationUI-Profile.xcconfig","buck-out/gen/submodules/LocationUI/LocationUI-Release.xcconfig","buck-out/gen/submodules/MapResourceToAvatarSizes/MapResourceToAvatarSizes-Debug.xcconfig","buck-out/gen/submodules/MapResourceToAvatarSizes/MapResourceToAvatarSizes-Profile.xcconfig","buck-out/gen/submodules/MapResourceToAvatarSizes/MapResourceToAvatarSizes-Release.xcconfig","buck-out/gen/submodules/MediaPlayer/UniversalMediaPlayer-Debug.xcconfig","buck-out/gen/submodules/MediaPlayer/UniversalMediaPlayer-Profile.xcconfig","buck-out/gen/submodules/MediaPlayer/UniversalMediaPlayer-Release.xcconfig","buck-out/gen/submodules/MediaResources/MediaResources-Debug.xcconfig","buck-out/gen/submodules/MediaResources/MediaResources-Profile.xcconfig","buck-out/gen/submodules/MediaResources/MediaResources-Release.xcconfig","buck-out/gen/submodules/MergeLists/MergeLists-Debug.xcconfig","buck-out/gen/submodules/MergeLists/MergeLists-Profile.xcconfig","buck-out/gen/submodules/MergeLists/MergeLists-Release.xcconfig","buck-out/gen/submodules/MessageReactionListUI/MessageReactionListUI-Debug.xcconfig","buck-out/gen/submodules/MessageReactionListUI/MessageReactionListUI-Profile.xcconfig","buck-out/gen/submodules/MessageReactionListUI/MessageReactionListUI-Release.xcconfig","buck-out/gen/submodules/MimeTypes/MimeTypes-Debug.xcconfig","buck-out/gen/submodules/MimeTypes/MimeTypes-Profile.xcconfig","buck-out/gen/submodules/MimeTypes/MimeTypes-Release.xcconfig","buck-out/gen/submodules/MosaicLayout/MosaicLayout-Debug.xcconfig","buck-out/gen/submodules/MosaicLayout/MosaicLayout-Profile.xcconfig","buck-out/gen/submodules/MosaicLayout/MosaicLayout-Release.xcconfig","buck-out/gen/submodules/MtProtoKit/MtProtoKit#shared-Debug.xcconfig","buck-out/gen/submodules/MtProtoKit/MtProtoKit#shared-Profile.xcconfig","buck-out/gen/submodules/MtProtoKit/MtProtoKit#shared-Release.xcconfig","buck-out/gen/submodules/MtProtoKit/openssl-Debug.xcconfig","buck-out/gen/submodules/MtProtoKit/openssl-Profile.xcconfig","buck-out/gen/submodules/MtProtoKit/openssl-Release.xcconfig","buck-out/gen/submodules/MtProtoKit/ton-Debug.xcconfig","buck-out/gen/submodules/MtProtoKit/ton-Profile.xcconfig","buck-out/gen/submodules/MtProtoKit/ton-Release.xcconfig","buck-out/gen/submodules/MusicAlbumArtResources/MusicAlbumArtResources-Debug.xcconfig","buck-out/gen/submodules/MusicAlbumArtResources/MusicAlbumArtResources-Profile.xcconfig","buck-out/gen/submodules/MusicAlbumArtResources/MusicAlbumArtResources-Release.xcconfig","buck-out/gen/submodules/NotificationMuteSettingsUI/NotificationMuteSettingsUI-Debug.xcconfig","buck-out/gen/submodules/NotificationMuteSettingsUI/NotificationMuteSettingsUI-Profile.xcconfig","buck-out/gen/submodules/NotificationMuteSettingsUI/NotificationMuteSettingsUI-Release.xcconfig","buck-out/gen/submodules/NotificationSoundSelectionUI/NotificationSoundSelectionUI-Debug.xcconfig","buck-out/gen/submodules/NotificationSoundSelectionUI/NotificationSoundSelectionUI-Profile.xcconfig","buck-out/gen/submodules/NotificationSoundSelectionUI/NotificationSoundSelectionUI-Release.xcconfig","buck-out/gen/submodules/OpenInExternalAppUI/OpenInExternalAppUI-Debug.xcconfig","buck-out/gen/submodules/OpenInExternalAppUI/OpenInExternalAppUI-Profile.xcconfig","buck-out/gen/submodules/OpenInExternalAppUI/OpenInExternalAppUI-Release.xcconfig","buck-out/gen/submodules/Opus/opus-Debug.xcconfig","buck-out/gen/submodules/Opus/opus-Profile.xcconfig","buck-out/gen/submodules/Opus/opus-Release.xcconfig","buck-out/gen/submodules/Opus/opus_lib-Debug.xcconfig","buck-out/gen/submodules/Opus/opus_lib-Profile.xcconfig","buck-out/gen/submodules/Opus/opus_lib-Release.xcconfig","buck-out/gen/submodules/OpusBinding/OpusBinding-Debug.xcconfig","buck-out/gen/submodules/OpusBinding/OpusBinding-Profile.xcconfig","buck-out/gen/submodules/OpusBinding/OpusBinding-Release.xcconfig","buck-out/gen/submodules/OverlayStatusController/OverlayStatusController-Debug.xcconfig","buck-out/gen/submodules/OverlayStatusController/OverlayStatusController-Profile.xcconfig","buck-out/gen/submodules/OverlayStatusController/OverlayStatusController-Release.xcconfig","buck-out/gen/submodules/PasscodeUI/PasscodeUI-Debug.xcconfig","buck-out/gen/submodules/PasscodeUI/PasscodeUI-Profile.xcconfig","buck-out/gen/submodules/PasscodeUI/PasscodeUI-Release.xcconfig","buck-out/gen/submodules/PassportUI/PassportUI-Debug.xcconfig","buck-out/gen/submodules/PassportUI/PassportUI-Profile.xcconfig","buck-out/gen/submodules/PassportUI/PassportUI-Release.xcconfig","buck-out/gen/submodules/PasswordSetupUI/PasswordSetupUI-Debug.xcconfig","buck-out/gen/submodules/PasswordSetupUI/PasswordSetupUI-Profile.xcconfig","buck-out/gen/submodules/PasswordSetupUI/PasswordSetupUI-Release.xcconfig","buck-out/gen/submodules/Pdf/Pdf-Debug.xcconfig","buck-out/gen/submodules/Pdf/Pdf-Profile.xcconfig","buck-out/gen/submodules/Pdf/Pdf-Release.xcconfig","buck-out/gen/submodules/PeerAvatarGalleryUI/PeerAvatarGalleryUI-Debug.xcconfig","buck-out/gen/submodules/PeerAvatarGalleryUI/PeerAvatarGalleryUI-Profile.xcconfig","buck-out/gen/submodules/PeerAvatarGalleryUI/PeerAvatarGalleryUI-Release.xcconfig","buck-out/gen/submodules/PeerInfoUI/PeerInfoUI-Debug.xcconfig","buck-out/gen/submodules/PeerInfoUI/PeerInfoUI-Profile.xcconfig","buck-out/gen/submodules/PeerInfoUI/PeerInfoUI-Release.xcconfig","buck-out/gen/submodules/PeerOnlineMarkerNode/PeerOnlineMarkerNode-Debug.xcconfig","buck-out/gen/submodules/PeerOnlineMarkerNode/PeerOnlineMarkerNode-Profile.xcconfig","buck-out/gen/submodules/PeerOnlineMarkerNode/PeerOnlineMarkerNode-Release.xcconfig","buck-out/gen/submodules/PeerPresenceStatusManager/PeerPresenceStatusManager-Debug.xcconfig","buck-out/gen/submodules/PeerPresenceStatusManager/PeerPresenceStatusManager-Profile.xcconfig","buck-out/gen/submodules/PeerPresenceStatusManager/PeerPresenceStatusManager-Release.xcconfig","buck-out/gen/submodules/PeersNearbyIconNode/PeersNearbyIconNode-Debug.xcconfig","buck-out/gen/submodules/PeersNearbyIconNode/PeersNearbyIconNode-Profile.xcconfig","buck-out/gen/submodules/PeersNearbyIconNode/PeersNearbyIconNode-Release.xcconfig","buck-out/gen/submodules/PeersNearbyUI/PeersNearbyUI-Debug.xcconfig","buck-out/gen/submodules/PeersNearbyUI/PeersNearbyUI-Profile.xcconfig","buck-out/gen/submodules/PeersNearbyUI/PeersNearbyUI-Release.xcconfig","buck-out/gen/submodules/PersistentStringHash/PersistentStringHash-Debug.xcconfig","buck-out/gen/submodules/PersistentStringHash/PersistentStringHash-Profile.xcconfig","buck-out/gen/submodules/PersistentStringHash/PersistentStringHash-Release.xcconfig","buck-out/gen/submodules/PhoneInputNode/PhoneInputNode-Debug.xcconfig","buck-out/gen/submodules/PhoneInputNode/PhoneInputNode-Profile.xcconfig","buck-out/gen/submodules/PhoneInputNode/PhoneInputNode-Release.xcconfig","buck-out/gen/submodules/PhotoResources/PhotoResources-Debug.xcconfig","buck-out/gen/submodules/PhotoResources/PhotoResources-Profile.xcconfig","buck-out/gen/submodules/PhotoResources/PhotoResources-Release.xcconfig","buck-out/gen/submodules/PlatformRestrictionMatching/PlatformRestrictionMatching-Debug.xcconfig","buck-out/gen/submodules/PlatformRestrictionMatching/PlatformRestrictionMatching-Profile.xcconfig","buck-out/gen/submodules/PlatformRestrictionMatching/PlatformRestrictionMatching-Release.xcconfig","buck-out/gen/submodules/Postbox/Postbox#shared-Debug.xcconfig","buck-out/gen/submodules/Postbox/Postbox#shared-Profile.xcconfig","buck-out/gen/submodules/Postbox/Postbox#shared-Release.xcconfig","buck-out/gen/submodules/ProgressNavigationButtonNode/ProgressNavigationButtonNode-Debug.xcconfig","buck-out/gen/submodules/ProgressNavigationButtonNode/ProgressNavigationButtonNode-Profile.xcconfig","buck-out/gen/submodules/ProgressNavigationButtonNode/ProgressNavigationButtonNode-Release.xcconfig","buck-out/gen/submodules/QrCode/QrCode-Debug.xcconfig","buck-out/gen/submodules/QrCode/QrCode-Profile.xcconfig","buck-out/gen/submodules/QrCode/QrCode-Release.xcconfig","buck-out/gen/submodules/RMIntro/RMIntro-Debug.xcconfig","buck-out/gen/submodules/RMIntro/RMIntro-Profile.xcconfig","buck-out/gen/submodules/RMIntro/RMIntro-Release.xcconfig","buck-out/gen/submodules/RadialStatusNode/RadialStatusNode-Debug.xcconfig","buck-out/gen/submodules/RadialStatusNode/RadialStatusNode-Profile.xcconfig","buck-out/gen/submodules/RadialStatusNode/RadialStatusNode-Release.xcconfig","buck-out/gen/submodules/RaiseToListen/RaiseToListen-Debug.xcconfig","buck-out/gen/submodules/RaiseToListen/RaiseToListen-Profile.xcconfig","buck-out/gen/submodules/RaiseToListen/RaiseToListen-Release.xcconfig","buck-out/gen/submodules/ReactionSelectionNode/ReactionSelectionNode-Debug.xcconfig","buck-out/gen/submodules/ReactionSelectionNode/ReactionSelectionNode-Profile.xcconfig","buck-out/gen/submodules/ReactionSelectionNode/ReactionSelectionNode-Release.xcconfig","buck-out/gen/submodules/SSignalKit/SSignalKit/SSignalKit-Debug.xcconfig","buck-out/gen/submodules/SSignalKit/SSignalKit/SSignalKit-Profile.xcconfig","buck-out/gen/submodules/SSignalKit/SSignalKit/SSignalKit-Release.xcconfig","buck-out/gen/submodules/SSignalKit/SwiftSignalKit/SwiftSignalKit#shared-Debug.xcconfig","buck-out/gen/submodules/SSignalKit/SwiftSignalKit/SwiftSignalKit#shared-Profile.xcconfig","buck-out/gen/submodules/SSignalKit/SwiftSignalKit/SwiftSignalKit#shared-Release.xcconfig","buck-out/gen/submodules/SaveToCameraRoll/SaveToCameraRoll-Debug.xcconfig","buck-out/gen/submodules/SaveToCameraRoll/SaveToCameraRoll-Profile.xcconfig","buck-out/gen/submodules/SaveToCameraRoll/SaveToCameraRoll-Release.xcconfig","buck-out/gen/submodules/ScreenCaptureDetection/ScreenCaptureDetection-Debug.xcconfig","buck-out/gen/submodules/ScreenCaptureDetection/ScreenCaptureDetection-Profile.xcconfig","buck-out/gen/submodules/ScreenCaptureDetection/ScreenCaptureDetection-Release.xcconfig","buck-out/gen/submodules/SearchBarNode/SearchBarNode-Debug.xcconfig","buck-out/gen/submodules/SearchBarNode/SearchBarNode-Profile.xcconfig","buck-out/gen/submodules/SearchBarNode/SearchBarNode-Release.xcconfig","buck-out/gen/submodules/SearchUI/SearchUI-Debug.xcconfig","buck-out/gen/submodules/SearchUI/SearchUI-Profile.xcconfig","buck-out/gen/submodules/SearchUI/SearchUI-Release.xcconfig","buck-out/gen/submodules/SegmentedControlNode/SegmentedControlNode-Debug.xcconfig","buck-out/gen/submodules/SegmentedControlNode/SegmentedControlNode-Profile.xcconfig","buck-out/gen/submodules/SegmentedControlNode/SegmentedControlNode-Release.xcconfig","buck-out/gen/submodules/SelectablePeerNode/SelectablePeerNode-Debug.xcconfig","buck-out/gen/submodules/SelectablePeerNode/SelectablePeerNode-Profile.xcconfig","buck-out/gen/submodules/SelectablePeerNode/SelectablePeerNode-Release.xcconfig","buck-out/gen/submodules/SettingsUI/SettingsUI-Debug.xcconfig","buck-out/gen/submodules/SettingsUI/SettingsUI-Profile.xcconfig","buck-out/gen/submodules/SettingsUI/SettingsUI-Release.xcconfig","buck-out/gen/submodules/ShareController/ShareController-Debug.xcconfig","buck-out/gen/submodules/ShareController/ShareController-Profile.xcconfig","buck-out/gen/submodules/ShareController/ShareController-Release.xcconfig","buck-out/gen/submodules/ShareItems/ShareItems-Debug.xcconfig","buck-out/gen/submodules/ShareItems/ShareItems-Profile.xcconfig","buck-out/gen/submodules/ShareItems/ShareItems-Release.xcconfig","buck-out/gen/submodules/SinglePhoneInputNode/SinglePhoneInputNode-Debug.xcconfig","buck-out/gen/submodules/SinglePhoneInputNode/SinglePhoneInputNode-Profile.xcconfig","buck-out/gen/submodules/SinglePhoneInputNode/SinglePhoneInputNode-Release.xcconfig","buck-out/gen/submodules/SolidRoundedButtonNode/SolidRoundedButtonNode-Debug.xcconfig","buck-out/gen/submodules/SolidRoundedButtonNode/SolidRoundedButtonNode-Profile.xcconfig","buck-out/gen/submodules/SolidRoundedButtonNode/SolidRoundedButtonNode-Release.xcconfig","buck-out/gen/submodules/StickerPackPreviewUI/StickerPackPreviewUI-Debug.xcconfig","buck-out/gen/submodules/StickerPackPreviewUI/StickerPackPreviewUI-Profile.xcconfig","buck-out/gen/submodules/StickerPackPreviewUI/StickerPackPreviewUI-Release.xcconfig","buck-out/gen/submodules/StickerResources/StickerResources-Debug.xcconfig","buck-out/gen/submodules/StickerResources/StickerResources-Profile.xcconfig","buck-out/gen/submodules/StickerResources/StickerResources-Release.xcconfig","buck-out/gen/submodules/Stripe/Stripe-Debug.xcconfig","buck-out/gen/submodules/Stripe/Stripe-Profile.xcconfig","buck-out/gen/submodules/Stripe/Stripe-Release.xcconfig","buck-out/gen/submodules/SwipeToDismissGesture/SwipeToDismissGesture-Debug.xcconfig","buck-out/gen/submodules/SwipeToDismissGesture/SwipeToDismissGesture-Profile.xcconfig","buck-out/gen/submodules/SwipeToDismissGesture/SwipeToDismissGesture-Release.xcconfig","buck-out/gen/submodules/SwitchNode/SwitchNode-Debug.xcconfig","buck-out/gen/submodules/SwitchNode/SwitchNode-Profile.xcconfig","buck-out/gen/submodules/SwitchNode/SwitchNode-Release.xcconfig","buck-out/gen/submodules/TelegramApi/TelegramApi-Debug.xcconfig","buck-out/gen/submodules/TelegramApi/TelegramApi-Profile.xcconfig","buck-out/gen/submodules/TelegramApi/TelegramApi-Release.xcconfig","buck-out/gen/submodules/TelegramAudio/TelegramAudio-Debug.xcconfig","buck-out/gen/submodules/TelegramAudio/TelegramAudio-Profile.xcconfig","buck-out/gen/submodules/TelegramAudio/TelegramAudio-Release.xcconfig","buck-out/gen/submodules/TelegramBaseController/TelegramBaseController-Debug.xcconfig","buck-out/gen/submodules/TelegramBaseController/TelegramBaseController-Profile.xcconfig","buck-out/gen/submodules/TelegramBaseController/TelegramBaseController-Release.xcconfig","buck-out/gen/submodules/TelegramCallsUI/TelegramCallsUI-Debug.xcconfig","buck-out/gen/submodules/TelegramCallsUI/TelegramCallsUI-Profile.xcconfig","buck-out/gen/submodules/TelegramCallsUI/TelegramCallsUI-Release.xcconfig","buck-out/gen/submodules/TelegramCore/TelegramCore#shared-Debug.xcconfig","buck-out/gen/submodules/TelegramCore/TelegramCore#shared-Profile.xcconfig","buck-out/gen/submodules/TelegramCore/TelegramCore#shared-Release.xcconfig","buck-out/gen/submodules/TelegramNotices/TelegramNotices-Debug.xcconfig","buck-out/gen/submodules/TelegramNotices/TelegramNotices-Profile.xcconfig","buck-out/gen/submodules/TelegramNotices/TelegramNotices-Release.xcconfig","buck-out/gen/submodules/TelegramPermissions/TelegramPermissions-Debug.xcconfig","buck-out/gen/submodules/TelegramPermissions/TelegramPermissions-Profile.xcconfig","buck-out/gen/submodules/TelegramPermissions/TelegramPermissions-Release.xcconfig","buck-out/gen/submodules/TelegramPermissionsUI/TelegramPermissionsUI-Debug.xcconfig","buck-out/gen/submodules/TelegramPermissionsUI/TelegramPermissionsUI-Profile.xcconfig","buck-out/gen/submodules/TelegramPermissionsUI/TelegramPermissionsUI-Release.xcconfig","buck-out/gen/submodules/TelegramPresentationData/TelegramPresentationData-Debug.xcconfig","buck-out/gen/submodules/TelegramPresentationData/TelegramPresentationData-Profile.xcconfig","buck-out/gen/submodules/TelegramPresentationData/TelegramPresentationData-Release.xcconfig","buck-out/gen/submodules/TelegramStringFormatting/TelegramStringFormatting-Debug.xcconfig","buck-out/gen/submodules/TelegramStringFormatting/TelegramStringFormatting-Profile.xcconfig","buck-out/gen/submodules/TelegramStringFormatting/TelegramStringFormatting-Release.xcconfig","buck-out/gen/submodules/TelegramUI/TelegramUI#shared-Debug.xcconfig","buck-out/gen/submodules/TelegramUI/TelegramUI#shared-Profile.xcconfig","buck-out/gen/submodules/TelegramUI/TelegramUI#shared-Release.xcconfig","buck-out/gen/submodules/TelegramUIPreferences/TelegramUIPreferences-Debug.xcconfig","buck-out/gen/submodules/TelegramUIPreferences/TelegramUIPreferences-Profile.xcconfig","buck-out/gen/submodules/TelegramUIPreferences/TelegramUIPreferences-Release.xcconfig","buck-out/gen/submodules/TelegramUniversalVideoContent/TelegramUniversalVideoContent-Debug.xcconfig","buck-out/gen/submodules/TelegramUniversalVideoContent/TelegramUniversalVideoContent-Profile.xcconfig","buck-out/gen/submodules/TelegramUniversalVideoContent/TelegramUniversalVideoContent-Release.xcconfig","buck-out/gen/submodules/TelegramUpdateUI/TelegramUpdateUI-Debug.xcconfig","buck-out/gen/submodules/TelegramUpdateUI/TelegramUpdateUI-Profile.xcconfig","buck-out/gen/submodules/TelegramUpdateUI/TelegramUpdateUI-Release.xcconfig","buck-out/gen/submodules/TelegramVoip/TelegramVoip-Debug.xcconfig","buck-out/gen/submodules/TelegramVoip/TelegramVoip-Profile.xcconfig","buck-out/gen/submodules/TelegramVoip/TelegramVoip-Release.xcconfig","buck-out/gen/submodules/TemporaryCachedPeerDataManager/TemporaryCachedPeerDataManager-Debug.xcconfig","buck-out/gen/submodules/TemporaryCachedPeerDataManager/TemporaryCachedPeerDataManager-Profile.xcconfig","buck-out/gen/submodules/TemporaryCachedPeerDataManager/TemporaryCachedPeerDataManager-Release.xcconfig","buck-out/gen/submodules/TextFormat/TextFormat-Debug.xcconfig","buck-out/gen/submodules/TextFormat/TextFormat-Profile.xcconfig","buck-out/gen/submodules/TextFormat/TextFormat-Release.xcconfig","buck-out/gen/submodules/TextSelectionNode/TextSelectionNode-Debug.xcconfig","buck-out/gen/submodules/TextSelectionNode/TextSelectionNode-Profile.xcconfig","buck-out/gen/submodules/TextSelectionNode/TextSelectionNode-Release.xcconfig","buck-out/gen/submodules/TinyThumbnail/TinyThumbnail-Debug.xcconfig","buck-out/gen/submodules/TinyThumbnail/TinyThumbnail-Profile.xcconfig","buck-out/gen/submodules/TinyThumbnail/TinyThumbnail-Release.xcconfig","buck-out/gen/submodules/TouchDownGesture/TouchDownGesture-Debug.xcconfig","buck-out/gen/submodules/TouchDownGesture/TouchDownGesture-Profile.xcconfig","buck-out/gen/submodules/TouchDownGesture/TouchDownGesture-Release.xcconfig","buck-out/gen/submodules/Tuples/Tuples-Debug.xcconfig","buck-out/gen/submodules/Tuples/Tuples-Profile.xcconfig","buck-out/gen/submodules/Tuples/Tuples-Release.xcconfig","buck-out/gen/submodules/UndoUI/UndoUI-Debug.xcconfig","buck-out/gen/submodules/UndoUI/UndoUI-Profile.xcconfig","buck-out/gen/submodules/UndoUI/UndoUI-Release.xcconfig","buck-out/gen/submodules/UrlEscaping/UrlEscaping-Debug.xcconfig","buck-out/gen/submodules/UrlEscaping/UrlEscaping-Profile.xcconfig","buck-out/gen/submodules/UrlEscaping/UrlEscaping-Release.xcconfig","buck-out/gen/submodules/UrlHandling/UrlHandling-Debug.xcconfig","buck-out/gen/submodules/UrlHandling/UrlHandling-Profile.xcconfig","buck-out/gen/submodules/UrlHandling/UrlHandling-Release.xcconfig","buck-out/gen/submodules/WalletUI/WalletUI-Debug.xcconfig","buck-out/gen/submodules/WalletUI/WalletUI-Profile.xcconfig","buck-out/gen/submodules/WalletUI/WalletUI-Release.xcconfig","buck-out/gen/submodules/WallpaperResources/WallpaperResources-Debug.xcconfig","buck-out/gen/submodules/WallpaperResources/WallpaperResources-Profile.xcconfig","buck-out/gen/submodules/WallpaperResources/WallpaperResources-Release.xcconfig","buck-out/gen/submodules/WatchBridge/WatchBridge-Debug.xcconfig","buck-out/gen/submodules/WatchBridge/WatchBridge-Profile.xcconfig","buck-out/gen/submodules/WatchBridge/WatchBridge-Release.xcconfig","buck-out/gen/submodules/WatchBridgeAudio/WatchBridgeAudio-Debug.xcconfig","buck-out/gen/submodules/WatchBridgeAudio/WatchBridgeAudio-Profile.xcconfig","buck-out/gen/submodules/WatchBridgeAudio/WatchBridgeAudio-Release.xcconfig","buck-out/gen/submodules/WatchCommon/Host/WatchCommon-Debug.xcconfig","buck-out/gen/submodules/WatchCommon/Host/WatchCommon-Profile.xcconfig","buck-out/gen/submodules/WatchCommon/Host/WatchCommon-Release.xcconfig","buck-out/gen/submodules/WebP/WebPImage-Debug.xcconfig","buck-out/gen/submodules/WebP/WebPImage-Profile.xcconfig","buck-out/gen/submodules/WebP/WebPImage-Release.xcconfig","buck-out/gen/submodules/WebP/WebP_lib-Debug.xcconfig","buck-out/gen/submodules/WebP/WebP_lib-Profile.xcconfig","buck-out/gen/submodules/WebP/WebP_lib-Release.xcconfig","buck-out/gen/submodules/WebSearchUI/WebSearchUI-Debug.xcconfig","buck-out/gen/submodules/WebSearchUI/WebSearchUI-Profile.xcconfig","buck-out/gen/submodules/WebSearchUI/WebSearchUI-Release.xcconfig","buck-out/gen/submodules/WebUI/WebUI-Debug.xcconfig","buck-out/gen/submodules/WebUI/WebUI-Profile.xcconfig","buck-out/gen/submodules/WebUI/WebUI-Release.xcconfig","buck-out/gen/submodules/WebsiteType/WebsiteType-Debug.xcconfig","buck-out/gen/submodules/WebsiteType/WebsiteType-Profile.xcconfig","buck-out/gen/submodules/WebsiteType/WebsiteType-Release.xcconfig","buck-out/gen/submodules/YuvConversion/YuvConversion-Debug.xcconfig","buck-out/gen/submodules/YuvConversion/YuvConversion-Profile.xcconfig","buck-out/gen/submodules/YuvConversion/YuvConversion-Release.xcconfig","buck-out/gen/submodules/libphonenumber/libphonenumber-Debug.xcconfig","buck-out/gen/submodules/libphonenumber/libphonenumber-Profile.xcconfig","buck-out/gen/submodules/libphonenumber/libphonenumber-Release.xcconfig","buck-out/gen/submodules/libtgvoip/libtgvoip-Debug.xcconfig","buck-out/gen/submodules/libtgvoip/libtgvoip-Profile.xcconfig","buck-out/gen/submodules/libtgvoip/libtgvoip-Release.xcconfig","buck-out/gen/submodules/lottie-ios/Lottie-Debug.xcconfig","buck-out/gen/submodules/lottie-ios/Lottie-Profile.xcconfig","buck-out/gen/submodules/lottie-ios/Lottie-Release.xcconfig","buck-out/gen/submodules/rlottie/RLottieBinding-Debug.xcconfig","buck-out/gen/submodules/rlottie/RLottieBinding-Profile.xcconfig","buck-out/gen/submodules/rlottie/RLottieBinding-Release.xcconfig","buck-out/gen/submodules/sqlcipher/sqlcipher-Debug.xcconfig","buck-out/gen/submodules/sqlcipher/sqlcipher-Profile.xcconfig","buck-out/gen/submodules/sqlcipher/sqlcipher-Release.xcconfig"],"copy-in-xcode":[]} \ No newline at end of file diff --git a/Telegram_Buck.xcworkspace/contents.xcworkspacedata b/Telegram_Buck.xcworkspace/contents.xcworkspacedata index fbd281cb51..3e61562224 100644 --- a/Telegram_Buck.xcworkspace/contents.xcworkspacedata +++ b/Telegram_Buck.xcworkspace/contents.xcworkspacedata @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck.xcscheme b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck.xcscheme index ab39efcec7..3a3c953561 100644 --- a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck.xcscheme +++ b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck.xcscheme @@ -76,6 +76,20 @@ ReferencedContainer = "container:submodules/MtProtoKit/MtProtoKit.xcodeproj"> + + + + + + + + Void)? = nil) { - self.controllerNode.animateOut(completion: completion) - } - @objc private func cancelPressed() { self.dismiss() } diff --git a/submodules/BotPaymentsUI/Sources/BotCheckoutInfoController.swift b/submodules/BotPaymentsUI/Sources/BotCheckoutInfoController.swift index 773b4b2f88..b959d65554 100644 --- a/submodules/BotPaymentsUI/Sources/BotCheckoutInfoController.swift +++ b/submodules/BotPaymentsUI/Sources/BotCheckoutInfoController.swift @@ -153,9 +153,4 @@ final class BotCheckoutInfoController: ViewController { @objc func donePressed() { self.controllerNode.verify() } - - override public func dismiss(completion: (() -> Void)? = nil) { - self.view.endEditing(true) - self.controllerNode.animateOut(completion: completion) - } } diff --git a/submodules/BotPaymentsUI/Sources/BotCheckoutNativeCardEntryController.swift b/submodules/BotPaymentsUI/Sources/BotCheckoutNativeCardEntryController.swift index 0ad8395f29..dcefe1f5d2 100644 --- a/submodules/BotPaymentsUI/Sources/BotCheckoutNativeCardEntryController.swift +++ b/submodules/BotPaymentsUI/Sources/BotCheckoutNativeCardEntryController.swift @@ -148,9 +148,4 @@ final class BotCheckoutNativeCardEntryController: ViewController { @objc private func donePressed() { self.controllerNode.verify() } - - override public func dismiss(completion: (() -> Void)? = nil) { - self.view.endEditing(true) - self.controllerNode.animateOut(completion: completion) - } } diff --git a/submodules/BotPaymentsUI/Sources/BotCheckoutWebInteractionController.swift b/submodules/BotPaymentsUI/Sources/BotCheckoutWebInteractionController.swift index 42c385472c..a07f96cf6b 100644 --- a/submodules/BotPaymentsUI/Sources/BotCheckoutWebInteractionController.swift +++ b/submodules/BotPaymentsUI/Sources/BotCheckoutWebInteractionController.swift @@ -71,13 +71,6 @@ final class BotCheckoutWebInteractionController: ViewController { } } - override func dismiss(completion: (() -> Void)? = nil) { - self.controllerNode.animateOut(completion: { [weak self] in - self?.presentingViewController?.dismiss(animated: false, completion: nil) - completion?() - }) - } - override func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { super.containerLayoutUpdated(layout, transition: transition) diff --git a/submodules/BotPaymentsUI/Sources/BotReceiptController.swift b/submodules/BotPaymentsUI/Sources/BotReceiptController.swift index c21c2013a6..db972623e6 100644 --- a/submodules/BotPaymentsUI/Sources/BotReceiptController.swift +++ b/submodules/BotPaymentsUI/Sources/BotReceiptController.swift @@ -83,10 +83,6 @@ public final class BotReceiptController: ViewController { self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationHeight, transition: transition) } - override public func dismiss(completion: (() -> Void)? = nil) { - self.controllerNode.animateOut(completion: completion) - } - @objc private func cancelPressed() { self.dismiss() } diff --git a/submodules/BuildConfig/Sources/BuildConfig.h b/submodules/BuildConfig/Sources/BuildConfig.h index 32a001384d..59b1abcd50 100644 --- a/submodules/BuildConfig/Sources/BuildConfig.h +++ b/submodules/BuildConfig/Sources/BuildConfig.h @@ -22,4 +22,7 @@ + (DeviceSpecificEncryptionParameters * _Nonnull)deviceSpecificEncryptionParameters:(NSString * _Nonnull)rootPath baseAppBundleId:(NSString * _Nonnull)baseAppBundleId; - (NSData * _Nullable)bundleDataWithAppToken:(NSData * _Nullable)appToken; ++ (void)encryptApplicationSecret:(NSData * _Nonnull)secret baseAppBundleId:(NSString * _Nonnull)baseAppBundleId completion:(void (^)(NSData * _Nullable))completion; ++ (void)decryptApplicationSecret:(NSData * _Nonnull)secret baseAppBundleId:(NSString * _Nonnull)baseAppBundleId completion:(void (^)(NSData * _Nullable))completion; + @end diff --git a/submodules/BuildConfig/Sources/BuildConfig.m b/submodules/BuildConfig/Sources/BuildConfig.m index 4e45fedb8f..bdf2841213 100644 --- a/submodules/BuildConfig/Sources/BuildConfig.m +++ b/submodules/BuildConfig/Sources/BuildConfig.m @@ -554,6 +554,132 @@ API_AVAILABLE(ios(10)) return result; } ++ (LocalPrivateKey * _Nullable)getApplicationSecretKey:(NSString * _Nonnull)baseAppBundleId API_AVAILABLE(ios(10)) { + NSString *bundleSeedId = [self bundleSeedId]; + if (bundleSeedId == nil) { + return nil; + } + + NSString *accessGroup = [bundleSeedId stringByAppendingFormat:@".%@", baseAppBundleId]; + + NSData *applicationTag = [@"telegramApplicationSecretKey" dataUsingEncoding:NSUTF8StringEncoding]; + + NSDictionary *query = @{ + (id)kSecClass: (id)kSecClassKey, + (id)kSecAttrApplicationTag: applicationTag, + (id)kSecAttrKeyType: (id)kSecAttrKeyTypeECSECPrimeRandom, + (id)kSecAttrAccessGroup: (id)accessGroup, + (id)kSecReturnRef: @YES, + }; + SecKeyRef privateKey = NULL; + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&privateKey); + if (status != errSecSuccess) { + return nil; + } + + SecKeyRef publicKey = SecKeyCopyPublicKey(privateKey); + if (!publicKey) { + if (privateKey) { + CFRelease(privateKey); + } + return nil; + } + + LocalPrivateKey *result = [[LocalPrivateKey alloc] initWithPrivateKey:privateKey publicKey:publicKey]; + + if (publicKey) { + CFRelease(publicKey); + } + if (privateKey) { + CFRelease(privateKey); + } + + return result; +} + ++ (bool)removeApplicationSecretKey:(NSString * _Nonnull)baseAppBundleId API_AVAILABLE(ios(10)) { + NSString *bundleSeedId = [self bundleSeedId]; + if (bundleSeedId == nil) { + return nil; + } + + NSData *applicationTag = [@"telegramApplicationSecretKey" dataUsingEncoding:NSUTF8StringEncoding]; + NSString *accessGroup = [bundleSeedId stringByAppendingFormat:@".%@", baseAppBundleId]; + + NSDictionary *query = @{ + (id)kSecClass: (id)kSecClassKey, + (id)kSecAttrApplicationTag: applicationTag, + (id)kSecAttrKeyType: (id)kSecAttrKeyTypeECSECPrimeRandom, + (id)kSecAttrAccessGroup: (id)accessGroup + }; + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)query); + if (status != errSecSuccess) { + return false; + } + return true; +} + ++ (LocalPrivateKey * _Nullable)addApplicationSecretKey:(NSString * _Nonnull)baseAppBundleId API_AVAILABLE(ios(10)) { + NSString *bundleSeedId = [self bundleSeedId]; + if (bundleSeedId == nil) { + return nil; + } + + NSData *applicationTag = [@"telegramApplicationSecretKey" dataUsingEncoding:NSUTF8StringEncoding]; + NSString *accessGroup = [bundleSeedId stringByAppendingFormat:@".%@", baseAppBundleId]; + + SecAccessControlRef access = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleAlwaysThisDeviceOnly, kSecAccessControlUserPresence | kSecAccessControlPrivateKeyUsage, NULL); + NSDictionary *attributes = @{ + (id)kSecAttrKeyType: (id)kSecAttrKeyTypeECSECPrimeRandom, + (id)kSecAttrKeySizeInBits: @256, + (id)kSecAttrTokenID: (id)kSecAttrTokenIDSecureEnclave, + (id)kSecPrivateKeyAttrs: @{ + (id)kSecAttrIsPermanent: @YES, + (id)kSecAttrApplicationTag: applicationTag, + (id)kSecAttrAccessControl: (__bridge id)access, + (id)kSecAttrAccessGroup: (id)accessGroup, + }, + }; + + CFErrorRef error = NULL; + SecKeyRef privateKey = SecKeyCreateRandomKey((__bridge CFDictionaryRef)attributes, &error); + if (!privateKey) { + if (access) { + CFRelease(access); + } + + __unused NSError *err = CFBridgingRelease(error); + return nil; + } + + SecKeyRef publicKey = SecKeyCopyPublicKey(privateKey); + if (!publicKey) { + if (privateKey) { + CFRelease(privateKey); + } + if (access) { + CFRelease(access); + } + + __unused NSError *err = CFBridgingRelease(error); + return nil; + } + + LocalPrivateKey *result = [[LocalPrivateKey alloc] initWithPrivateKey:privateKey publicKey:publicKey]; + + if (publicKey) { + CFRelease(publicKey); + } + if (privateKey) { + CFRelease(privateKey); + } + if (access) { + CFRelease(access); + } + + return result; +} + + (DeviceSpecificEncryptionParameters * _Nonnull)deviceSpecificEncryptionParameters:(NSString * _Nonnull)rootPath baseAppBundleId:(NSString * _Nonnull)baseAppBundleId { CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); @@ -609,4 +735,35 @@ API_AVAILABLE(ios(10)) return [[DeviceSpecificEncryptionParameters alloc] initWithKey:key salt:salt]; } ++ (void)encryptApplicationSecret:(NSData * _Nonnull)secret baseAppBundleId:(NSString * _Nonnull)baseAppBundleId completion:(void (^)(NSData * _Nullable))completion { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + LocalPrivateKey *privateKey = [self getApplicationSecretKey:baseAppBundleId]; + if (privateKey == nil) { + privateKey = [self addApplicationSecretKey:baseAppBundleId]; + } + if (privateKey == nil) { + completion(nil); + return; + } + NSData *result = [privateKey encrypt:secret]; + completion(result); + }); +} + ++ (void)decryptApplicationSecret:(NSData * _Nonnull)secret baseAppBundleId:(NSString * _Nonnull)baseAppBundleId completion:(void (^)(NSData * _Nullable))completion { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + LocalPrivateKey *privateKey = [self getApplicationSecretKey:baseAppBundleId]; + if (privateKey == nil) { + completion(nil); + return; + } + if (privateKey == nil) { + completion(nil); + return; + } + NSData *result = [privateKey decrypt:secret]; + completion(result); + }); +} + @end diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index d890ae4961..ae0d65c4ba 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -1287,7 +1287,7 @@ public enum ContextContentSource { case controller(ContextControllerContentSource) } -public final class ContextController: ViewController { +public final class ContextController: ViewController, StandalonePresentableController { private let account: Account private var theme: PresentationTheme private var strings: PresentationStrings diff --git a/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionController.swift b/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionController.swift index 634d08f6c1..e5a634f6de 100644 --- a/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionController.swift +++ b/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionController.swift @@ -205,11 +205,4 @@ public final class AuthorizationSequenceCountrySelectionController: ViewControll self.dismissed?() self.dismiss(completion: nil) } - - override public func dismiss(completion: (() -> Void)? = nil) { - self.navigationContentNode?.deactivate() - self.controllerNode.animateOut(completion: { [weak self] in - self?.presentingViewController?.dismiss(animated: true, completion: nil) - }) - } } diff --git a/submodules/Display/Display/ActionSheetController.swift b/submodules/Display/Display/ActionSheetController.swift index 46df40e0ca..8fd76c318a 100644 --- a/submodules/Display/Display/ActionSheetController.swift +++ b/submodules/Display/Display/ActionSheetController.swift @@ -1,7 +1,7 @@ import Foundation import UIKit -open class ActionSheetController: ViewController, PresentableController { +open class ActionSheetController: ViewController, PresentableController, StandalonePresentableController { private var actionSheetNode: ActionSheetControllerNode { return self.displayNode as! ActionSheetControllerNode } diff --git a/submodules/Display/Display/AlertController.swift b/submodules/Display/Display/AlertController.swift index 7e74a95ee9..870c1a2a14 100644 --- a/submodules/Display/Display/AlertController.swift +++ b/submodules/Display/Display/AlertController.swift @@ -62,7 +62,7 @@ public final class AlertControllerTheme: Equatable { } } -open class AlertController: ViewController { +open class AlertController: ViewController, StandalonePresentableController { private var controllerNode: AlertControllerNode { return self.displayNode as! AlertControllerNode } diff --git a/submodules/Display/Display/ContextMenuController.swift b/submodules/Display/Display/ContextMenuController.swift index eb5e921664..20e0b73e49 100644 --- a/submodules/Display/Display/ContextMenuController.swift +++ b/submodules/Display/Display/ContextMenuController.swift @@ -12,7 +12,7 @@ public final class ContextMenuControllerPresentationArguments { } } -public final class ContextMenuController: ViewController, KeyShortcutResponder { +public final class ContextMenuController: ViewController, KeyShortcutResponder, StandalonePresentableController { private var contextMenuNode: ContextMenuNode { return self.displayNode as! ContextMenuNode } diff --git a/submodules/Display/Display/Navigation/NavigationController.swift b/submodules/Display/Display/Navigation/NavigationController.swift index 4d8735844b..829910453e 100644 --- a/submodules/Display/Display/Navigation/NavigationController.swift +++ b/submodules/Display/Display/Navigation/NavigationController.swift @@ -642,6 +642,17 @@ open class NavigationController: UINavigationController, ContainableController, } } + public func replaceController(_ controller: ViewController, with other: ViewController, animated: Bool) { + var controllers = self._viewControllers + for i in 0 ..< controllers.count { + if controllers[i] === controller { + controllers[i] = other + break + } + } + self.setViewControllers(controllers, animated: animated) + } + public func replaceControllersAndPush(controllers: [UIViewController], controller: ViewController, animated: Bool, options: NavigationAnimationOptions = [], ready: ValuePromise? = nil, completion: @escaping () -> Void = {}) { ready?.set(true) var controllers = controllers diff --git a/submodules/Display/Display/NavigationBar.swift b/submodules/Display/Display/NavigationBar.swift index 073729ed53..24f50d137c 100644 --- a/submodules/Display/Display/NavigationBar.swift +++ b/submodules/Display/Display/NavigationBar.swift @@ -1053,11 +1053,13 @@ open class NavigationBar: ASDisplayNode { } } + public var intrinsicCanTransitionInline: Bool = true + public var canTransitionInline: Bool { if let contentNode = self.contentNode, case .replacement = contentNode.mode { return false } else { - return true + return self.intrinsicCanTransitionInline } } diff --git a/submodules/Display/Display/TooltipController.swift b/submodules/Display/Display/TooltipController.swift index 7e9f4526c0..84dcab6b94 100644 --- a/submodules/Display/Display/TooltipController.swift +++ b/submodules/Display/Display/TooltipController.swift @@ -53,7 +53,7 @@ public final class TooltipControllerPresentationArguments { } } -open class TooltipController: ViewController { +open class TooltipController: ViewController, StandalonePresentableController { private var controllerNode: TooltipControllerNode { return self.displayNode as! TooltipControllerNode } diff --git a/submodules/Display/Display/ViewController.swift b/submodules/Display/Display/ViewController.swift index 3c04ba961d..3cd5b2d3af 100644 --- a/submodules/Display/Display/ViewController.swift +++ b/submodules/Display/Display/ViewController.swift @@ -3,6 +3,9 @@ import UIKit import AsyncDisplayKit import SwiftSignalKit +public protocol StandalonePresentableController: ViewController { +} + private func findCurrentResponder(_ view: UIView) -> UIResponder? { if view.isFirstResponder { return view @@ -471,7 +474,7 @@ public enum ViewControllerNavigationPresentation { } public func present(_ controller: ViewController, in context: PresentationContextType, with arguments: Any? = nil, blockInteraction: Bool = false, completion: @escaping () -> Void = {}) { - if case .window = context, let arguments = arguments as? ViewControllerPresentationArguments, case .modalSheet = arguments.presentationAnimation { + if !(controller is StandalonePresentableController), case .window = context, let arguments = arguments as? ViewControllerPresentationArguments, case .modalSheet = arguments.presentationAnimation { controller.navigationPresentation = .modal self.push(controller) } else { diff --git a/submodules/GalleryUI/Sources/GalleryController.swift b/submodules/GalleryUI/Sources/GalleryController.swift index a5b146553a..31a75de627 100644 --- a/submodules/GalleryUI/Sources/GalleryController.swift +++ b/submodules/GalleryUI/Sources/GalleryController.swift @@ -272,7 +272,7 @@ public enum GalleryControllerItemNodeAction { case timecode(Double) } -public class GalleryController: ViewController { +public class GalleryController: ViewController, StandalonePresentableController { public static let darkNavigationTheme = NavigationBarTheme(buttonColor: .white, disabledButtonColor: UIColor(rgb: 0x525252), primaryTextColor: .white, backgroundColor: UIColor(white: 0.0, alpha: 0.6), separatorColor: UIColor(white: 0.0, alpha: 0.8), badgeBackgroundColor: .clear, badgeStrokeColor: .clear, badgeTextColor: .clear) public static let lightNavigationTheme = NavigationBarTheme(buttonColor: UIColor(rgb: 0x007ee5), disabledButtonColor: UIColor(rgb: 0xd0d0d0), primaryTextColor: .black, backgroundColor: UIColor(red: 0.968626451, green: 0.968626451, blue: 0.968626451, alpha: 1.0), separatorColor: UIColor(red: 0.6953125, green: 0.6953125, blue: 0.6953125, alpha: 1.0), badgeBackgroundColor: .clear, badgeStrokeColor: .clear, badgeTextColor: .clear) diff --git a/submodules/GameUI/Sources/GameController.swift b/submodules/GameUI/Sources/GameController.swift index d82d782767..dc8079c6db 100644 --- a/submodules/GameUI/Sources/GameController.swift +++ b/submodules/GameUI/Sources/GameController.swift @@ -75,13 +75,6 @@ public final class GameController: ViewController { }, message: self.message) } - override public func dismiss(completion: (() -> Void)? = nil) { - self.controllerNode.animateOut(completion: { [weak self] in - self?.presentingViewController?.dismiss(animated: false, completion: nil) - completion?() - }) - } - override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { super.containerLayoutUpdated(layout, transition: transition) diff --git a/submodules/InstantPageUI/Sources/InstantPageGalleryController.swift b/submodules/InstantPageUI/Sources/InstantPageGalleryController.swift index b0e61f6416..99cd5a3ca1 100644 --- a/submodules/InstantPageUI/Sources/InstantPageGalleryController.swift +++ b/submodules/InstantPageUI/Sources/InstantPageGalleryController.swift @@ -142,7 +142,7 @@ public final class InstantPageGalleryControllerPresentationArguments { } } -public class InstantPageGalleryController: ViewController { +public class InstantPageGalleryController: ViewController, StandalonePresentableController { private var galleryNode: GalleryControllerNode { return self.displayNode as! GalleryControllerNode } diff --git a/submodules/MtProtoKit/BUCK b/submodules/MtProtoKit/BUCK index 9d5d6ad159..7849442a2a 100644 --- a/submodules/MtProtoKit/BUCK +++ b/submodules/MtProtoKit/BUCK @@ -25,6 +25,58 @@ apple_library( ], ) +ton_lib_names = [ + "adnllite", + "crc32c", + "fift", + "keys", + "memprof", + "tdactor", + "tddb", + "tdnet", + "tdtl", + "tdutils", + "terminal", + "tl-lite-utils", + "tl-utils", + "tl_api", + "tl_lite_api", + "tl_tonlib_api", + "tl_tonlib_api_json", + "ton_block", + "ton_crypto", + "ton_db", + "tonlib", + "tonlibjson_private", + "tonlibjson_static", +] + +ton_lib_flags = ["-l" + name for name in ton_lib_names] + +genrule( + name = "ton_libs", + srcs = glob([ + "TON/*.a", + ]), + bash = "mkdir -p $OUT; cp $SRCS $OUT/", + out = "ton_libs", + visibility = ["PUBLIC"] +) + +apple_library( + name = "ton", + visibility = [ + "//submodules/MtProtoKit:MtProtoKit" + ], + header_namespace = "ton", + exported_headers = glob([ + "TON/include/*.h", + ]), + exported_linker_flags = [ + "-L$(location :ton_libs)", + ] + ton_lib_flags, +) + framework( name = "MtProtoKit", srcs = glob([ @@ -32,12 +84,16 @@ framework( "MtProtoKit/*.m", "thirdparty/AFNetworking/*.m", "thirdparty/AsyncSocket/*.m", + "TON/*.m", + "TON/*.mm", ]), headers = glob([ "*.h", "MtProtoKit/*.h", "thirdparty/AFNetworking/*.h", "thirdparty/AsyncSocket/*.h", + "TON/*.h", + "TON/include/*.h", ]), exported_headers = [ "MtProtoKit/MTTime.h", @@ -99,10 +155,12 @@ framework( "MTGzip.h", "MTDatacenterVerificationData.h", "MTPKCS.h", + "TON/TON.h", ], visibility = ["PUBLIC"], deps = [ ":openssl", + ":ton", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/MtProtoKit/MtProtoKitDynamic/MtProtoKitDynamic.h b/submodules/MtProtoKit/MtProtoKitDynamic/MtProtoKitDynamic.h index 71b8db618f..80ab27624e 100644 --- a/submodules/MtProtoKit/MtProtoKitDynamic/MtProtoKitDynamic.h +++ b/submodules/MtProtoKit/MtProtoKitDynamic/MtProtoKitDynamic.h @@ -76,3 +76,4 @@ FOUNDATION_EXPORT const unsigned char MtProtoKitDynamicVersionString[]; #import #import #import +#import diff --git a/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj b/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj index 3927679786..20d7499874 100644 --- a/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj +++ b/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + D00083C922DD33E500EC418C /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D00083C822DD33E500EC418C /* libc++.tbd */; }; D00354681C173BF0006610DA /* MtProtoKitStabilityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D00354671C173BF0006610DA /* MtProtoKitStabilityTests.m */; }; D003546A1C173BF0006610DA /* MtProtoKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0CB05F71ADC4483005E298F /* MtProtoKit.framework */; }; D00354701C173CB9006610DA /* SSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0580ABE1B0F3E7100E8235B /* SSignalKit.framework */; }; @@ -34,6 +35,41 @@ D015E01B225CD19E00CB9E8A /* MTGzip.m in Sources */ = {isa = PBXBuildFile; fileRef = D015E017225CD19E00CB9E8A /* MTGzip.m */; }; D015E01C225CD19E00CB9E8A /* MTGzip.m in Sources */ = {isa = PBXBuildFile; fileRef = D015E017225CD19E00CB9E8A /* MTGzip.m */; }; D015E01D225CD19E00CB9E8A /* MTGzip.m in Sources */ = {isa = PBXBuildFile; fileRef = D015E017225CD19E00CB9E8A /* MTGzip.m */; }; + D018559022DDD36C00AC458A /* Client.h in Headers */ = {isa = PBXBuildFile; fileRef = D018558A22DDD36C00AC458A /* Client.h */; }; + D018559122DDD36C00AC458A /* TlObject.h in Headers */ = {isa = PBXBuildFile; fileRef = D018558B22DDD36C00AC458A /* TlObject.h */; }; + D018559222DDD36C00AC458A /* tonlib_api.h in Headers */ = {isa = PBXBuildFile; fileRef = D018558C22DDD36C00AC458A /* tonlib_api.h */; }; + D018559322DDD36C00AC458A /* int_types.h in Headers */ = {isa = PBXBuildFile; fileRef = D018558D22DDD36C00AC458A /* int_types.h */; }; + D018559422DDD36C00AC458A /* TonlibCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = D018558E22DDD36C00AC458A /* TonlibCallback.h */; }; + D018559522DDD36C00AC458A /* platform.h in Headers */ = {isa = PBXBuildFile; fileRef = D018558F22DDD36C00AC458A /* platform.h */; }; + D018559622DDD37300AC458A /* Client.h in Headers */ = {isa = PBXBuildFile; fileRef = D018558A22DDD36C00AC458A /* Client.h */; }; + D018559722DDD37300AC458A /* TlObject.h in Headers */ = {isa = PBXBuildFile; fileRef = D018558B22DDD36C00AC458A /* TlObject.h */; }; + D018559822DDD37300AC458A /* tonlib_api.h in Headers */ = {isa = PBXBuildFile; fileRef = D018558C22DDD36C00AC458A /* tonlib_api.h */; }; + D018559922DDD37300AC458A /* int_types.h in Headers */ = {isa = PBXBuildFile; fileRef = D018558D22DDD36C00AC458A /* int_types.h */; }; + D018559A22DDD37300AC458A /* TonlibCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = D018558E22DDD36C00AC458A /* TonlibCallback.h */; }; + D018559B22DDD37300AC458A /* platform.h in Headers */ = {isa = PBXBuildFile; fileRef = D018558F22DDD36C00AC458A /* platform.h */; }; + D018559C22DDD38B00AC458A /* libtdutils.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D08A159322DD32CF0073B508 /* libtdutils.a */; }; + D018559D22DDD38B00AC458A /* libtddb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D08A159522DD32CF0073B508 /* libtddb.a */; }; + D018559E22DDD38B00AC458A /* libtdactor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D08A159422DD32CF0073B508 /* libtdactor.a */; }; + D01855B322DDD38D00AC458A /* libtl_lite_api.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D018559F22DDD38B00AC458A /* libtl_lite_api.a */; }; + D01855B422DDD38D00AC458A /* libadnllite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855A022DDD38C00AC458A /* libadnllite.a */; }; + D01855B522DDD38D00AC458A /* libfift.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855A122DDD38C00AC458A /* libfift.a */; }; + D01855B622DDD38D00AC458A /* libkeys.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855A222DDD38C00AC458A /* libkeys.a */; }; + D01855B722DDD38D00AC458A /* libtl-lite-utils.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855A322DDD38C00AC458A /* libtl-lite-utils.a */; }; + D01855B822DDD38D00AC458A /* libtl-utils.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855A422DDD38C00AC458A /* libtl-utils.a */; }; + D01855B922DDD38D00AC458A /* libton_db.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855A522DDD38C00AC458A /* libton_db.a */; }; + D01855BA22DDD38D00AC458A /* libtonlib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855A622DDD38C00AC458A /* libtonlib.a */; }; + D01855BB22DDD38D00AC458A /* libterminal.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855A722DDD38C00AC458A /* libterminal.a */; }; + D01855BC22DDD38D00AC458A /* libtonlibjson_private.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855A822DDD38C00AC458A /* libtonlibjson_private.a */; }; + D01855BD22DDD38D00AC458A /* libton_crypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855A922DDD38C00AC458A /* libton_crypto.a */; }; + D01855BE22DDD38D00AC458A /* libtl_tonlib_api_json.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855AA22DDD38C00AC458A /* libtl_tonlib_api_json.a */; }; + D01855BF22DDD38D00AC458A /* libtdnet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855AB22DDD38C00AC458A /* libtdnet.a */; }; + D01855C022DDD38D00AC458A /* libtl_tonlib_api.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855AC22DDD38C00AC458A /* libtl_tonlib_api.a */; }; + D01855C122DDD38D00AC458A /* libtonlibjson_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855AD22DDD38C00AC458A /* libtonlibjson_static.a */; }; + D01855C222DDD38D00AC458A /* libton_block.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855AE22DDD38D00AC458A /* libton_block.a */; }; + D01855C322DDD38D00AC458A /* libtl_api.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855AF22DDD38D00AC458A /* libtl_api.a */; }; + D01855C422DDD38D00AC458A /* libcrc32c.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855B022DDD38D00AC458A /* libcrc32c.a */; }; + D01855C522DDD38D00AC458A /* libtdtl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855B122DDD38D00AC458A /* libtdtl.a */; }; + D01855C622DDD38D00AC458A /* libmemprof.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D01855B222DDD38D00AC458A /* libmemprof.a */; }; D0185E722089D265005E1A6C /* MTProxyConnectivity.h in Headers */ = {isa = PBXBuildFile; fileRef = D0185E702089D265005E1A6C /* MTProxyConnectivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; D0185E732089D265005E1A6C /* MTProxyConnectivity.h in Headers */ = {isa = PBXBuildFile; fileRef = D0185E702089D265005E1A6C /* MTProxyConnectivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; D0185E742089D265005E1A6C /* MTProxyConnectivity.h in Headers */ = {isa = PBXBuildFile; fileRef = D0185E702089D265005E1A6C /* MTProxyConnectivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -63,6 +99,10 @@ D073D2D81FB5E493009E1DA2 /* MTBindingTempAuthKeyContext.m in Sources */ = {isa = PBXBuildFile; fileRef = D0C0EAE51FB5DBEA00DCF07C /* MTBindingTempAuthKeyContext.m */; }; D073D2D91FB5E494009E1DA2 /* MTBindingTempAuthKeyContext.m in Sources */ = {isa = PBXBuildFile; fileRef = D0C0EAE51FB5DBEA00DCF07C /* MTBindingTempAuthKeyContext.m */; }; D079AB9C1AF39B8000076F59 /* MtProtoKitMac.h in Headers */ = {isa = PBXBuildFile; fileRef = D079AB9B1AF39B8000076F59 /* MtProtoKitMac.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D08A159122DD32B40073B508 /* tonlibjson_export.h in Headers */ = {isa = PBXBuildFile; fileRef = D08A158F22DD32B40073B508 /* tonlibjson_export.h */; }; + D08A159222DD32B40073B508 /* tonlib_client_json.h in Headers */ = {isa = PBXBuildFile; fileRef = D08A159022DD32B40073B508 /* tonlib_client_json.h */; }; + D08A159D22DD32F20073B508 /* TON.h in Headers */ = {isa = PBXBuildFile; fileRef = D08A159B22DD32F20073B508 /* TON.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D08A159E22DD32F20073B508 /* TON.mm in Sources */ = {isa = PBXBuildFile; fileRef = D08A159C22DD32F20073B508 /* TON.mm */; }; D09A59581B582EFF00FC3724 /* MTFileBasedKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = D09A59561B582EFF00FC3724 /* MTFileBasedKeychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; D09A59591B582EFF00FC3724 /* MTFileBasedKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = D09A59571B582EFF00FC3724 /* MTFileBasedKeychain.m */; }; D0B0DF5D1DD7E75B003BA12D /* MTBag.m in Sources */ = {isa = PBXBuildFile; fileRef = D0B0DF5C1DD7E75B003BA12D /* MTBag.m */; }; @@ -604,6 +644,9 @@ 93DBD23018B2D72800631ADC /* MTRequestErrorContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTRequestErrorContext.m; path = MtProtoKit/MTRequestErrorContext.m; sourceTree = ""; }; 93DBD23318B2D9AA00631ADC /* MTTime.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MTTime.h; path = MtProtoKit/MTTime.h; sourceTree = ""; }; 93DBD23418B2DA1E00631ADC /* MTTime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTTime.m; path = MtProtoKit/MTTime.m; sourceTree = ""; }; + D00083C822DD33E500EC418C /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; + D00083CA22DD42F600EC418C /* libtonlibjson.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtonlibjson.dylib; path = TON/libtonlibjson.dylib; sourceTree = ""; }; + D00083D722DD467100EC418C /* libtdjson.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtdjson.dylib; path = TON/libtdjson.dylib; sourceTree = ""; }; D00354651C173BF0006610DA /* MtProtoKitStabilityTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MtProtoKitStabilityTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; D00354671C173BF0006610DA /* MtProtoKitStabilityTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MtProtoKitStabilityTests.m; sourceTree = ""; }; D00354691C173BF0006610DA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -619,6 +662,32 @@ D0119CC820CAD65D00895300 /* PingFoundation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PingFoundation.m; sourceTree = ""; }; D015E016225CD19E00CB9E8A /* MTGzip.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTGzip.h; sourceTree = ""; }; D015E017225CD19E00CB9E8A /* MTGzip.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTGzip.m; sourceTree = ""; }; + D018558A22DDD36C00AC458A /* Client.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Client.h; sourceTree = ""; }; + D018558B22DDD36C00AC458A /* TlObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TlObject.h; sourceTree = ""; }; + D018558C22DDD36C00AC458A /* tonlib_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tonlib_api.h; sourceTree = ""; }; + D018558D22DDD36C00AC458A /* int_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int_types.h; sourceTree = ""; }; + D018558E22DDD36C00AC458A /* TonlibCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TonlibCallback.h; sourceTree = ""; }; + D018558F22DDD36C00AC458A /* platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform.h; sourceTree = ""; }; + D018559F22DDD38B00AC458A /* libtl_lite_api.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtl_lite_api.a; path = TON/libtl_lite_api.a; sourceTree = ""; }; + D01855A022DDD38C00AC458A /* libadnllite.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libadnllite.a; path = TON/libadnllite.a; sourceTree = ""; }; + D01855A122DDD38C00AC458A /* libfift.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfift.a; path = TON/libfift.a; sourceTree = ""; }; + D01855A222DDD38C00AC458A /* libkeys.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libkeys.a; path = TON/libkeys.a; sourceTree = ""; }; + D01855A322DDD38C00AC458A /* libtl-lite-utils.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libtl-lite-utils.a"; path = "TON/libtl-lite-utils.a"; sourceTree = ""; }; + D01855A422DDD38C00AC458A /* libtl-utils.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libtl-utils.a"; path = "TON/libtl-utils.a"; sourceTree = ""; }; + D01855A522DDD38C00AC458A /* libton_db.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libton_db.a; path = TON/libton_db.a; sourceTree = ""; }; + D01855A622DDD38C00AC458A /* libtonlib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtonlib.a; path = TON/libtonlib.a; sourceTree = ""; }; + D01855A722DDD38C00AC458A /* libterminal.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libterminal.a; path = TON/libterminal.a; sourceTree = ""; }; + D01855A822DDD38C00AC458A /* libtonlibjson_private.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtonlibjson_private.a; path = TON/libtonlibjson_private.a; sourceTree = ""; }; + D01855A922DDD38C00AC458A /* libton_crypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libton_crypto.a; path = TON/libton_crypto.a; sourceTree = ""; }; + D01855AA22DDD38C00AC458A /* libtl_tonlib_api_json.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtl_tonlib_api_json.a; path = TON/libtl_tonlib_api_json.a; sourceTree = ""; }; + D01855AB22DDD38C00AC458A /* libtdnet.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtdnet.a; path = TON/libtdnet.a; sourceTree = ""; }; + D01855AC22DDD38C00AC458A /* libtl_tonlib_api.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtl_tonlib_api.a; path = TON/libtl_tonlib_api.a; sourceTree = ""; }; + D01855AD22DDD38C00AC458A /* libtonlibjson_static.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtonlibjson_static.a; path = TON/libtonlibjson_static.a; sourceTree = ""; }; + D01855AE22DDD38D00AC458A /* libton_block.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libton_block.a; path = TON/libton_block.a; sourceTree = ""; }; + D01855AF22DDD38D00AC458A /* libtl_api.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtl_api.a; path = TON/libtl_api.a; sourceTree = ""; }; + D01855B022DDD38D00AC458A /* libcrc32c.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcrc32c.a; path = TON/libcrc32c.a; sourceTree = ""; }; + D01855B122DDD38D00AC458A /* libtdtl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtdtl.a; path = TON/libtdtl.a; sourceTree = ""; }; + D01855B222DDD38D00AC458A /* libmemprof.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmemprof.a; path = TON/libmemprof.a; sourceTree = ""; }; D0185E702089D265005E1A6C /* MTProxyConnectivity.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTProxyConnectivity.h; sourceTree = ""; }; D0185E712089D265005E1A6C /* MTProxyConnectivity.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTProxyConnectivity.m; sourceTree = ""; }; D020FAF81D994E3100F279AA /* MTHttpRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTHttpRequestOperation.h; path = MTProtoKit/MTHttpRequestOperation.h; sourceTree = ""; }; @@ -738,6 +807,14 @@ D079AB9B1AF39B8000076F59 /* MtProtoKitMac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MtProtoKitMac.h; sourceTree = ""; }; D079ABA71AF39B8000076F59 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D079ABA81AF39B8000076F59 /* MtProtoKitMacTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MtProtoKitMacTests.m; sourceTree = ""; }; + D08A158F22DD32B40073B508 /* tonlibjson_export.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tonlibjson_export.h; sourceTree = ""; }; + D08A159022DD32B40073B508 /* tonlib_client_json.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tonlib_client_json.h; sourceTree = ""; }; + D08A159322DD32CF0073B508 /* libtdutils.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtdutils.a; path = TON/libtdutils.a; sourceTree = ""; }; + D08A159422DD32CF0073B508 /* libtdactor.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtdactor.a; path = TON/libtdactor.a; sourceTree = ""; }; + D08A159522DD32CF0073B508 /* libtddb.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtddb.a; path = TON/libtddb.a; sourceTree = ""; }; + D08A159622DD32CF0073B508 /* libtonlibjson.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtonlibjson.a; path = TON/libtonlibjson.a; sourceTree = ""; }; + D08A159B22DD32F20073B508 /* TON.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TON.h; sourceTree = ""; }; + D08A159C22DD32F20073B508 /* TON.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = TON.mm; sourceTree = ""; }; D09A59561B582EFF00FC3724 /* MTFileBasedKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTFileBasedKeychain.h; path = MTProtoKit/MTFileBasedKeychain.h; sourceTree = ""; }; D09A59571B582EFF00FC3724 /* MTFileBasedKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTFileBasedKeychain.m; path = MTProtoKit/MTFileBasedKeychain.m; sourceTree = ""; }; D0B0DF5C1DD7E75B003BA12D /* MTBag.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBag.m; sourceTree = ""; }; @@ -875,6 +952,30 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D01855B322DDD38D00AC458A /* libtl_lite_api.a in Frameworks */, + D01855B422DDD38D00AC458A /* libadnllite.a in Frameworks */, + D01855B522DDD38D00AC458A /* libfift.a in Frameworks */, + D01855B622DDD38D00AC458A /* libkeys.a in Frameworks */, + D01855B722DDD38D00AC458A /* libtl-lite-utils.a in Frameworks */, + D01855B822DDD38D00AC458A /* libtl-utils.a in Frameworks */, + D01855B922DDD38D00AC458A /* libton_db.a in Frameworks */, + D01855BA22DDD38D00AC458A /* libtonlib.a in Frameworks */, + D01855BB22DDD38D00AC458A /* libterminal.a in Frameworks */, + D01855BC22DDD38D00AC458A /* libtonlibjson_private.a in Frameworks */, + D01855BD22DDD38D00AC458A /* libton_crypto.a in Frameworks */, + D01855BE22DDD38D00AC458A /* libtl_tonlib_api_json.a in Frameworks */, + D01855BF22DDD38D00AC458A /* libtdnet.a in Frameworks */, + D01855C022DDD38D00AC458A /* libtl_tonlib_api.a in Frameworks */, + D01855C122DDD38D00AC458A /* libtonlibjson_static.a in Frameworks */, + D01855C222DDD38D00AC458A /* libton_block.a in Frameworks */, + D01855C322DDD38D00AC458A /* libtl_api.a in Frameworks */, + D01855C422DDD38D00AC458A /* libcrc32c.a in Frameworks */, + D01855C522DDD38D00AC458A /* libtdtl.a in Frameworks */, + D01855C622DDD38D00AC458A /* libmemprof.a in Frameworks */, + D018559C22DDD38B00AC458A /* libtdutils.a in Frameworks */, + D018559D22DDD38B00AC458A /* libtddb.a in Frameworks */, + D018559E22DDD38B00AC458A /* libtdactor.a in Frameworks */, + D00083C922DD33E500EC418C /* libc++.tbd in Frameworks */, D0CAF2FD1D7628FD0011F558 /* libcrypto.a in Frameworks */, D0CAF2F11D75F4EA0011F558 /* CFNetwork.framework in Frameworks */, D0CAF2EF1D75F4E20011F558 /* UIKit.framework in Frameworks */, @@ -915,9 +1016,23 @@ path = MtProtoKitStabilityTests; sourceTree = ""; }; + D018558922DDD36C00AC458A /* include */ = { + isa = PBXGroup; + children = ( + D018558A22DDD36C00AC458A /* Client.h */, + D018558B22DDD36C00AC458A /* TlObject.h */, + D018558C22DDD36C00AC458A /* tonlib_api.h */, + D018558D22DDD36C00AC458A /* int_types.h */, + D018558E22DDD36C00AC458A /* TonlibCallback.h */, + D018558F22DDD36C00AC458A /* platform.h */, + ); + path = include; + sourceTree = ""; + }; D05A830918AFB3F9007F1076 = { isa = PBXGroup; children = ( + D08A158E22DD32740073B508 /* TON */, D05A84E718AFF0EE007F1076 /* Third Party */, D05A849B18AFCA3D007F1076 /* MTProtoKit */, D05A831918AFB3F9007F1076 /* MtProtoKit iOS */, @@ -950,6 +1065,33 @@ D05A831618AFB3F9007F1076 /* Frameworks */ = { isa = PBXGroup; children = ( + D01855A022DDD38C00AC458A /* libadnllite.a */, + D01855B022DDD38D00AC458A /* libcrc32c.a */, + D01855A122DDD38C00AC458A /* libfift.a */, + D01855A222DDD38C00AC458A /* libkeys.a */, + D01855B222DDD38D00AC458A /* libmemprof.a */, + D01855AB22DDD38C00AC458A /* libtdnet.a */, + D01855B122DDD38D00AC458A /* libtdtl.a */, + D01855A722DDD38C00AC458A /* libterminal.a */, + D01855AF22DDD38D00AC458A /* libtl_api.a */, + D018559F22DDD38B00AC458A /* libtl_lite_api.a */, + D01855AA22DDD38C00AC458A /* libtl_tonlib_api_json.a */, + D01855AC22DDD38C00AC458A /* libtl_tonlib_api.a */, + D01855A322DDD38C00AC458A /* libtl-lite-utils.a */, + D01855A422DDD38C00AC458A /* libtl-utils.a */, + D01855AE22DDD38D00AC458A /* libton_block.a */, + D01855A922DDD38C00AC458A /* libton_crypto.a */, + D01855A522DDD38C00AC458A /* libton_db.a */, + D01855A622DDD38C00AC458A /* libtonlib.a */, + D01855A822DDD38C00AC458A /* libtonlibjson_private.a */, + D01855AD22DDD38C00AC458A /* libtonlibjson_static.a */, + D00083D722DD467100EC418C /* libtdjson.dylib */, + D00083CA22DD42F600EC418C /* libtonlibjson.dylib */, + D00083C822DD33E500EC418C /* libc++.tbd */, + D08A159422DD32CF0073B508 /* libtdactor.a */, + D08A159522DD32CF0073B508 /* libtddb.a */, + D08A159322DD32CF0073B508 /* libtdutils.a */, + D08A159622DD32CF0073B508 /* libtonlibjson.a */, D0B4187C1D7E04EB004562A4 /* libcrypto.a */, D0B4187A1D7E04CF004562A4 /* libz.tbd */, D0B418781D7E04CB004562A4 /* Security.framework */, @@ -1351,6 +1493,18 @@ name = "Supporting Files"; sourceTree = ""; }; + D08A158E22DD32740073B508 /* TON */ = { + isa = PBXGroup; + children = ( + D018558922DDD36C00AC458A /* include */, + D08A159022DD32B40073B508 /* tonlib_client_json.h */, + D08A158F22DD32B40073B508 /* tonlibjson_export.h */, + D08A159B22DD32F20073B508 /* TON.h */, + D08A159C22DD32F20073B508 /* TON.mm */, + ); + path = TON; + sourceTree = ""; + }; D0CB05F81ADC4483005E298F /* MtProtoKit */ = { isa = PBXGroup; children = ( @@ -1612,6 +1766,7 @@ D0D1A03A1ADD983C007D9ED6 /* MTBufferReader.h in Headers */, D0CB065C1ADC45CE005E298F /* MTTcpConnection.h in Headers */, D0D1A0501ADD983C007D9ED6 /* MTMsgsAckMessage.h in Headers */, + D018559322DDD36C00AC458A /* int_types.h in Headers */, D0CAF2CB1D75E24C0011F558 /* MTSignal.h in Headers */, D0CB06461ADC45A2005E298F /* MTMessageService.h in Headers */, D0B0DF611DD7E7A2003BA12D /* MTBag.h in Headers */, @@ -1620,12 +1775,14 @@ D0D1A0441ADD983C007D9ED6 /* MTInternalMessageParser.h in Headers */, D0D1A05A1ADD983C007D9ED6 /* MTPongMessage.h in Headers */, D0CFBB8A1FD718C500B65C0D /* AFHTTPRequestOperation.h in Headers */, + D018559422DDD36C00AC458A /* TonlibCallback.h in Headers */, D0D1A0481ADD983C007D9ED6 /* MTMsgAllInfoMessage.h in Headers */, D0CFBB871FD7188200B65C0D /* AFURLConnectionOperation.h in Headers */, D0CAF2D71D75E2840011F558 /* MTDisposable.h in Headers */, D0CB062A1ADC4575005E298F /* MTDatacenterTransferAuthAction.h in Headers */, D0CB064F1ADC45B1005E298F /* MTApiEnvironment.h in Headers */, D0CB06191ADC4541005E298F /* MTTimer.h in Headers */, + D018559122DDD36C00AC458A /* TlObject.h in Headers */, D0CB06381ADC4591005E298F /* MTProto.h in Headers */, D0CB06321ADC4583005E298F /* MTDatacenterAuthInfo.h in Headers */, D0D1A0541ADD983C007D9ED6 /* MTMsgsStateReqMessage.h in Headers */, @@ -1636,6 +1793,7 @@ D0D1A0361ADD983C007D9ED6 /* MTBadMsgNotificationMessage.h in Headers */, D0529D2B21A434BF00D7C3C4 /* MTTransportSchemeStats.h in Headers */, D0CB06581ADC45CE005E298F /* MTNetworkAvailability.h in Headers */, + D018559522DDD36C00AC458A /* platform.h in Headers */, D0CB06211ADC454C005E298F /* MTKeychain.h in Headers */, D0580AC21B0F3E9C00E8235B /* MTDiscoverConnectionSignals.h in Headers */, D0C932231E095D6A0074F044 /* MTNetworkUsageCalculationInfo.h in Headers */, @@ -1663,6 +1821,7 @@ D0D1A05E1ADD983C007D9ED6 /* MTRpcError.h in Headers */, D0E2E17720866780005737E8 /* MTDNS.h in Headers */, D0C9322B1E095E280074F044 /* MTNetworkUsageManager.h in Headers */, + D018559022DDD36C00AC458A /* Client.h in Headers */, D0CB063A1ADC4591005E298F /* MTTimeFixContext.h in Headers */, D0CB065D1ADC45CE005E298F /* MTTcpConnectionBehaviour.h in Headers */, D09A59581B582EFF00FC3724 /* MTFileBasedKeychain.h in Headers */, @@ -1687,6 +1846,7 @@ D0CB066A1ADC4846005E298F /* MTResendMessageService.h in Headers */, D0CB061D1ADC4541005E298F /* MTQueue.h in Headers */, D0CB06171ADC4536005E298F /* MTProtoKit.h in Headers */, + D018559222DDD36C00AC458A /* tonlib_api.h in Headers */, D0CB06391ADC4591005E298F /* MTSessionInfo.h in Headers */, D0CB06331ADC4583005E298F /* MTDatacenterSaltInfo.h in Headers */, D0CB062B1ADC4575005E298F /* MTDatacenterAuthAction.h in Headers */, @@ -1716,6 +1876,7 @@ D0CD97F61D74B94B00F41187 /* MTRsa.h in Headers */, D0CD98C11D74BA8300F41187 /* MTTcpTransport.h in Headers */, D0CD98CB1D74BA9500F41187 /* MTTcpConnectionBehaviour.h in Headers */, + D08A159D22DD32F20073B508 /* TON.h in Headers */, D0CD982D1D74B99500F41187 /* MTResPqMessage.h in Headers */, D0CD98E91D75C0BB00F41187 /* MTMessageService.h in Headers */, D0B0DF631DD7E7A4003BA12D /* MTBag.h in Headers */, @@ -1733,6 +1894,8 @@ D0CD984C1D74B9AD00F41187 /* MTRpcError.h in Headers */, D0CD98251D74B99500F41187 /* MTMsgDetailedInfoMessage.h in Headers */, D0CD989D1D74BA6500F41187 /* MTIncomingMessage.h in Headers */, + D08A159222DD32B40073B508 /* tonlib_client_json.h in Headers */, + D018559722DDD37300AC458A /* TlObject.h in Headers */, D0CD98011D74B96400F41187 /* MTBadMsgNotificationMessage.h in Headers */, D0CD98201D74B99500F41187 /* MTFutureSaltsMessage.h in Headers */, D0CD985E1D74B9BF00F41187 /* MTServerDhParamsMessage.h in Headers */, @@ -1742,6 +1905,7 @@ D0CD98041D74B96400F41187 /* MTDestroySessionResponseMessage.h in Headers */, D0CD97FB1D74B95100F41187 /* MTSerialization.h in Headers */, D0CD98651D74B9D800F41187 /* MTFileBasedKeychain.h in Headers */, + D018559622DDD37300AC458A /* Client.h in Headers */, D0CD98991D74BA6500F41187 /* MTSessionInfo.h in Headers */, D0CD97D71D74B92000F41187 /* MTTimer.h in Headers */, D0529D2D21A434BF00D7C3C4 /* MTTransportSchemeStats.h in Headers */, @@ -1752,6 +1916,7 @@ D033873B223BC115007A2CE4 /* MTPKCS.h in Headers */, D0CD985C1D74B9BF00F41187 /* MTRpcResultMessage.h in Headers */, D0D225101B4D817B0085E26D /* MtProtoKitDynamic.h in Headers */, + D018559922DDD37300AC458A /* int_types.h in Headers */, D0CD98241D74B99500F41187 /* MTMsgContainerMessage.h in Headers */, D0CD98281D74B99500F41187 /* MTMsgsStateInfoMessage.h in Headers */, D0CD98271D74B99500F41187 /* MTMsgsAckMessage.h in Headers */, @@ -1760,7 +1925,9 @@ D0CD988D1D74BA5200F41187 /* MTDatacenterAddressListData.h in Headers */, D0CD985D1D74B9BF00F41187 /* MTServerDhInnerDataMessage.h in Headers */, D0CD98611D74B9D000F41187 /* MTKeychain.h in Headers */, + D018559822DDD37300AC458A /* tonlib_api.h in Headers */, D0CD98261D74B99500F41187 /* MTMsgResendReqMessage.h in Headers */, + D018559B22DDD37300AC458A /* platform.h in Headers */, D0CD97EE1D74B94300F41187 /* MTLogging.h in Headers */, D0CD98FB1D75C0E500F41187 /* MTRequest.h in Headers */, D0CAF2DA1D75E3160011F558 /* MTSubscriber.h in Headers */, @@ -1782,6 +1949,8 @@ D0CD97F11D74B94300F41187 /* MTQueue.h in Headers */, D0CD98051D74B96400F41187 /* MTDropRpcResultMessage.h in Headers */, D0CD987C1D74BA4100F41187 /* MTDatacenterAuthAction.h in Headers */, + D018559A22DDD37300AC458A /* TonlibCallback.h in Headers */, + D08A159122DD32B40073B508 /* tonlibjson_export.h in Headers */, D0CD982A1D74B99500F41187 /* MTNewSessionCreatedMessage.h in Headers */, D0CD987B1D74BA4100F41187 /* MTDatacenterTransferAuthAction.h in Headers */, D0CD990B1D75C0F400F41187 /* MTResendMessageService.h in Headers */, @@ -2206,6 +2375,7 @@ D0CD98821D74BA4900F41187 /* MTDatacenterAuthAction.m in Sources */, D0CD98961D74BA5A00F41187 /* MTDatacenterSaltInfo.m in Sources */, D0CD98771D74BA0700F41187 /* MTDiscoverDatacenterAddressAction.m in Sources */, + D08A159E22DD32F20073B508 /* TON.mm in Sources */, D0CD98CD1D74BA9700F41187 /* MTTcpConnectionBehaviour.m in Sources */, D0CD98491D74B9AA00F41187 /* MTPingMessage.m in Sources */, D0CD97DB1D74B93100F41187 /* MTQueue.m in Sources */, @@ -2411,6 +2581,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = NO; @@ -2472,6 +2643,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -2497,11 +2669,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = NO; OTHER_CFLAGS = "-DMtProtoKitDynamicFramework=1"; @@ -2681,6 +2854,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = YES; @@ -2747,6 +2921,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -2775,11 +2950,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -2928,6 +3104,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = YES; @@ -2995,6 +3172,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -3023,11 +3201,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -3176,6 +3355,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = YES; @@ -3243,6 +3423,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -3271,11 +3452,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -3585,6 +3767,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = YES; @@ -3652,6 +3835,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -3680,11 +3864,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -3822,6 +4007,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = NO; @@ -3883,6 +4069,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -3907,11 +4094,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = NO; OTHER_CFLAGS = "-DMtProtoKitDynamicFramework=1"; @@ -4042,6 +4230,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = NO; @@ -4103,6 +4292,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -4127,11 +4317,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = NO; OTHER_CFLAGS = "-DMtProtoKitDynamicFramework=1"; @@ -4262,6 +4453,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = NO; @@ -4322,6 +4514,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -4346,11 +4539,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = NO; OTHER_CFLAGS = "-DMtProtoKitDynamicFramework=1"; @@ -4481,6 +4675,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = NO; @@ -4541,6 +4736,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -4565,11 +4761,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = NO; OTHER_CFLAGS = "-DMtProtoKitDynamicFramework=1"; @@ -4711,6 +4908,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = YES; @@ -4778,6 +4976,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -4806,11 +5005,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -4914,6 +5114,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = YES; @@ -4968,6 +5169,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = NO; @@ -5059,6 +5261,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = NO; @@ -5120,6 +5323,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -5144,11 +5348,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = NO; OTHER_CFLAGS = "-DMtProtoKitDynamicFramework=1"; @@ -5210,6 +5415,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -5238,11 +5444,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -5266,6 +5473,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -5290,11 +5498,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = NO; OTHER_CFLAGS = "-DMtProtoKitDynamicFramework=1"; @@ -5444,6 +5653,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = YES; @@ -5511,6 +5721,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_ENABLE_MODULES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -5539,11 +5750,12 @@ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/openssl/iOS", + "$(PROJECT_DIR)/TON", ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; diff --git a/submodules/MtProtoKit/TON/TON.h b/submodules/MtProtoKit/TON/TON.h new file mode 100644 index 0000000000..010f7faf0b --- /dev/null +++ b/submodules/MtProtoKit/TON/TON.h @@ -0,0 +1,48 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@class MTSignal; + +@interface TONError : NSObject + +@property (nonatomic, strong, readonly) NSString *text; + +@end + +@interface TONKey : NSObject + +@property (nonatomic, strong, readonly) NSString *publicKey; +@property (nonatomic, strong, readonly) NSData *secret; + +- (instancetype)initWithPublicKey:(NSString *)publicKey secret:(NSData *)secret; + +@end + +@interface TONAccountState : NSObject + +@property (nonatomic, readonly) int64_t balance; +@property (nonatomic, readonly) int32_t seqno; + +- (instancetype)initWithBalance:(int64_t)balance seqno:(int32_t)seqno; + +@end + +@interface TON : NSObject + +- (instancetype)initWithKeystoreDirectory:(NSString *)keystoreDirectory config:(NSString *)config; + +- (MTSignal *)createKeyWithLocalPassword:(NSData *)localPassword mnemonicPassword:(NSString *)mnemonicPassword; +- (MTSignal *)getTestWalletAccountAddressWithPublicKey:(NSString *)publicKey; +- (MTSignal *)getTestGiverAccountState; +- (MTSignal *)testGiverSendGramsWithAccountState:(TONAccountState *)accountState accountAddress:(NSString *)accountAddress amount:(int64_t)amount; +- (MTSignal *)getAccountStateWithAddress:(NSString *)accountAddress; +- (MTSignal *)sendGramsFromKey:(TONKey *)key localPassword:(NSData *)localPassword fromAddress:(NSString *)fromAddress toAddress:(NSString *)address amount:(int64_t)amount; +- (MTSignal *)exportKey:(TONKey *)key localPassword:(NSData *)localPassword; +- (MTSignal *)importKeyWithLocalPassword:(NSData *)localPassword mnemonicPassword:(NSString *)mnemonicPassword wordList:(NSArray *)wordList; +- (MTSignal *)deleteKeyWithPublicKey:(NSString *)publicKey; +- (MTSignal *)makeWalletInitialized:(TONKey *)key localPassword:(NSData *)localPassword; + +@end + +NS_ASSUME_NONNULL_END diff --git a/submodules/MtProtoKit/TON/TON.mm b/submodules/MtProtoKit/TON/TON.mm new file mode 100644 index 0000000000..9fe09d5050 --- /dev/null +++ b/submodules/MtProtoKit/TON/TON.mm @@ -0,0 +1,472 @@ +#import "TON.h" + +#import "tonlib_client_json.h" +#import "MTLogging.h" +#import "Client.h" +#import "MTQueue.h" +#import "MTSignal.h" + +@implementation TONKey + +- (instancetype)initWithPublicKey:(NSString *)publicKey secret:(NSData *)secret { + self = [super init]; + if (self != nil) { + _publicKey = publicKey; + _secret = secret; + } + return self; +} + +@end + +@implementation TONAccountState + +- (instancetype)initWithBalance:(int64_t)balance seqno:(int32_t)seqno { + self = [super init]; + if (self != nil) { + _balance = balance; + _seqno = seqno; + } + return self; +} + +@end + +using tonlib_api::make_object; + +@interface TONReceiveThreadParams : NSObject + +@property (nonatomic, readonly) std::shared_ptr client; +@property (nonatomic, copy, readonly) void (^received)(tonlib::Client::Response &); + +@end + +@implementation TONReceiveThreadParams + +- (instancetype)initWithClient:(std::shared_ptr)client received:(void (^)(tonlib::Client::Response &))received { + self = [super init]; + if (self != nil) { + _client = client; + _received = [received copy]; + } + return self; +} + +@end + +@interface TONRequestHandler : NSObject + +@property (nonatomic, copy, readonly) void (^completion)(tonlib_api::object_ptr &); + +@end + +@implementation TONRequestHandler + +- (instancetype)initWithCompletion:(void (^)(tonlib_api::object_ptr &))completion { + self = [super init]; + if (self != nil) { + _completion = [completion copy]; + } + return self; +} + +@end + +@implementation TONError + +- (instancetype)initWithText:(NSString *)text { + self = [super init]; + if (self != nil) { + _text = text; + } + return self; +} + +@end + +@interface TON () { + std::shared_ptr _client; + uint64_t _nextRequestId; + NSLock *_requestHandlersLock; + NSMutableDictionary *_requestHandlers; + MTPipe *_initialized; +} + +@end + +@implementation TON + ++ (void)receiveThread:(TONReceiveThreadParams *)params { + while (true) { + auto response = params.client->receive(1000); + if (response.object) { + params.received(response); + } + } +} + +- (instancetype)initWithKeystoreDirectory:(NSString *)keystoreDirectory config:(NSString *)config { + self = [super init]; + if (self != nil) { + _requestHandlersLock = [[NSLock alloc] init]; + _requestHandlers = [[NSMutableDictionary alloc] init]; + _initialized = [[MTPipe alloc] initWithReplay:true]; + _initialized.sink(@false); + _nextRequestId = 1; + + _client = std::make_shared(); + + NSLock *requestHandlersLock = _requestHandlersLock; + NSMutableDictionary *requestHandlers = _requestHandlers; + NSThread *thread = [[NSThread alloc] initWithTarget:[self class] selector:@selector(receiveThread:) object:[[TONReceiveThreadParams alloc] initWithClient:_client received:^(tonlib::Client::Response &response) { + NSNumber *requestId = @(response.id); + [requestHandlersLock lock]; + TONRequestHandler *handler = requestHandlers[requestId]; + [requestHandlers removeObjectForKey:requestId]; + [requestHandlersLock unlock]; + if (handler != nil) { + handler.completion(response.object); + } + }]]; + [thread start]; + + [[NSFileManager defaultManager] createDirectoryAtPath:keystoreDirectory withIntermediateDirectories:true attributes:nil error:nil]; + + [[self requestInitWithConfigString:config keystoreDirectory:keystoreDirectory] startWithNext:nil completed:^{ + _initialized.sink(@true); + }]; + } + return self; +} + +- (MTSignal *)requestInitWithConfigString:(NSString *)configString keystoreDirectory:(NSString *)keystoreDirectory { + return [[[[MTSignal alloc] initWithGenerator:^id(MTSubscriber *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 { + [subscriber putCompletion]; + } + }]; + + auto query = make_object(make_object(configString.UTF8String, keystoreDirectory.UTF8String)); + _client->send({ requestId, std::move(query) }); + + return [[MTBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[MTQueue mainQueue]] deliverOn:[MTQueue mainQueue]]; +} + +- (MTSignal *)createKeyWithLocalPassword:(NSData *)localPassword mnemonicPassword:(NSString *)mnemonicPassword { + return [[[[MTSignal alloc] initWithGenerator:^id(MTSubscriber *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::key::ID) { + auto result = tonlib_api::move_object_as(object); + NSString *publicKey = [[[NSData alloc] initWithBytes:result->public_key_.data() length:result->public_key_.length()] base64EncodedStringWithOptions:0]; + NSData *secret = [[NSData alloc] initWithBytes:result->secret_.data() length:result->secret_.length()]; + [subscriber putNext:[[TONKey alloc] initWithPublicKey:publicKey secret:secret]]; + [subscriber putCompletion]; + } else { + assert(false); + } + }]; + + NSString *localPasswordString = [localPassword base64EncodedStringWithOptions:0]; + + auto query = make_object(localPasswordString.UTF8String, mnemonicPassword.UTF8String); + _client->send({ requestId, std::move(query) }); + + return [[MTBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[MTQueue mainQueue]] deliverOn:[MTQueue mainQueue]]; +} + +- (MTSignal *)getTestWalletAccountAddressWithPublicKey:(NSString *)publicKey { + return [[[[MTSignal alloc] initWithGenerator:^id(MTSubscriber *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::accountAddress::ID) { + auto result = tonlib_api::move_object_as(object); + [subscriber putNext:[[NSString alloc] initWithUTF8String:result->account_address_.c_str()]]; + [subscriber putCompletion]; + } else { + assert(false); + } + }]; + + NSData *publicKeyData = [[NSData alloc] initWithBase64EncodedString:publicKey options:0]; + std::string publicKeyString((uint8_t *)publicKeyData.bytes, (uint8_t *)publicKeyData.bytes + publicKeyData.length); + + auto query = make_object(make_object(publicKeyString)); + _client->send({ requestId, std::move(query) }); + + return [[MTBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[MTQueue mainQueue]] deliverOn:[MTQueue mainQueue]]; +} + +- (MTSignal *)getTestGiverAccountState { + return [[[[MTSignal alloc] initWithGenerator:^id(MTSubscriber *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::testGiver_accountState::ID) { + auto result = tonlib_api::move_object_as(object); + [subscriber putNext:[[TONAccountState alloc] initWithBalance:result->balance_ seqno:result->seqno_]]; + [subscriber putCompletion]; + } else { + assert(false); + } + }]; + + auto query = make_object(); + _client->send({ requestId, std::move(query) }); + + return [[MTBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[MTQueue mainQueue]] deliverOn:[MTQueue mainQueue]]; +} + +- (MTSignal *)testGiverSendGramsWithAccountState:(TONAccountState *)accountState accountAddress:(NSString *)accountAddress amount:(int64_t)amount { + return [[[[MTSignal alloc] initWithGenerator:^id(MTSubscriber *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 { + [subscriber putCompletion]; + } + }]; + + auto query = make_object(make_object(accountAddress.UTF8String), accountState.seqno, amount); + _client->send({ requestId, std::move(query) }); + + return [[MTBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[MTQueue mainQueue]] deliverOn:[MTQueue mainQueue]]; +} + +- (MTSignal *)getAccountStateWithAddress:(NSString *)accountAddress { + return [[[[MTSignal alloc] initWithGenerator:^id(MTSubscriber *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::generic_accountStateUninited::ID) { + auto result = tonlib_api::move_object_as(object); + [subscriber putNext:[[TONAccountState alloc] initWithBalance:result->account_state_->balance_ seqno:-1]]; + [subscriber putCompletion]; + } else if (object->get_id() == tonlib_api::generic_accountStateTestWallet::ID) { + auto result = tonlib_api::move_object_as(object); + [subscriber putNext:[[TONAccountState alloc] initWithBalance:result->account_state_->balance_ seqno:result->account_state_->seqno_]]; + [subscriber putCompletion]; + } else { + assert(false); + } + }]; + + auto query = make_object(make_object(accountAddress.UTF8String)); + _client->send({ requestId, std::move(query) }); + + return [[MTBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[MTQueue mainQueue]] deliverOn:[MTQueue mainQueue]]; +} + +- (MTSignal *)sendGramsFromKey:(TONKey *)key localPassword:(NSData *)localPassword fromAddress:(NSString *)fromAddress toAddress:(NSString *)address amount:(int64_t)amount { + return [[[[MTSignal alloc] initWithGenerator:^id(MTSubscriber *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 { + [subscriber putCompletion]; + } + }]; + + NSData *publicKeyData = [[NSData alloc] initWithBase64EncodedString:key.publicKey options:0]; + std::string publicKeyString((uint8_t *)publicKeyData.bytes, (uint8_t *)publicKeyData.bytes + publicKeyData.length); + + NSData *secretData = key.secret; + std::string secretString((uint8_t *)secretData.bytes, (uint8_t *)secretData.bytes + secretData.length); + + NSString *localPasswordConvertedString = [localPassword base64EncodedStringWithOptions:0]; + NSData *localPasswordData = [localPasswordConvertedString dataUsingEncoding:NSUTF8StringEncoding]; + std::string localPasswordString((uint8_t *)localPasswordData.bytes, (uint8_t *)localPasswordData.bytes + localPasswordData.length); + + auto query = make_object(make_object(make_object(publicKeyString, secretString), localPasswordString), make_object(fromAddress.UTF8String), make_object(address.UTF8String), amount); + _client->send({ requestId, std::move(query) }); + + return [[MTBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[MTQueue mainQueue]] deliverOn:[MTQueue mainQueue]]; +} + +- (MTSignal *)exportKey:(TONKey *)key localPassword:(NSData *)localPassword { + return [[[[MTSignal alloc] initWithGenerator:^id(MTSubscriber *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::exportedKey::ID) { + auto result = tonlib_api::move_object_as(object); + NSMutableArray *wordList = [[NSMutableArray alloc] init]; + for (auto it : result->word_list_) { + [wordList addObject:[[NSString alloc] initWithUTF8String:it.c_str()]]; + } + [subscriber putNext:wordList]; + [subscriber putCompletion]; + } else { + assert(false); + } + }]; + + NSData *publicKeyData = [[NSData alloc] initWithBase64EncodedString:key.publicKey options:0]; + std::string publicKeyString((uint8_t *)publicKeyData.bytes, (uint8_t *)publicKeyData.bytes + publicKeyData.length); + + NSData *secretData = key.secret; + std::string secretString((uint8_t *)secretData.bytes, (uint8_t *)secretData.bytes + secretData.length); + + NSString *localPasswordConvertedString = [localPassword base64EncodedStringWithOptions:0]; + NSData *localPasswordData = [localPasswordConvertedString dataUsingEncoding:NSUTF8StringEncoding]; + std::string localPasswordString((uint8_t *)localPasswordData.bytes, (uint8_t *)localPasswordData.bytes + localPasswordData.length); + + auto query = make_object(make_object(make_object(publicKeyString, secretString), localPasswordString)); + _client->send({ requestId, std::move(query) }); + + return [[MTBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[MTQueue mainQueue]] deliverOn:[MTQueue mainQueue]]; +} + +- (MTSignal *)makeWalletInitialized:(TONKey *)key localPassword:(NSData *)localPassword { + return [[[[MTSignal alloc] initWithGenerator:^id(MTSubscriber *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 { + [subscriber putCompletion]; + } + }]; + + NSData *publicKeyData = [[NSData alloc] initWithBase64EncodedString:key.publicKey options:0]; + std::string publicKeyString((uint8_t *)publicKeyData.bytes, (uint8_t *)publicKeyData.bytes + publicKeyData.length); + + NSData *secretData = key.secret; + std::string secretString((uint8_t *)secretData.bytes, (uint8_t *)secretData.bytes + secretData.length); + + NSString *localPasswordConvertedString = [localPassword base64EncodedStringWithOptions:0]; + NSData *localPasswordData = [localPasswordConvertedString dataUsingEncoding:NSUTF8StringEncoding]; + std::string localPasswordString((uint8_t *)localPasswordData.bytes, (uint8_t *)localPasswordData.bytes + localPasswordData.length); + + auto query = make_object(make_object(make_object(publicKeyString, secretString), localPasswordString)); + _client->send({ requestId, std::move(query) }); + + return [[MTBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[MTQueue mainQueue]] deliverOn:[MTQueue mainQueue]]; +} + +- (MTSignal *)importKeyWithLocalPassword:(NSData *)localPassword mnemonicPassword:(NSString *)mnemonicPassword wordList:(NSArray *)wordList { + return [[[[MTSignal alloc] initWithGenerator:^id(MTSubscriber *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::key::ID) { + auto result = tonlib_api::move_object_as(object); + NSString *publicKey = [[[NSData alloc] initWithBytes:result->public_key_.data() length:result->public_key_.length()] base64EncodedStringWithOptions:0]; + NSData *secret = [[NSData alloc] initWithBytes:result->secret_.data() length:result->secret_.length()]; + [subscriber putNext:[[TONKey alloc] initWithPublicKey:publicKey secret:secret]]; + [subscriber putCompletion]; + } else { + assert(false); + } + }]; + + NSString *localPasswordConvertedString = [localPassword base64EncodedStringWithOptions:0]; + NSData *localPasswordData = [localPasswordConvertedString dataUsingEncoding:NSUTF8StringEncoding]; + std::string localPasswordString((uint8_t *)localPasswordData.bytes, (uint8_t *)localPasswordData.bytes + localPasswordData.length); + + NSData *mnemonicPasswordData = [mnemonicPassword dataUsingEncoding:NSUTF8StringEncoding]; + std::string mnemonicPasswordString((uint8_t *)mnemonicPasswordData.bytes, (uint8_t *)mnemonicPasswordData.bytes + mnemonicPasswordData.length); + + std::vector wordVector; + for (NSString *word in wordList) { + NSData *wordData = [word dataUsingEncoding:NSUTF8StringEncoding]; + std::string wordString((uint8_t *)wordData.bytes, (uint8_t *)wordData.bytes + wordData.length); + wordVector.push_back(wordString); + } + + auto query = make_object(localPasswordString, mnemonicPasswordString, make_object(std::move(wordVector))); + _client->send({ requestId, std::move(query) }); + + return [[MTBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[MTQueue mainQueue]] deliverOn:[MTQueue mainQueue]]; +} + +- (MTSignal *)deleteKeyWithPublicKey:(NSString *)publicKey { + return [[[[MTSignal alloc] initWithGenerator:^id(MTSubscriber *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 { + [subscriber putCompletion]; + } + }]; + + NSData *publicKeyData = [[NSData alloc] initWithBase64EncodedString:publicKey options:0]; + std::string publicKeyString((uint8_t *)publicKeyData.bytes, (uint8_t *)publicKeyData.bytes + publicKeyData.length); + + auto query = make_object(publicKeyString); + _client->send({ requestId, std::move(query) }); + + return [[MTBlockDisposable alloc] initWithBlock:^{ + }]; + }] startOn:[MTQueue mainQueue]] deliverOn:[MTQueue mainQueue]]; +} + +@end diff --git a/submodules/MtProtoKit/TON/include/Client.h b/submodules/MtProtoKit/TON/include/Client.h new file mode 100644 index 0000000000..f1b14ad686 --- /dev/null +++ b/submodules/MtProtoKit/TON/include/Client.h @@ -0,0 +1,34 @@ +#pragma once +#include "tonlib_api.h" + +#include "TonlibCallback.h" + +namespace tonlib { +class Client final { + public: + Client(); + struct Request { + std::uint64_t id; + tonlib_api::object_ptr function; + }; + + void send(Request&& request); + + struct Response { + std::uint64_t id; + tonlib_api::object_ptr object; + }; + + Response receive(double timeout); + + static Response execute(Request&& request); + + ~Client(); + Client(Client&& other); + Client& operator=(Client&& other); + + private: + class Impl; + std::unique_ptr impl_; +}; +} // namespace tonlib diff --git a/submodules/MtProtoKit/TON/include/TlObject.h b/submodules/MtProtoKit/TON/include/TlObject.h new file mode 100644 index 0000000000..d79419a605 --- /dev/null +++ b/submodules/MtProtoKit/TON/include/TlObject.h @@ -0,0 +1,159 @@ +#pragma once + +/** + * \file + * Contains declarations of a base class for all TL-objects and some helper methods + */ + +#include +#include +#include +#include + +namespace td { +class TlStorerCalcLength; + +class TlStorerUnsafe; + +class TlStorerToString; +} // namespace td +namespace ton { +/** + * This class is a base class for all TL-objects. + */ +class TlObject { + public: + /** + * Returns identifier uniquely determining TL-type of the object. + */ + virtual std::int32_t get_id() const = 0; + + /** + * Appends object to the storer serializing object to a buffer of fixed length. + * \param[in] s Storer to which object will be appended. + */ + virtual void store(td::TlStorerUnsafe &s) const { + } + + /** + * Appends object to the storer calculating TL-length of the serialized object. + * \param[in] s Storer to which object will be appended. + */ + virtual void store(td::TlStorerCalcLength &s) const { + } + + /** + * Helper function for to_string method. Appends string representation of the object to the storer. + * \param[in] s Storer to which object string representation will be appended. + * \param[in] field_name Object field_name if applicable. + */ + virtual void store(td::TlStorerToString &s, const char *field_name) const = 0; + + /** + * Default constructor. + */ + TlObject() = default; + + /** + * Deleted copy constructor. + */ + TlObject(const TlObject &) = delete; + + /** + * Deleted copy assignment operator. + */ + TlObject &operator=(const TlObject &) = delete; + + /** + * Default move constructor. + */ + TlObject(TlObject &&) = default; + + /** + * Default move assignment operator. + */ + TlObject &operator=(TlObject &&) = default; + + /** + * Virtual desctructor. + */ + virtual ~TlObject() = default; +}; + +/** + * A smart wrapper to store a pointer to a TL-object. + */ +template +using tl_object_ptr = std::unique_ptr; + +/** + * A function to create a dynamically allocated TL-object. Can be treated as an analogue of std::make_unique. + * Examples of usage: + * \code + * auto get_auth_state_request = td::create_tl_object(); + * auto send_message_request = td::create_tl_object(chat_id, 0, false, false, nullptr, + * td::create_tl_object("Hello, world!!!", false, true, {}, nullptr)); + * \endcode + * + * \tparam Type Type of a TL-object to construct. + * \param[in] args Arguments to pass to the object constructor. + * \return Wrapped pointer to the created TL-object. + */ +template +tl_object_ptr create_tl_object(Args &&... args) { + return tl_object_ptr(new Type(std::forward(args)...)); +} + +/** + * A function to downcast a wrapped pointer to TL-object to a pointer to its subclass. + * It is undefined behaviour to cast an object to the wrong type. + * Examples of usage: + * \code + * td::tl_object_ptr auth_state = ...; + * switch (auth_state->get_id()) { + * case td::td_api::authStateWaitPhoneNumber::ID: { + * auto state = td::move_tl_object_as(auth_state); + * // use state + * break; + * } + * case td::td_api::authStateWaitCode::ID: { + * auto state = td::move_tl_object_as(auth_state); + * // use state + * break; + * } + * case td::td_api::authStateWaitPassword::ID: { + * auto state = td::move_tl_object_as(auth_state); + * // use state + * break; + * } + * case td::td_api::authStateOk::ID: { + * auto state = td::move_tl_object_as(auth_state); + * // use state + * break; + * } + * case td::td_api::authStateLoggingOut::ID: { + * auto state = td::move_tl_object_as(auth_state); + * // use state + * break; + * } + * } + * \endcode + * + * \tparam ToT Type of a TL-object to move to. + * \tparam FromT Type of a TL-object to move from, auto-deduced. + * \param[in] from Wrapped pointer to a TL-object. + */ +template +tl_object_ptr move_tl_object_as(tl_object_ptr &from) { + return tl_object_ptr(static_cast(from.release())); +} + +/** + * \overload + */ +template +tl_object_ptr move_tl_object_as(tl_object_ptr &&from) { + return tl_object_ptr(static_cast(from.release())); +} + +} // namespace ton diff --git a/submodules/MtProtoKit/TON/include/TonlibCallback.h b/submodules/MtProtoKit/TON/include/TonlibCallback.h new file mode 100644 index 0000000000..866521709e --- /dev/null +++ b/submodules/MtProtoKit/TON/include/TonlibCallback.h @@ -0,0 +1,12 @@ +#pragma once + +#include "tonlib_api.h" + +namespace tonlib_api = ton::tonlib_api; + +class TonlibCallback { + public: + virtual void on_result(std::uint64_t id, tonlib_api::object_ptr result) = 0; + virtual void on_error(std::uint64_t id, tonlib_api::object_ptr error) = 0; + virtual ~TonlibCallback() = default; +}; diff --git a/submodules/MtProtoKit/TON/include/int_types.h b/submodules/MtProtoKit/TON/include/int_types.h new file mode 100644 index 0000000000..8e6a835d08 --- /dev/null +++ b/submodules/MtProtoKit/TON/include/int_types.h @@ -0,0 +1,39 @@ +#pragma once + +#include "platform.h" + +#include +#include + +namespace td { + +#if !TD_WINDOWS +using size_t = std::size_t; +#endif + +using int8 = std::int8_t; +using int16 = std::int16_t; +using uint16 = std::uint16_t; +using int32 = std::int32_t; +using uint32 = std::uint32_t; +using int64 = std::int64_t; +using uint64 = std::uint64_t; + +static_assert(sizeof(std::uint8_t) == sizeof(unsigned char), "Unsigned char expected to be 8-bit"); +using uint8 = unsigned char; + +#if TD_MSVC +#pragma warning(push) +#pragma warning(disable : 4309) +#endif + +static_assert(static_cast(128) == -128 || static_cast(128) == 128, + "Unexpected cast to char implementation-defined behaviour"); +static_assert(static_cast(256) == 0, "Unexpected cast to char implementation-defined behaviour"); +static_assert(static_cast(-256) == 0, "Unexpected cast to char implementation-defined behaviour"); + +#if TD_MSVC +#pragma warning(pop) +#endif + +} // namespace td diff --git a/submodules/MtProtoKit/TON/include/platform.h b/submodules/MtProtoKit/TON/include/platform.h new file mode 100644 index 0000000000..4530102d8b --- /dev/null +++ b/submodules/MtProtoKit/TON/include/platform.h @@ -0,0 +1,106 @@ +#pragma once + +// clang-format off + +/*** Platform macros ***/ +#if defined(_WIN32) || defined(_WINDOWS) // _WINDOWS is defined by CMake + #if defined(__cplusplus_winrt) + #define TD_WINRT 1 + #endif + #if defined(__cplusplus_cli) + #define TD_CLI 1 + #endif + #define TD_WINDOWS 1 +#elif defined(__APPLE__) + #include "TargetConditionals.h" + #if TARGET_OS_IPHONE + // iOS/watchOS/tvOS + #if TARGET_OS_IOS + #define TD_DARWIN_IOS 1 + #elif TARGET_OS_TV + #define TD_DARWIN_TV_OS 1 + #elif TARGET_OS_WATCH + #define TD_DARWIN_WATCH_OS 1 + #else + #warning "Probably unsupported Apple iPhone platform. Feel free to try to compile" + #endif + #elif TARGET_OS_MAC + // Other kinds of macOS + #define TD_DARWIN_MAC 1 + #else + #warning "Probably unsupported Apple platform. Feel free to try to compile" + #endif + #define TD_DARWIN 1 +#elif defined(ANDROID) || defined(__ANDROID__) + #define TD_ANDROID 1 +#elif defined(TIZEN_DEPRECATION) + #define TD_TIZEN 1 +#elif defined(__linux__) + #define TD_LINUX 1 +#elif defined(__FreeBSD__) + #define TD_FREEBSD 1 +#elif defined(__CYGWIN__) + #define TD_CYGWIN 1 +#elif defined(__EMSCRIPTEN__) + #define TD_EMSCRIPTEN 1 +#elif defined(__unix__) // all unices not caught above + #warning "Probably unsupported Unix platform. Feel free to try to compile" + #define TD_CYGWIN 1 +#else + #error "Probably unsupported platform. Feel free to remove the error and try to recompile" +#endif + +#if defined(__ICC) || defined(__INTEL_COMPILER) + #define TD_INTEL 1 +#elif defined(__clang__) + #define TD_CLANG 1 +#elif defined(__GNUC__) || defined(__GNUG__) + #define TD_GCC 1 +#elif defined(_MSC_VER) + #define TD_MSVC 1 +#else + #warning "Probably unsupported compiler. Feel free to try to compile" +#endif + +#if TD_GCC || TD_CLANG || TD_INTEL + #define TD_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) + #define TD_ATTRIBUTE_FORMAT_PRINTF(from, to) __attribute__((format(printf, from, to))) +#else + #define TD_WARN_UNUSED_RESULT + #define TD_ATTRIBUTE_FORMAT_PRINTF(from, to) +#endif + +#if TD_MSVC + #define TD_UNUSED __pragma(warning(suppress : 4100)) +#elif TD_CLANG || TD_GCC || TD_INTEL + #define TD_UNUSED __attribute__((unused)) +#else + #define TD_UNUSED +#endif + +#define TD_HAVE_ATOMIC_SHARED_PTR 1 + +// No atomic operations on std::shared_ptr in libstdc++ before 5.0 +// see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57250 +#ifdef __GLIBCXX__ + #undef TD_HAVE_ATOMIC_SHARED_PTR +#endif + +// Also no atomic operations on std::shared_ptr when clang __has_feature(cxx_atomic) is defined and zero +#if defined(__has_feature) + #if !__has_feature(cxx_atomic) + #undef TD_HAVE_ATOMIC_SHARED_PTR + #endif +#endif + +#ifdef TD_HAVE_ATOMIC_SHARED_PTR // unfortunately we can't check for __GLIBCXX__ here, it is not defined yet + #undef TD_HAVE_ATOMIC_SHARED_PTR +#endif + +#define TD_CONCURRENCY_PAD 128 + +#if !TD_WINDOWS && defined(__SIZEOF_INT128__) +#define TD_HAVE_INT128 1 +#endif + +// clang-format on diff --git a/submodules/MtProtoKit/TON/include/tonlib_api.h b/submodules/MtProtoKit/TON/include/tonlib_api.h new file mode 100644 index 0000000000..516b3db5d8 --- /dev/null +++ b/submodules/MtProtoKit/TON/include/tonlib_api.h @@ -0,0 +1,867 @@ +#pragma once + +#include "TlObject.h" + +#include "int_types.h" + +#include + +#include +#include +#include +#include + +namespace td { +class TlStorerToString; +} // namespace td + +namespace ton { +namespace tonlib_api{ +using BaseObject = ::ton::TlObject; + +template +using object_ptr = ::ton::tl_object_ptr; + +template +object_ptr make_object(Args &&... args) { + return object_ptr(new Type(std::forward(args)...)); +} + +template +object_ptr move_object_as(FromType &&from) { + return object_ptr(static_cast(from.release())); +} + +std::string to_string(const BaseObject &value); + +template +std::string to_string(const object_ptr &value) { + if (value == nullptr) { + return "null"; + } + + return to_string(*value); +} + +class accountAddress; + +class error; + +class exportedKey; + +class exportedPemKey; + +class inputKey; + +class key; + +class ok; + +class options; + +class generic_AccountState; + +class generic_InitialAccountState; + +class internal_transactionId; + +class raw_accountState; + +class raw_initialAccountState; + +class testGiver_accountState; + +class testWallet_accountState; + +class testWallet_initialAccountState; + +class uninited_accountState; + +class Object; + +class Object: public TlObject { + public: +}; + +class Function: public TlObject { + public: +}; + +class accountAddress final : public Object { + public: + std::string account_address_; + + accountAddress(); + + explicit accountAddress(std::string const &account_address_); + + static const std::int32_t ID = 755613099; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class error final : public Object { + public: + std::int32_t code_; + std::string message_; + + error(); + + error(std::int32_t code_, std::string const &message_); + + static const std::int32_t ID = -1679978726; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class exportedKey final : public Object { + public: + std::vector word_list_; + + exportedKey(); + + explicit exportedKey(std::vector &&word_list_); + + static const std::int32_t ID = -1591775274; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class exportedPemKey final : public Object { + public: + std::string pem_; + + exportedPemKey(); + + explicit exportedPemKey(std::string const &pem_); + + static const std::int32_t ID = -1606004936; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class inputKey final : public Object { + public: + object_ptr key_; + std::string local_password_; + + inputKey(); + + inputKey(object_ptr &&key_, std::string const &local_password_); + + static const std::int32_t ID = -896546932; + 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_; + std::string secret_; + + key(); + + key(std::string const &public_key_, std::string const &secret_); + + static const std::int32_t ID = -1824886393; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class ok final : public Object { + public: + + ok(); + + static const std::int32_t ID = -722616727; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class options final : public Object { + public: + std::string config_; + std::string keystore_directory_; + + options(); + + options(std::string const &config_, std::string const &keystore_directory_); + + static const std::int32_t ID = -876766471; + 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: +}; + +class generic_accountStateRaw final : public generic_AccountState { + public: + object_ptr account_state_; + + generic_accountStateRaw(); + + explicit generic_accountStateRaw(object_ptr &&account_state_); + + static const std::int32_t ID = -1387096685; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class generic_accountStateTestWallet final : public generic_AccountState { + public: + object_ptr account_state_; + + generic_accountStateTestWallet(); + + explicit generic_accountStateTestWallet(object_ptr &&account_state_); + + static const std::int32_t ID = -1041955397; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class generic_accountStateTestGiver final : public generic_AccountState { + public: + object_ptr account_state_; + + generic_accountStateTestGiver(); + + explicit generic_accountStateTestGiver(object_ptr &&account_state_); + + static const std::int32_t ID = 1134654598; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class generic_accountStateUninited final : public generic_AccountState { + public: + object_ptr account_state_; + + generic_accountStateUninited(); + + explicit generic_accountStateUninited(object_ptr &&account_state_); + + static const std::int32_t ID = -908702008; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class generic_InitialAccountState: public Object { + public: +}; + +class generic_initialAccountStateRaw final : public generic_InitialAccountState { + public: + object_ptr initital_account_state_; + + generic_initialAccountStateRaw(); + + explicit generic_initialAccountStateRaw(object_ptr &&initital_account_state_); + + static const std::int32_t ID = -1178429153; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class generic_initialAccountStateTestWallet final : public generic_InitialAccountState { + public: + object_ptr initital_account_state_; + + generic_initialAccountStateTestWallet(); + + explicit generic_initialAccountStateTestWallet(object_ptr &&initital_account_state_); + + static const std::int32_t ID = 710924204; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class internal_transactionId final : public Object { + public: + std::int64_t lt_; + std::string hash_; + + internal_transactionId(); + + internal_transactionId(std::int64_t lt_, std::string const &hash_); + + static const std::int32_t ID = -989527262; + 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_; + std::string code_; + std::string data_; + object_ptr last_transaction_; + + raw_accountState(); + + raw_accountState(std::int64_t balance_, std::string const &code_, std::string const &data_, object_ptr &&last_transaction_); + + static const std::int32_t ID = 1473454653; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class raw_initialAccountState final : public Object { + public: + std::string code_; + std::string data_; + + raw_initialAccountState(); + + raw_initialAccountState(std::string const &code_, std::string const &data_); + + static const std::int32_t ID = 777456197; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class testGiver_accountState final : public Object { + public: + std::int64_t balance_; + std::int32_t seqno_; + object_ptr last_transaction_id_; + + testGiver_accountState(); + + testGiver_accountState(std::int64_t balance_, std::int32_t seqno_, object_ptr &&last_transaction_id_); + + static const std::int32_t ID = 2037609684; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class testWallet_accountState final : public Object { + public: + std::int64_t balance_; + std::int32_t seqno_; + object_ptr last_transaction_id_; + + testWallet_accountState(); + + testWallet_accountState(std::int64_t balance_, std::int32_t seqno_, object_ptr &&last_transaction_id_); + + static const std::int32_t ID = 105752218; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class testWallet_initialAccountState final : public Object { + public: + std::string public_key_; + + testWallet_initialAccountState(); + + explicit testWallet_initialAccountState(std::string const &public_key_); + + static const std::int32_t ID = 276948331; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class uninited_accountState final : public Object { + public: + std::int64_t balance_; + + uninited_accountState(); + + explicit uninited_accountState(std::int64_t balance_); + + static const std::int32_t ID = -1992757598; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +class changeLocalPassword final : public Function { + public: + object_ptr input_key_; + std::string new_local_password_; + + changeLocalPassword(); + + changeLocalPassword(object_ptr &&input_key_, std::string const &new_local_password_); + + static const std::int32_t ID = 1851603483; + 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 close final : public Function { + public: + + close(); + + static const std::int32_t ID = -1187782273; + 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 createNewKey final : public Function { + public: + std::string local_password_; + std::string mnemonic_password_; + + createNewKey(); + + createNewKey(std::string const &local_password_, std::string const &mnemonic_password_); + + static const std::int32_t ID = -132817741; + 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 deleteKey final : public Function { + public: + std::string public_key_; + + deleteKey(); + + explicit deleteKey(std::string const &public_key_); + + static const std::int32_t ID = -1148357295; + 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 exportKey final : public Function { + public: + object_ptr input_key_; + + exportKey(); + + explicit exportKey(object_ptr &&input_key_); + + static const std::int32_t ID = 399723440; + 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 exportPemKey final : public Function { + public: + object_ptr input_key_; + std::string key_password_; + + exportPemKey(); + + exportPemKey(object_ptr &&input_key_, std::string const &key_password_); + + static const std::int32_t ID = -189764962; + 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_; + + generic_getAccountState(); + + explicit generic_getAccountState(object_ptr &&account_address_); + + static const std::int32_t ID = -657000446; + 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_sendGrams final : public Function { + public: + object_ptr private_key_; + object_ptr source_; + object_ptr destination_; + std::int64_t amount_; + + generic_sendGrams(); + + generic_sendGrams(object_ptr &&private_key_, object_ptr &&source_, object_ptr &&destination_, std::int64_t amount_); + + static const std::int32_t ID = 799772985; + 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 importKey final : public Function { + public: + std::string local_password_; + std::string mnemonic_password_; + object_ptr exported_key_; + + importKey(); + + importKey(std::string const &local_password_, std::string const &mnemonic_password_, object_ptr &&exported_key_); + + static const std::int32_t ID = -1396771552; + 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 importPemKey final : public Function { + public: + std::string local_password_; + std::string key_password_; + object_ptr exported_key_; + + importPemKey(); + + importPemKey(std::string const &local_password_, std::string const &key_password_, object_ptr &&exported_key_); + + static const std::int32_t ID = -15644852; + 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 init final : public Function { + public: + object_ptr options_; + + init(); + + explicit init(object_ptr &&options_); + + static const std::int32_t ID = -2014661877; + 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 options_setConfig final : public Function { + public: + std::string config_; + + options_setConfig(); + + explicit options_setConfig(std::string const &config_); + + static const std::int32_t ID = 21225546; + 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_; + + raw_getAccountAddress(); + + explicit raw_getAccountAddress(object_ptr &&initital_account_state_); + + static const std::int32_t ID = -521283849; + 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_getAccountState final : public Function { + public: + object_ptr account_address_; + + raw_getAccountState(); + + explicit raw_getAccountState(object_ptr &&account_address_); + + static const std::int32_t ID = 663706721; + 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_sendMessage final : public Function { + public: + object_ptr destination_; + std::string initial_account_state_; + std::string data_; + + raw_sendMessage(); + + raw_sendMessage(object_ptr &&destination_, std::string const &initial_account_state_, std::string const &data_); + + static const std::int32_t ID = 473889461; + 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 runTests final : public Function { + public: + std::string dir_; + + runTests(); + + explicit runTests(std::string const &dir_); + + static const std::int32_t ID = -2039925427; + 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: + + testGiver_getAccountAddress(); + + static const std::int32_t ID = -540100768; + 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_getAccountState final : public Function { + public: + + testGiver_getAccountState(); + + static const std::int32_t ID = 267738275; + 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_sendGrams final : public Function { + public: + object_ptr destination_; + std::int32_t seqno_; + std::int64_t amount_; + + testGiver_sendGrams(); + + testGiver_sendGrams(object_ptr &&destination_, std::int32_t seqno_, std::int64_t amount_); + + static const std::int32_t ID = -178493799; + 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 testWallet_getAccountAddress final : public Function { + public: + object_ptr initital_account_state_; + + testWallet_getAccountAddress(); + + explicit testWallet_getAccountAddress(object_ptr &&initital_account_state_); + + static const std::int32_t ID = -1557748223; + 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 testWallet_getAccountState final : public Function { + public: + object_ptr account_address_; + + testWallet_getAccountState(); + + explicit testWallet_getAccountState(object_ptr &&account_address_); + + static const std::int32_t ID = 654082364; + 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 testWallet_init final : public Function { + public: + object_ptr private_key_; + + testWallet_init(); + + explicit testWallet_init(object_ptr &&private_key_); + + static const std::int32_t ID = 419055225; + 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 testWallet_sendGrams final : public Function { + public: + object_ptr private_key_; + object_ptr destination_; + std::int32_t seqno_; + std::int64_t amount_; + + testWallet_sendGrams(); + + testWallet_sendGrams(object_ptr &&private_key_, object_ptr &&destination_, std::int32_t seqno_, std::int64_t amount_); + + static const std::int32_t ID = -1716705044; + std::int32_t get_id() const final { + return ID; + } + + using ReturnType = object_ptr; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + +} // namespace tonlib_api +} // namespace ton diff --git a/submodules/MtProtoKit/TON/libadnllite.a b/submodules/MtProtoKit/TON/libadnllite.a new file mode 100644 index 0000000000..09be1342ad Binary files /dev/null and b/submodules/MtProtoKit/TON/libadnllite.a differ diff --git a/submodules/MtProtoKit/TON/libcrc32c.a b/submodules/MtProtoKit/TON/libcrc32c.a new file mode 100644 index 0000000000..2350b11123 Binary files /dev/null and b/submodules/MtProtoKit/TON/libcrc32c.a differ diff --git a/submodules/MtProtoKit/TON/libfift.a b/submodules/MtProtoKit/TON/libfift.a new file mode 100644 index 0000000000..e4df5e5c33 Binary files /dev/null and b/submodules/MtProtoKit/TON/libfift.a differ diff --git a/submodules/MtProtoKit/TON/libkeys.a b/submodules/MtProtoKit/TON/libkeys.a new file mode 100644 index 0000000000..ebc2dc031d Binary files /dev/null and b/submodules/MtProtoKit/TON/libkeys.a differ diff --git a/submodules/MtProtoKit/TON/libmemprof.a b/submodules/MtProtoKit/TON/libmemprof.a new file mode 100644 index 0000000000..8a5d7d4716 Binary files /dev/null and b/submodules/MtProtoKit/TON/libmemprof.a differ diff --git a/submodules/MtProtoKit/TON/libtdactor.a b/submodules/MtProtoKit/TON/libtdactor.a new file mode 100644 index 0000000000..fa25a35335 Binary files /dev/null and b/submodules/MtProtoKit/TON/libtdactor.a differ diff --git a/submodules/MtProtoKit/TON/libtddb.a b/submodules/MtProtoKit/TON/libtddb.a new file mode 100644 index 0000000000..030eac1e67 Binary files /dev/null and b/submodules/MtProtoKit/TON/libtddb.a differ diff --git a/submodules/MtProtoKit/TON/libtdnet.a b/submodules/MtProtoKit/TON/libtdnet.a new file mode 100644 index 0000000000..981e7dd50c Binary files /dev/null and b/submodules/MtProtoKit/TON/libtdnet.a differ diff --git a/submodules/MtProtoKit/TON/libtdtl.a b/submodules/MtProtoKit/TON/libtdtl.a new file mode 100644 index 0000000000..b2ad5ef1d6 Binary files /dev/null and b/submodules/MtProtoKit/TON/libtdtl.a differ diff --git a/submodules/MtProtoKit/TON/libtdutils.a b/submodules/MtProtoKit/TON/libtdutils.a new file mode 100644 index 0000000000..72905b5b4b Binary files /dev/null and b/submodules/MtProtoKit/TON/libtdutils.a differ diff --git a/submodules/MtProtoKit/TON/libterminal.a b/submodules/MtProtoKit/TON/libterminal.a new file mode 100644 index 0000000000..944a816912 Binary files /dev/null and b/submodules/MtProtoKit/TON/libterminal.a differ diff --git a/submodules/MtProtoKit/TON/libtl-lite-utils.a b/submodules/MtProtoKit/TON/libtl-lite-utils.a new file mode 100644 index 0000000000..0d2fa23364 Binary files /dev/null and b/submodules/MtProtoKit/TON/libtl-lite-utils.a differ diff --git a/submodules/MtProtoKit/TON/libtl-utils.a b/submodules/MtProtoKit/TON/libtl-utils.a new file mode 100644 index 0000000000..6522867d1b Binary files /dev/null and b/submodules/MtProtoKit/TON/libtl-utils.a differ diff --git a/submodules/MtProtoKit/TON/libtl_api.a b/submodules/MtProtoKit/TON/libtl_api.a new file mode 100644 index 0000000000..2c5d6415b5 Binary files /dev/null and b/submodules/MtProtoKit/TON/libtl_api.a differ diff --git a/submodules/MtProtoKit/TON/libtl_lite_api.a b/submodules/MtProtoKit/TON/libtl_lite_api.a new file mode 100644 index 0000000000..711589ccf9 Binary files /dev/null and b/submodules/MtProtoKit/TON/libtl_lite_api.a differ diff --git a/submodules/MtProtoKit/TON/libtl_tonlib_api.a b/submodules/MtProtoKit/TON/libtl_tonlib_api.a new file mode 100644 index 0000000000..ebddedc92a Binary files /dev/null and b/submodules/MtProtoKit/TON/libtl_tonlib_api.a differ diff --git a/submodules/MtProtoKit/TON/libtl_tonlib_api_json.a b/submodules/MtProtoKit/TON/libtl_tonlib_api_json.a new file mode 100644 index 0000000000..276d711111 Binary files /dev/null and b/submodules/MtProtoKit/TON/libtl_tonlib_api_json.a differ diff --git a/submodules/MtProtoKit/TON/libton_block.a b/submodules/MtProtoKit/TON/libton_block.a new file mode 100644 index 0000000000..4c2540a60c Binary files /dev/null and b/submodules/MtProtoKit/TON/libton_block.a differ diff --git a/submodules/MtProtoKit/TON/libton_crypto.a b/submodules/MtProtoKit/TON/libton_crypto.a new file mode 100644 index 0000000000..ed91623899 Binary files /dev/null and b/submodules/MtProtoKit/TON/libton_crypto.a differ diff --git a/submodules/MtProtoKit/TON/libton_db.a b/submodules/MtProtoKit/TON/libton_db.a new file mode 100644 index 0000000000..31a15926c2 Binary files /dev/null and b/submodules/MtProtoKit/TON/libton_db.a differ diff --git a/submodules/MtProtoKit/TON/libtonlib.a b/submodules/MtProtoKit/TON/libtonlib.a new file mode 100644 index 0000000000..3a491dc5a0 Binary files /dev/null and b/submodules/MtProtoKit/TON/libtonlib.a differ diff --git a/submodules/MtProtoKit/TON/libtonlibjson_private.a b/submodules/MtProtoKit/TON/libtonlibjson_private.a new file mode 100644 index 0000000000..f3b10d1ecd Binary files /dev/null and b/submodules/MtProtoKit/TON/libtonlibjson_private.a differ diff --git a/submodules/MtProtoKit/TON/libtonlibjson_static.a b/submodules/MtProtoKit/TON/libtonlibjson_static.a new file mode 100644 index 0000000000..1a3e28189f Binary files /dev/null and b/submodules/MtProtoKit/TON/libtonlibjson_static.a differ diff --git a/submodules/MtProtoKit/TON/tonlib_client_json.h b/submodules/MtProtoKit/TON/tonlib_client_json.h new file mode 100644 index 0000000000..bf603e2586 --- /dev/null +++ b/submodules/MtProtoKit/TON/tonlib_client_json.h @@ -0,0 +1,21 @@ +#pragma once + +#include "tonlibjson_export.h" + +#ifdef __cplusplus +extern "C" { +#endif + +TONLIBJSON_EXPORT void *tonlib_client_json_create(); + +TONLIBJSON_EXPORT void tonlib_client_json_send(void *client, const char *request); + +TONLIBJSON_EXPORT const char *tonlib_client_json_receive(void *client, double timeout); + +TONLIBJSON_EXPORT const char *tonlib_client_json_execute(void *client, const char *request); + +TONLIBJSON_EXPORT void tonlib_client_json_destroy(void *client); + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/submodules/MtProtoKit/TON/tonlibjson_export.h b/submodules/MtProtoKit/TON/tonlibjson_export.h new file mode 100644 index 0000000000..94a51fdb19 --- /dev/null +++ b/submodules/MtProtoKit/TON/tonlibjson_export.h @@ -0,0 +1,42 @@ + +#ifndef TONLIBJSON_EXPORT_H +#define TONLIBJSON_EXPORT_H + +#ifdef TONLIBJSON_STATIC_DEFINE +# define TONLIBJSON_EXPORT +# define TONLIBJSON_NO_EXPORT +#else +# ifndef TONLIBJSON_EXPORT +# ifdef tonlibjson_EXPORTS + /* We are building this library */ +# define TONLIBJSON_EXPORT +# else + /* We are using this library */ +# define TONLIBJSON_EXPORT +# endif +# endif + +# ifndef TONLIBJSON_NO_EXPORT +# define TONLIBJSON_NO_EXPORT +# endif +#endif + +#ifndef TONLIBJSON_DEPRECATED +# define TONLIBJSON_DEPRECATED __attribute__ ((__deprecated__)) +#endif + +#ifndef TONLIBJSON_DEPRECATED_EXPORT +# define TONLIBJSON_DEPRECATED_EXPORT TONLIBJSON_EXPORT TONLIBJSON_DEPRECATED +#endif + +#ifndef TONLIBJSON_DEPRECATED_NO_EXPORT +# define TONLIBJSON_DEPRECATED_NO_EXPORT TONLIBJSON_NO_EXPORT TONLIBJSON_DEPRECATED +#endif + +#if 0 /* DEFINE_NO_DEPRECATED */ +# ifndef TONLIBJSON_NO_DEPRECATED +# define TONLIBJSON_NO_DEPRECATED +# endif +#endif + +#endif /* TONLIBJSON_EXPORT_H */ diff --git a/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m b/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m index c7a03d6126..5e630e1352 100644 --- a/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m +++ b/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m @@ -330,7 +330,10 @@ static inline BOOL AFStateTransitionIsValid(AFOperationState fromState, AFOperat if ([self isCancelled]) { [self finish]; } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:NO]; +#pragma clang diagnostic pop NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; for (NSString *runLoopMode in self.runLoopModes) { diff --git a/submodules/PassportUI/Sources/SecureIdAuthController.swift b/submodules/PassportUI/Sources/SecureIdAuthController.swift index 563dad667a..5235baaab8 100644 --- a/submodules/PassportUI/Sources/SecureIdAuthController.swift +++ b/submodules/PassportUI/Sources/SecureIdAuthController.swift @@ -101,6 +101,8 @@ public final class SecureIdAuthController: ViewController { super.init(navigationBarPresentationData: NavigationBarPresentationData(presentationData: self.presentationData)) + self.navigationPresentation = .modal + self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style @@ -292,13 +294,6 @@ public final class SecureIdAuthController: ViewController { } } - override public func dismiss(completion: (() -> Void)? = nil) { - self.controllerNode.animateOut(completion: { [weak self] in - self?.presentingViewController?.dismiss(animated: false, completion: nil) - completion?() - }) - } - override public func loadDisplayNode() { let interaction = SecureIdAuthControllerInteraction(updateState: { [weak self] f in self?.updateState(f) diff --git a/submodules/PassportUI/Sources/SecureIdDocumentGalleryController.swift b/submodules/PassportUI/Sources/SecureIdDocumentGalleryController.swift index adc379563d..2906c943d9 100644 --- a/submodules/PassportUI/Sources/SecureIdDocumentGalleryController.swift +++ b/submodules/PassportUI/Sources/SecureIdDocumentGalleryController.swift @@ -44,7 +44,7 @@ final class SecureIdDocumentGalleryControllerPresentationArguments { } } -class SecureIdDocumentGalleryController: ViewController { +class SecureIdDocumentGalleryController: ViewController, StandalonePresentableController { private var galleryNode: GalleryControllerNode { return self.displayNode as! GalleryControllerNode } diff --git a/submodules/PasswordSetupUI/Sources/SetupTwoStepVerificationController.swift b/submodules/PasswordSetupUI/Sources/SetupTwoStepVerificationController.swift index 47608aef42..4e59ac0e51 100644 --- a/submodules/PasswordSetupUI/Sources/SetupTwoStepVerificationController.swift +++ b/submodules/PasswordSetupUI/Sources/SetupTwoStepVerificationController.swift @@ -86,14 +86,6 @@ public class SetupTwoStepVerificationController: ViewController { } } - override public func dismiss(completion: (() -> Void)? = nil) { - self.controllerNode.animateOut(completion: { [weak self] in - self?.presentingViewController?.dismiss(animated: false, completion: nil) - completion?() - }) - self.view.endEditing(true) - } - private func updateThemeAndStrings() { self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style self.navigationBar?.updatePresentationData(NavigationBarPresentationData(presentationData: self.presentationData)) diff --git a/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryController.swift b/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryController.swift index e7531ea7ba..d89cd9e3e7 100644 --- a/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryController.swift +++ b/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryController.swift @@ -91,7 +91,7 @@ public func fetchedAvatarGalleryEntries(account: Account, peer: Peer) -> Signal< } } -public class AvatarGalleryController: ViewController { +public class AvatarGalleryController: ViewController, StandalonePresentableController { private var galleryNode: GalleryControllerNode { return self.displayNode as! GalleryControllerNode } diff --git a/submodules/PeerInfoUI/Sources/ChannelStatsController.swift b/submodules/PeerInfoUI/Sources/ChannelStatsController.swift index 5da8bc19eb..bbc84a1b03 100644 --- a/submodules/PeerInfoUI/Sources/ChannelStatsController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelStatsController.swift @@ -57,13 +57,6 @@ final class ChannelStatsController: ViewController { }) } - override func dismiss(completion: (() -> Void)? = nil) { - self.controllerNode.animateOut(completion: { [weak self] in - self?.presentingViewController?.dismiss(animated: false, completion: nil) - completion?() - }) - } - override func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { super.containerLayoutUpdated(layout, transition: transition) diff --git a/submodules/SettingsUI/BUCK b/submodules/SettingsUI/BUCK index 385f179e24..35c1679cca 100644 --- a/submodules/SettingsUI/BUCK +++ b/submodules/SettingsUI/BUCK @@ -76,6 +76,7 @@ static_library( "//submodules/InstantPageCache:InstantPageCache", "//submodules/AppBundle:AppBundle", "//submodules/ContextUI:ContextUI", + "//submodules/WalletUI:WalletUI", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/SettingsUI/SettingsUI.xcodeproj/project.pbxproj b/submodules/SettingsUI/SettingsUI.xcodeproj/project.pbxproj index b8030bfd35..6fc68ad753 100644 --- a/submodules/SettingsUI/SettingsUI.xcodeproj/project.pbxproj +++ b/submodules/SettingsUI/SettingsUI.xcodeproj/project.pbxproj @@ -1469,6 +1469,19 @@ explicitFileType archive.ar + 1DD70E29D097476500000000 + + isa + PBXFileReference + name + libWalletUI.a + path + libWalletUI.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + 1DD70E29A7E1559B00000000 isa @@ -1625,6 +1638,7 @@ 1DD70E2951398CF200000000 1DD70E29597BAFBB00000000 1DD70E29D81471E200000000 + 1DD70E29D097476500000000 1DD70E29A7E1559B00000000 1DD70E29DF12291E00000000 1DD70E29A6BAE8A300000000 @@ -4740,6 +4754,13 @@ fileRef 1DD70E29D81471E200000000 + E7A30F04D097476500000000 + + isa + PBXBuildFile + fileRef + 1DD70E29D097476500000000 + E7A30F04A7E1559B00000000 isa @@ -4868,6 +4889,7 @@ E7A30F04F18DE1D900000000 E7A30F04DA3FBAD600000000 E7A30F04D81471E200000000 + E7A30F04D097476500000000 E7A30F04A7E1559B00000000 E7A30F04DF12291E00000000 diff --git a/submodules/SettingsUI/Sources/DebugController.swift b/submodules/SettingsUI/Sources/DebugController.swift index 534b578b52..72845c7377 100644 --- a/submodules/SettingsUI/Sources/DebugController.swift +++ b/submodules/SettingsUI/Sources/DebugController.swift @@ -66,6 +66,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { case resetDatabase(PresentationTheme) case resetHoles(PresentationTheme) case resetBiometricsData(PresentationTheme) + case deleteWallets(PresentationTheme) case optimizeDatabase(PresentationTheme) case photoPreview(PresentationTheme, Bool) case knockoutWallpaper(PresentationTheme, Bool) @@ -82,7 +83,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { return DebugControllerSection.logging.rawValue case .enableRaiseToSpeak, .keepChatNavigationStack, .skipReadHistory, .crashOnSlowQueries: return DebugControllerSection.experiments.rawValue - case .clearTips, .reimport, .resetData, .resetDatabase, .resetHoles, .resetBiometricsData, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .gradientBubbles: + case .clearTips, .reimport, .resetData, .resetDatabase, .resetHoles, .resetBiometricsData, .deleteWallets, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .gradientBubbles: return DebugControllerSection.experiments.rawValue case .versionInfo: return DebugControllerSection.info.rawValue @@ -127,16 +128,18 @@ private enum DebugControllerEntry: ItemListNodeEntry { return 16 case .resetBiometricsData: return 17 - case .optimizeDatabase: + case .deleteWallets: return 18 - case .photoPreview: + case .optimizeDatabase: return 19 - case .knockoutWallpaper: + case .photoPreview: return 20 - case .gradientBubbles: + case .knockoutWallpaper: return 21 - case .versionInfo: + case .gradientBubbles: return 22 + case .versionInfo: + return 23 } } @@ -464,6 +467,13 @@ private enum DebugControllerEntry: ItemListNodeEntry { return settings.withUpdatedBiometricsDomainState(nil).withUpdatedShareBiometricsDomainState(nil) }).start() }) + case let .deleteWallets(theme): + return ItemListActionItem(theme: theme, title: "Delete Wallets", kind: .destructive, alignment: .natural, sectionId: self.section, style: .blocks, action: { + guard let context = arguments.context else { + return + } + let _ = debugDeleteWallets(postbox: context.account.postbox).start() + }) case let .optimizeDatabase(theme): return ItemListActionItem(theme: theme, title: "Optimize Database", kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: { guard let context = arguments.context else { @@ -546,6 +556,9 @@ private func debugControllerEntries(presentationData: PresentationData, loggingS entries.append(.resetData(presentationData.theme)) entries.append(.resetDatabase(presentationData.theme)) entries.append(.resetHoles(presentationData.theme)) + if experimentalSettings.wallets { + entries.append(.deleteWallets(presentationData.theme)) + } entries.append(.optimizeDatabase(presentationData.theme)) entries.append(.photoPreview(presentationData.theme, experimentalSettings.chatListPhotos)) entries.append(.knockoutWallpaper(presentationData.theme, experimentalSettings.knockoutWallpaper)) diff --git a/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift index f29b6fa615..2bae821282 100644 --- a/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift +++ b/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift @@ -45,6 +45,7 @@ enum SettingsSearchableItemId: Hashable { case language(Int32) case watch(Int32) case passport(Int32) + case wallet(Int32) case support(Int32) case faq(Int32) @@ -74,10 +75,12 @@ enum SettingsSearchableItemId: Hashable { return 11 case .passport: return 12 - case .support: + case .wallet: return 13 - case .faq: + case .support: return 14 + case .faq: + return 15 } } @@ -95,6 +98,7 @@ enum SettingsSearchableItemId: Hashable { let .language(id), let .watch(id), let .passport(id), + let .wallet(id), let .support(id), let .faq(id): return id @@ -134,8 +138,10 @@ enum SettingsSearchableItemId: Hashable { case 12: self = .passport(id) case 13: - self = .support(id) + self = .wallet(id) case 14: + self = .support(id) + case 15: self = .faq(id) default: return nil @@ -851,6 +857,13 @@ func settingsSearchableItems(context: AccountContext, notificationExceptionsList present(.modal, SecureIdAuthController(context: context, mode: .list)) }) allItems.append(passport) + + let wallet = SettingsSearchableItem(id: .wallet(0), title: "Wallet", alternate: synonyms("Wallet"), icon: .passport, breadcrumbs: [], present: { context, _, present in + openWallet(context: context, push: { c in + present(.push, c) + }) + }) + allItems.append(wallet) let support = SettingsSearchableItem(id: .support(0), title: strings.Settings_Support, alternate: synonyms(strings.SettingsSearch_Synonyms_Support), icon: .support, breadcrumbs: [], present: { context, _, present in let _ = (supportPeerId(account: context.account) diff --git a/submodules/SettingsUI/Sources/SettingsController.swift b/submodules/SettingsUI/Sources/SettingsController.swift index e0d3fc0384..e019f881d7 100644 --- a/submodules/SettingsUI/Sources/SettingsController.swift +++ b/submodules/SettingsUI/Sources/SettingsController.swift @@ -34,6 +34,7 @@ import PeerAvatarGalleryUI import MapResourceToAvatarSizes import AppBundle import ContextUI +import WalletUI private let maximumNumberOfAccounts = 3 @@ -91,6 +92,7 @@ private struct SettingsItemArguments { let pushController: (ViewController) -> Void let openLanguage: () -> Void let openPassport: () -> Void + let openWallet: () -> Void let openWatch: () -> Void let openSupport: () -> Void let openFaq: (String?) -> Void @@ -140,6 +142,7 @@ private enum SettingsEntry: ItemListNodeEntry { case themes(PresentationTheme, UIImage?, String) case language(PresentationTheme, UIImage?, String, String) case passport(PresentationTheme, UIImage?, String, String) + case wallet(PresentationTheme, UIImage?, String, String) case watch(PresentationTheme, UIImage?, String, String) case askAQuestion(PresentationTheme, UIImage?, String) @@ -159,7 +162,7 @@ private enum SettingsEntry: ItemListNodeEntry { return SettingsSection.media.rawValue case .notificationsAndSounds, .privacyAndSecurity, .dataAndStorage, .themes, .language: return SettingsSection.generalSettings.rawValue - case .passport, .watch : + case .passport, .wallet, .watch : return SettingsSection.advanced.rawValue case .askAQuestion, .faq: return SettingsSection.help.rawValue @@ -168,48 +171,50 @@ private enum SettingsEntry: ItemListNodeEntry { var stableId: Int32 { switch self { - case .userInfo: - return 0 - case .setProfilePhoto: - return 1 - case .setUsername: - return 2 - case .phoneInfo: - return 3 - case .keepPhone: - return 4 - case .changePhone: - return 5 - case let .account(account): - return 6 + Int32(account.0) - case .addAccount: - return 1002 - case .proxy: - return 1003 - case .savedMessages: - return 1004 - case .recentCalls: - return 1005 - case .stickers: - return 1006 - case .notificationsAndSounds: - return 1007 - case .privacyAndSecurity: - return 1008 - case .dataAndStorage: - return 1009 - case .themes: - return 1010 - case .language: - return 1011 - case .passport: - return 1012 - case .watch: - return 1013 - case .askAQuestion: - return 1014 - case .faq: - return 1015 + case .userInfo: + return 0 + case .setProfilePhoto: + return 1 + case .setUsername: + return 2 + case .phoneInfo: + return 3 + case .keepPhone: + return 4 + case .changePhone: + return 5 + case let .account(account): + return 6 + Int32(account.0) + case .addAccount: + return 1002 + case .proxy: + return 1003 + case .savedMessages: + return 1004 + case .recentCalls: + return 1005 + case .stickers: + return 1006 + case .notificationsAndSounds: + return 1007 + case .privacyAndSecurity: + return 1008 + case .dataAndStorage: + return 1009 + case .themes: + return 1010 + case .language: + return 1011 + case .passport: + return 1012 + case .wallet: + return 1013 + case .watch: + return 1014 + case .askAQuestion: + return 1015 + case .faq: + return 1016 } } @@ -355,6 +360,12 @@ private enum SettingsEntry: ItemListNodeEntry { } else { return false } + case let .wallet(lhsTheme, lhsImage, lhsText, lhsValue): + if case let .wallet(rhsTheme, rhsImage, rhsText, rhsValue) = rhs, lhsTheme === rhsTheme, lhsImage === rhsImage, lhsText == rhsText, lhsValue == rhsValue { + return true + } else { + return false + } case let .watch(lhsTheme, lhsImage, lhsText, lhsValue): if case let .watch(rhsTheme, rhsImage, rhsText, rhsValue) = rhs, lhsTheme === rhsTheme, lhsImage === rhsImage, lhsText == rhsText, lhsValue == rhsValue { return true @@ -479,6 +490,10 @@ private enum SettingsEntry: ItemListNodeEntry { return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: value, sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openPassport() }) + case let .wallet(theme, image, text, value): + return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: value, sectionId: ItemListSectionId(self.section), style: .blocks, action: { + arguments.openWallet() + }) case let .watch(theme, image, text, value): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: value, sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openWatch() @@ -501,7 +516,7 @@ private struct SettingsState: Equatable { var isSearching: Bool } -private func settingsEntries(account: Account, presentationData: PresentationData, state: SettingsState, view: PeerView, proxySettings: ProxySettings, notifyExceptions: NotificationExceptionsList?, notificationsAuthorizationStatus: AccessType, notificationsWarningSuppressed: Bool, unreadTrendingStickerPacks: Int, archivedPacks: [ArchivedStickerPackItem]?, privacySettings: AccountPrivacySettings?, hasPassport: Bool, hasWatchApp: Bool, accountsAndPeers: [(Account, Peer, Int32)], inAppNotificationSettings: InAppNotificationSettings, displayPhoneNumberConfirmation: Bool) -> [SettingsEntry] { +private func settingsEntries(account: Account, presentationData: PresentationData, state: SettingsState, view: PeerView, proxySettings: ProxySettings, notifyExceptions: NotificationExceptionsList?, notificationsAuthorizationStatus: AccessType, notificationsWarningSuppressed: Bool, unreadTrendingStickerPacks: Int, archivedPacks: [ArchivedStickerPackItem]?, privacySettings: AccountPrivacySettings?, hasPassport: Bool, hasWatchApp: Bool, accountsAndPeers: [(Account, Peer, Int32)], inAppNotificationSettings: InAppNotificationSettings, experimentalUISettings: ExperimentalUISettings, displayPhoneNumberConfirmation: Bool) -> [SettingsEntry] { var entries: [SettingsEntry] = [] if let peer = peerViewMainPeer(view) as? TelegramUser { @@ -562,6 +577,10 @@ private func settingsEntries(account: Account, presentationData: PresentationDat if hasPassport { entries.append(.passport(presentationData.theme, PresentationResourcesSettings.passport, presentationData.strings.Settings_Passport, "")) } + if experimentalUISettings.wallets { + entries.append(.wallet(presentationData.theme, PresentationResourcesSettings.passport, presentationData.strings.Settings_Wallet, "")) + } + if hasWatchApp { entries.append(.watch(presentationData.theme, PresentationResourcesSettings.watch, presentationData.strings.Settings_AppleWatch, "")) } @@ -825,7 +844,15 @@ public func settingsController(context: AccountContext, accountManager: AccountM let _ = (contextValue.get() |> deliverOnMainQueue |> take(1)).start(next: { context in - presentControllerImpl?(SecureIdAuthController(context: context, mode: .list), nil) + pushControllerImpl?(SecureIdAuthController(context: context, mode: .list)) + }) + }, openWallet: { + let _ = (contextValue.get() + |> deliverOnMainQueue + |> take(1)).start(next: { context in + openWallet(context: context, push: { c in + pushControllerImpl?(c) + }) }) }, openWatch: { let _ = (contextValue.get() @@ -1168,7 +1195,11 @@ public func settingsController(context: AccountContext, accountManager: AccountM return context.sharedContext.presentationData } - let preferences = context.sharedContext.accountManager.sharedData(keys: [SharedDataKeys.proxySettings, ApplicationSpecificSharedDataKeys.inAppNotificationSettings]) + let preferences = context.sharedContext.accountManager.sharedData(keys: [ + SharedDataKeys.proxySettings, + ApplicationSpecificSharedDataKeys.inAppNotificationSettings, + ApplicationSpecificSharedDataKeys.experimentalUISettings + ]) let featuredStickerPacks = contextValue.get() |> mapToSignal { context in @@ -1179,6 +1210,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM |> map { context, presentationData, state, view, preferencesAndExceptions, featuredAndArchived, hasPassportAndWatch, accountsAndPeers -> (ItemListControllerState, (ItemListNodeState, SettingsEntry.ItemGenerationArguments)) in let proxySettings: ProxySettings = preferencesAndExceptions.0.entries[SharedDataKeys.proxySettings] as? ProxySettings ?? ProxySettings.defaultSettings let inAppNotificationSettings: InAppNotificationSettings = preferencesAndExceptions.0.entries[ApplicationSpecificSharedDataKeys.inAppNotificationSettings] as? InAppNotificationSettings ?? InAppNotificationSettings.defaultSettings + let experimentalUISettings: ExperimentalUISettings = preferencesAndExceptions.0.entries[ApplicationSpecificSharedDataKeys.experimentalUISettings] as? ExperimentalUISettings ?? ExperimentalUISettings.defaultSettings let rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Edit), style: .regular, enabled: true, action: { arguments.openEditing() @@ -1213,7 +1245,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM }, getNavigationController: getNavigationControllerImpl, exceptionsList: notifyExceptions.get(), archivedStickerPacks: archivedPacks.get(), privacySettings: privacySettings.get()) let (hasPassport, hasWatchApp) = hasPassportAndWatch - let listState = ItemListNodeState(entries: settingsEntries(account: context.account, presentationData: presentationData, state: state, view: view, proxySettings: proxySettings, notifyExceptions: preferencesAndExceptions.1, notificationsAuthorizationStatus: preferencesAndExceptions.2, notificationsWarningSuppressed: preferencesAndExceptions.3, unreadTrendingStickerPacks: unreadTrendingStickerPacks, archivedPacks: featuredAndArchived.1, privacySettings: preferencesAndExceptions.4, hasPassport: hasPassport, hasWatchApp: hasWatchApp, accountsAndPeers: accountsAndPeers.1, inAppNotificationSettings: inAppNotificationSettings, displayPhoneNumberConfirmation: preferencesAndExceptions.5), style: .blocks, searchItem: searchItem, initialScrollToItem: ListViewScrollToItem(index: 0, position: .top(-navigationBarSearchContentHeight), animated: false, curve: .Default(duration: 0.0), directionHint: .Up)) + let listState = ItemListNodeState(entries: settingsEntries(account: context.account, presentationData: presentationData, state: state, view: view, proxySettings: proxySettings, notifyExceptions: preferencesAndExceptions.1, notificationsAuthorizationStatus: preferencesAndExceptions.2, notificationsWarningSuppressed: preferencesAndExceptions.3, unreadTrendingStickerPacks: unreadTrendingStickerPacks, archivedPacks: featuredAndArchived.1, privacySettings: preferencesAndExceptions.4, hasPassport: hasPassport, hasWatchApp: hasWatchApp, accountsAndPeers: accountsAndPeers.1, inAppNotificationSettings: inAppNotificationSettings, experimentalUISettings: experimentalUISettings, displayPhoneNumberConfirmation: preferencesAndExceptions.5), style: .blocks, searchItem: searchItem, initialScrollToItem: ListViewScrollToItem(index: 0, position: .top(-navigationBarSearchContentHeight), animated: false, curve: .Default(duration: 0.0), directionHint: .Up)) return (controllerState, (listState, arguments)) } @@ -1548,3 +1580,18 @@ private func accountContextMenuItems(context: AccountContext, logout: @escaping } } +func openWallet(context: AccountContext, push: @escaping (ViewController) -> Void) { + let _ = (availableWallets(postbox: context.account.postbox) + |> deliverOnMainQueue).start(next: { wallets in + if let tonContext = context.tonContext { + if wallets.wallets.isEmpty { + push(WalletSplashScreen(context: context, tonContext: tonContext, mode: .intro)) + } else { + let _ = (walletAddress(publicKey: wallets.wallets[0].publicKey, tonInstance: tonContext.instance) + |> deliverOnMainQueue).start(next: { address in + push(WalletInfoScreen(context: context, tonContext: tonContext, walletInfo: wallets.wallets[0], address: address)) + }) + } + } + }) +} diff --git a/submodules/SettingsUI/Sources/Terms of Service/TermsOfServiceController.swift b/submodules/SettingsUI/Sources/Terms of Service/TermsOfServiceController.swift index a2136d2325..2beff53b73 100644 --- a/submodules/SettingsUI/Sources/Terms of Service/TermsOfServiceController.swift +++ b/submodules/SettingsUI/Sources/Terms of Service/TermsOfServiceController.swift @@ -172,11 +172,4 @@ public class TermsOfServiceController: ViewController { self.controllerNode.animateIn() } } - - override public func dismiss(completion: (() -> Void)? = nil) { - self.controllerNode.animateOut(completion: { [weak self] in - self?.presentingViewController?.dismiss(animated: false, completion: nil) - completion?() - }) - } } diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 58354b3e1e..3b3cef1da1 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -96,7 +96,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[483104362] = { return Api.RichText.parse_textPhone($0) } dict[136105807] = { return Api.RichText.parse_textImage($0) } dict[894777186] = { return Api.RichText.parse_textAnchor($0) } - dict[-302941166] = { return Api.UserFull.parse_userFull($0) } + dict[-1684333439] = { return Api.UserFull.parse_userFull($0) } dict[-292807034] = { return Api.InputChannel.parse_inputChannelEmpty($0) } dict[-1343524562] = { return Api.InputChannel.parse_inputChannel($0) } dict[414687501] = { return Api.DcOption.parse_dcOption($0) } @@ -167,6 +167,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1777000467] = { return Api.PrivacyKey.parse_privacyKeyProfilePhoto($0) } dict[-778378131] = { return Api.PrivacyKey.parse_privacyKeyPhoneNumber($0) } dict[1124062251] = { return Api.PrivacyKey.parse_privacyKeyAddedByPhone($0) } + dict[963559926] = { return Api.PrivacyKey.parse_privacyKeyWalletAddress($0) } dict[522914557] = { return Api.Update.parse_updateNewMessage($0) } dict[1318109142] = { return Api.Update.parse_updateMessageID($0) } dict[-1576161051] = { return Api.Update.parse_updateDeleteMessages($0) } @@ -442,6 +443,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1261946036] = { return Api.NotifyPeer.parse_notifyUsers($0) } dict[-1073230141] = { return Api.NotifyPeer.parse_notifyChats($0) } dict[-703403793] = { return Api.NotifyPeer.parse_notifyBroadcasts($0) } + dict[-582464156] = { return Api.wallet.KeySecretSalt.parse_secretSalt($0) } dict[1335282456] = { return Api.InputPrivacyKey.parse_inputPrivacyKeyStatusTimestamp($0) } dict[-1107622874] = { return Api.InputPrivacyKey.parse_inputPrivacyKeyChatInvite($0) } dict[-88417185] = { return Api.InputPrivacyKey.parse_inputPrivacyKeyPhoneCall($0) } @@ -450,6 +452,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1461304012] = { return Api.InputPrivacyKey.parse_inputPrivacyKeyProfilePhoto($0) } dict[55761658] = { return Api.InputPrivacyKey.parse_inputPrivacyKeyPhoneNumber($0) } dict[-786326563] = { return Api.InputPrivacyKey.parse_inputPrivacyKeyAddedByPhone($0) } + dict[-640916697] = { return Api.InputPrivacyKey.parse_inputPrivacyKeyWalletAddress($0) } dict[235081943] = { return Api.help.RecentMeUrls.parse_recentMeUrls($0) } dict[-1606526075] = { return Api.ReplyMarkup.parse_replyKeyboardHide($0) } dict[-200242528] = { return Api.ReplyMarkup.parse_replyKeyboardForceReply($0) } @@ -641,6 +644,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[594408994] = { return Api.EmojiKeyword.parse_emojiKeywordDeleted($0) } dict[-290921362] = { return Api.upload.CdnFile.parse_cdnFileReuploadNeeded($0) } dict[-1449145777] = { return Api.upload.CdnFile.parse_cdnFile($0) } + dict[1984136919] = { return Api.wallet.LiteResponse.parse_liteResponse($0) } dict[415997816] = { return Api.help.InviteText.parse_inviteText($0) } dict[-764945220] = { return Api.MessageUserReaction.parse_messageUserReaction($0) } dict[-1937807902] = { return Api.BotInlineMessage.parse_botInlineMessageText($0) } @@ -1094,6 +1098,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.NotifyPeer: _1.serialize(buffer, boxed) + case let _1 as Api.wallet.KeySecretSalt: + _1.serialize(buffer, boxed) case let _1 as Api.InputPrivacyKey: _1.serialize(buffer, boxed) case let _1 as Api.help.RecentMeUrls: @@ -1276,6 +1282,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.upload.CdnFile: _1.serialize(buffer, boxed) + case let _1 as Api.wallet.LiteResponse: + _1.serialize(buffer, boxed) case let _1 as Api.help.InviteText: _1.serialize(buffer, boxed) case let _1 as Api.MessageUserReaction: diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index dea26f3ed2..6d32d35cea 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -2650,13 +2650,13 @@ public extension Api { } public enum UserFull: TypeConstructorDescription { - case userFull(flags: Int32, user: Api.User, about: String?, settings: Api.PeerSettings, profilePhoto: Api.Photo?, notifySettings: Api.PeerNotifySettings, botInfo: Api.BotInfo?, pinnedMsgId: Int32?, commonChatsCount: Int32, folderId: Int32?) + case userFull(flags: Int32, user: Api.User, about: String?, settings: Api.PeerSettings, profilePhoto: Api.Photo?, notifySettings: Api.PeerNotifySettings, botInfo: Api.BotInfo?, pinnedMsgId: Int32?, commonChatsCount: Int32, folderId: Int32?, walletAddress: String?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { - case .userFull(let flags, let user, let about, let settings, let profilePhoto, let notifySettings, let botInfo, let pinnedMsgId, let commonChatsCount, let folderId): + case .userFull(let flags, let user, let about, let settings, let profilePhoto, let notifySettings, let botInfo, let pinnedMsgId, let commonChatsCount, let folderId, let walletAddress): if boxed { - buffer.appendInt32(-302941166) + buffer.appendInt32(-1684333439) } serializeInt32(flags, buffer: buffer, boxed: false) user.serialize(buffer, true) @@ -2668,14 +2668,15 @@ public extension Api { if Int(flags) & Int(1 << 6) != 0 {serializeInt32(pinnedMsgId!, buffer: buffer, boxed: false)} serializeInt32(commonChatsCount, buffer: buffer, boxed: false) if Int(flags) & Int(1 << 11) != 0 {serializeInt32(folderId!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 13) != 0 {serializeString(walletAddress!, buffer: buffer, boxed: false)} break } } public func descriptionFields() -> (String, [(String, Any)]) { switch self { - case .userFull(let flags, let user, let about, let settings, let profilePhoto, let notifySettings, let botInfo, let pinnedMsgId, let commonChatsCount, let folderId): - return ("userFull", [("flags", flags), ("user", user), ("about", about), ("settings", settings), ("profilePhoto", profilePhoto), ("notifySettings", notifySettings), ("botInfo", botInfo), ("pinnedMsgId", pinnedMsgId), ("commonChatsCount", commonChatsCount), ("folderId", folderId)]) + case .userFull(let flags, let user, let about, let settings, let profilePhoto, let notifySettings, let botInfo, let pinnedMsgId, let commonChatsCount, let folderId, let walletAddress): + return ("userFull", [("flags", flags), ("user", user), ("about", about), ("settings", settings), ("profilePhoto", profilePhoto), ("notifySettings", notifySettings), ("botInfo", botInfo), ("pinnedMsgId", pinnedMsgId), ("commonChatsCount", commonChatsCount), ("folderId", folderId), ("walletAddress", walletAddress)]) } } @@ -2710,6 +2711,8 @@ public extension Api { _9 = reader.readInt32() var _10: Int32? if Int(_1!) & Int(1 << 11) != 0 {_10 = reader.readInt32() } + var _11: String? + if Int(_1!) & Int(1 << 13) != 0 {_11 = parseString(reader) } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = (Int(_1!) & Int(1 << 1) == 0) || _3 != nil @@ -2720,8 +2723,9 @@ public extension Api { let _c8 = (Int(_1!) & Int(1 << 6) == 0) || _8 != nil let _c9 = _9 != nil let _c10 = (Int(_1!) & Int(1 << 11) == 0) || _10 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 { - return Api.UserFull.userFull(flags: _1!, user: _2!, about: _3, settings: _4!, profilePhoto: _5, notifySettings: _6!, botInfo: _7, pinnedMsgId: _8, commonChatsCount: _9!, folderId: _10) + let _c11 = (Int(_1!) & Int(1 << 13) == 0) || _11 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 { + return Api.UserFull.userFull(flags: _1!, user: _2!, about: _3, settings: _4!, profilePhoto: _5, notifySettings: _6!, botInfo: _7, pinnedMsgId: _8, commonChatsCount: _9!, folderId: _10, walletAddress: _11) } else { return nil @@ -3968,6 +3972,7 @@ public extension Api { case privacyKeyProfilePhoto case privacyKeyPhoneNumber case privacyKeyAddedByPhone + case privacyKeyWalletAddress public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -4018,6 +4023,12 @@ public extension Api { buffer.appendInt32(1124062251) } + break + case .privacyKeyWalletAddress: + if boxed { + buffer.appendInt32(963559926) + } + break } } @@ -4040,6 +4051,8 @@ public extension Api { return ("privacyKeyPhoneNumber", []) case .privacyKeyAddedByPhone: return ("privacyKeyAddedByPhone", []) + case .privacyKeyWalletAddress: + return ("privacyKeyWalletAddress", []) } } @@ -4067,6 +4080,9 @@ public extension Api { public static func parse_privacyKeyAddedByPhone(_ reader: BufferReader) -> PrivacyKey? { return Api.PrivacyKey.privacyKeyAddedByPhone } + public static func parse_privacyKeyWalletAddress(_ reader: BufferReader) -> PrivacyKey? { + return Api.PrivacyKey.privacyKeyWalletAddress + } } public enum Update: TypeConstructorDescription { @@ -11058,6 +11074,7 @@ public extension Api { case inputPrivacyKeyProfilePhoto case inputPrivacyKeyPhoneNumber case inputPrivacyKeyAddedByPhone + case inputPrivacyKeyWalletAddress public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -11108,6 +11125,12 @@ public extension Api { buffer.appendInt32(-786326563) } + break + case .inputPrivacyKeyWalletAddress: + if boxed { + buffer.appendInt32(-640916697) + } + break } } @@ -11130,6 +11153,8 @@ public extension Api { return ("inputPrivacyKeyPhoneNumber", []) case .inputPrivacyKeyAddedByPhone: return ("inputPrivacyKeyAddedByPhone", []) + case .inputPrivacyKeyWalletAddress: + return ("inputPrivacyKeyWalletAddress", []) } } @@ -11157,6 +11182,9 @@ public extension Api { public static func parse_inputPrivacyKeyAddedByPhone(_ reader: BufferReader) -> InputPrivacyKey? { return Api.InputPrivacyKey.inputPrivacyKeyAddedByPhone } + public static func parse_inputPrivacyKeyWalletAddress(_ reader: BufferReader) -> InputPrivacyKey? { + return Api.InputPrivacyKey.inputPrivacyKeyWalletAddress + } } public enum ReplyMarkup: TypeConstructorDescription { diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index a66c158aa3..0b3668e6b5 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -975,6 +975,78 @@ public struct account { } } public extension Api { +public struct wallet { + public enum KeySecretSalt: TypeConstructorDescription { + case secretSalt(salt: Buffer) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .secretSalt(let salt): + if boxed { + buffer.appendInt32(-582464156) + } + serializeBytes(salt, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .secretSalt(let salt): + return ("secretSalt", [("salt", salt)]) + } + } + + public static func parse_secretSalt(_ reader: BufferReader) -> KeySecretSalt? { + var _1: Buffer? + _1 = parseBytes(reader) + let _c1 = _1 != nil + if _c1 { + return Api.wallet.KeySecretSalt.secretSalt(salt: _1!) + } + else { + return nil + } + } + + } + public enum LiteResponse: TypeConstructorDescription { + case liteResponse(response: Buffer) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .liteResponse(let response): + if boxed { + buffer.appendInt32(1984136919) + } + serializeBytes(response, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .liteResponse(let response): + return ("liteResponse", [("response", response)]) + } + } + + public static func parse_liteResponse(_ reader: BufferReader) -> LiteResponse? { + var _1: Buffer? + _1 = parseBytes(reader) + let _c1 = _1 != nil + if _c1 { + return Api.wallet.LiteResponse.liteResponse(response: _1!) + } + else { + return nil + } + } + + } +} +} +public extension Api { public struct photos { public enum Photo: TypeConstructorDescription { case photo(photo: Api.Photo, users: [Api.User]) @@ -5818,6 +5890,49 @@ public extension Api { return result }) } + + public static func setWalletAddress(walletAddress: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1588431790) + serializeString(walletAddress, buffer: buffer, boxed: false) + return (FunctionDescription(name: "account.setWalletAddress", parameters: [("walletAddress", walletAddress)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in + let reader = BufferReader(buffer) + var result: Api.Bool? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Bool + } + return result + }) + } + } + public struct wallet { + public static func sendLiteRequest(body: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-490089666) + serializeBytes(body, buffer: buffer, boxed: false) + return (FunctionDescription(name: "wallet.sendLiteRequest", parameters: [("body", body)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.wallet.LiteResponse? in + let reader = BufferReader(buffer) + var result: Api.wallet.LiteResponse? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.wallet.LiteResponse + } + return result + }) + } + + public static func getKeySecretSalt(revoke: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(190313286) + revoke.serialize(buffer, true) + return (FunctionDescription(name: "wallet.getKeySecretSalt", parameters: [("revoke", revoke)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.wallet.KeySecretSalt? in + let reader = BufferReader(buffer) + var result: Api.wallet.KeySecretSalt? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.wallet.KeySecretSalt + } + return result + }) + } } public struct langpack { public static func getLangPack(langPack: String, langCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { diff --git a/submodules/TelegramCore/TelegramCore/AccountManager.swift b/submodules/TelegramCore/TelegramCore/AccountManager.swift index 201707caef..b6357d4717 100644 --- a/submodules/TelegramCore/TelegramCore/AccountManager.swift +++ b/submodules/TelegramCore/TelegramCore/AccountManager.swift @@ -157,6 +157,7 @@ private var declaredEncodables: Void = { declareEncodable(UpdateMessageReactionsAction.self, f: { UpdateMessageReactionsAction(decoder: $0) }) declareEncodable(RestrictedContentMessageAttribute.self, f: { RestrictedContentMessageAttribute(decoder: $0) }) declareEncodable(SendScheduledMessageImmediatelyAction.self, f: { SendScheduledMessageImmediatelyAction(decoder: $0) }) + declareEncodable(WalletCollection.self, f: { WalletCollection(decoder: $0) }) return }() diff --git a/submodules/TelegramCore/TelegramCore/Namespaces.swift b/submodules/TelegramCore/TelegramCore/Namespaces.swift index 74074db5ee..009efa1d0f 100644 --- a/submodules/TelegramCore/TelegramCore/Namespaces.swift +++ b/submodules/TelegramCore/TelegramCore/Namespaces.swift @@ -163,6 +163,7 @@ private enum PreferencesKeyValues: Int32 { case searchBotsConfiguration = 15 case contactsSettings = 16 case secretChatSettings = 17 + case walletCollection = 18 } public func applicationSpecificPreferencesKey(_ value: Int32) -> ValueBoxKey { @@ -255,11 +256,18 @@ public struct PreferencesKeys { key.setInt32(0, value: PreferencesKeyValues.contactsSettings.rawValue) return key }() + public static let secretChatSettings: ValueBoxKey = { let key = ValueBoxKey(length: 4) key.setInt32(0, value: PreferencesKeyValues.secretChatSettings.rawValue) return key }() + + public static let walletCollection: ValueBoxKey = { + let key = ValueBoxKey(length: 4) + key.setInt32(0, value: PreferencesKeyValues.walletCollection.rawValue) + return key + }() } private enum SharedDataKeyValues: Int32 { diff --git a/submodules/TelegramCore/TelegramCore/Wallets.swift b/submodules/TelegramCore/TelegramCore/Wallets.swift new file mode 100644 index 0000000000..1fc27a44a9 --- /dev/null +++ b/submodules/TelegramCore/TelegramCore/Wallets.swift @@ -0,0 +1,411 @@ +import Foundation +#if os(macOS) +import PostboxMac +import SwiftSignalKitMac +import MtProtoKitMac +import TelegramApiMac +#else +import Postbox +import SwiftSignalKit +import MtProtoKit +import TelegramApi +#endif + +public struct TonKeychain { + public let encrypt: (Data) -> Signal + public let decrypt: (Data) -> Signal + + public init(encrypt: @escaping (Data) -> Signal, decrypt: @escaping (Data) -> Signal) { + self.encrypt = encrypt + self.decrypt = decrypt + } +} + +private final class TonInstanceImpl { + private let queue: Queue + private let basePath: String + private let config: String + private var instance: TON? + + init(queue: Queue, basePath: String, config: String) { + self.queue = queue + self.basePath = basePath + self.config = config + } + + func withInstance(_ f: (TON) -> Void) { + let instance: TON + if let current = self.instance { + instance = current + } else { + instance = TON(keystoreDirectory: self.basePath + "/ton-keystore", config: self.config) + self.instance = instance + } + f(instance) + } +} + +public final class TonInstance { + private let queue: Queue + private let impl: QueueLocalObject + + public init(basePath: String, config: String) { + self.queue = .mainQueue() + let queue = self.queue + self.impl = QueueLocalObject(queue: queue, generate: { + return TonInstanceImpl(queue: queue, basePath: basePath, config: config) + }) + } + + fileprivate func createWallet(keychain: TonKeychain, serverSalt: Data) -> Signal<(WalletInfo, [String]), NoError> { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.createKey(withLocalPassword: serverSalt, mnemonicPassword: "").start(next: { key in + guard let key = key as? TONKey else { + assertionFailure() + return + } + let cancel = keychain.encrypt(key.secret).start(next: { encryptedSecretData in + guard let encryptedSecretData = encryptedSecretData else { + assertionFailure() + return + } + let cancel = ton.export(key, localPassword: serverSalt).start(next: { wordList in + guard let wordList = wordList as? [String] else { + assertionFailure() + return + } + subscriber.putNext((WalletInfo(publicKey: WalletPublicKey(rawValue: key.publicKey), encryptedSecret: EncryptedWalletSecret(rawValue: encryptedSecretData)), wordList)) + subscriber.putCompletion() + }) + }, error: { _ in + }, completed: { + }) + }, error: { _ in + }, completed: { + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func importWallet(keychain: TonKeychain, wordList: [String], serverSalt: Data) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.importKey(withLocalPassword: serverSalt, mnemonicPassword: "", wordList: wordList).start(next: { key in + guard let key = key as? TONKey else { + subscriber.putError(.generic) + subscriber.putCompletion() + return + } + let cancel = keychain.encrypt(key.secret).start(next: { encryptedSecretData in + guard let encryptedSecretData = encryptedSecretData else { + subscriber.putError(.generic) + subscriber.putCompletion() + return + } + subscriber.putNext(WalletInfo(publicKey: WalletPublicKey(rawValue: key.publicKey), encryptedSecret: EncryptedWalletSecret(rawValue: encryptedSecretData))) + subscriber.putCompletion() + }, error: { _ in + }, completed: { + }) + }, error: { _ in + }, completed: { + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func walletAddress(publicKey: WalletPublicKey) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.getTestWalletAccountAddress(withPublicKey: publicKey.rawValue).start(next: { address in + guard let address = address as? String else { + return + } + subscriber.putNext(address) + subscriber.putCompletion() + }, error: { _ in + }, completed: { + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func walletBalance(publicKey: WalletPublicKey) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.getTestWalletAccountAddress(withPublicKey: publicKey.rawValue).start(next: { address in + guard let address = address as? String else { + return + } + let cancel = ton.getAccountState(withAddress: address).start(next: { state in + guard let state = state as? TONAccountState else { + return + } + subscriber.putNext(WalletBalance(rawValue: state.balance)) + }, error: { _ in + }, completed: { + subscriber.putCompletion() + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + }, error: { _ in + }, completed: { + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func walletRestoreWords(walletInfo: WalletInfo, keychain: TonKeychain, serverSalt: Data) -> Signal<[String], WalletRestoreWordsError> { + return keychain.decrypt(walletInfo.encryptedSecret.rawValue) + |> introduceError(WalletRestoreWordsError.self) + |> mapToSignal { decryptedSecret -> Signal<[String], WalletRestoreWordsError> in + guard let decryptedSecret = decryptedSecret else { + return .fail(.secretDecryptionFailed) + } + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.export(TONKey(publicKey: walletInfo.publicKey.rawValue, secret: decryptedSecret), localPassword: serverSalt).start(next: { wordList in + guard let wordList = wordList as? [String] else { + subscriber.putError(.generic) + return + } + subscriber.putNext(wordList) + }, error: { _ in + subscriber.putError(.generic) + }, completed: { + subscriber.putCompletion() + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + } +} + +public struct WalletPublicKey: Hashable { + public var rawValue: String + + public init(rawValue: String) { + self.rawValue = rawValue + } +} + +public struct EncryptedWalletSecret: Hashable { + public var rawValue: Data + + public init(rawValue: Data) { + self.rawValue = rawValue + } +} + +public struct WalletInfo: PostboxCoding, Equatable { + public let publicKey: WalletPublicKey + public let encryptedSecret: EncryptedWalletSecret + + public init(publicKey: WalletPublicKey, encryptedSecret: EncryptedWalletSecret) { + self.publicKey = publicKey + self.encryptedSecret = encryptedSecret + } + + public init(decoder: PostboxDecoder) { + self.publicKey = WalletPublicKey(rawValue: decoder.decodeStringForKey("publicKey", orElse: "")) + self.encryptedSecret = EncryptedWalletSecret(rawValue: decoder.decodeDataForKey("encryptedSecret")!) + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeString(self.publicKey.rawValue, forKey: "publicKey") + encoder.encodeData(self.encryptedSecret.rawValue, forKey: "encryptedSecret") + } +} + +public struct WalletCollection: PreferencesEntry { + public var wallets: [WalletInfo] + + public init(wallets: [WalletInfo]) { + self.wallets = wallets + } + + public init(decoder: PostboxDecoder) { + self.wallets = decoder.decodeObjectArrayWithDecoderForKey("wallets") + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeObjectArray(self.wallets, forKey: "wallets") + } + + public func isEqual(to: PreferencesEntry) -> Bool { + guard let other = to as? WalletCollection else { + return false + } + if self.wallets != other.wallets { + return false + } + return true + } +} + +public func availableWallets(postbox: Postbox) -> Signal { + return postbox.transaction { transaction -> WalletCollection in + return (transaction.getPreferencesEntry(key: PreferencesKeys.walletCollection) as? WalletCollection) ?? WalletCollection(wallets: []) + } +} + +public enum CreateWalletError { + case generic +} + +public func createWallet(postbox: Postbox, network: Network, tonInstance: TonInstance, keychain: TonKeychain) -> Signal<(WalletInfo, [String]), CreateWalletError> { + return getServerWalletSalt(network: network) + |> mapError { _ -> CreateWalletError in + return .generic + } + |> mapToSignal { serverSalt -> Signal<(WalletInfo, [String]), CreateWalletError> in + return tonInstance.createWallet(keychain: keychain, serverSalt: serverSalt) + |> introduceError(CreateWalletError.self) + |> mapToSignal { walletInfo, wordList -> Signal<(WalletInfo, [String]), CreateWalletError> in + return postbox.transaction { transaction -> (WalletInfo, [String]) in + transaction.updatePreferencesEntry(key: PreferencesKeys.walletCollection, { current in + var walletCollection = (current as? WalletCollection) ?? WalletCollection(wallets: []) + walletCollection.wallets = [walletInfo] + return walletCollection + }) + return (walletInfo, wordList) + } + |> introduceError(CreateWalletError.self) + } + } +} + +public enum ImportWalletError { + case generic +} + +public func importWallet(postbox: Postbox, network: Network, tonInstance: TonInstance, keychain: TonKeychain, wordList: [String]) -> Signal { + return getServerWalletSalt(network: network) + |> mapError { _ -> ImportWalletError in + return .generic + } + |> mapToSignal { serverSalt in + return tonInstance.importWallet(keychain: keychain, wordList: wordList, serverSalt: serverSalt) + |> mapToSignal { walletInfo -> Signal in + return postbox.transaction { transaction -> WalletInfo in + transaction.updatePreferencesEntry(key: PreferencesKeys.walletCollection, { current in + var walletCollection = (current as? WalletCollection) ?? WalletCollection(wallets: []) + walletCollection.wallets = [walletInfo] + return walletCollection + }) + return walletInfo + } + |> introduceError(ImportWalletError.self) + } + } +} + +public func debugDeleteWallets(postbox: Postbox) -> Signal { + return postbox.transaction { transaction -> Void in + transaction.updatePreferencesEntry(key: PreferencesKeys.walletCollection, { current in + var walletCollection = (current as? WalletCollection) ?? WalletCollection(wallets: []) + walletCollection.wallets = [] + return walletCollection + }) + } + |> ignoreValues +} + +public enum WalletRestoreWordsError { + case generic + case secretDecryptionFailed +} + +public func walletRestoreWords(network: Network, walletInfo: WalletInfo, tonInstance: TonInstance, keychain: TonKeychain) -> Signal<[String], WalletRestoreWordsError> { + return getServerWalletSalt(network: network) + |> mapError { _ -> WalletRestoreWordsError in + return .generic + } + |> mapToSignal { serverSalt in + return tonInstance.walletRestoreWords(walletInfo: walletInfo, keychain: keychain, serverSalt: serverSalt) + } +} + +public struct WalletBalance: Hashable { + public var rawValue: Int64 + + public init(rawValue: Int64) { + self.rawValue = rawValue + } +} + +public func walletAddress(publicKey: WalletPublicKey, tonInstance: TonInstance) -> Signal { + return tonInstance.walletAddress(publicKey: publicKey) +} + +public func currentWalletBalance(publicKey: WalletPublicKey, tonInstance: TonInstance) -> Signal { + return tonInstance.walletBalance(publicKey: publicKey) +} + +public enum GetServerWalletSaltError { + case generic +} + +private func getServerWalletSalt(network: Network) -> Signal { + #if DEBUG + return .single(Data()) + #endif + + return network.request(Api.functions.wallet.getKeySecretSalt(revoke: .boolFalse)) + |> mapError { _ -> GetServerWalletSaltError in + return .generic + } + |> map { result -> Data in + switch result { + case let .secretSalt(salt): + return salt.makeData() + } + } +} diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 917a0c94f9..0bcb635e93 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -3021,1747 +3021,1748 @@ public final class PresentationStrings { public var Contacts_SearchLabel: String { return self._s[2628]! } public var Map_OpenInYandexNavigator: String { return self._s[2630]! } public var PasscodeSettings_EncryptData: String { return self._s[2631]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2632]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2633]! } - public var DialogList_AdNoticeAlert: String { return self._s[2634]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2636]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2637]! } - public var Localization_LanguageCustom: String { return self._s[2638]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2639]! } - public var CallFeedback_Title: String { return self._s[2640]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2643]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2644]! } - public var Conversation_InfoGroup: String { return self._s[2645]! } - public var Compose_NewMessage: String { return self._s[2646]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2647]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2648]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2649]! } + public var Settings_Wallet: String { return self._s[2632]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2633]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2634]! } + public var DialogList_AdNoticeAlert: String { return self._s[2635]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2637]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2638]! } + public var Localization_LanguageCustom: String { return self._s[2639]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2640]! } + public var CallFeedback_Title: String { return self._s[2641]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2644]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2645]! } + public var Conversation_InfoGroup: String { return self._s[2646]! } + public var Compose_NewMessage: String { return self._s[2647]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2648]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2649]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2650]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2650]!, self._r[2650]!, [_0]) + return formatWithArgumentRanges(self._s[2651]!, self._r[2651]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2651]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2652]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2653]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2654]! } - public var Channel_BlackList_Title: String { return self._s[2655]! } - public var UserInfo_PhoneCall: String { return self._s[2656]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2658]! } - public var State_connecting: String { return self._s[2659]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2660]! } - public var EditTheme_Expand_BottomInfo: String { return self._s[2661]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2652]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2653]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2654]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2655]! } + public var Channel_BlackList_Title: String { return self._s[2656]! } + public var UserInfo_PhoneCall: String { return self._s[2657]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2659]! } + public var State_connecting: String { return self._s[2660]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2661]! } + public var EditTheme_Expand_BottomInfo: String { return self._s[2662]! } public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2662]!, self._r[2662]!, [_0]) - } - public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2663]!, self._r[2663]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2664]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2665]! } - public var Passport_Identity_EditPassport: String { return self._s[2666]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2668]! } - public var Localization_EnglishLanguageName: String { return self._s[2669]! } - public var Share_AuthDescription: String { return self._s[2670]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2671]! } - public var Passport_Identity_Surname: String { return self._s[2672]! } - public var Compose_TokenListPlaceholder: String { return self._s[2673]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2674]! } - public var Settings_AboutEmpty: String { return self._s[2675]! } - public var Conversation_Unmute: String { return self._s[2676]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2678]! } - public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2679]!, self._r[2679]!, [_1]) + public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2664]!, self._r[2664]!, [_0]) } - public var Login_CodeSentCall: String { return self._s[2680]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2682]! } - public var ChatSettings_Appearance: String { return self._s[2683]! } - public var Appearance_PickAccentColor: String { return self._s[2684]! } + public var Notifications_GroupNotifications: String { return self._s[2665]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2666]! } + public var Passport_Identity_EditPassport: String { return self._s[2667]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2669]! } + public var Localization_EnglishLanguageName: String { return self._s[2670]! } + public var Share_AuthDescription: String { return self._s[2671]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2672]! } + public var Passport_Identity_Surname: String { return self._s[2673]! } + public var Compose_TokenListPlaceholder: String { return self._s[2674]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2675]! } + public var Settings_AboutEmpty: String { return self._s[2676]! } + public var Conversation_Unmute: String { return self._s[2677]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2679]! } + public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2680]!, self._r[2680]!, [_1]) + } + public var Login_CodeSentCall: String { return self._s[2681]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2683]! } + public var ChatSettings_Appearance: String { return self._s[2684]! } + public var Appearance_PickAccentColor: String { return self._s[2685]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2685]!, self._r[2685]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2686]!, self._r[2686]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2686]!, self._r[2686]!, [_1]) + return formatWithArgumentRanges(self._s[2687]!, self._r[2687]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2687]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2688]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2689]! } - public var ChatAdmins_AdminLabel: String { return self._s[2691]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2692]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2694]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2695]! } - public var Month_GenJune: String { return self._s[2696]! } - public var Watch_Location_Current: String { return self._s[2697]! } - public var Conversation_TitleMute: String { return self._s[2698]! } + public var Notification_CallMissed: String { return self._s[2688]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2689]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2690]! } + public var ChatAdmins_AdminLabel: String { return self._s[2692]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2693]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2695]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2696]! } + public var Month_GenJune: String { return self._s[2697]! } + public var Watch_Location_Current: String { return self._s[2698]! } + public var Conversation_TitleMute: String { return self._s[2699]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2699]!, self._r[2699]!, [_1]) + return formatWithArgumentRanges(self._s[2700]!, self._r[2700]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2700]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2701]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2701]!, self._r[2701]!, [_0]) + return formatWithArgumentRanges(self._s[2702]!, self._r[2702]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2702]! } - public var Chat_SlowmodeSendError: String { return self._s[2703]! } - public var MaskStickerSettings_Info: String { return self._s[2704]! } - public var EditTheme_Expand_TopInfo: String { return self._s[2705]! } + public var Call_ReportPlaceholder: String { return self._s[2703]! } + public var Chat_SlowmodeSendError: String { return self._s[2704]! } + public var MaskStickerSettings_Info: String { return self._s[2705]! } + public var EditTheme_Expand_TopInfo: String { return self._s[2706]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2706]!, self._r[2706]!, [_0]) + return formatWithArgumentRanges(self._s[2707]!, self._r[2707]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2707]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2709]! } - public var Contacts_ShareTelegram: String { return self._s[2710]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2711]! } - public var Channel_ErrorAccessDenied: String { return self._s[2712]! } - public var UserInfo_ScamBotWarning: String { return self._s[2714]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2715]! } - public var Call_ConnectionErrorTitle: String { return self._s[2716]! } - public var UserInfo_NotificationsEnable: String { return self._s[2717]! } - public var ArchivedChats_IntroText1: String { return self._s[2718]! } - public var Tour_Text4: String { return self._s[2721]! } - public var WallpaperSearch_Recent: String { return self._s[2722]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2723]! } - public var Profile_MessageLifetime2s: String { return self._s[2725]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2726]! } - public var Notification_MessageLifetime2s: String { return self._s[2727]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2708]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2710]! } + public var Contacts_ShareTelegram: String { return self._s[2711]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2712]! } + public var Channel_ErrorAccessDenied: String { return self._s[2713]! } + public var UserInfo_ScamBotWarning: String { return self._s[2715]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2716]! } + public var Call_ConnectionErrorTitle: String { return self._s[2717]! } + public var UserInfo_NotificationsEnable: String { return self._s[2718]! } + public var ArchivedChats_IntroText1: String { return self._s[2719]! } + public var Tour_Text4: String { return self._s[2722]! } + public var WallpaperSearch_Recent: String { return self._s[2723]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2724]! } + public var Profile_MessageLifetime2s: String { return self._s[2726]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2727]! } + public var Notification_MessageLifetime2s: String { return self._s[2728]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2728]!, self._r[2728]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2729]!, self._r[2729]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2729]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2730]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2731]! } + public var Cache_ClearCache: String { return self._s[2730]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2731]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2732]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2735]!, self._r[2735]!, [_0]) + return formatWithArgumentRanges(self._s[2736]!, self._r[2736]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2737]!, self._r[2737]!, [_0]) + return formatWithArgumentRanges(self._s[2738]!, self._r[2738]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2738]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2739]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2740]! } - public var ChatList_UnarchiveAction: String { return self._s[2741]! } - public var AutoNightTheme_Title: String { return self._s[2742]! } - public var InstantPage_FeedbackButton: String { return self._s[2743]! } - public var Passport_FieldAddress: String { return self._s[2744]! } + public var LocalGroup_Text: String { return self._s[2739]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2740]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2741]! } + public var ChatList_UnarchiveAction: String { return self._s[2742]! } + public var AutoNightTheme_Title: String { return self._s[2743]! } + public var InstantPage_FeedbackButton: String { return self._s[2744]! } + public var Passport_FieldAddress: String { return self._s[2745]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2745]!, self._r[2745]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2746]!, self._r[2746]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[2746]! } + public var Month_ShortMarch: String { return self._s[2747]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2747]!, self._r[2747]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2748]!, self._r[2748]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2748]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2749]! } - public var Passport_FloodError: String { return self._s[2750]! } - public var SecretGif_Title: String { return self._s[2751]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2752]! } - public var ChatList_Context_UnhideArchive: String { return self._s[2753]! } - public var Passport_Language_th: String { return self._s[2755]! } - public var Passport_Address_Address: String { return self._s[2756]! } - public var Login_InvalidLastNameError: String { return self._s[2757]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2758]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2759]! } - public var ChatList_Context_Archive: String { return self._s[2760]! } - public var SettingsSearch_FAQ: String { return self._s[2761]! } - public var ShareMenu_Send: String { return self._s[2762]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2764]! } - public var Month_GenNovember: String { return self._s[2766]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2768]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2749]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2750]! } + public var Passport_FloodError: String { return self._s[2751]! } + public var SecretGif_Title: String { return self._s[2752]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2753]! } + public var ChatList_Context_UnhideArchive: String { return self._s[2754]! } + public var Passport_Language_th: String { return self._s[2756]! } + public var Passport_Address_Address: String { return self._s[2757]! } + public var Login_InvalidLastNameError: String { return self._s[2758]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2759]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2760]! } + public var ChatList_Context_Archive: String { return self._s[2761]! } + public var SettingsSearch_FAQ: String { return self._s[2762]! } + public var ShareMenu_Send: String { return self._s[2763]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2765]! } + public var Month_GenNovember: String { return self._s[2767]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2769]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2769]!, self._r[2769]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2770]!, self._r[2770]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2770]! } - public var NotificationsSound_Tritone: String { return self._s[2771]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2773]! } + public var Checkout_Email: String { return self._s[2771]! } + public var NotificationsSound_Tritone: String { return self._s[2772]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2774]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2776]!, self._r[2776]!, [_1]) + return formatWithArgumentRanges(self._s[2777]!, self._r[2777]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2777]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2778]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2778]!, self._r[2778]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2779]!, self._r[2779]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2779]! } - public var Notification_Exceptions_Add: String { return self._s[2780]! } - public var DialogList_You: String { return self._s[2781]! } - public var MediaPicker_Send: String { return self._s[2784]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2785]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2786]! } - public var Call_AudioRouteSpeaker: String { return self._s[2787]! } - public var Watch_UserInfo_Title: String { return self._s[2788]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[2789]! } - public var Appearance_AccentColor: String { return self._s[2790]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2780]! } + public var Notification_Exceptions_Add: String { return self._s[2781]! } + public var DialogList_You: String { return self._s[2782]! } + public var MediaPicker_Send: String { return self._s[2785]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2786]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2787]! } + public var Call_AudioRouteSpeaker: String { return self._s[2788]! } + public var Watch_UserInfo_Title: String { return self._s[2789]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[2790]! } + public var Appearance_AccentColor: String { return self._s[2791]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2791]!, self._r[2791]!, [_0]) + return formatWithArgumentRanges(self._s[2792]!, self._r[2792]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2792]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2793]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2793]!, self._r[2793]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2794]!, self._r[2794]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2794]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2795]! } - public var Notification_CallOutgoing: String { return self._s[2796]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2797]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2798]! } - public var Call_RecordingDisabledMessage: String { return self._s[2799]! } - public var Message_Game: String { return self._s[2800]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2801]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2802]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2803]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2804]! } - public var Date_DialogDateFormat: String { return self._s[2805]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2806]! } - public var Notifications_InAppNotifications: String { return self._s[2807]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2795]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2796]! } + public var Notification_CallOutgoing: String { return self._s[2797]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2798]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2799]! } + public var Call_RecordingDisabledMessage: String { return self._s[2800]! } + public var Message_Game: String { return self._s[2801]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2802]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2803]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2804]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2805]! } + public var Date_DialogDateFormat: String { return self._s[2806]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2807]! } + public var Notifications_InAppNotifications: String { return self._s[2808]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2808]!, self._r[2808]!, [_0]) + return formatWithArgumentRanges(self._s[2809]!, self._r[2809]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2809]!, self._r[2809]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2810]!, self._r[2810]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[2810]! } + public var NewContact_Title: String { return self._s[2811]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2811]!, self._r[2811]!, [_0]) + return formatWithArgumentRanges(self._s[2812]!, self._r[2812]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2812]! } + public var Conversation_ViewContactDetails: String { return self._s[2813]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2814]!, self._r[2814]!, [_1]) + return formatWithArgumentRanges(self._s[2815]!, self._r[2815]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2815]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2816]! } - public var PrivacySettings_Title: String { return self._s[2817]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2820]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2821]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[2822]! } - public var Contacts_PhoneNumber: String { return self._s[2823]! } - public var Map_ShowPlaces: String { return self._s[2825]! } - public var ChatAdmins_Title: String { return self._s[2826]! } - public var InstantPage_Reference: String { return self._s[2828]! } - public var ReportGroupLocation_Text: String { return self._s[2829]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2816]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2817]! } + public var PrivacySettings_Title: String { return self._s[2818]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2821]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2822]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[2823]! } + public var Contacts_PhoneNumber: String { return self._s[2824]! } + public var Map_ShowPlaces: String { return self._s[2826]! } + public var ChatAdmins_Title: String { return self._s[2827]! } + public var InstantPage_Reference: String { return self._s[2829]! } + public var ReportGroupLocation_Text: String { return self._s[2830]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2830]!, self._r[2830]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2831]!, self._r[2831]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2831]! } - public var Watch_UserInfo_Block: String { return self._s[2832]! } - public var ChatSettings_Stickers: String { return self._s[2833]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2834]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[2835]! } + public var Camera_FlashOff: String { return self._s[2832]! } + public var Watch_UserInfo_Block: String { return self._s[2833]! } + public var ChatSettings_Stickers: String { return self._s[2834]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2835]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[2836]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2836]!, self._r[2836]!, [_0]) + return formatWithArgumentRanges(self._s[2837]!, self._r[2837]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2837]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2838]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2839]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2840]! } - public var VoiceOver_MessageContextShare: String { return self._s[2841]! } + public var Settings_ViewPhoto: String { return self._s[2838]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2839]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2840]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2841]! } + public var VoiceOver_MessageContextShare: String { return self._s[2842]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2843]!, self._r[2843]!, [_0]) + return formatWithArgumentRanges(self._s[2844]!, self._r[2844]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[2844]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2845]! } + public var Privacy_DeleteDrafts: String { return self._s[2845]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2846]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2846]!, self._r[2846]!, [_0]) + return formatWithArgumentRanges(self._s[2847]!, self._r[2847]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2847]! } - public var DialogList_SavedMessages: String { return self._s[2848]! } - public var GroupInfo_UpgradeButton: String { return self._s[2849]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2851]! } - public var DialogList_Pin: String { return self._s[2852]! } + public var DialogList_SavedMessagesHelp: String { return self._s[2848]! } + public var DialogList_SavedMessages: String { return self._s[2849]! } + public var GroupInfo_UpgradeButton: String { return self._s[2850]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2852]! } + public var DialogList_Pin: String { return self._s[2853]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2853]!, self._r[2853]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2854]!, self._r[2854]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2854]!, self._r[2854]!, [_0]) + return formatWithArgumentRanges(self._s[2855]!, self._r[2855]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2855]! } - public var UserInfo_NotificationsDisable: String { return self._s[2856]! } - public var Paint_Outlined: String { return self._s[2857]! } - public var Activity_PlayingGame: String { return self._s[2858]! } - public var SearchImages_NoImagesFound: String { return self._s[2859]! } - public var SocksProxySetup_ProxyType: String { return self._s[2860]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2862]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2863]! } - public var Settings_AppLanguage: String { return self._s[2864]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2865]! } - public var Common_ChoosePhoto: String { return self._s[2866]! } - public var CallFeedback_ReasonEcho: String { return self._s[2867]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2856]! } + public var UserInfo_NotificationsDisable: String { return self._s[2857]! } + public var Paint_Outlined: String { return self._s[2858]! } + public var Activity_PlayingGame: String { return self._s[2859]! } + public var SearchImages_NoImagesFound: String { return self._s[2860]! } + public var SocksProxySetup_ProxyType: String { return self._s[2861]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2863]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[2864]! } + public var Settings_AppLanguage: String { return self._s[2865]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[2866]! } + public var Common_ChoosePhoto: String { return self._s[2867]! } + public var CallFeedback_ReasonEcho: String { return self._s[2868]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2868]!, self._r[2868]!, [_1]) + return formatWithArgumentRanges(self._s[2869]!, self._r[2869]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2869]! } - public var Activity_UploadingVideo: String { return self._s[2870]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2871]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2872]! } - public var VoiceOver_Editing_ClearText: String { return self._s[2873]! } - public var PUSH_SENDER_YOU: String { return self._s[2874]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2875]! } - public var Checkout_PayWithTouchId: String { return self._s[2876]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2877]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2870]! } + public var Activity_UploadingVideo: String { return self._s[2871]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2872]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2873]! } + public var VoiceOver_Editing_ClearText: String { return self._s[2874]! } + public var PUSH_SENDER_YOU: String { return self._s[2875]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2876]! } + public var Checkout_PayWithTouchId: String { return self._s[2877]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2878]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_1]) + return formatWithArgumentRanges(self._s[2880]!, self._r[2880]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[2880]! } + public var Notifications_ExceptionsNone: String { return self._s[2881]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_0]) + return formatWithArgumentRanges(self._s[2882]!, self._r[2882]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2882]!, self._r[2882]!, [_1]) + return formatWithArgumentRanges(self._s[2883]!, self._r[2883]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2884]! } - public var Passport_Address_Region: String { return self._s[2887]! } - public var ChatList_DeleteChat: String { return self._s[2888]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2889]! } - public var PhotoEditor_TiltShift: String { return self._s[2890]! } - public var Settings_FAQ_URL: String { return self._s[2891]! } - public var Passport_Language_sl: String { return self._s[2892]! } - public var Settings_PrivacySettings: String { return self._s[2894]! } - public var SharedMedia_TitleLink: String { return self._s[2895]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[2896]! } - public var Settings_SetProfilePhoto: String { return self._s[2897]! } - public var Channel_About_Help: String { return self._s[2898]! } - public var Contacts_PermissionsEnable: String { return self._s[2899]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2900]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[2901]! } - public var CallFeedback_ReasonInterruption: String { return self._s[2903]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2904]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2905]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2906]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2907]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2909]! } - public var Map_OpenInYandexMaps: String { return self._s[2911]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2912]! } - public var VoiceOver_MessageContextReply: String { return self._s[2913]! } - public var PhotoEditor_SaturationTool: String { return self._s[2914]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[2885]! } + public var Passport_Address_Region: String { return self._s[2888]! } + public var ChatList_DeleteChat: String { return self._s[2889]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2890]! } + public var PhotoEditor_TiltShift: String { return self._s[2891]! } + public var Settings_FAQ_URL: String { return self._s[2892]! } + public var Passport_Language_sl: String { return self._s[2893]! } + public var Settings_PrivacySettings: String { return self._s[2895]! } + public var SharedMedia_TitleLink: String { return self._s[2896]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[2897]! } + public var Settings_SetProfilePhoto: String { return self._s[2898]! } + public var Channel_About_Help: String { return self._s[2899]! } + public var Contacts_PermissionsEnable: String { return self._s[2900]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2901]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[2902]! } + public var CallFeedback_ReasonInterruption: String { return self._s[2904]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2905]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2906]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2907]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2908]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2910]! } + public var Map_OpenInYandexMaps: String { return self._s[2912]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2913]! } + public var VoiceOver_MessageContextReply: String { return self._s[2914]! } + public var PhotoEditor_SaturationTool: String { return self._s[2915]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2915]!, self._r[2915]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2916]!, self._r[2916]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2916]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2917]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2918]! } - public var Appearance_TextSize: String { return self._s[2919]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2917]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2918]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2919]! } + public var Appearance_TextSize: String { return self._s[2920]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2920]!, self._r[2920]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2921]!, self._r[2921]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2921]! } - public var Channel_Username_InvalidTooShort: String { return self._s[2923]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2922]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2924]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2924]!, self._r[2924]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2925]!, self._r[2925]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2925]!, self._r[2925]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2926]!, self._r[2926]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[2926]! } - public var Passport_PassportInformation: String { return self._s[2929]! } - public var Theme_Unsupported: String { return self._s[2930]! } - public var WatchRemote_AlertTitle: String { return self._s[2931]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2932]! } - public var ConvertToSupergroup_HelpText: String { return self._s[2934]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[2927]! } + public var Passport_PassportInformation: String { return self._s[2930]! } + public var Theme_Unsupported: String { return self._s[2931]! } + public var WatchRemote_AlertTitle: String { return self._s[2932]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2933]! } + public var ConvertToSupergroup_HelpText: String { return self._s[2935]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2935]!, self._r[2935]!, [_0]) + return formatWithArgumentRanges(self._s[2936]!, self._r[2936]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2936]!, self._r[2936]!, [_1]) + return formatWithArgumentRanges(self._s[2937]!, self._r[2937]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2937]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2939]! } - public var AccessDenied_CameraDisabled: String { return self._s[2940]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2938]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2940]! } + public var AccessDenied_CameraDisabled: String { return self._s[2941]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2941]!, self._r[2941]!, [_0]) + return formatWithArgumentRanges(self._s[2942]!, self._r[2942]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[2944]! } + public var PhotoEditor_ContrastTool: String { return self._s[2945]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2945]!, self._r[2945]!, [_1]) + return formatWithArgumentRanges(self._s[2946]!, self._r[2946]!, [_1]) } - public var DialogList_Draft: String { return self._s[2946]! } - public var Privacy_TopPeersDelete: String { return self._s[2948]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[2949]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2950]! } - public var WebSearch_RecentSectionClear: String { return self._s[2951]! } - public var EditTheme_ErrorInvalidCharacters: String { return self._s[2952]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2954]! } - public var Common_Done: String { return self._s[2956]! } - public var AuthSessions_EmptyText: String { return self._s[2957]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[2958]! } - public var Tour_Title5: String { return self._s[2959]! } + public var DialogList_Draft: String { return self._s[2947]! } + public var Privacy_TopPeersDelete: String { return self._s[2949]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[2950]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2951]! } + public var WebSearch_RecentSectionClear: String { return self._s[2952]! } + public var EditTheme_ErrorInvalidCharacters: String { return self._s[2953]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2955]! } + public var Common_Done: String { return self._s[2957]! } + public var AuthSessions_EmptyText: String { return self._s[2958]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[2959]! } + public var Tour_Title5: String { return self._s[2960]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2960]!, self._r[2960]!, [_0]) + return formatWithArgumentRanges(self._s[2961]!, self._r[2961]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2961]! } - public var Conversation_LinkDialogSave: String { return self._s[2962]! } - public var GroupInfo_ActionRestrict: String { return self._s[2963]! } - public var Checkout_Title: String { return self._s[2964]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2966]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2968]! } - public var Notification_RenamedGroup: String { return self._s[2969]! } - public var PeopleNearby_Groups: String { return self._s[2970]! } - public var Checkout_PayWithFaceId: String { return self._s[2971]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2972]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2974]! } - public var Checkout_WebConfirmation_Title: String { return self._s[2975]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[2976]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2962]! } + public var Conversation_LinkDialogSave: String { return self._s[2963]! } + public var GroupInfo_ActionRestrict: String { return self._s[2964]! } + public var Checkout_Title: String { return self._s[2965]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2967]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2969]! } + public var Notification_RenamedGroup: String { return self._s[2970]! } + public var PeopleNearby_Groups: String { return self._s[2971]! } + public var Checkout_PayWithFaceId: String { return self._s[2972]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2973]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2975]! } + public var Checkout_WebConfirmation_Title: String { return self._s[2976]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2977]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2977]!, self._r[2977]!, [_0]) + return formatWithArgumentRanges(self._s[2978]!, self._r[2978]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[2979]! } + public var Profile_AddToExisting: String { return self._s[2980]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2980]!, self._r[2980]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2981]!, self._r[2981]!, [_0, _1]) } - public var Cache_Files: String { return self._s[2982]! } - public var Permissions_PrivacyPolicy: String { return self._s[2983]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2984]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2985]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2987]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2989]! } - public var Calls_NoCallsPlaceholder: String { return self._s[2990]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2991]! } - public var VoiceOver_AttachMedia: String { return self._s[2993]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2994]! } + public var Cache_Files: String { return self._s[2983]! } + public var Permissions_PrivacyPolicy: String { return self._s[2984]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2985]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2986]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2988]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2990]! } + public var Calls_NoCallsPlaceholder: String { return self._s[2991]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2992]! } + public var VoiceOver_AttachMedia: String { return self._s[2994]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2995]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2995]!, self._r[2995]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2996]!, self._r[2996]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2996]! } - public var Conversation_SetReminder_Title: String { return self._s[2997]! } - public var Passport_FieldAddressHelp: String { return self._s[2998]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2999]! } - public var PUSH_REMINDER_TITLE: String { return self._s[3000]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2997]! } + public var Conversation_SetReminder_Title: String { return self._s[2998]! } + public var Passport_FieldAddressHelp: String { return self._s[2999]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3000]! } + public var PUSH_REMINDER_TITLE: String { return self._s[3001]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3001]!, self._r[3001]!, [_0]) + return formatWithArgumentRanges(self._s[3002]!, self._r[3002]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[3002]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[3003]! } - public var Login_UnknownError: String { return self._s[3004]! } - public var Group_UpgradeNoticeText2: String { return self._s[3007]! } - public var Watch_Compose_AddContact: String { return self._s[3008]! } - public var Web_Error: String { return self._s[3009]! } - public var Gif_Search: String { return self._s[3010]! } - public var Profile_MessageLifetime1h: String { return self._s[3011]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3012]! } - public var Channel_Username_CheckingUsername: String { return self._s[3013]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[3014]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[3015]! } - public var Channel_AboutItem: String { return self._s[3016]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3018]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[3019]! } - public var GroupInfo_SharedMedia: String { return self._s[3020]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[3003]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[3004]! } + public var Login_UnknownError: String { return self._s[3005]! } + public var Group_UpgradeNoticeText2: String { return self._s[3008]! } + public var Watch_Compose_AddContact: String { return self._s[3009]! } + public var Web_Error: String { return self._s[3010]! } + public var Gif_Search: String { return self._s[3011]! } + public var Profile_MessageLifetime1h: String { return self._s[3012]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3013]! } + public var Channel_Username_CheckingUsername: String { return self._s[3014]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[3015]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[3016]! } + public var Channel_AboutItem: String { return self._s[3017]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3019]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[3020]! } + public var GroupInfo_SharedMedia: String { return self._s[3021]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3021]!, self._r[3021]!, [_1]) + return formatWithArgumentRanges(self._s[3022]!, self._r[3022]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[3022]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[3023]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3023]!, self._r[3023]!, [_1]) + return formatWithArgumentRanges(self._s[3024]!, self._r[3024]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[3024]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3025]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[3026]! } - public var CreatePoll_AddOption: String { return self._s[3027]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3028]! } - public var Group_UpgradeNoticeHeader: String { return self._s[3029]! } - public var Channel_Management_AddModerator: String { return self._s[3030]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[3031]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[3032]! } - public var NotificationsSound_Hello: String { return self._s[3033]! } - public var SocksProxySetup_SavedProxies: String { return self._s[3034]! } - public var Channel_Stickers_Placeholder: String { return self._s[3036]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[3025]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3026]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[3027]! } + public var CreatePoll_AddOption: String { return self._s[3028]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3029]! } + public var Group_UpgradeNoticeHeader: String { return self._s[3030]! } + public var Channel_Management_AddModerator: String { return self._s[3031]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[3032]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[3033]! } + public var NotificationsSound_Hello: String { return self._s[3034]! } + public var SocksProxySetup_SavedProxies: String { return self._s[3035]! } + public var Channel_Stickers_Placeholder: String { return self._s[3037]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3037]!, self._r[3037]!, [_0]) + return formatWithArgumentRanges(self._s[3038]!, self._r[3038]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3038]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[3039]! } - public var ContactInfo_BirthdayLabel: String { return self._s[3040]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3041]! } - public var AutoDownloadSettings_Channels: String { return self._s[3042]! } - public var Passport_Language_mn: String { return self._s[3043]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[3046]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3047]! } - public var Passport_Language_ja: String { return self._s[3049]! } - public var Settings_About_Title: String { return self._s[3050]! } - public var Settings_NotificationsAndSounds: String { return self._s[3051]! } - public var ChannelInfo_DeleteGroup: String { return self._s[3052]! } - public var Settings_BlockedUsers: String { return self._s[3053]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3039]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[3040]! } + public var ContactInfo_BirthdayLabel: String { return self._s[3041]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3042]! } + public var AutoDownloadSettings_Channels: String { return self._s[3043]! } + public var Passport_Language_mn: String { return self._s[3044]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[3047]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3048]! } + public var Passport_Language_ja: String { return self._s[3050]! } + public var Settings_About_Title: String { return self._s[3051]! } + public var Settings_NotificationsAndSounds: String { return self._s[3052]! } + public var ChannelInfo_DeleteGroup: String { return self._s[3053]! } + public var Settings_BlockedUsers: String { return self._s[3054]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3054]!, self._r[3054]!, [_0]) + return formatWithArgumentRanges(self._s[3055]!, self._r[3055]!, [_0]) } - public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3055]! } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3056]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3057]! } - public var Channel_Username_Title: String { return self._s[3058]! } + public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3056]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3057]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3058]! } + public var Channel_Username_Title: String { return self._s[3059]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3059]!, self._r[3059]!, [_0]) + return formatWithArgumentRanges(self._s[3060]!, self._r[3060]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3061]! } - public var AppleWatch_Title: String { return self._s[3062]! } - public var Activity_RecordingVideoMessage: String { return self._s[3063]! } + public var AttachmentMenu_File: String { return self._s[3062]! } + public var AppleWatch_Title: String { return self._s[3063]! } + public var Activity_RecordingVideoMessage: String { return self._s[3064]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3064]!, self._r[3064]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3065]!, self._r[3065]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[3065]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3066]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3067]! } - public var Common_Next: String { return self._s[3069]! } - public var Channel_Stickers_YourStickers: String { return self._s[3071]! } - public var Message_Theme: String { return self._s[3072]! } - public var Call_AudioRouteHeadphones: String { return self._s[3073]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3075]! } - public var Watch_Contacts_NoResults: String { return self._s[3077]! } - public var PhotoEditor_TintTool: String { return self._s[3080]! } - public var LoginPassword_ResetAccount: String { return self._s[3082]! } - public var Settings_SavedMessages: String { return self._s[3083]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3084]! } - public var Bot_GenericSupportStatus: String { return self._s[3085]! } - public var StickerPack_Add: String { return self._s[3086]! } - public var Checkout_TotalAmount: String { return self._s[3087]! } - public var Your_cards_number_is_invalid: String { return self._s[3088]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3089]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3090]! } + public var Weekday_Saturday: String { return self._s[3066]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3067]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3068]! } + public var Common_Next: String { return self._s[3070]! } + public var Channel_Stickers_YourStickers: String { return self._s[3072]! } + public var Message_Theme: String { return self._s[3073]! } + public var Call_AudioRouteHeadphones: String { return self._s[3074]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3076]! } + public var Watch_Contacts_NoResults: String { return self._s[3078]! } + public var PhotoEditor_TintTool: String { return self._s[3081]! } + public var LoginPassword_ResetAccount: String { return self._s[3083]! } + public var Settings_SavedMessages: String { return self._s[3084]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3085]! } + public var Bot_GenericSupportStatus: String { return self._s[3086]! } + public var StickerPack_Add: String { return self._s[3087]! } + public var Checkout_TotalAmount: String { return self._s[3088]! } + public var Your_cards_number_is_invalid: String { return self._s[3089]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3090]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3091]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3091]!, self._r[3091]!, [_0]) + return formatWithArgumentRanges(self._s[3092]!, self._r[3092]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3092]!, self._r[3092]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3093]!, self._r[3093]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3093]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3094]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3095]!, self._r[3095]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3096]!, self._r[3096]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3096]!, self._r[3096]!, [_0]) + return formatWithArgumentRanges(self._s[3097]!, self._r[3097]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3097]! } - public var StickerPack_Share: String { return self._s[3098]! } - public var Passport_DeleteAddress: String { return self._s[3099]! } - public var Settings_Passport: String { return self._s[3100]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3101]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3102]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3103]! } - public var Contacts_PermissionsText: String { return self._s[3104]! } - public var Group_Setup_HistoryVisible: String { return self._s[3105]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3107]! } - public var SocksProxySetup_Title: String { return self._s[3108]! } - public var Notification_Mute1h: String { return self._s[3109]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3098]! } + public var StickerPack_Share: String { return self._s[3099]! } + public var Passport_DeleteAddress: String { return self._s[3100]! } + public var Settings_Passport: String { return self._s[3101]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3102]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3103]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3104]! } + public var Contacts_PermissionsText: String { return self._s[3105]! } + public var Group_Setup_HistoryVisible: String { return self._s[3106]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3108]! } + public var SocksProxySetup_Title: String { return self._s[3109]! } + public var Notification_Mute1h: String { return self._s[3110]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3110]!, self._r[3110]!, [_0]) + return formatWithArgumentRanges(self._s[3111]!, self._r[3111]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3111]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3112]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3112]!, self._r[3112]!, [_1]) + return formatWithArgumentRanges(self._s[3113]!, self._r[3113]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3113]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3116]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3118]! } - public var DialogList_NoMessagesText: String { return self._s[3119]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3120]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3121]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3123]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3124]! } - public var Common_TakePhotoOrVideo: String { return self._s[3125]! } - public var Call_StatusBusy: String { return self._s[3126]! } - public var Conversation_PinnedMessage: String { return self._s[3127]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3128]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3129]! } - public var Undo_ChatCleared: String { return self._s[3130]! } - public var AppleWatch_ReplyPresets: String { return self._s[3131]! } - public var Passport_DiscardMessageDescription: String { return self._s[3133]! } - public var Login_NetworkError: String { return self._s[3134]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3114]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3117]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3119]! } + public var DialogList_NoMessagesText: String { return self._s[3120]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3121]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3122]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3124]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3125]! } + public var Common_TakePhotoOrVideo: String { return self._s[3126]! } + public var Call_StatusBusy: String { return self._s[3127]! } + public var Conversation_PinnedMessage: String { return self._s[3128]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3129]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3130]! } + public var Undo_ChatCleared: String { return self._s[3131]! } + public var AppleWatch_ReplyPresets: String { return self._s[3132]! } + public var Passport_DiscardMessageDescription: String { return self._s[3134]! } + public var Login_NetworkError: String { return self._s[3135]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3135]!, self._r[3135]!, [_0]) - } - public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3136]!, self._r[3136]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3137]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3139]! } + public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3137]!, self._r[3137]!, [_0]) + } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3138]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3140]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3141]!, self._r[3141]!, [_0]) + return formatWithArgumentRanges(self._s[3142]!, self._r[3142]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3142]! } - public var VoiceOver_Chat_Music: String { return self._s[3143]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3144]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3146]! } - public var ConversationMedia_Title: String { return self._s[3147]! } - public var EncryptionKey_Title: String { return self._s[3149]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3150]! } - public var Notification_Exceptions_AddException: String { return self._s[3151]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3152]! } - public var Profile_MessageLifetime1m: String { return self._s[3153]! } + public var Call_ConnectionErrorMessage: String { return self._s[3143]! } + public var VoiceOver_Chat_Music: String { return self._s[3144]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3145]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3147]! } + public var ConversationMedia_Title: String { return self._s[3148]! } + public var EncryptionKey_Title: String { return self._s[3150]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3151]! } + public var Notification_Exceptions_AddException: String { return self._s[3152]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3153]! } + public var Profile_MessageLifetime1m: String { return self._s[3154]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3154]!, self._r[3154]!, [_1]) + return formatWithArgumentRanges(self._s[3155]!, self._r[3155]!, [_1]) } - public var Month_GenMay: String { return self._s[3155]! } + public var Month_GenMay: String { return self._s[3156]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3156]!, self._r[3156]!, [_0]) + return formatWithArgumentRanges(self._s[3157]!, self._r[3157]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3157]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3158]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3159]! } - public var Conversation_EmptyPlaceholder: String { return self._s[3161]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3162]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3163]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3164]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3165]! } - public var Channel_JoinChannel: String { return self._s[3167]! } - public var Appearance_Animations: String { return self._s[3170]! } + public var PeopleNearby_Users: String { return self._s[3158]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3159]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3160]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3162]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3163]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3164]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3165]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3166]! } + public var Channel_JoinChannel: String { return self._s[3168]! } + public var Appearance_Animations: String { return self._s[3171]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3171]!, self._r[3171]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3172]!, self._r[3172]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3173]! } - public var Appearance_ShareTheme: String { return self._s[3174]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3176]! } - public var Passport_Address_Street: String { return self._s[3177]! } - public var Conversation_AddContact: String { return self._s[3178]! } - public var Login_PhonePlaceholder: String { return self._s[3179]! } - public var Channel_Members_InviteLink: String { return self._s[3181]! } - public var Bot_Stop: String { return self._s[3182]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3184]! } - public var Notification_PassportValueAddress: String { return self._s[3185]! } - public var Month_ShortJuly: String { return self._s[3186]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3187]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3188]! } - public var Passport_Identity_ReverseSide: String { return self._s[3189]! } - public var Watch_Stickers_Recents: String { return self._s[3192]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3194]! } - public var Map_SendThisLocation: String { return self._s[3195]! } + public var Stickers_GroupStickers: String { return self._s[3174]! } + public var Appearance_ShareTheme: String { return self._s[3175]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3177]! } + public var Passport_Address_Street: String { return self._s[3178]! } + public var Conversation_AddContact: String { return self._s[3179]! } + public var Login_PhonePlaceholder: String { return self._s[3180]! } + public var Channel_Members_InviteLink: String { return self._s[3182]! } + public var Bot_Stop: String { return self._s[3183]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3185]! } + public var Notification_PassportValueAddress: String { return self._s[3186]! } + public var Month_ShortJuly: String { return self._s[3187]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3188]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3189]! } + public var Passport_Identity_ReverseSide: String { return self._s[3190]! } + public var Watch_Stickers_Recents: String { return self._s[3193]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3195]! } + public var Map_SendThisLocation: String { return self._s[3196]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3196]!, self._r[3196]!, [_0]) - } - public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3197]!, self._r[3197]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3198]! } + public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3198]!, self._r[3198]!, [_0]) + } + public var ConvertToSupergroup_Note: String { return self._s[3199]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3199]!, self._r[3199]!, [_0]) + return formatWithArgumentRanges(self._s[3200]!, self._r[3200]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3200]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3201]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3201]!, self._r[3201]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3202]!, self._r[3202]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3203]! } - public var Wallpaper_SearchShort: String { return self._s[3204]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3206]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3207]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3208]! } + public var Login_CallRequestState3: String { return self._s[3204]! } + public var Wallpaper_SearchShort: String { return self._s[3205]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3207]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3208]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3209]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3209]!, self._r[3209]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3210]!, self._r[3210]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3210]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3214]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3211]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3215]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3215]!, self._r[3215]!, [_0]) + return formatWithArgumentRanges(self._s[3216]!, self._r[3216]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3216]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3217]! } + public var Passport_CorrectErrors: String { return self._s[3217]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3218]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3218]!, self._r[3218]!, [_0]) + return formatWithArgumentRanges(self._s[3219]!, self._r[3219]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3219]! } - public var Channel_DiscussionGroup: String { return self._s[3220]! } + public var Map_SendMyCurrentLocation: String { return self._s[3220]! } + public var Channel_DiscussionGroup: String { return self._s[3221]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3221]!, self._r[3221]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3222]!, self._r[3222]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3222]! } - public var Permissions_NotificationsText_v0: String { return self._s[3223]! } - public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3224]! } - public var Appearance_AppIcon: String { return self._s[3225]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3226]! } - public var LoginPassword_FloodError: String { return self._s[3227]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3229]! } + public var SharedMedia_SearchNoResults: String { return self._s[3223]! } + public var Permissions_NotificationsText_v0: String { return self._s[3224]! } + public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3225]! } + public var Appearance_AppIcon: String { return self._s[3226]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3227]! } + public var LoginPassword_FloodError: String { return self._s[3228]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3230]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3230]!, self._r[3230]!, [_0]) + return formatWithArgumentRanges(self._s[3231]!, self._r[3231]!, [_0]) } - public var Passport_Language_bn: String { return self._s[3231]! } + public var Passport_Language_bn: String { return self._s[3232]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3232]!, self._r[3232]!, [_0]) + return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_0]) } - public var ChatList_Context_Pin: String { return self._s[3233]! } + public var ChatList_Context_Pin: String { return self._s[3234]! } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3234]!, self._r[3234]!, [_0]) - } - public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3235]!, self._r[3235]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3238]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3240]! } - public var Contacts_PermissionsAllow: String { return self._s[3241]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3242]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3243]! } - public var WallpaperPreview_Pattern: String { return self._s[3244]! } - public var Paint_Duplicate: String { return self._s[3245]! } - public var Passport_Address_Country: String { return self._s[3246]! } - public var Notification_RenamedChannel: String { return self._s[3248]! } - public var ChatList_Context_Unmute: String { return self._s[3249]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3250]! } - public var Group_MessagePhotoUpdated: String { return self._s[3251]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3252]! } - public var Conversation_ContextMenuBan: String { return self._s[3253]! } - public var TwoStepAuth_EmailSent: String { return self._s[3254]! } - public var MessagePoll_NoVotes: String { return self._s[3255]! } - public var Passport_Language_is: String { return self._s[3256]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3258]! } - public var Tour_Text5: String { return self._s[3259]! } + public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3236]!, self._r[3236]!, [_0]) + } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3239]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3241]! } + public var Contacts_PermissionsAllow: String { return self._s[3242]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3243]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3244]! } + public var WallpaperPreview_Pattern: String { return self._s[3245]! } + public var Paint_Duplicate: String { return self._s[3246]! } + public var Passport_Address_Country: String { return self._s[3247]! } + public var Notification_RenamedChannel: String { return self._s[3249]! } + public var ChatList_Context_Unmute: String { return self._s[3250]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3251]! } + public var Group_MessagePhotoUpdated: String { return self._s[3252]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3253]! } + public var Conversation_ContextMenuBan: String { return self._s[3254]! } + public var TwoStepAuth_EmailSent: String { return self._s[3255]! } + public var MessagePoll_NoVotes: String { return self._s[3256]! } + public var Passport_Language_is: String { return self._s[3257]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3259]! } + public var Tour_Text5: String { return self._s[3260]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3261]!, self._r[3261]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3262]!, self._r[3262]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3262]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3263]! } + public var Undo_SecretChatDeleted: String { return self._s[3263]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3264]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3264]!, self._r[3264]!, [_0]) + return formatWithArgumentRanges(self._s[3265]!, self._r[3265]!, [_0]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3265]! } - public var Paint_Edit: String { return self._s[3267]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3269]! } - public var Undo_DeletedGroup: String { return self._s[3271]! } - public var LoginPassword_ForgotPassword: String { return self._s[3272]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3273]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3266]! } + public var Paint_Edit: String { return self._s[3268]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3270]! } + public var Undo_DeletedGroup: String { return self._s[3272]! } + public var LoginPassword_ForgotPassword: String { return self._s[3273]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3274]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3274]!, self._r[3274]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3275]!, self._r[3275]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3275]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3276]! } - public var Passport_Language_uz: String { return self._s[3277]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3278]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3279]! } - public var Map_StopLiveLocation: String { return self._s[3281]! } - public var VoiceOver_MessageContextSend: String { return self._s[3283]! } - public var PasscodeSettings_Help: String { return self._s[3284]! } - public var NotificationsSound_Input: String { return self._s[3285]! } - public var Share_Title: String { return self._s[3288]! } - public var LogoutOptions_Title: String { return self._s[3289]! } - public var Login_TermsOfServiceAgree: String { return self._s[3290]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3291]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3292]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3293]! } - public var EnterPasscode_EnterTitle: String { return self._s[3294]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3276]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3277]! } + public var Passport_Language_uz: String { return self._s[3278]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3279]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3280]! } + public var Map_StopLiveLocation: String { return self._s[3282]! } + public var VoiceOver_MessageContextSend: String { return self._s[3284]! } + public var PasscodeSettings_Help: String { return self._s[3285]! } + public var NotificationsSound_Input: String { return self._s[3286]! } + public var Share_Title: String { return self._s[3289]! } + public var LogoutOptions_Title: String { return self._s[3290]! } + public var Login_TermsOfServiceAgree: String { return self._s[3291]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3292]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3293]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3294]! } + public var EnterPasscode_EnterTitle: String { return self._s[3295]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3295]!, self._r[3295]!, [_0]) + return formatWithArgumentRanges(self._s[3296]!, self._r[3296]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3296]! } - public var Conversation_AddToContacts: String { return self._s[3297]! } + public var Settings_CopyPhoneNumber: String { return self._s[3297]! } + public var Conversation_AddToContacts: String { return self._s[3298]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3298]!, self._r[3298]!, [_0]) + return formatWithArgumentRanges(self._s[3299]!, self._r[3299]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[3299]! } + public var NotificationsSound_Keys: String { return self._s[3300]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3300]!, self._r[3300]!, [_0]) + return formatWithArgumentRanges(self._s[3301]!, self._r[3301]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3301]! } - public var Message_Video: String { return self._s[3302]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3303]! } + public var Notification_MessageLifetime1w: String { return self._s[3302]! } + public var Message_Video: String { return self._s[3303]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3304]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3304]!, self._r[3304]!, [_1]) + return formatWithArgumentRanges(self._s[3305]!, self._r[3305]!, [_1]) } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3307]!, self._r[3307]!, [_0]) - } - public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3308]!, self._r[3308]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3309]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3310]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3312]! } - public var PrivacyPolicy_Decline: String { return self._s[3313]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3314]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3315]! } - public var Permissions_SiriAllow_v0: String { return self._s[3317]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3318]! } + public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3309]!, self._r[3309]!, [_0]) + } + public var Passport_Language_mk: String { return self._s[3310]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3311]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3313]! } + public var PrivacyPolicy_Decline: String { return self._s[3314]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3315]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3316]! } + public var Permissions_SiriAllow_v0: String { return self._s[3318]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3319]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3319]!, self._r[3319]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3320]!, self._r[3320]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3320]!, self._r[3320]!, [_0]) + return formatWithArgumentRanges(self._s[3321]!, self._r[3321]!, [_0]) } - public var Paint_Regular: String { return self._s[3321]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3322]! } - public var SocksProxySetup_ShareLink: String { return self._s[3323]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3324]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3326]! } - public var GroupInfo_InviteByLink: String { return self._s[3327]! } - public var MessageTimer_Custom: String { return self._s[3328]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3329]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3331]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3332]! } - public var VoiceOver_Chat_Selected: String { return self._s[3333]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3334]! } - public var Channel_Username_InvalidTaken: String { return self._s[3335]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3336]! } - public var Settings_ChatBackground: String { return self._s[3337]! } - public var Channel_Subscribers_Title: String { return self._s[3338]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3339]! } - public var Watch_ConnectionDescription: String { return self._s[3340]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3344]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3345]! } - public var EditProfile_Title: String { return self._s[3346]! } - public var NotificationsSound_Bamboo: String { return self._s[3348]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3350]! } - public var Login_SmsRequestState2: String { return self._s[3351]! } - public var Passport_Language_ar: String { return self._s[3352]! } + public var Paint_Regular: String { return self._s[3322]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3323]! } + public var SocksProxySetup_ShareLink: String { return self._s[3324]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3325]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3327]! } + public var GroupInfo_InviteByLink: String { return self._s[3328]! } + public var MessageTimer_Custom: String { return self._s[3329]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3330]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3332]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3333]! } + public var VoiceOver_Chat_Selected: String { return self._s[3334]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3335]! } + public var Channel_Username_InvalidTaken: String { return self._s[3336]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3337]! } + public var Settings_ChatBackground: String { return self._s[3338]! } + public var Channel_Subscribers_Title: String { return self._s[3339]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3340]! } + public var Watch_ConnectionDescription: String { return self._s[3341]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3345]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3346]! } + public var EditProfile_Title: String { return self._s[3347]! } + public var NotificationsSound_Bamboo: String { return self._s[3349]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3351]! } + public var Login_SmsRequestState2: String { return self._s[3352]! } + public var Passport_Language_ar: String { return self._s[3353]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3353]!, self._r[3353]!, [_0]) + return formatWithArgumentRanges(self._s[3354]!, self._r[3354]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3354]! } - public var Conversation_MessageDialogEdit: String { return self._s[3355]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3356]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3355]! } + public var Conversation_MessageDialogEdit: String { return self._s[3356]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3357]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3357]!, self._r[3357]!, [_1]) + return formatWithArgumentRanges(self._s[3358]!, self._r[3358]!, [_1]) } - public var Common_Close: String { return self._s[3358]! } - public var GroupInfo_PublicLink: String { return self._s[3359]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3360]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3361]! } + public var Common_Close: String { return self._s[3359]! } + public var GroupInfo_PublicLink: String { return self._s[3360]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3361]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3362]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_0]) + return formatWithArgumentRanges(self._s[3366]!, self._r[3366]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3366]! } + public var UserInfo_About_Placeholder: String { return self._s[3367]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3367]!, self._r[3367]!, [_0]) + return formatWithArgumentRanges(self._s[3368]!, self._r[3368]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3368]! } - public var Channel_Info_Banned: String { return self._s[3370]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3369]! } + public var Channel_Info_Banned: String { return self._s[3371]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3371]!, self._r[3371]!, [_0]) + return formatWithArgumentRanges(self._s[3372]!, self._r[3372]!, [_0]) } - public var Appearance_Other: String { return self._s[3372]! } - public var Passport_Language_my: String { return self._s[3373]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3374]! } + public var Appearance_Other: String { return self._s[3373]! } + public var Passport_Language_my: String { return self._s[3374]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3375]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3375]!, self._r[3375]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3376]!, self._r[3376]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3376]! } - public var Preview_CopyAddress: String { return self._s[3377]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3377]! } + public var Preview_CopyAddress: String { return self._s[3378]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3378]!, self._r[3378]!, [_0]) + return formatWithArgumentRanges(self._s[3379]!, self._r[3379]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3379]! } - public var UserInfo_BotSettings: String { return self._s[3380]! } - public var LiveLocation_MenuStopAll: String { return self._s[3382]! } - public var Passport_PasswordCreate: String { return self._s[3383]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3384]! } - public var Message_PinnedLocationMessage: String { return self._s[3385]! } - public var Map_Satellite: String { return self._s[3386]! } - public var Watch_Message_Unsupported: String { return self._s[3387]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3388]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3389]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3380]! } + public var UserInfo_BotSettings: String { return self._s[3381]! } + public var LiveLocation_MenuStopAll: String { return self._s[3383]! } + public var Passport_PasswordCreate: String { return self._s[3384]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3385]! } + public var Message_PinnedLocationMessage: String { return self._s[3386]! } + public var Map_Satellite: String { return self._s[3387]! } + public var Watch_Message_Unsupported: String { return self._s[3388]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3389]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3390]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3390]!, self._r[3390]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3391]!, self._r[3391]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3391]!, self._r[3391]!, [_0]) + return formatWithArgumentRanges(self._s[3392]!, self._r[3392]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3392]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3393]! } - public var NotificationsSound_None: String { return self._s[3394]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3396]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3397]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3393]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3394]! } + public var NotificationsSound_None: String { return self._s[3395]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3397]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3398]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3398]!, self._r[3398]!, [_1]) + return formatWithArgumentRanges(self._s[3399]!, self._r[3399]!, [_1]) } - public var Cache_Indexing: String { return self._s[3399]! } - public var DialogList_RecentTitlePeople: String { return self._s[3401]! } - public var DialogList_EncryptionRejected: String { return self._s[3402]! } - public var GroupInfo_Administrators: String { return self._s[3403]! } - public var Passport_ScanPassportHelp: String { return self._s[3404]! } - public var Application_Name: String { return self._s[3405]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3406]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3408]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3409]! } + public var Cache_Indexing: String { return self._s[3400]! } + public var DialogList_RecentTitlePeople: String { return self._s[3402]! } + public var DialogList_EncryptionRejected: String { return self._s[3403]! } + public var GroupInfo_Administrators: String { return self._s[3404]! } + public var Passport_ScanPassportHelp: String { return self._s[3405]! } + public var Application_Name: String { return self._s[3406]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3407]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3409]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3410]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3410]!, self._r[3410]!, [_0]) - } - public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3411]!, self._r[3411]!, [_0]) } - public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3412]!, self._r[3412]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3413]! } - public var Privacy_ChatsTitle: String { return self._s[3414]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3415]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3416]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3417]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3418]! } - public var Group_LinkedChannel: String { return self._s[3419]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3420]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3421]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3422]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3423]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3425]! } - public var Channel_Setup_TypePublic: String { return self._s[3427]! } + public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3413]!, self._r[3413]!, [_0]) + } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3414]! } + public var Privacy_ChatsTitle: String { return self._s[3415]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3416]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3417]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3418]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3419]! } + public var Group_LinkedChannel: String { return self._s[3420]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3421]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3422]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3423]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3424]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3426]! } + public var Channel_Setup_TypePublic: String { return self._s[3428]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3428]!, self._r[3428]!, [_0]) + return formatWithArgumentRanges(self._s[3429]!, self._r[3429]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3430]! } - public var Map_OpenInMaps: String { return self._s[3432]! } + public var Channel_TypeSetup_Title: String { return self._s[3431]! } + public var Map_OpenInMaps: String { return self._s[3433]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3433]!, self._r[3433]!, [_1]) + return formatWithArgumentRanges(self._s[3434]!, self._r[3434]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3435]! } + public var NotificationsSound_Tremolo: String { return self._s[3436]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3436]!, self._r[3436]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3437]!, self._r[3437]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3437]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3438]! } - public var Passport_PasswordHelp: String { return self._s[3439]! } - public var Login_CodeExpiredError: String { return self._s[3440]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3441]! } - public var Conversation_TitleUnmute: String { return self._s[3442]! } - public var Passport_Identity_ScansHelp: String { return self._s[3443]! } - public var Passport_Language_lo: String { return self._s[3444]! } - public var Camera_FlashAuto: String { return self._s[3445]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3446]! } - public var Common_Cancel: String { return self._s[3447]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3448]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3449]! } - public var Appearance_TintAllColors: String { return self._s[3450]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3438]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3439]! } + public var Passport_PasswordHelp: String { return self._s[3440]! } + public var Login_CodeExpiredError: String { return self._s[3441]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3442]! } + public var Conversation_TitleUnmute: String { return self._s[3443]! } + public var Passport_Identity_ScansHelp: String { return self._s[3444]! } + public var Passport_Language_lo: String { return self._s[3445]! } + public var Camera_FlashAuto: String { return self._s[3446]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3447]! } + public var Common_Cancel: String { return self._s[3448]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3449]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3450]! } + public var Appearance_TintAllColors: String { return self._s[3451]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3451]!, self._r[3451]!, [_1]) + return formatWithArgumentRanges(self._s[3452]!, self._r[3452]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3452]! } - public var ChatSettings_Title: String { return self._s[3454]! } - public var Passport_PasswordReset: String { return self._s[3455]! } - public var SocksProxySetup_TypeNone: String { return self._s[3456]! } - public var EditTheme_Title: String { return self._s[3458]! } - public var PhoneNumberHelp_Help: String { return self._s[3459]! } - public var Checkout_EnterPassword: String { return self._s[3460]! } - public var Share_AuthTitle: String { return self._s[3462]! } - public var Activity_UploadingDocument: String { return self._s[3463]! } - public var State_Connecting: String { return self._s[3464]! } - public var Profile_MessageLifetime1w: String { return self._s[3465]! } - public var Conversation_ContextMenuReport: String { return self._s[3466]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3467]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3468]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3453]! } + public var ChatSettings_Title: String { return self._s[3455]! } + public var Passport_PasswordReset: String { return self._s[3456]! } + public var SocksProxySetup_TypeNone: String { return self._s[3457]! } + public var EditTheme_Title: String { return self._s[3459]! } + public var PhoneNumberHelp_Help: String { return self._s[3460]! } + public var Checkout_EnterPassword: String { return self._s[3461]! } + public var Share_AuthTitle: String { return self._s[3463]! } + public var Activity_UploadingDocument: String { return self._s[3464]! } + public var State_Connecting: String { return self._s[3465]! } + public var Profile_MessageLifetime1w: String { return self._s[3466]! } + public var Conversation_ContextMenuReport: String { return self._s[3467]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3468]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3469]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3469]!, self._r[3469]!, [_0]) + return formatWithArgumentRanges(self._s[3470]!, self._r[3470]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3470]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3471]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3472]! } - public var PhotoEditor_Set: String { return self._s[3473]! } - public var EmptyGroupInfo_Title: String { return self._s[3474]! } - public var Login_PadPhoneHelp: String { return self._s[3475]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3477]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3479]! } - public var NotificationsSound_Complete: String { return self._s[3480]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3481]! } - public var Group_Info_AdminLog: String { return self._s[3482]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3483]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3484]! } - public var Conversation_Admin: String { return self._s[3486]! } - public var Conversation_GifTooltip: String { return self._s[3487]! } - public var Passport_NotLoggedInMessage: String { return self._s[3488]! } + public var AuthSessions_Terminate: String { return self._s[3471]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3472]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3473]! } + public var PhotoEditor_Set: String { return self._s[3474]! } + public var EmptyGroupInfo_Title: String { return self._s[3475]! } + public var Login_PadPhoneHelp: String { return self._s[3476]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3478]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3480]! } + public var NotificationsSound_Complete: String { return self._s[3481]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3482]! } + public var Group_Info_AdminLog: String { return self._s[3483]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3484]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3485]! } + public var Conversation_Admin: String { return self._s[3487]! } + public var Conversation_GifTooltip: String { return self._s[3488]! } + public var Passport_NotLoggedInMessage: String { return self._s[3489]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3490]!, self._r[3490]!, [_0]) + return formatWithArgumentRanges(self._s[3491]!, self._r[3491]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3491]! } - public var SharedMedia_EmptyTitle: String { return self._s[3493]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3495]! } - public var Username_Help: String { return self._s[3496]! } - public var DialogList_LanguageTooltip: String { return self._s[3498]! } - public var Map_LoadError: String { return self._s[3499]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3500]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3501]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3502]! } - public var Notification_Exceptions_NewException: String { return self._s[3503]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3504]! } - public var WatchRemote_AlertText: String { return self._s[3505]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[3508]! } + public var Profile_MessageLifetimeForever: String { return self._s[3492]! } + public var SharedMedia_EmptyTitle: String { return self._s[3494]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3496]! } + public var Username_Help: String { return self._s[3497]! } + public var DialogList_LanguageTooltip: String { return self._s[3499]! } + public var Map_LoadError: String { return self._s[3500]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3501]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3502]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3503]! } + public var Notification_Exceptions_NewException: String { return self._s[3504]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3505]! } + public var WatchRemote_AlertText: String { return self._s[3506]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3509]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3509]!, self._r[3509]!, [_0]) + return formatWithArgumentRanges(self._s[3510]!, self._r[3510]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3510]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3511]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3511]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3512]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_0]) + return formatWithArgumentRanges(self._s[3513]!, self._r[3513]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3513]!, self._r[3513]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3514]!, self._r[3514]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3514]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3515]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3517]! } - public var ChatList_UndoArchiveText1: String { return self._s[3518]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3519]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3520]! } - public var Cache_ClearNone: String { return self._s[3521]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3522]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3523]! } + public var Group_AdminLog_EmptyText: String { return self._s[3515]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3516]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3518]! } + public var ChatList_UndoArchiveText1: String { return self._s[3519]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3520]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3521]! } + public var Cache_ClearNone: String { return self._s[3522]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3523]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3524]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3524]!, self._r[3524]!, [_0]) + return formatWithArgumentRanges(self._s[3525]!, self._r[3525]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[3525]! } + public var Passport_Identity_Country: String { return self._s[3526]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3526]!, self._r[3526]!, [_0]) - } - public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3527]!, self._r[3527]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3528]! } - public var AccessDenied_Settings: String { return self._s[3529]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3530]! } - public var Month_ShortMay: String { return self._s[3531]! } - public var Compose_NewGroup: String { return self._s[3533]! } - public var Group_Setup_TypePrivate: String { return self._s[3535]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3537]! } - public var Appearance_ThemeDayClassic: String { return self._s[3538]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3539]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3540]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3541]! } - public var Conversation_typing: String { return self._s[3543]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[3544]! } - public var Paint_Masks: String { return self._s[3545]! } - public var Contacts_DeselectAll: String { return self._s[3546]! } - public var Username_InvalidTaken: String { return self._s[3547]! } - public var Call_StatusNoAnswer: String { return self._s[3548]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3549]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3550]! } - public var Passport_Identity_Selfie: String { return self._s[3551]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3552]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3553]! } - public var Conversation_ClearSecretHistory: String { return self._s[3554]! } - public var PeopleNearby_Description: String { return self._s[3556]! } - public var NetworkUsageSettings_Title: String { return self._s[3557]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3559]! } + public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3528]!, self._r[3528]!, [_0]) + } + public var Exceptions_AddToExceptions: String { return self._s[3529]! } + public var AccessDenied_Settings: String { return self._s[3530]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3531]! } + public var Month_ShortMay: String { return self._s[3532]! } + public var Compose_NewGroup: String { return self._s[3534]! } + public var Group_Setup_TypePrivate: String { return self._s[3536]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3538]! } + public var Appearance_ThemeDayClassic: String { return self._s[3539]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3540]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3541]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3542]! } + public var Conversation_typing: String { return self._s[3544]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3545]! } + public var Paint_Masks: String { return self._s[3546]! } + public var Contacts_DeselectAll: String { return self._s[3547]! } + public var Username_InvalidTaken: String { return self._s[3548]! } + public var Call_StatusNoAnswer: String { return self._s[3549]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3550]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3551]! } + public var Passport_Identity_Selfie: String { return self._s[3552]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3553]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3554]! } + public var Conversation_ClearSecretHistory: String { return self._s[3555]! } + public var PeopleNearby_Description: String { return self._s[3557]! } + public var NetworkUsageSettings_Title: String { return self._s[3558]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3560]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3561]!, self._r[3561]!, [_0]) + return formatWithArgumentRanges(self._s[3562]!, self._r[3562]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3562]!, self._r[3562]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3563]!, self._r[3563]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3564]! } - public var VoiceOver_Navigation_Search: String { return self._s[3565]! } - public var Map_LiveLocationTitle: String { return self._s[3566]! } - public var Login_InfoAvatarAdd: String { return self._s[3567]! } - public var Passport_Identity_FilesView: String { return self._s[3568]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3569]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3570]! } - public var VoiceOver_Chat_File: String { return self._s[3571]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3565]! } + public var VoiceOver_Navigation_Search: String { return self._s[3566]! } + public var Map_LiveLocationTitle: String { return self._s[3567]! } + public var Login_InfoAvatarAdd: String { return self._s[3568]! } + public var Passport_Identity_FilesView: String { return self._s[3569]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3570]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3571]! } + public var VoiceOver_Chat_File: String { return self._s[3572]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3572]!, self._r[3572]!, [_0]) + return formatWithArgumentRanges(self._s[3573]!, self._r[3573]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3573]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3574]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3575]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3574]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3575]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3576]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3576]!, self._r[3576]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3577]!, self._r[3577]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3577]! } - public var Tour_Title2: String { return self._s[3578]! } - public var Conversation_FileOpenIn: String { return self._s[3579]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3580]! } - public var Wallpaper_Set: String { return self._s[3581]! } - public var Passport_Identity_Translations: String { return self._s[3583]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3578]! } + public var Tour_Title2: String { return self._s[3579]! } + public var Conversation_FileOpenIn: String { return self._s[3580]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3581]! } + public var Wallpaper_Set: String { return self._s[3582]! } + public var Passport_Identity_Translations: String { return self._s[3584]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3584]!, self._r[3584]!, [_0]) + return formatWithArgumentRanges(self._s[3585]!, self._r[3585]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[3585]! } + public var Channel_LeaveChannel: String { return self._s[3586]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3586]!, self._r[3586]!, [_1]) + return formatWithArgumentRanges(self._s[3587]!, self._r[3587]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3588]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3589]! } - public var Passport_Email_Delete: String { return self._s[3590]! } - public var Conversation_Mute: String { return self._s[3592]! } - public var Channel_AddBotAsAdmin: String { return self._s[3593]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3595]! } - public var Channel_Management_LabelOwner: String { return self._s[3597]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3589]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3590]! } + public var Passport_Email_Delete: String { return self._s[3591]! } + public var Conversation_Mute: String { return self._s[3593]! } + public var Channel_AddBotAsAdmin: String { return self._s[3594]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3596]! } + public var Channel_Management_LabelOwner: String { return self._s[3598]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3598]!, self._r[3598]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3599]!, self._r[3599]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3599]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3600]! } - public var Common_No: String { return self._s[3601]! } - public var Weekday_Sunday: String { return self._s[3602]! } - public var Notification_Reply: String { return self._s[3603]! } - public var Conversation_ViewMessage: String { return self._s[3604]! } + public var Calls_CallTabDescription: String { return self._s[3600]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3601]! } + public var Common_No: String { return self._s[3602]! } + public var Weekday_Sunday: String { return self._s[3603]! } + public var Notification_Reply: String { return self._s[3604]! } + public var Conversation_ViewMessage: String { return self._s[3605]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3605]!, self._r[3605]!, [_0]) - } - public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3606]!, self._r[3606]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3607]! } - public var Message_PinnedDocumentMessage: String { return self._s[3608]! } - public var DialogList_TabTitle: String { return self._s[3610]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3611]! } - public var Passport_FieldEmail: String { return self._s[3612]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3613]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3614]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3615]! } - public var Privacy_Calls_P2P: String { return self._s[3616]! } + public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3607]!, self._r[3607]!, [_0]) + } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3608]! } + public var Message_PinnedDocumentMessage: String { return self._s[3609]! } + public var DialogList_TabTitle: String { return self._s[3611]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3612]! } + public var Passport_FieldEmail: String { return self._s[3613]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3614]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3615]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3616]! } + public var Privacy_Calls_P2P: String { return self._s[3617]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3618]!, self._r[3618]!, [_0]) + return formatWithArgumentRanges(self._s[3619]!, self._r[3619]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3619]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3620]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3620]!, self._r[3620]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3621]!, self._r[3621]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3621]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3622]! } - public var Passport_InfoText: String { return self._s[3623]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3624]! } + public var Stickers_ClearRecent: String { return self._s[3622]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3623]! } + public var Passport_InfoText: String { return self._s[3624]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3625]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3625]!, self._r[3625]!, [_0]) + return formatWithArgumentRanges(self._s[3626]!, self._r[3626]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3626]!, self._r[3626]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3627]!, self._r[3627]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3627]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[3628]! } - public var VoiceOver_Navigation_Compose: String { return self._s[3629]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3630]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3632]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3633]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3628]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[3629]! } + public var VoiceOver_Navigation_Compose: String { return self._s[3630]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3631]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3633]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3634]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3634]!, self._r[3634]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3635]!, self._r[3635]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3636]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3637]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3638]!, self._r[3638]!, [_0]) + return formatWithArgumentRanges(self._s[3639]!, self._r[3639]!, [_0]) } - public var DialogList_Unread: String { return self._s[3639]! } + public var DialogList_Unread: String { return self._s[3640]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3640]!, self._r[3640]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3641]!, self._r[3641]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3641]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3642]! } + public var User_DeletedAccount: String { return self._s[3642]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3643]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3643]!, self._r[3643]!, [_0]) + return formatWithArgumentRanges(self._s[3644]!, self._r[3644]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3644]! } - public var SharedMedia_CategoryMedia: String { return self._s[3645]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3646]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3647]! } - public var Watch_ChatList_Compose: String { return self._s[3648]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3649]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3650]! } - public var Watch_Microphone_Access: String { return self._s[3651]! } - public var Group_Setup_HistoryHeader: String { return self._s[3652]! } - public var Map_SetThisLocation: String { return self._s[3653]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3654]! } - public var Activity_UploadingPhoto: String { return self._s[3655]! } - public var Conversation_Edit: String { return self._s[3657]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3658]! } - public var Login_TermsOfServiceDecline: String { return self._s[3659]! } - public var Message_PinnedContactMessage: String { return self._s[3660]! } + public var UserInfo_NotificationsDefault: String { return self._s[3645]! } + public var SharedMedia_CategoryMedia: String { return self._s[3646]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3647]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3648]! } + public var Watch_ChatList_Compose: String { return self._s[3649]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3650]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3651]! } + public var Watch_Microphone_Access: String { return self._s[3652]! } + public var Group_Setup_HistoryHeader: String { return self._s[3653]! } + public var Map_SetThisLocation: String { return self._s[3654]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3655]! } + public var Activity_UploadingPhoto: String { return self._s[3656]! } + public var Conversation_Edit: String { return self._s[3658]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3659]! } + public var Login_TermsOfServiceDecline: String { return self._s[3660]! } + public var Message_PinnedContactMessage: String { return self._s[3661]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3661]!, self._r[3661]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3662]!, self._r[3662]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3662]!, self._r[3662]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3663]!, self._r[3663]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3663]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3665]! } - public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[3666]! } + public var Appearance_LargeEmoji: String { return self._s[3664]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3666]! } + public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[3667]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3667]!, self._r[3667]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3668]!, self._r[3668]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3668]! } - public var Message_PinnedPhotoMessage: String { return self._s[3669]! } - public var Passport_FieldPhone: String { return self._s[3670]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3671]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3672]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3674]! } - public var Conversation_Call: String { return self._s[3675]! } - public var Common_TakePhoto: String { return self._s[3677]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3678]! } - public var Channel_NotificationLoading: String { return self._s[3679]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3669]! } + public var Message_PinnedPhotoMessage: String { return self._s[3670]! } + public var Passport_FieldPhone: String { return self._s[3671]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3672]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3673]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3675]! } + public var Conversation_Call: String { return self._s[3676]! } + public var Common_TakePhoto: String { return self._s[3678]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3679]! } + public var Channel_NotificationLoading: String { return self._s[3680]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3680]!, self._r[3680]!, [_0]) - } - public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3681]!, self._r[3681]!, [_0]) } + public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3682]!, self._r[3682]!, [_0]) + } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3682]!, self._r[3682]!, [_1]) + return formatWithArgumentRanges(self._s[3683]!, self._r[3683]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[3683]! } + public var Permissions_SiriTitle_v0: String { return self._s[3684]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3684]!, self._r[3684]!, [_0]) - } - public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3685]!, self._r[3685]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3686]! } - public var Common_edit: String { return self._s[3687]! } - public var PrivacySettings_AuthSessions: String { return self._s[3688]! } - public var Month_ShortJune: String { return self._s[3689]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3690]! } - public var Call_ReportSend: String { return self._s[3691]! } - public var Watch_LastSeen_JustNow: String { return self._s[3692]! } - public var Notifications_MessageNotifications: String { return self._s[3693]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3694]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3696]! } - public var Group_Status: String { return self._s[3697]! } + public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3686]!, self._r[3686]!, [_0]) + } + public var Channel_MessagePhotoRemoved: String { return self._s[3687]! } + public var Common_edit: String { return self._s[3688]! } + public var PrivacySettings_AuthSessions: String { return self._s[3689]! } + public var Month_ShortJune: String { return self._s[3690]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3691]! } + public var Call_ReportSend: String { return self._s[3692]! } + public var Watch_LastSeen_JustNow: String { return self._s[3693]! } + public var Notifications_MessageNotifications: String { return self._s[3694]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3695]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3697]! } + public var Group_Status: String { return self._s[3698]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3698]!, self._r[3698]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3699]!, self._r[3699]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3699]! } - public var ShareMenu_ShareTo: String { return self._s[3700]! } - public var Conversation_Moderate_Ban: String { return self._s[3701]! } + public var TextFormat_AddLinkTitle: String { return self._s[3700]! } + public var ShareMenu_ShareTo: String { return self._s[3701]! } + public var Conversation_Moderate_Ban: String { return self._s[3702]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3702]!, self._r[3702]!, [_0]) + return formatWithArgumentRanges(self._s[3703]!, self._r[3703]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3703]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3704]! } + public var SharedMedia_ViewInChat: String { return self._s[3704]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3705]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3705]!, self._r[3705]!, [_1]) + return formatWithArgumentRanges(self._s[3706]!, self._r[3706]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3706]!, self._r[3706]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3707]!, self._r[3707]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3708]!, self._r[3708]!, [_0]) + return formatWithArgumentRanges(self._s[3709]!, self._r[3709]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3709]! } - public var Appearance_ReduceMotion: String { return self._s[3710]! } + public var Map_OpenInHereMaps: String { return self._s[3710]! } + public var Appearance_ReduceMotion: String { return self._s[3711]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3711]!, self._r[3711]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3712]!, self._r[3712]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3712]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3713]! } - public var PhotoEditor_Skip: String { return self._s[3714]! } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) - } - public func UserCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + public var Channel_Setup_TypePublicHelp: String { return self._s[3713]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3714]! } + public var PhotoEditor_Skip: String { return self._s[3715]! } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, _1, _2) } public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPolls(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Theme_UsersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public func ForwardedStickers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func 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 = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, _1, _2) } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + public func MessageTimer_ShortDays(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Theme_UsersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } public func MuteExpires_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedPhotos(_ value: Int32) -> String { + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + public func AttachmentMenu_SendItem(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + public func Notifications_Exceptions(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } public func MuteFor_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, _1, _2) + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) } public func LastSeen_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedVideoMessages(_ value: Int32) -> String { + public func Watch_UserInfo_Mute(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) } public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func UserCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) } public func LastSeen_HoursAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Months(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) } public func SharedMedia_File(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) } public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + public func StickerPack_AddMaskCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramUI/BUCK b/submodules/TelegramUI/BUCK index 8e8a2aaea7..01d49c8675 100644 --- a/submodules/TelegramUI/BUCK +++ b/submodules/TelegramUI/BUCK @@ -182,6 +182,7 @@ framework( "//submodules/MessageReactionListUI:MessageReactionListUI", "//submodules/SegmentedControlNode:SegmentedControlNode", "//submodules/AppBundle:AppBundle", + "//submodules/WalletUI:WalletUI", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/TelegramUI/Images.xcassets/Settings/Wallet/Contents.json b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/Contents.json new file mode 100644 index 0000000000..38f0c81fc2 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/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/TelegramUI/Images.xcassets/Settings/Wallet/CreatedIcon.imageset/Bitmap.pdf b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/CreatedIcon.imageset/Bitmap.pdf new file mode 100644 index 0000000000..7cdc968169 Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/CreatedIcon.imageset/Bitmap.pdf differ diff --git a/submodules/TelegramUI/Images.xcassets/Settings/Wallet/CreatedIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/CreatedIcon.imageset/Contents.json new file mode 100644 index 0000000000..4bd38fb169 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/CreatedIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Bitmap.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Settings/Wallet/IntroIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/IntroIcon.imageset/Contents.json new file mode 100644 index 0000000000..cd65855a81 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/IntroIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "telegram-cloud-document-2-5467630458869122251.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Settings/Wallet/IntroIcon.imageset/telegram-cloud-document-2-5467630458869122251.pdf b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/IntroIcon.imageset/telegram-cloud-document-2-5467630458869122251.pdf new file mode 100644 index 0000000000..d6873316fe Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/IntroIcon.imageset/telegram-cloud-document-2-5467630458869122251.pdf differ diff --git a/submodules/TelegramUI/Images.xcassets/Settings/Wallet/WordsCheckIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/WordsCheckIcon.imageset/Contents.json new file mode 100644 index 0000000000..aaf8fe33b7 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/WordsCheckIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "telegram-cloud-photo-size-2-5474556248708983793-x.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Settings/Wallet/WordsCheckIcon.imageset/telegram-cloud-photo-size-2-5474556248708983793-x.pdf b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/WordsCheckIcon.imageset/telegram-cloud-photo-size-2-5474556248708983793-x.pdf new file mode 100644 index 0000000000..745de19d7b Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/WordsCheckIcon.imageset/telegram-cloud-photo-size-2-5474556248708983793-x.pdf differ diff --git a/submodules/TelegramUI/Images.xcassets/Settings/Wallet/WordsDisplayIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/WordsDisplayIcon.imageset/Contents.json new file mode 100644 index 0000000000..bc11e7fa38 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/WordsDisplayIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "telegram-cloud-photo-size-2-5474556248708983799-x.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Settings/Wallet/WordsDisplayIcon.imageset/telegram-cloud-photo-size-2-5474556248708983799-x.pdf b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/WordsDisplayIcon.imageset/telegram-cloud-photo-size-2-5474556248708983799-x.pdf new file mode 100644 index 0000000000..16c80ac3b6 Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Settings/Wallet/WordsDisplayIcon.imageset/telegram-cloud-photo-size-2-5474556248708983799-x.pdf differ diff --git a/submodules/TelegramUI/TelegramUI/AccountContext.swift b/submodules/TelegramUI/TelegramUI/AccountContext.swift index 01a1625fe4..377e4324ce 100644 --- a/submodules/TelegramUI/TelegramUI/AccountContext.swift +++ b/submodules/TelegramUI/TelegramUI/AccountContext.swift @@ -102,6 +102,8 @@ public final class AccountContextImpl: AccountContext { } public let account: Account + public let tonContext: TonContext? + public let fetchManager: FetchManager private let prefetchManager: PrefetchManager? @@ -129,9 +131,10 @@ public final class AccountContextImpl: AccountContext { private let deviceSpecificContactImportContexts: QueueLocalObject private var managedAppSpecificContactsDisposable: Disposable? - public init(sharedContext: SharedAccountContextImpl, account: Account, limitsConfiguration: LimitsConfiguration) { + public init(sharedContext: SharedAccountContextImpl, account: Account, tonContext: TonContext?, limitsConfiguration: LimitsConfiguration) { self.sharedContextImpl = sharedContext self.account = account + self.tonContext = tonContext self.downloadedMediaStoreManager = DownloadedMediaStoreManagerImpl(postbox: account.postbox, accountManager: sharedContext.accountManager) diff --git a/submodules/TelegramUI/TelegramUI/AppDelegate.swift b/submodules/TelegramUI/TelegramUI/AppDelegate.swift index 35112f5fb8..ed7d9a9fff 100644 --- a/submodules/TelegramUI/TelegramUI/AppDelegate.swift +++ b/submodules/TelegramUI/TelegramUI/AppDelegate.swift @@ -23,6 +23,7 @@ import PassportUI import WatchBridge import LegacyDataImport import SettingsUI +import AppBundle private let handleVoipNotifications = false @@ -646,6 +647,42 @@ final class SharedApplicationContext { }) } + let tonKeychain: TonKeychain + + #if targetEnvironment(simulator) + tonKeychain = TonKeychain(encrypt: { data in + return Signal { subscriber in + subscriber.putNext(data) + subscriber.putCompletion() + return EmptyDisposable + } + }, decrypt: { data in + return Signal { subscriber in + subscriber.putNext(data) + subscriber.putCompletion() + return EmptyDisposable + } + }) + #else + tonKeychain = TonKeychain(encrypt: { data in + return Signal { subscriber in + BuildConfig.encryptApplicationSecret(data, baseAppBundleId: baseAppBundleId, completion: { result in + subscriber.putNext(result) + subscriber.putCompletion() + }) + return EmptyDisposable + } + }, decrypt: { data in + return Signal { subscriber in + BuildConfig.decryptApplicationSecret(data, baseAppBundleId: baseAppBundleId, completion: { result in + subscriber.putNext(result) + subscriber.putCompletion() + }) + return EmptyDisposable + } + }) + #endif + let sharedContextSignal = accountManagerSignal |> deliverOnMainQueue |> take(1) @@ -884,7 +921,11 @@ final class SharedApplicationContext { |> deliverOnMainQueue |> map { accountAndSettings -> AuthorizedApplicationContext? in return accountAndSettings.flatMap { account, limitsConfiguration, callListSettings in - let context = AccountContextImpl(sharedContext: sharedApplicationContext.sharedContext, account: account, limitsConfiguration: limitsConfiguration) + var tonContext: TonContext? + if let path = getAppBundle().path(forResource: "cfg", ofType: "txt"), let data = try? Data(contentsOf: URL(fileURLWithPath: path)), let config = String(data: data, encoding: .utf8) { + tonContext = TonContext(instance: TonInstance(basePath: account.basePath, config: config), keychain: tonKeychain) + } + let context = AccountContextImpl(sharedContext: sharedApplicationContext.sharedContext, account: account, tonContext: tonContext, limitsConfiguration: limitsConfiguration) return AuthorizedApplicationContext(sharedApplicationContext: sharedApplicationContext, mainWindow: self.mainWindow, watchManagerArguments: watchManagerArgumentsPromise.get(), context: context, accountManager: sharedApplicationContext.sharedContext.accountManager, showCallsTab: callListSettings.showTab, reinitializedNotificationSettings: { let _ = (self.context.get() |> take(1) diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift index d1114a7664..d2293c60ab 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift @@ -522,7 +522,9 @@ final class ChatMediaInputNode: ChatInputNode { } }, openSettings: { [weak self] in if let strongSelf = self { - strongSelf.controllerInteraction.navigationController()?.pushViewController(installedStickerPacksController(context: context, mode: .modal)) + let controller = installedStickerPacksController(context: context, mode: .modal) + controller.navigationPresentation = .modal + strongSelf.controllerInteraction.navigationController()?.pushViewController(controller) } }, toggleSearch: { [weak self] value, searchMode in if let strongSelf = self { diff --git a/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift b/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift index 1090b75511..de6922d780 100644 --- a/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift +++ b/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift @@ -302,22 +302,6 @@ class ContactMultiselectionControllerImpl: ViewController, ContactMultiselection } } - override open func dismiss(completion: (() -> Void)? = nil) { - if let presentationArguments = self.presentationArguments as? ViewControllerPresentationArguments { - switch presentationArguments.presentationAnimation { - case .modalSheet: - self.view.endEditing(true) - self.contactsNode.animateOut(completion: { [weak self] in - self?.dismissed?() - completion?() - }) - case .none: - self.dismissed?() - completion?() - } - } - } - override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 846948decd..ba3c537245 100644 Binary files a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping and b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping differ diff --git a/submodules/TelegramUI/TelegramUI/Resources/cfg.txt b/submodules/TelegramUI/TelegramUI/Resources/cfg.txt new file mode 100644 index 0000000000..2b93e6d930 --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/Resources/cfg.txt @@ -0,0 +1,1004 @@ +{ + "@type": "config.global", + "liteclients": [ + { + "@type": "liteclient.config.global", + "ip": -1304504083, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "DV/tiUhUm63rd5Apd8GEAT0dFfJUtZ2nTIfJ+kRlsAw=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1068377703, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "CIoYpRWinXWbFq28vaehuVHXjcWIAVntgP86IFVhBZA=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1057912003, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "gzDHDw3tRv8vlNX7fZstkf2ryjtSnPPFCoo3zShIrP4=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1057911744, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "qny2fvIURiomfiersNlO2XCVsoAa79jODk8W+xwHb7U=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1057911148, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "HA46rLOlOR8TnLUTMKj+00EkgVNjLLR/n8pl0D6UVFs=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -960017601, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "KTcSr9C1dOV0aq1XYNQ+EB/FD/ZahbxPDki3LiqW2gI=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -960016061, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "NUbsAQT1cOc37zL2EKETN7PW/+IEEqcUPnE7NLlErYw=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1057908603, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "ExfhjJNdm5pTb59CKRs7PvOZmYzp10JGVMsJZUh6ECc=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1057913261, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "EgJ3XQs2BPH4KgVSOUhYCGJauDf1ZIQS8ekY0CWuSWM=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1057912968, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "fkcogWHOSj/mjne7plR88xm8jFhgQuj8CViXSGdDr7Q=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1068378705, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "2xi+YQBzNQs0Y6LRtLLuFpC9xGxBG0GmuA+VrhlHUJ8=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761102430, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "AMF7C9bSHrcmmLv8PBLIsNMwIrlk5hz95EPinrtS3OM=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761102682, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "Drj1DIdJbaywWyXwWrXe4Ahdxt0aeUoDxGNlbRJuAvw=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761102998, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "XNvgKbw/Lt+5Olzl0JXWh3Z8SUUoOl+HfBQXpa7mmus=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906484321, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "IKqRbLTkH9SycgbNKSqGwoQ4quwIIbniw6CIpHupvGg=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761128499, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "H4CyzrVBmRUySPRbodkIOS0bNN7pw25BOkr8osvu2uk=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906485293, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "hs/hGnZ5/cXpnaXW4YC6ZiCccKbCKV0lqUAHDcZAWbI=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761103643, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "jRvgvasW6qCo8B7Bx/is0keNTO9r4TorAnc6pEi/23M=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761102669, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "uv2MVlfhGOWIw5HgryqGDKJ3UpJwkrqp4kr+lPK6co8=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761128567, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "NApQRK7m0vRQxzbkYmwUq8glTbkUU8UIBgPCBWeCU3s=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761102455, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "bmbIbxQV4zSUMQ8I+dD5/l8kPHQBdG8CiybmnT32euc=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1304505746, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "S75iLB0NR2/UigCTeHZ09aYOjOmv5XHouvsf7WdP3Zk=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1304506980, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "1bfndxb6MSCLLfBNuGNbGRgsqemtfC89Gd/+hXUTRbU=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1304505254, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "el6aQW3psg5eoUAZYSmK+JUpaqGrcETaxdVc69VdoqQ=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1304505250, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "rcXjR9/LRK33pKIoheKsZlluRrDRbybDGd9yF7/GNGY=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1304506016, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "lTeh+3op7fMgAoeJbKLvT1Bsn3Q7cCrpmU25BYQw1k8=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1304505762, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "8aRwvoUS+IMkysDo300FTBlInDWI7Cv1J6/Q5G1KXFc=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1304506327, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "XQB7dBGjRTg/xl3a5coTIeHfkMU/glrXd+pOCjLXlMc=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1304505218, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "7+LMdebb+NeEW1v+wPnkZFfkSOj539xTcpKYlkIEeb4=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1304507131, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "qokyesASkg3C7YOp/DJ/DfsuojVARFc28LsNMitmCmA=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1304506280, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "zEiY6eT3aYZq5+pAC9cmjv/YRvzxG5E5wsm7IBSto+4=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1152892389, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "cdCPa/iSKfID87WEZe/nFjO/aRbiZahj8FsK8SMUZpQ=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1645860838, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "6UWk19MbBb7I3o9xvClrlcvFqzWnNRfEt8ttBbvFz/s=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1152889600, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "Y2wsQPXrMNMB6dvNa612HdaJ5HWh0jo9W5sbEicC8xs=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1152889682, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "XUk6hemxamYwdUr93+pNeRLESEL+xOy0LNCnKuR+Gdo=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -826453684, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "KD5l0+wrR0SjTvwKB0j4C/wTaeiyhSwrRRq11Dyb3L0=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1152892218, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "pMIxjycUkkhqU0E2JPCANW7bMBK6Zw/Sga8aIz++JYo=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1152892263, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "hDh4oFrYKquWQM1DsAO273cfJevPW/TlZHF/aP8WCc4=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1152892278, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "6q+ZtFXRIO0Wi0IgXnsyIbOJHMxhnZfKQFEhDlIsxuc=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1152892245, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "t+5NFV1iSCOB4JRH6uXsVahAQjx1YypiNoawUxV4elk=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1152889739, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "QW/Qcec57iz27OTLJZWx8hADO4rOUI8fjak0BeW7Uik=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906497622, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "+BGcX5JyiJLCNncXDkraybMlWl6ia/E442KBxH/BaSw=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761128256, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "wGlPbpfz/xfynExyRhRtp8C6LZuj8u/LMUT6/uTIvTg=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761125946, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "cmo+9dmnfewfrAe9tkWN7+EZfEH+yVaugHrPGrd1qN0=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761126833, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "CX3L4PkMF00sATRk/b3oSTrJyLdMrEtsNnI3CXcsudo=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761126836, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "mfbwQQF6JxCqjH8N2DhawDI9BAQ4jr6p7iXXJsrv+Mw=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761125954, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "kBHSnRbZbLFHoWVPQ3GZUvBxLsgQ1Dtah8UicTzNmQM=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761126831, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "yilz2TDUfQYUFOU2w/FSDGsQgUbK1VO/6avcmHK/9yM=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761127482, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "WSpv7ZJZYdcHXEPWxCGa1eB83NFLtzNxD83E6cpLbsA=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761125923, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "VOzqQQWzAWuQ13LurjTqnRn6ca6ZVRngqBRX5EhFkxU=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1761126773, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "JZv7kKSqWUY1Hb834Yoju5x4f7CsAy8evvac74m6C2I=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906462930, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "TKY6d+qjYOuy4NdYPpW1EI1OUUdt+mRZ1XdNttTyfUM=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906465777, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "v2/1ctPuoLrkcjhzg883nsj43CEZunD0rLwiydWQB1g=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906462910, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "ll6tinPXeBq8AQuFNx/tpXb3zPEgbYKWCOzlwsvY9So=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906465752, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "pkbZ3c5mFOPGqIGNAhdY2aYVYtktUovv4ydf+7KoYIw=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906462871, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "Jrbug5SSeN4SS2QXWAEKWqGQn2DlULYEpd0CQUmrUog=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906462903, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "Uqb/H4hAXfYTowJ8Uj1i/O2uyCtVzIvEYs7Wj0WugKM=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906462900, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "DnMT/zaKqEDCWj0pqEQVZx2Gyej5NVnVgzfSMZbtS8I=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906464679, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "bfn/ZPjyi2sRRb3EqWeEo1biCfmnAScJtzf0iWcoetY=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906462816, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "dNleRcSLp18yP6JuJ9ZAw4tyvcZI8dwYIamJrsf3jnw=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906464690, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "TXs2WXqGdqydsAo0AoeCoL+2/46+Itn19w7boG+xmOA=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1486637148, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "kwU+G53Qu2B6dcQ5VU22lq/lM58nPkJpgs+nUqBVKE8=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1486637095, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "dLzZot6GVZ1vb9oRzNLRUvRyKPfjtD5Rhwda5lDX5RY=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1486637057, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "/GrzoCXcy+0Cf+sGW4jW/t1YS2l5/l4vP2f1ab/+4Xg=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1486637076, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "7PLAlTdhGvCGY87aF/zHV37mcnaPZ56ulWynys73Ht4=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1486637077, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "3x+i3BTlSgx71oxeV9MK8GIlmaoeviBVP5mRAohkWjg=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300176878, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "594AzH7G2s3X0CatCX+VcotLDAEhkoSdtH7jgJJqx9A=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300176772, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "IOw67C40qmY/jMajJOP0T7nXq0Nm0bad3hRJZH37plw=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1966759642, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "1+OvwcnY/TmcVf6/BNgVp5K4ROfKWDUrGPryMDPiAVo=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1621525557, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "sz1vWl1/6zL6Ax3JIoMi2Hypbm3EYua0PMCzYJIPwHA=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1486637182, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "HWrd2Ki0RIQZanCClYA6wVTL/2/Pw93xR7wnzPC54FA=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300174690, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "PRkX4OnKH9hrC4wRLK9KjcyRIeb8vQ9fAuKy0KAR96I=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300174601, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "SLtDEcGNoLejl5+7ugRtwIb1iAP4zJgiMqV45adhBxo=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300174685, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "BTNybm5f/sNG1bTrVHbvfDYRNqj8tMUJ4I8C8NaiC5k=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300174619, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "jLQkdn005r7OI92waLZgo+s3eXBufdA0f2ZABbziG+c=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300175620, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "ldjuyk0g5F167UOy/Onmfw0DF4XIzhATN71DB9OSE+I=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1966758224, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "XiyxLPocCqLzzAq32b12zi58YuhI8Tk0g12A3C+baBI=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300174695, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "QQA+HLq++d9cydhpnc/IJdEaGSXsiooNc4x93F11zGI=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300173773, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "cjq2qdBHRVoIidXywXj7wffJyw4c7fxnhA0GvaB3hS8=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300176324, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "4URHqWke30BXuS7OAhmtyk0g8SMIZFc4ThyyBsOKf08=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300175865, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "fDQXvgFHQIYTaBpTlMBhA0h56NOuWeDJnKpKAX5vMTE=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906452403, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "5JXdERiHv3vB3gYfR9TlH0/vFp6WVqAVd0RwrKijrgU=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906450496, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "60Ap+Ny9Wu83f0EnGyz5yc7ko2oCdPf2r6rgpaarQAc=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -826440608, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "gx/O0lgQMGQaTJ1HkH03eOhJ42Ts/PcgtAXuYVLzeGQ=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906453788, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "/q9JpZOk/qQRSCLJZFC7/9iOvoSt5llktn3YcQ8DFXM=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906451778, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "DsV4SOyWmCjw2daY5CQVa05PNIbJcPN5G+gJWzGXn6w=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906454492, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "+sQhYkomuMdwRJoa4l2jLxqzqh9ppSIdDC/N1v0KfbY=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906454434, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "/FAXhFYnpj1KKsD70TIiEbvTWqEnxai+kvol/5BSruk=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -826441009, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "7ubeF32tFr1d99LlT9wDZ3P0Fq93be8pMasa5VjcLN4=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1621514304, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "OA5JMLshDZ+AkqmF0LG4xCpri0Sqp4Lor0+cmq0GZh8=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -826439121, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "xfx2ZUTBGUSL1ah2HFabK7OY04pjk1Kg37JUMs5U/sU=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300233760, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "t9LrAxemsDKCxEh2k2yEuKXKGjF0g4FaEDz7YWSxaeU=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1975195596, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "jFlC3YvTllrqp6spQnxF9FbNObfL6gYnE0OG4PC31f4=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300187178, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "DutaSjqF3BiJE8MJnx0EBO0mk/Vw9WLTx8ABGPnECXk=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300232943, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "hnVmZHy/od2mOcTWci9qOBxpqG4SJBpjgTIWl9X2A5M=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300230720, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "mFPe8+dcmsrYjb7vg+6Uq2tlEOzGmndlPaahbbKR0s8=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1959043315, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "kiOZrE5gNrNCLn3qpJrV6hLovc81z70FkqASezpMOtA=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -826441105, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "lHYQFG4CVeMLrITRZ7ga2PgQFRsrzLbnhga+mly5T+Q=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906452288, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "XZVDqG6TdXmEN+bCXWSR7E7QOCB5HL2mBe8ErMXDHkU=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906452915, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "w9zFkSfBTwMg2y/Wz7lo5GRwiy7C7vkUK7b1YWZSDu0=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1906452150, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "nKOE+5IdXPQEBepJoIqZTKBe4cmqoHMjbS/VCTazh64=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1645858963, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "VWeMFMCIvJuLNN+hgHYHa5f9Ddr4weOdDZtdjDPxDw0=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1645860831, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "Eehi2MUSTSN0LuOhlKgIi1AXNdlDXDCvipTMzTouSu4=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1645858962, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "0dcj6aQPBvRvwSUObscLDGhrHv0OGhSkqMzJdDGwc2Q=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1152904943, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "v/+3wj2whN9/V3gF1v4ijIFV8j0FafMPEJ8v1955GBM=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1645858971, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "/g0Qu/jPQ+SU4mM2gf/CSVvvP3D9xLlRn4kgCW+lo18=" + } + }, + { + "@type": "liteclient.config.global", + "ip": 1152889061, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "bUQTJ62nzM+yOe7QqeafDkCcVyYzwROZX2RRWb0+DOg=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1645858966, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "MO51IFzD52v5TAL712Q24XVX+bvRe+BzxMYQexpf99Y=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1645858965, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "TOrLpeLDEr1SObDsYzyN15Bug9xQClcROx8cdZRH220=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1645862732, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "PZ6dB8lfhryFk6keq8Jo/eiy+q+zSzey8B+YYt/ifwE=" + } + }, + { + "@type": "liteclient.config.global", + "ip": -1300227689, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "nJ/JNVabS5My75rJIWnJ+hW/undPVm+NuYr21UHICVU=" + } + } + ] +} diff --git a/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift b/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift index 32aca3c406..d169b08626 100644 --- a/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift +++ b/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift @@ -212,7 +212,7 @@ public class ShareRootControllerImpl { |> introduceError(ShareAuthorizationError.self) |> map { sharedData, limitsConfiguration, data -> (AccountContext, PostboxAccessChallengeData, [AccountWithInfo]) in updateLegacyLocalization(strings: sharedContext.currentPresentationData.with({ $0 }).strings) - let context = AccountContextImpl(sharedContext: sharedContext, account: account, limitsConfiguration: limitsConfiguration) + let context = AccountContextImpl(sharedContext: sharedContext, account: account, tonContext: nil, limitsConfiguration: limitsConfiguration) return (context, data.data, otherAccounts) } } diff --git a/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift b/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift index 1b114e0110..c520209b84 100644 --- a/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift +++ b/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift @@ -814,7 +814,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { } public func makeTempAccountContext(account: Account) -> AccountContext { - return AccountContextImpl(sharedContext: self, account: account, limitsConfiguration: .defaultValue) + return AccountContextImpl(sharedContext: self, account: account, tonContext: nil, limitsConfiguration: .defaultValue) } public func openChatMessage(_ params: OpenChatMessageParams) -> Bool { diff --git a/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift b/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift index 2a9a8b095d..0f0ded202d 100644 --- a/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift +++ b/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift @@ -9,18 +9,20 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { public var chatListPhotos: Bool public var knockoutWallpaper: Bool public var gradientBubbles: Bool + public var wallets: Bool public static var defaultSettings: ExperimentalUISettings { - return ExperimentalUISettings(keepChatNavigationStack: false, skipReadHistory: false, crashOnLongQueries: false, chatListPhotos: false, knockoutWallpaper: false, gradientBubbles: false) + return ExperimentalUISettings(keepChatNavigationStack: false, skipReadHistory: false, crashOnLongQueries: false, chatListPhotos: false, knockoutWallpaper: false, gradientBubbles: false, wallets: false) } - public init(keepChatNavigationStack: Bool, skipReadHistory: Bool, crashOnLongQueries: Bool, chatListPhotos: Bool, knockoutWallpaper: Bool, gradientBubbles: Bool) { + public init(keepChatNavigationStack: Bool, skipReadHistory: Bool, crashOnLongQueries: Bool, chatListPhotos: Bool, knockoutWallpaper: Bool, gradientBubbles: Bool, wallets: Bool) { self.keepChatNavigationStack = keepChatNavigationStack self.skipReadHistory = skipReadHistory self.crashOnLongQueries = crashOnLongQueries self.chatListPhotos = chatListPhotos self.knockoutWallpaper = knockoutWallpaper self.gradientBubbles = gradientBubbles + self.wallets = wallets } public init(decoder: PostboxDecoder) { @@ -30,6 +32,7 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { self.chatListPhotos = decoder.decodeInt32ForKey("chatListPhotos", orElse: 0) != 0 self.knockoutWallpaper = decoder.decodeInt32ForKey("knockoutWallpaper", orElse: 0) != 0 self.gradientBubbles = decoder.decodeInt32ForKey("gradientBubbles", orElse: 0) != 0 + self.wallets = decoder.decodeInt32ForKey("wallets", orElse: 0) != 0 } public func encode(_ encoder: PostboxEncoder) { @@ -39,6 +42,7 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { encoder.encodeInt32(self.chatListPhotos ? 1 : 0, forKey: "chatListPhotos") encoder.encodeInt32(self.knockoutWallpaper ? 1 : 0, forKey: "knockoutWallpaper") encoder.encodeInt32(self.gradientBubbles ? 1 : 0, forKey: "gradientBubbles") + encoder.encodeInt32(self.wallets ? 1 : 0, forKey: "wallets") } public func isEqual(to: PreferencesEntry) -> Bool { diff --git a/submodules/UndoUI/Sources/UndoOverlayController.swift b/submodules/UndoUI/Sources/UndoOverlayController.swift index 4575f39d72..2320223bae 100644 --- a/submodules/UndoUI/Sources/UndoOverlayController.swift +++ b/submodules/UndoUI/Sources/UndoOverlayController.swift @@ -12,6 +12,7 @@ public enum UndoOverlayContent { case hidArchive(title: String, text: String, undo: Bool) case revealedArchive(title: String, text: String, undo: Bool) case succeed(text: String) + case emoji(account: Account, path: String, text: String) } public final class UndoOverlayController: ViewController { diff --git a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift index 748baee52e..984a99615a 100644 --- a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift +++ b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift @@ -16,6 +16,7 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { private let iconNode: ASImageNode? private let iconCheckNode: RadialStatusNode? private let animationNode: AnimationNode? + private let animatedStickerNode: AnimatedStickerNode? private let titleNode: ImmediateTextNode private let textNode: ImmediateTextNode private let buttonTextNode: ImmediateTextNode @@ -65,6 +66,7 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { self.iconNode = nil self.iconCheckNode = nil self.animationNode = nil + self.animatedStickerNode = nil self.textNode.attributedText = NSAttributedString(string: text, font: Font.regular(14.0), textColor: .white) displayUndo = true self.originalRemainingSeconds = 5 @@ -82,6 +84,7 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { self.iconCheckNode = nil self.animationNode = AnimationNode(animation: "anim_infotip", colors: ["info1.info1.stroke": self.animationBackgroundColor, "info2.info2.Fill": self.animationBackgroundColor], scale: 1.0) } + self.animatedStickerNode = nil self.titleNode.attributedText = NSAttributedString(string: title, font: Font.semibold(14.0), textColor: .white) self.textNode.attributedText = NSAttributedString(string: text, font: Font.regular(14.0), textColor: .white) displayUndo = undo @@ -90,6 +93,7 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { self.iconNode = nil self.iconCheckNode = nil self.animationNode = AnimationNode(animation: "anim_archiveswipe", colors: ["info1.info1.stroke": self.animationBackgroundColor, "info2.info2.Fill": self.animationBackgroundColor], scale: 1.0) + self.animatedStickerNode = nil self.titleNode.attributedText = NSAttributedString(string: title, font: Font.semibold(14.0), textColor: .white) self.textNode.attributedText = NSAttributedString(string: text, font: Font.regular(14.0), textColor: .white) displayUndo = undo @@ -98,6 +102,7 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { self.iconNode = nil self.iconCheckNode = nil self.animationNode = AnimationNode(animation: "anim_infotip", colors: ["info1.info1.stroke": self.animationBackgroundColor, "info2.info2.Fill": self.animationBackgroundColor], scale: 1.0) + self.animatedStickerNode = nil self.titleNode.attributedText = NSAttributedString(string: title, font: Font.semibold(14.0), textColor: .white) self.textNode.attributedText = NSAttributedString(string: text, font: Font.regular(14.0), textColor: .white) displayUndo = undo @@ -106,6 +111,22 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { self.iconNode = nil self.iconCheckNode = nil self.animationNode = AnimationNode(animation: "anim_success", colors: ["info1.info1.stroke": self.animationBackgroundColor, "info2.info2.Fill": self.animationBackgroundColor], scale: 1.0) + self.animatedStickerNode = nil + + let body = MarkdownAttributeSet(font: Font.regular(14.0), textColor: .white) + let bold = MarkdownAttributeSet(font: Font.semibold(14.0), textColor: .white) + let attributedText = parseMarkdownIntoAttributedString(text, attributes: MarkdownAttributes(body: body, bold: bold, link: body, linkAttribute: { _ in return nil }), textAlignment: .natural) + self.textNode.attributedText = attributedText + self.textNode.maximumNumberOfLines = 2 + displayUndo = false + self.originalRemainingSeconds = 5 + case let .emoji(account, path, text): + self.iconNode = nil + self.iconCheckNode = nil + self.animationNode = nil + self.animatedStickerNode = AnimatedStickerNode() + self.animatedStickerNode?.visibility = true + self.animatedStickerNode?.setup(account: account, resource: .localFile(path), width: 100, height: 100, playbackMode: .once, mode: .direct) let body = MarkdownAttributeSet(font: Font.regular(14.0), textColor: .white) let bold = MarkdownAttributeSet(font: Font.semibold(14.0), textColor: .white) @@ -145,12 +166,13 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { case .removedChat: self.panelWrapperNode.addSubnode(self.timerTextNode) self.panelWrapperNode.addSubnode(self.statusNode) - case .archivedChat, .hidArchive, .revealedArchive, .succeed: + case .archivedChat, .hidArchive, .revealedArchive, .succeed, .emoji: break } self.iconNode.flatMap(self.panelWrapperNode.addSubnode) self.iconCheckNode.flatMap(self.panelWrapperNode.addSubnode) self.animationNode.flatMap(self.panelWrapperNode.addSubnode) + self.animatedStickerNode.flatMap(self.panelWrapperNode.addSubnode) self.panelWrapperNode.addSubnode(self.titleNode) self.panelWrapperNode.addSubnode(self.textNode) if displayUndo { @@ -298,6 +320,13 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { transition.updateFrame(node: animationNode, frame: iconFrame) } + if let animatedStickerNode = self.animatedStickerNode { + let iconSize = CGSize(width: 32.0, height: 32.0) + let iconFrame = CGRect(origin: CGPoint(x: floor((leftInset - iconSize.width) / 2.0), y: floor((contentHeight - iconSize.height) / 2.0)), size: iconSize) + animatedStickerNode.updateLayout(size: iconFrame.size) + transition.updateFrame(node: animatedStickerNode, frame: iconFrame) + } + let timerTextSize = self.timerTextNode.updateLayout(CGSize(width: 100.0, height: 100.0)) transition.updateFrame(node: self.timerTextNode, frame: CGRect(origin: CGPoint(x: floor((leftInset - timerTextSize.width) / 2.0), y: floor((contentHeight - timerTextSize.height) / 2.0)), size: timerTextSize)) let statusSize: CGFloat = 30.0 diff --git a/submodules/WalletUI/BUCK b/submodules/WalletUI/BUCK new file mode 100644 index 0000000000..72b2b7c1ac --- /dev/null +++ b/submodules/WalletUI/BUCK @@ -0,0 +1,26 @@ +load("//Config:buck_rule_macros.bzl", "static_library") + +static_library( + name = "WalletUI", + srcs = glob([ + "Sources/**/*.swift", + ]), + deps = [ + "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared", + "//submodules/AsyncDisplayKit:AsyncDisplayKit#shared", + "//submodules/Display:Display#shared", + "//submodules/Postbox:Postbox#shared", + "//submodules/TelegramCore:TelegramCore#shared", + "//submodules/TelegramPresentationData:TelegramPresentationData", + "//submodules/OverlayStatusController:OverlayStatusController", + "//submodules/AppBundle:AppBundle", + "//submodules/SolidRoundedButtonNode:SolidRoundedButtonNode", + "//submodules/AccountContext:AccountContext", + "//submodules/UndoUI:UndoUI", + "//submodules/AlertUI:AlertUI", + ], + frameworks = [ + "$SDKROOT/System/Library/Frameworks/Foundation.framework", + "$SDKROOT/System/Library/Frameworks/UIKit.framework", + ], +) diff --git a/submodules/WalletUI/Sources/WalletInfoScreen.swift b/submodules/WalletUI/Sources/WalletInfoScreen.swift new file mode 100644 index 0000000000..9754906135 --- /dev/null +++ b/submodules/WalletUI/Sources/WalletInfoScreen.swift @@ -0,0 +1,176 @@ +import Foundation +import UIKit +import AppBundle +import AccountContext +import TelegramPresentationData +import AsyncDisplayKit +import Display +import Postbox +import TelegramCore +import SolidRoundedButtonNode +import AnimationUI +import SwiftSignalKit + +public final class WalletInfoScreen: ViewController { + private let context: AccountContext + private let tonContext: TonContext + private let walletInfo: WalletInfo + private let address: String + + private var presentationData: PresentationData + + public init(context: AccountContext, tonContext: TonContext, walletInfo: WalletInfo, address: String) { + self.context = context + self.tonContext = tonContext + self.walletInfo = walletInfo + self.address = address + + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + + let defaultNavigationPresentationData = NavigationBarPresentationData(presentationTheme: self.presentationData.theme, presentationStrings: self.presentationData.strings) + let navigationBarTheme = NavigationBarTheme(buttonColor: defaultNavigationPresentationData.theme.buttonColor, disabledButtonColor: defaultNavigationPresentationData.theme.disabledButtonColor, primaryTextColor: defaultNavigationPresentationData.theme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultNavigationPresentationData.theme.badgeBackgroundColor, badgeStrokeColor: defaultNavigationPresentationData.theme.badgeStrokeColor, badgeTextColor: defaultNavigationPresentationData.theme.badgeTextColor) + + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: defaultNavigationPresentationData.strings)) + + self.navigationPresentation = .modalInLargeLayout + self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) + self.navigationBar?.intrinsicCanTransitionInline = false + + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_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 = WalletInfoScreenNode(account: self.context.account, tonContext: self.tonContext, presentationData: self.presentationData, walletInfo: self.walletInfo, address: self.address, exportAction: { [weak self] in + guard let strongSelf = self else { + return + } + let _ = (walletRestoreWords(network: strongSelf.context.account.network, walletInfo: strongSelf.walletInfo, tonInstance: strongSelf.tonContext.instance, keychain: strongSelf.tonContext.keychain) + |> deliverOnMainQueue).start(next: { wordList in + guard let strongSelf = self else { + return + } + strongSelf.push(WalletWordDisplayScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, walletInfo: strongSelf.walletInfo, wordList: wordList)) + }, error: { _ in + guard let strongSelf = self else { + return + } + }) + }) + + self.displayNodeDidLoad() + } + + override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + super.containerLayoutUpdated(layout, transition: transition) + + (self.displayNode as! WalletInfoScreenNode).containerLayoutUpdated(layout: layout, navigationHeight: self.navigationHeight, transition: transition) + } +} + +private final class WalletInfoScreenNode: ViewControllerTracingNode { + private var presentationData: PresentationData + private let walletInfo: WalletInfo + private let exportAction: () -> Void + + private let titleNode: ImmediateTextNode + private let textNode: ImmediateTextNode + private let buttonNode: SolidRoundedButtonNode + + var inProgress: Bool = false { + didSet { + self.buttonNode.isUserInteractionEnabled = !self.inProgress + self.buttonNode.alpha = self.inProgress ? 0.6 : 1.0 + } + } + + private var validLayout: (ContainerViewLayout, CGFloat)? + + private let balanceDisposable = MetaDisposable() + + init(account: Account, tonContext: TonContext, presentationData: PresentationData, walletInfo: WalletInfo, address: String, exportAction: @escaping () -> Void) { + self.presentationData = presentationData + self.walletInfo = walletInfo + self.exportAction = exportAction + + let addressString = Data(base64Encoded: walletInfo.publicKey.rawValue).flatMap({ String(data: $0, encoding: .utf8) }) ?? "" + + let title: String = address + let text: String = "..." + let buttonText: String = "Export" + + 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 = NSAttributedString(string: text, font: Font.regular(16.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor) + self.textNode.maximumNumberOfLines = 0 + self.textNode.textAlignment = .center + + self.buttonNode = SolidRoundedButtonNode(title: buttonText, theme: self.presentationData.theme, height: 50.0, cornerRadius: 10.0, gloss: true) + + super.init() + + self.backgroundColor = self.presentationData.theme.list.plainBackgroundColor + + self.addSubnode(self.titleNode) + self.addSubnode(self.textNode) + self.addSubnode(self.buttonNode) + + self.buttonNode.pressed = { + exportAction() + } + + self.balanceDisposable.set((currentWalletBalance(publicKey: walletInfo.publicKey, tonInstance: tonContext.instance) + |> deliverOnMainQueue).start(next: { [weak self] value in + guard let strongSelf = self else { + return + } + strongSelf.textNode.attributedText = NSAttributedString(string: "\(value)", font: Font.regular(16.0), textColor: strongSelf.presentationData.theme.list.itemPrimaryTextColor) + if let (layout, navigationHeight) = strongSelf.validLayout { + strongSelf.containerLayoutUpdated(layout: layout, navigationHeight: navigationHeight, transition: .immediate) + } + })) + } + + func containerLayoutUpdated(layout: ContainerViewLayout, navigationHeight: CGFloat, transition: ContainedViewLayoutTransition) { + self.validLayout = (layout, navigationHeight) + + let sideInset: CGFloat = 32.0 + let buttonSideInset: CGFloat = 48.0 + let titleSpacing: CGFloat = 10.0 + let termsSpacing: CGFloat = 10.0 + let buttonHeight: CGFloat = 50.0 + + 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 = titleSize.height + titleSpacing + textSize.height + let contentVerticalOrigin = floor((layout.size.height - contentHeight) / 2.0) + + let titleFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - titleSize.width) / 2.0), y: contentVerticalOrigin), 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) + + 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) + } +} diff --git a/submodules/WalletUI/Sources/WalletSplashScreen.swift b/submodules/WalletUI/Sources/WalletSplashScreen.swift new file mode 100644 index 0000000000..60e960cdba --- /dev/null +++ b/submodules/WalletUI/Sources/WalletSplashScreen.swift @@ -0,0 +1,342 @@ +import Foundation +import UIKit +import AppBundle +import AccountContext +import TelegramPresentationData +import AsyncDisplayKit +import Display +import Postbox +import TelegramCore +import SolidRoundedButtonNode +import AnimationUI +import SwiftSignalKit +import OverlayStatusController + +public enum WalletSplashMode { + case intro + case created(WalletInfo, [String]) + case success(WalletInfo) + case restoreFailed +} + +public final class WalletSplashScreen: ViewController { + private let context: AccountContext + private let tonContext: TonContext + private var presentationData: PresentationData + private let mode: WalletSplashMode + + public init(context: AccountContext, tonContext: TonContext, mode: WalletSplashMode) { + self.context = context + self.tonContext = tonContext + self.mode = mode + + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + + let defaultNavigationPresentationData = NavigationBarPresentationData(presentationTheme: self.presentationData.theme, presentationStrings: self.presentationData.strings) + let navigationBarTheme = NavigationBarTheme(buttonColor: defaultNavigationPresentationData.theme.buttonColor, disabledButtonColor: defaultNavigationPresentationData.theme.disabledButtonColor, primaryTextColor: defaultNavigationPresentationData.theme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultNavigationPresentationData.theme.badgeBackgroundColor, badgeStrokeColor: defaultNavigationPresentationData.theme.badgeStrokeColor, badgeTextColor: defaultNavigationPresentationData.theme.badgeTextColor) + + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: defaultNavigationPresentationData.strings)) + + self.navigationPresentation = .modalInLargeLayout + self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) + self.navigationBar?.intrinsicCanTransitionInline = false + + switch self.mode { + case .intro: + self.navigationItem.setLeftBarButton(UIBarButtonItem(title: "Not Now", style: .plain, target: self, action: #selector(self.backPressed)), animated: false) + self.navigationItem.setRightBarButton(UIBarButtonItem(title: "Import existing wallet", style: .plain, target: self, action: #selector(self.importPressed)), animated: false) + case .created, .success, .restoreFailed: + break + } + + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_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() + } + + @objc private func importPressed() { + self.push(WalletWordCheckScreen(context: self.context, tonContext: self.tonContext, mode: .import)) + } + + override public func loadDisplayNode() { + self.displayNode = WalletSplashScreenNode(account: self.context.account, presentationData: self.presentationData, mode: self.mode, action: { [weak self] in + guard let strongSelf = self else { + return + } + switch strongSelf.mode { + case .intro: + let controller = OverlayStatusController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, type: .loading(cancelled: nil)) + strongSelf.present(controller, in: .window(.root)) + let _ = (createWallet(postbox: strongSelf.context.account.postbox, network: strongSelf.context.account.network, tonInstance: strongSelf.tonContext.instance, keychain: strongSelf.tonContext.keychain) + |> deliverOnMainQueue).start(next: { walletInfo, wordList in + guard let strongSelf = self else { + return + } + controller.dismiss() + (strongSelf.navigationController as? NavigationController)?.replaceController(strongSelf, with: WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .created(walletInfo, wordList)), animated: true) + }) + case let .created(walletInfo, wordList): + strongSelf.push(WalletWordDisplayScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, walletInfo: walletInfo, wordList: wordList)) + case let .success(walletInfo): + let _ = (walletAddress(publicKey: walletInfo.publicKey, tonInstance: strongSelf.tonContext.instance) + |> deliverOnMainQueue).start(next: { address in + guard let strongSelf = self else { + return + } + if let navigationController = strongSelf.navigationController as? NavigationController { + var controllers = navigationController.viewControllers + controllers = controllers.filter { controller in + if controller is WalletSplashScreen { + return false + } + if controller is WalletWordDisplayScreen { + return false + } + if controller is WalletWordCheckScreen { + return false + } + return true + } + controllers.append(WalletInfoScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, walletInfo: walletInfo, address: address)) + strongSelf.view.endEditing(true) + navigationController.setViewControllers(controllers, animated: true) + } + }) + case .restoreFailed: + if let navigationController = strongSelf.navigationController as? NavigationController { + var controllers = navigationController.viewControllers + controllers = controllers.filter { controller in + if controller is WalletSplashScreen { + return false + } + if controller is WalletWordDisplayScreen { + return false + } + if controller is WalletWordCheckScreen { + return false + } + return true + } + controllers.append(WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .intro)) + strongSelf.view.endEditing(true) + navigationController.setViewControllers(controllers, animated: true) + } + } + }, secondaryAction: { [weak self] in + guard let strongSelf = self else { + return + } + strongSelf.push(WalletWordCheckScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .import)) + }) + + self.displayNodeDidLoad() + } + + override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + super.containerLayoutUpdated(layout, transition: transition) + + (self.displayNode as! WalletSplashScreenNode).containerLayoutUpdated(layout: layout, navigationHeight: self.navigationHeight, transition: transition) + } +} + +private final class WalletSplashScreenNode: ViewControllerTracingNode { + private var presentationData: PresentationData + private let mode: WalletSplashMode + private let secondaryAction: () -> Void + + private let iconNode: ASImageNode + private let animationNode: AnimatedStickerNode + private let titleNode: ImmediateTextNode + private let textNode: ImmediateTextNode + private let buttonNode: SolidRoundedButtonNode + private let termsNode: ImmediateTextNode + private let secondaryActionTitleNode: ImmediateTextNode + private let secondaryActionButtonNode: HighlightTrackingButtonNode + + var inProgress: Bool = false { + didSet { + self.buttonNode.isUserInteractionEnabled = !self.inProgress + self.buttonNode.alpha = self.inProgress ? 0.6 : 1.0 + } + } + + init(account: Account, presentationData: PresentationData, mode: WalletSplashMode, action: @escaping () -> Void, secondaryAction: @escaping () -> Void) { + self.presentationData = presentationData + self.mode = mode + self.secondaryAction = secondaryAction + + self.iconNode = ASImageNode() + self.iconNode.displayWithoutProcessing = true + self.iconNode.displaysAsynchronously = false + + self.animationNode = AnimatedStickerNode() + + let title: String + let text: String + let buttonText: String + let termsText: String + let secondaryActionText: String + + switch mode { + case .intro: + title = "Gram Wallet" + text = "Gram wallet allows you to make fast and secure blockchain-based payments without intermediaries." + buttonText = "Create My Wallet" + termsText = "By creating the wallet you accept\nTerms of Conditions." + self.iconNode.image = UIImage(bundleImageName: "Settings/Wallet/IntroIcon") + secondaryActionText = "" + case .created: + title = "Congratulations" + text = "Your Gram wallet has just been created. Only you control it.\n\nTo be able to always have access to it, please write down secret words and\nset up a secure passcode." + buttonText = "Proceed" + termsText = "" + self.iconNode.image = UIImage(bundleImageName: "Settings/Wallet/CreatedIcon") + secondaryActionText = "" + case .success: + title = "Ready to go!" + text = "You’re all set. Now you have a wallet that only you control - directly, without middlemen or bankers. " + buttonText = "View My Wallet" + termsText = "" + self.iconNode.image = nil + if let path = getAppBundle().path(forResource: "celebrate", ofType: "tgs") { + self.animationNode.setup(account: account, resource: .localFile(path), width: 280, height: 280, mode: .direct) + self.animationNode.visibility = true + } + secondaryActionText = "" + case .restoreFailed: + title = "Too Bad" + text = "Without the secret words, you can't'nrestore access to the wallet." + buttonText = "Create a New Wallet" + termsText = "" + self.iconNode.image = nil + if let path = getAppBundle().path(forResource: "sad", ofType: "tgs") { + self.animationNode.setup(account: account, resource: .localFile(path), width: 280, height: 280, mode: .direct) + self.animationNode.visibility = true + } + secondaryActionText = "Enter 24 words" + } + + 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 = NSAttributedString(string: text, font: Font.regular(16.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor) + self.textNode.maximumNumberOfLines = 0 + self.textNode.lineSpacing = 0.1 + self.textNode.textAlignment = .center + + self.termsNode = ImmediateTextNode() + self.termsNode.displaysAsynchronously = false + self.termsNode.attributedText = NSAttributedString(string: termsText, font: Font.regular(13.0), textColor: self.presentationData.theme.list.itemSecondaryTextColor) + self.termsNode.maximumNumberOfLines = 0 + self.termsNode.textAlignment = .center + + self.secondaryActionTitleNode = ImmediateTextNode() + self.secondaryActionTitleNode.displaysAsynchronously = false + self.secondaryActionTitleNode.attributedText = NSAttributedString(string: secondaryActionText, font: Font.regular(16.0), textColor: self.presentationData.theme.list.itemAccentColor) + + self.secondaryActionButtonNode = HighlightTrackingButtonNode() + + self.buttonNode = SolidRoundedButtonNode(title: buttonText, theme: self.presentationData.theme, height: 50.0, cornerRadius: 10.0, gloss: true) + + super.init() + + self.backgroundColor = self.presentationData.theme.list.plainBackgroundColor + + self.addSubnode(self.iconNode) + self.addSubnode(self.animationNode) + self.addSubnode(self.titleNode) + self.addSubnode(self.textNode) + self.addSubnode(self.buttonNode) + self.addSubnode(self.termsNode) + self.addSubnode(self.secondaryActionTitleNode) + self.addSubnode(self.secondaryActionButtonNode) + + self.buttonNode.pressed = { + action() + } + + self.secondaryActionButtonNode.highligthedChanged = { [weak self] highlighted in + guard let strongSelf = self else { + return + } + if highlighted { + strongSelf.secondaryActionTitleNode.layer.removeAnimation(forKey: "opacity") + strongSelf.secondaryActionTitleNode.alpha = 0.4 + } else { + strongSelf.secondaryActionTitleNode.alpha = 1.0 + strongSelf.secondaryActionTitleNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2) + } + } + + self.secondaryActionButtonNode.addTarget(self, action: #selector(self.secondaryActionPressed), forControlEvents: .touchUpInside) + } + + @objc private func secondaryActionPressed() { + self.secondaryAction() + } + + func containerLayoutUpdated(layout: ContainerViewLayout, navigationHeight: CGFloat, transition: ContainedViewLayoutTransition) { + let sideInset: CGFloat = 32.0 + let buttonSideInset: CGFloat = 48.0 + let iconSpacing: CGFloat = 5.0 + let titleSpacing: CGFloat = 19.0 + let termsSpacing: CGFloat = 11.0 + let buttonHeight: CGFloat = 50.0 + + let iconSize: CGSize + var iconOffset = CGPoint() + switch self.mode { + case .success: + iconSize = CGSize(width: 140.0, height: 140.0) + iconOffset.x = 10.0 + default: + iconSize = self.iconNode.image?.size ?? CGSize(width: 140.0, height: 140.0) + } + + 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 termsSize = self.termsNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: layout.size.height)) + let secondaryActionSize = self.secondaryActionTitleNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: layout.size.height)) + + let contentHeight = iconSize.height + iconSpacing + titleSize.height + titleSpacing + textSize.height + let contentVerticalOrigin = floor((layout.size.height - contentHeight - iconSize.height / 2.0) / 2.0) + + let iconFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - iconSize.width) / 2.0), y: contentVerticalOrigin), size: iconSize).offsetBy(dx: iconOffset.x, dy: iconOffset.y) + transition.updateFrameAdditive(node: self.iconNode, frame: iconFrame) + 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) + + let minimalBottomInset: CGFloat = 60.0 + let bottomInset = layout.intrinsicInsets.bottom + max(minimalBottomInset, termsSize.height + termsSpacing * 2.0) + + 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) + + if !secondaryActionSize.width.isZero { + let secondaryActionFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - secondaryActionSize.width) / 2.0), y: buttonFrame.minY - 20.0 - secondaryActionSize.height), size: secondaryActionSize) + transition.updateFrameAdditive(node: self.secondaryActionTitleNode, frame: secondaryActionFrame) + transition.updateFrame(node: self.secondaryActionButtonNode, frame: secondaryActionFrame.insetBy(dx: -10.0, dy: -10.0)) + } + + let termsFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - termsSize.width) / 2.0), y: buttonFrame.maxY + floor((layout.size.height - layout.intrinsicInsets.bottom - buttonFrame.maxY - termsSize.height) / 2.0)), size: termsSize) + transition.updateFrameAdditive(node: self.termsNode, frame: termsFrame) + } +} diff --git a/submodules/WalletUI/Sources/WalletWordCheckScreen.swift b/submodules/WalletUI/Sources/WalletWordCheckScreen.swift new file mode 100644 index 0000000000..a7557b0b0e --- /dev/null +++ b/submodules/WalletUI/Sources/WalletWordCheckScreen.swift @@ -0,0 +1,2798 @@ +import Foundation +import UIKit +import AppBundle +import AccountContext +import TelegramPresentationData +import AsyncDisplayKit +import Display +import Postbox +import TelegramCore +import SolidRoundedButtonNode +import UndoUI +import AlertUI +import SwiftSignalKit + +private let possibleWordList: [String] = [ + "abandon", + "ability", + "able", + "about", + "above", + "absent", + "absorb", + "abstract", + "absurd", + "abuse", + "access", + "accident", + "account", + "accuse", + "achieve", + "acid", + "acoustic", + "acquire", + "across", + "act", + "action", + "actor", + "actress", + "actual", + "adapt", + "add", + "addict", + "address", + "adjust", + "admit", + "adult", + "advance", + "advice", + "aerobic", + "affair", + "afford", + "afraid", + "again", + "age", + "agent", + "agree", + "ahead", + "aim", + "air", + "airport", + "aisle", + "alarm", + "album", + "alcohol", + "alert", + "alien", + "all", + "alley", + "allow", + "almost", + "alone", + "alpha", + "already", + "also", + "alter", + "always", + "amateur", + "amazing", + "among", + "amount", + "amused", + "analyst", + "anchor", + "ancient", + "anger", + "angle", + "angry", + "animal", + "ankle", + "announce", + "annual", + "another", + "answer", + "antenna", + "antique", + "anxiety", + "any", + "apart", + "apology", + "appear", + "apple", + "approve", + "april", + "arch", + "arctic", + "area", + "arena", + "argue", + "arm", + "armed", + "armor", + "army", + "around", + "arrange", + "arrest", + "arrive", + "arrow", + "art", + "artefact", + "artist", + "artwork", + "ask", + "aspect", + "assault", + "asset", + "assist", + "assume", + "asthma", + "athlete", + "atom", + "attack", + "attend", + "attitude", + "attract", + "auction", + "audit", + "august", + "aunt", + "author", + "auto", + "autumn", + "average", + "avocado", + "avoid", + "awake", + "aware", + "away", + "awesome", + "awful", + "awkward", + "axis", + "baby", + "bachelor", + "bacon", + "badge", + "bag", + "balance", + "balcony", + "ball", + "bamboo", + "banana", + "banner", + "bar", + "barely", + "bargain", + "barrel", + "base", + "basic", + "basket", + "battle", + "beach", + "bean", + "beauty", + "because", + "become", + "beef", + "before", + "begin", + "behave", + "behind", + "believe", + "below", + "belt", + "bench", + "benefit", + "best", + "betray", + "better", + "between", + "beyond", + "bicycle", + "bid", + "bike", + "bind", + "biology", + "bird", + "birth", + "bitter", + "black", + "blade", + "blame", + "blanket", + "blast", + "bleak", + "bless", + "blind", + "blood", + "blossom", + "blouse", + "blue", + "blur", + "blush", + "board", + "boat", + "body", + "boil", + "bomb", + "bone", + "bonus", + "book", + "boost", + "border", + "boring", + "borrow", + "boss", + "bottom", + "bounce", + "box", + "boy", + "bracket", + "brain", + "brand", + "brass", + "brave", + "bread", + "breeze", + "brick", + "bridge", + "brief", + "bright", + "bring", + "brisk", + "broccoli", + "broken", + "bronze", + "broom", + "brother", + "brown", + "brush", + "bubble", + "buddy", + "budget", + "buffalo", + "build", + "bulb", + "bulk", + "bullet", + "bundle", + "bunker", + "burden", + "burger", + "burst", + "bus", + "business", + "busy", + "butter", + "buyer", + "buzz", + "cabbage", + "cabin", + "cable", + "cactus", + "cage", + "cake", + "call", + "calm", + "camera", + "camp", + "can", + "canal", + "cancel", + "candy", + "cannon", + "canoe", + "canvas", + "canyon", + "capable", + "capital", + "captain", + "car", + "carbon", + "card", + "cargo", + "carpet", + "carry", + "cart", + "case", + "cash", + "casino", + "castle", + "casual", + "cat", + "catalog", + "catch", + "category", + "cattle", + "caught", + "cause", + "caution", + "cave", + "ceiling", + "celery", + "cement", + "census", + "century", + "cereal", + "certain", + "chair", + "chalk", + "champion", + "change", + "chaos", + "chapter", + "charge", + "chase", + "chat", + "cheap", + "check", + "cheese", + "chef", + "cherry", + "chest", + "chicken", + "chief", + "child", + "chimney", + "choice", + "choose", + "chronic", + "chuckle", + "chunk", + "churn", + "cigar", + "cinnamon", + "circle", + "citizen", + "city", + "civil", + "claim", + "clap", + "clarify", + "claw", + "clay", + "clean", + "clerk", + "clever", + "click", + "client", + "cliff", + "climb", + "clinic", + "clip", + "clock", + "clog", + "close", + "cloth", + "cloud", + "clown", + "club", + "clump", + "cluster", + "clutch", + "coach", + "coast", + "coconut", + "code", + "coffee", + "coil", + "coin", + "collect", + "color", + "column", + "combine", + "come", + "comfort", + "comic", + "common", + "company", + "concert", + "conduct", + "confirm", + "congress", + "connect", + "consider", + "control", + "convince", + "cook", + "cool", + "copper", + "copy", + "coral", + "core", + "corn", + "correct", + "cost", + "cotton", + "couch", + "country", + "couple", + "course", + "cousin", + "cover", + "coyote", + "crack", + "cradle", + "craft", + "cram", + "crane", + "crash", + "crater", + "crawl", + "crazy", + "cream", + "credit", + "creek", + "crew", + "cricket", + "crime", + "crisp", + "critic", + "crop", + "cross", + "crouch", + "crowd", + "crucial", + "cruel", + "cruise", + "crumble", + "crunch", + "crush", + "cry", + "crystal", + "cube", + "culture", + "cup", + "cupboard", + "curious", + "current", + "curtain", + "curve", + "cushion", + "custom", + "cute", + "cycle", + "dad", + "damage", + "damp", + "dance", + "danger", + "daring", + "dash", + "daughter", + "dawn", + "day", + "deal", + "debate", + "debris", + "decade", + "december", + "decide", + "decline", + "decorate", + "decrease", + "deer", + "defense", + "define", + "defy", + "degree", + "delay", + "deliver", + "demand", + "demise", + "denial", + "dentist", + "deny", + "depart", + "depend", + "deposit", + "depth", + "deputy", + "derive", + "describe", + "desert", + "design", + "desk", + "despair", + "destroy", + "detail", + "detect", + "develop", + "device", + "devote", + "diagram", + "dial", + "diamond", + "diary", + "dice", + "diesel", + "diet", + "differ", + "digital", + "dignity", + "dilemma", + "dinner", + "dinosaur", + "direct", + "dirt", + "disagree", + "discover", + "disease", + "dish", + "dismiss", + "disorder", + "display", + "distance", + "divert", + "divide", + "divorce", + "dizzy", + "doctor", + "document", + "dog", + "doll", + "dolphin", + "domain", + "donate", + "donkey", + "donor", + "door", + "dose", + "double", + "dove", + "draft", + "dragon", + "drama", + "drastic", + "draw", + "dream", + "dress", + "drift", + "drill", + "drink", + "drip", + "drive", + "drop", + "drum", + "dry", + "duck", + "dumb", + "dune", + "during", + "dust", + "dutch", + "duty", + "dwarf", + "dynamic", + "eager", + "eagle", + "early", + "earn", + "earth", + "easily", + "east", + "easy", + "echo", + "ecology", + "economy", + "edge", + "edit", + "educate", + "effort", + "egg", + "eight", + "either", + "elbow", + "elder", + "electric", + "elegant", + "element", + "elephant", + "elevator", + "elite", + "else", + "embark", + "embody", + "embrace", + "emerge", + "emotion", + "employ", + "empower", + "empty", + "enable", + "enact", + "end", + "endless", + "endorse", + "enemy", + "energy", + "enforce", + "engage", + "engine", + "enhance", + "enjoy", + "enlist", + "enough", + "enrich", + "enroll", + "ensure", + "enter", + "entire", + "entry", + "envelope", + "episode", + "equal", + "equip", + "era", + "erase", + "erode", + "erosion", + "error", + "erupt", + "escape", + "essay", + "essence", + "estate", + "eternal", + "ethics", + "evidence", + "evil", + "evoke", + "evolve", + "exact", + "example", + "excess", + "exchange", + "excite", + "exclude", + "excuse", + "execute", + "exercise", + "exhaust", + "exhibit", + "exile", + "exist", + "exit", + "exotic", + "expand", + "expect", + "expire", + "explain", + "expose", + "express", + "extend", + "extra", + "eye", + "eyebrow", + "fabric", + "face", + "faculty", + "fade", + "faint", + "faith", + "fall", + "false", + "fame", + "family", + "famous", + "fan", + "fancy", + "fantasy", + "farm", + "fashion", + "fat", + "fatal", + "father", + "fatigue", + "fault", + "favorite", + "feature", + "february", + "federal", + "fee", + "feed", + "feel", + "female", + "fence", + "festival", + "fetch", + "fever", + "few", + "fiber", + "fiction", + "field", + "figure", + "file", + "film", + "filter", + "final", + "find", + "fine", + "finger", + "finish", + "fire", + "firm", + "first", + "fiscal", + "fish", + "fit", + "fitness", + "fix", + "flag", + "flame", + "flash", + "flat", + "flavor", + "flee", + "flight", + "flip", + "float", + "flock", + "floor", + "flower", + "fluid", + "flush", + "fly", + "foam", + "focus", + "fog", + "foil", + "fold", + "follow", + "food", + "foot", + "force", + "forest", + "forget", + "fork", + "fortune", + "forum", + "forward", + "fossil", + "foster", + "found", + "fox", + "fragile", + "frame", + "frequent", + "fresh", + "friend", + "fringe", + "frog", + "front", + "frost", + "frown", + "frozen", + "fruit", + "fuel", + "fun", + "funny", + "furnace", + "fury", + "future", + "gadget", + "gain", + "galaxy", + "gallery", + "game", + "gap", + "garage", + "garbage", + "garden", + "garlic", + "garment", + "gas", + "gasp", + "gate", + "gather", + "gauge", + "gaze", + "general", + "genius", + "genre", + "gentle", + "genuine", + "gesture", + "ghost", + "giant", + "gift", + "giggle", + "ginger", + "giraffe", + "girl", + "give", + "glad", + "glance", + "glare", + "glass", + "glide", + "glimpse", + "globe", + "gloom", + "glory", + "glove", + "glow", + "glue", + "goat", + "goddess", + "gold", + "good", + "goose", + "gorilla", + "gospel", + "gossip", + "govern", + "gown", + "grab", + "grace", + "grain", + "grant", + "grape", + "grass", + "gravity", + "great", + "green", + "grid", + "grief", + "grit", + "grocery", + "group", + "grow", + "grunt", + "guard", + "guess", + "guide", + "guilt", + "guitar", + "gun", + "gym", + "habit", + "hair", + "half", + "hammer", + "hamster", + "hand", + "happy", + "harbor", + "hard", + "harsh", + "harvest", + "hat", + "have", + "hawk", + "hazard", + "head", + "health", + "heart", + "heavy", + "hedgehog", + "height", + "hello", + "helmet", + "help", + "hen", + "hero", + "hidden", + "high", + "hill", + "hint", + "hip", + "hire", + "history", + "hobby", + "hockey", + "hold", + "hole", + "holiday", + "hollow", + "home", + "honey", + "hood", + "hope", + "horn", + "horror", + "horse", + "hospital", + "host", + "hotel", + "hour", + "hover", + "hub", + "huge", + "human", + "humble", + "humor", + "hundred", + "hungry", + "hunt", + "hurdle", + "hurry", + "hurt", + "husband", + "hybrid", + "ice", + "icon", + "idea", + "identify", + "idle", + "ignore", + "ill", + "illegal", + "illness", + "image", + "imitate", + "immense", + "immune", + "impact", + "impose", + "improve", + "impulse", + "inch", + "include", + "income", + "increase", + "index", + "indicate", + "indoor", + "industry", + "infant", + "inflict", + "inform", + "inhale", + "inherit", + "initial", + "inject", + "injury", + "inmate", + "inner", + "innocent", + "input", + "inquiry", + "insane", + "insect", + "inside", + "inspire", + "install", + "intact", + "interest", + "into", + "invest", + "invite", + "involve", + "iron", + "island", + "isolate", + "issue", + "item", + "ivory", + "jacket", + "jaguar", + "jar", + "jazz", + "jealous", + "jeans", + "jelly", + "jewel", + "job", + "join", + "joke", + "journey", + "joy", + "judge", + "juice", + "jump", + "jungle", + "junior", + "junk", + "just", + "kangaroo", + "keen", + "keep", + "ketchup", + "key", + "kick", + "kid", + "kidney", + "kind", + "kingdom", + "kiss", + "kit", + "kitchen", + "kite", + "kitten", + "kiwi", + "knee", + "knife", + "knock", + "know", + "lab", + "label", + "labor", + "ladder", + "lady", + "lake", + "lamp", + "language", + "laptop", + "large", + "later", + "latin", + "laugh", + "laundry", + "lava", + "law", + "lawn", + "lawsuit", + "layer", + "lazy", + "leader", + "leaf", + "learn", + "leave", + "lecture", + "left", + "leg", + "legal", + "legend", + "leisure", + "lemon", + "lend", + "length", + "lens", + "leopard", + "lesson", + "letter", + "level", + "liar", + "liberty", + "library", + "license", + "life", + "lift", + "light", + "like", + "limb", + "limit", + "link", + "lion", + "liquid", + "list", + "little", + "live", + "lizard", + "load", + "loan", + "lobster", + "local", + "lock", + "logic", + "lonely", + "long", + "loop", + "lottery", + "loud", + "lounge", + "love", + "loyal", + "lucky", + "luggage", + "lumber", + "lunar", + "lunch", + "luxury", + "lyrics", + "machine", + "mad", + "magic", + "magnet", + "maid", + "mail", + "main", + "major", + "make", + "mammal", + "man", + "manage", + "mandate", + "mango", + "mansion", + "manual", + "maple", + "marble", + "march", + "margin", + "marine", + "market", + "marriage", + "mask", + "mass", + "master", + "match", + "material", + "math", + "matrix", + "matter", + "maximum", + "maze", + "meadow", + "mean", + "measure", + "meat", + "mechanic", + "medal", + "media", + "melody", + "melt", + "member", + "memory", + "mention", + "menu", + "mercy", + "merge", + "merit", + "merry", + "mesh", + "message", + "metal", + "method", + "middle", + "midnight", + "milk", + "million", + "mimic", + "mind", + "minimum", + "minor", + "minute", + "miracle", + "mirror", + "misery", + "miss", + "mistake", + "mix", + "mixed", + "mixture", + "mobile", + "model", + "modify", + "mom", + "moment", + "monitor", + "monkey", + "monster", + "month", + "moon", + "moral", + "more", + "morning", + "mosquito", + "mother", + "motion", + "motor", + "mountain", + "mouse", + "move", + "movie", + "much", + "muffin", + "mule", + "multiply", + "muscle", + "museum", + "mushroom", + "music", + "must", + "mutual", + "myself", + "mystery", + "myth", + "naive", + "name", + "napkin", + "narrow", + "nasty", + "nation", + "nature", + "near", + "neck", + "need", + "negative", + "neglect", + "neither", + "nephew", + "nerve", + "nest", + "net", + "network", + "neutral", + "never", + "news", + "next", + "nice", + "night", + "noble", + "noise", + "nominee", + "noodle", + "normal", + "north", + "nose", + "notable", + "note", + "nothing", + "notice", + "novel", + "now", + "nuclear", + "number", + "nurse", + "nut", + "oak", + "obey", + "object", + "oblige", + "obscure", + "observe", + "obtain", + "obvious", + "occur", + "ocean", + "october", + "odor", + "off", + "offer", + "office", + "often", + "oil", + "okay", + "old", + "olive", + "olympic", + "omit", + "once", + "one", + "onion", + "online", + "only", + "open", + "opera", + "opinion", + "oppose", + "option", + "orange", + "orbit", + "orchard", + "order", + "ordinary", + "organ", + "orient", + "original", + "orphan", + "ostrich", + "other", + "outdoor", + "outer", + "output", + "outside", + "oval", + "oven", + "over", + "own", + "owner", + "oxygen", + "oyster", + "ozone", + "pact", + "paddle", + "page", + "pair", + "palace", + "palm", + "panda", + "panel", + "panic", + "panther", + "paper", + "parade", + "parent", + "park", + "parrot", + "party", + "pass", + "patch", + "path", + "patient", + "patrol", + "pattern", + "pause", + "pave", + "payment", + "peace", + "peanut", + "pear", + "peasant", + "pelican", + "pen", + "penalty", + "pencil", + "people", + "pepper", + "perfect", + "permit", + "person", + "pet", + "phone", + "photo", + "phrase", + "physical", + "piano", + "picnic", + "picture", + "piece", + "pig", + "pigeon", + "pill", + "pilot", + "pink", + "pioneer", + "pipe", + "pistol", + "pitch", + "pizza", + "place", + "planet", + "plastic", + "plate", + "play", + "please", + "pledge", + "pluck", + "plug", + "plunge", + "poem", + "poet", + "point", + "polar", + "pole", + "police", + "pond", + "pony", + "pool", + "popular", + "portion", + "position", + "possible", + "post", + "potato", + "pottery", + "poverty", + "powder", + "power", + "practice", + "praise", + "predict", + "prefer", + "prepare", + "present", + "pretty", + "prevent", + "price", + "pride", + "primary", + "print", + "priority", + "prison", + "private", + "prize", + "problem", + "process", + "produce", + "profit", + "program", + "project", + "promote", + "proof", + "property", + "prosper", + "protect", + "proud", + "provide", + "public", + "pudding", + "pull", + "pulp", + "pulse", + "pumpkin", + "punch", + "pupil", + "puppy", + "purchase", + "purity", + "purpose", + "purse", + "push", + "put", + "puzzle", + "pyramid", + "quality", + "quantum", + "quarter", + "question", + "quick", + "quit", + "quiz", + "quote", + "rabbit", + "raccoon", + "race", + "rack", + "radar", + "radio", + "rail", + "rain", + "raise", + "rally", + "ramp", + "ranch", + "random", + "range", + "rapid", + "rare", + "rate", + "rather", + "raven", + "raw", + "razor", + "ready", + "real", + "reason", + "rebel", + "rebuild", + "recall", + "receive", + "recipe", + "record", + "recycle", + "reduce", + "reflect", + "reform", + "refuse", + "region", + "regret", + "regular", + "reject", + "relax", + "release", + "relief", + "rely", + "remain", + "remember", + "remind", + "remove", + "render", + "renew", + "rent", + "reopen", + "repair", + "repeat", + "replace", + "report", + "require", + "rescue", + "resemble", + "resist", + "resource", + "response", + "result", + "retire", + "retreat", + "return", + "reunion", + "reveal", + "review", + "reward", + "rhythm", + "rib", + "ribbon", + "rice", + "rich", + "ride", + "ridge", + "rifle", + "right", + "rigid", + "ring", + "riot", + "ripple", + "risk", + "ritual", + "rival", + "river", + "road", + "roast", + "robot", + "robust", + "rocket", + "romance", + "roof", + "rookie", + "room", + "rose", + "rotate", + "rough", + "round", + "route", + "royal", + "rubber", + "rude", + "rug", + "rule", + "run", + "runway", + "rural", + "sad", + "saddle", + "sadness", + "safe", + "sail", + "salad", + "salmon", + "salon", + "salt", + "salute", + "same", + "sample", + "sand", + "satisfy", + "satoshi", + "sauce", + "sausage", + "save", + "say", + "scale", + "scan", + "scare", + "scatter", + "scene", + "scheme", + "school", + "science", + "scissors", + "scorpion", + "scout", + "scrap", + "screen", + "script", + "scrub", + "sea", + "search", + "season", + "seat", + "second", + "secret", + "section", + "security", + "seed", + "seek", + "segment", + "select", + "sell", + "seminar", + "senior", + "sense", + "sentence", + "series", + "service", + "session", + "settle", + "setup", + "seven", + "shadow", + "shaft", + "shallow", + "share", + "shed", + "shell", + "sheriff", + "shield", + "shift", + "shine", + "ship", + "shiver", + "shock", + "shoe", + "shoot", + "shop", + "short", + "shoulder", + "shove", + "shrimp", + "shrug", + "shuffle", + "shy", + "sibling", + "sick", + "side", + "siege", + "sight", + "sign", + "silent", + "silk", + "silly", + "silver", + "similar", + "simple", + "since", + "sing", + "siren", + "sister", + "situate", + "six", + "size", + "skate", + "sketch", + "ski", + "skill", + "skin", + "skirt", + "skull", + "slab", + "slam", + "sleep", + "slender", + "slice", + "slide", + "slight", + "slim", + "slogan", + "slot", + "slow", + "slush", + "small", + "smart", + "smile", + "smoke", + "smooth", + "snack", + "snake", + "snap", + "sniff", + "snow", + "soap", + "soccer", + "social", + "sock", + "soda", + "soft", + "solar", + "soldier", + "solid", + "solution", + "solve", + "someone", + "song", + "soon", + "sorry", + "sort", + "soul", + "sound", + "soup", + "source", + "south", + "space", + "spare", + "spatial", + "spawn", + "speak", + "special", + "speed", + "spell", + "spend", + "sphere", + "spice", + "spider", + "spike", + "spin", + "spirit", + "split", + "spoil", + "sponsor", + "spoon", + "sport", + "spot", + "spray", + "spread", + "spring", + "spy", + "square", + "squeeze", + "squirrel", + "stable", + "stadium", + "staff", + "stage", + "stairs", + "stamp", + "stand", + "start", + "state", + "stay", + "steak", + "steel", + "stem", + "step", + "stereo", + "stick", + "still", + "sting", + "stock", + "stomach", + "stone", + "stool", + "story", + "stove", + "strategy", + "street", + "strike", + "strong", + "struggle", + "student", + "stuff", + "stumble", + "style", + "subject", + "submit", + "subway", + "success", + "such", + "sudden", + "suffer", + "sugar", + "suggest", + "suit", + "summer", + "sun", + "sunny", + "sunset", + "super", + "supply", + "supreme", + "sure", + "surface", + "surge", + "surprise", + "surround", + "survey", + "suspect", + "sustain", + "swallow", + "swamp", + "swap", + "swarm", + "swear", + "sweet", + "swift", + "swim", + "swing", + "switch", + "sword", + "symbol", + "symptom", + "syrup", + "system", + "table", + "tackle", + "tag", + "tail", + "talent", + "talk", + "tank", + "tape", + "target", + "task", + "taste", + "tattoo", + "taxi", + "teach", + "team", + "tell", + "ten", + "tenant", + "tennis", + "tent", + "term", + "test", + "text", + "thank", + "that", + "theme", + "then", + "theory", + "there", + "they", + "thing", + "this", + "thought", + "three", + "thrive", + "throw", + "thumb", + "thunder", + "ticket", + "tide", + "tiger", + "tilt", + "timber", + "time", + "tiny", + "tip", + "tired", + "tissue", + "title", + "toast", + "tobacco", + "today", + "toddler", + "toe", + "together", + "toilet", + "token", + "tomato", + "tomorrow", + "tone", + "tongue", + "tonight", + "tool", + "tooth", + "top", + "topic", + "topple", + "torch", + "tornado", + "tortoise", + "toss", + "total", + "tourist", + "toward", + "tower", + "town", + "toy", + "track", + "trade", + "traffic", + "tragic", + "train", + "transfer", + "trap", + "trash", + "travel", + "tray", + "treat", + "tree", + "trend", + "trial", + "tribe", + "trick", + "trigger", + "trim", + "trip", + "trophy", + "trouble", + "truck", + "true", + "truly", + "trumpet", + "trust", + "truth", + "try", + "tube", + "tuition", + "tumble", + "tuna", + "tunnel", + "turkey", + "turn", + "turtle", + "twelve", + "twenty", + "twice", + "twin", + "twist", + "two", + "type", + "typical", + "ugly", + "umbrella", + "unable", + "unaware", + "uncle", + "uncover", + "under", + "undo", + "unfair", + "unfold", + "unhappy", + "uniform", + "unique", + "unit", + "universe", + "unknown", + "unlock", + "until", + "unusual", + "unveil", + "update", + "upgrade", + "uphold", + "upon", + "upper", + "upset", + "urban", + "urge", + "usage", + "use", + "used", + "useful", + "useless", + "usual", + "utility", + "vacant", + "vacuum", + "vague", + "valid", + "valley", + "valve", + "van", + "vanish", + "vapor", + "various", + "vast", + "vault", + "vehicle", + "velvet", + "vendor", + "venture", + "venue", + "verb", + "verify", + "version", + "very", + "vessel", + "veteran", + "viable", + "vibrant", + "vicious", + "victory", + "video", + "view", + "village", + "vintage", + "violin", + "virtual", + "virus", + "visa", + "visit", + "visual", + "vital", + "vivid", + "vocal", + "voice", + "void", + "volcano", + "volume", + "vote", + "voyage", + "wage", + "wagon", + "wait", + "walk", + "wall", + "walnut", + "want", + "warfare", + "warm", + "warrior", + "wash", + "wasp", + "waste", + "water", + "wave", + "way", + "wealth", + "weapon", + "wear", + "weasel", + "weather", + "web", + "wedding", + "weekend", + "weird", + "welcome", + "west", + "wet", + "whale", + "what", + "wheat", + "wheel", + "when", + "where", + "whip", + "whisper", + "wide", + "width", + "wife", + "wild", + "will", + "win", + "window", + "wine", + "wing", + "wink", + "winner", + "winter", + "wire", + "wisdom", + "wise", + "wish", + "witness", + "wolf", + "woman", + "wonder", + "wood", + "wool", + "word", + "work", + "world", + "worry", + "worth", + "wrap", + "wreck", + "wrestle", + "wrist", + "write", + "wrong", + "yard", + "year", + "yellow", + "you", + "young", + "youth", + "zebra", + "zero", + "zone", + "zoo" +] + +private let verifyWordIndices: [Int] = [4, 16, 21] + +public enum WalletWordCheckMode { + case verify(WalletInfo, [String]) + case `import` +} + +public final class WalletWordCheckScreen: ViewController { + private let context: AccountContext + private let tonContext: TonContext + private var presentationData: PresentationData + private let mode: WalletWordCheckMode + + private let startTime: Double + + public init(context: AccountContext, tonContext: TonContext, mode: WalletWordCheckMode) { + self.context = context + self.tonContext = tonContext + self.mode = mode + + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + + let defaultNavigationPresentationData = NavigationBarPresentationData(presentationTheme: self.presentationData.theme, presentationStrings: self.presentationData.strings) + let navigationBarTheme = NavigationBarTheme(buttonColor: defaultNavigationPresentationData.theme.buttonColor, disabledButtonColor: defaultNavigationPresentationData.theme.disabledButtonColor, primaryTextColor: defaultNavigationPresentationData.theme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultNavigationPresentationData.theme.badgeBackgroundColor, badgeStrokeColor: defaultNavigationPresentationData.theme.badgeStrokeColor, badgeTextColor: defaultNavigationPresentationData.theme.badgeTextColor) + + self.startTime = Date().timeIntervalSince1970 + + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: defaultNavigationPresentationData.strings)) + + self.navigationPresentation = .modalInLargeLayout + self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) + self.navigationBar?.intrinsicCanTransitionInline = false + + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_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 = WalletWordCheckScreenNode(presentationData: self.presentationData, mode: self.mode, possibleWordList: possibleWordList, action: { [weak self] in + guard let strongSelf = self else { + return + } + switch strongSelf.mode { + case let .verify(walletInfo, wordList): + let enteredWords = (strongSelf.displayNode as! WalletWordCheckScreenNode).enteredWords + var isCorrect = true + for i in 0 ..< enteredWords.count { + if enteredWords[i] != wordList[verifyWordIndices[i]] { + isCorrect = false + break + } + } + + if isCorrect { + if let navigationController = strongSelf.navigationController as? NavigationController { + var controllers = navigationController.viewControllers + controllers = controllers.filter { controller in + if controller is WalletSplashScreen { + return false + } + if controller is WalletWordDisplayScreen { + return false + } + if controller is WalletWordCheckScreen { + return false + } + return true + } + controllers.append(WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .success(walletInfo))) + strongSelf.view.endEditing(true) + navigationController.setViewControllers(controllers, animated: true) + } + } else { + strongSelf.view.endEditing(true) + strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: "Incorrect words!", text: "The secret words you have entered do not match the ones in the list.", actions: [ + TextAlertAction(type: .defaultAction, title: "Try Again", action: { + }), + TextAlertAction(type: .genericAction, title: "View Words", action: { + guard let strongSelf = self else { + return + } + strongSelf.dismiss() + }) + ], actionLayout: .vertical), in: .window(.root)) + } + case .import: + let enteredWords = (strongSelf.displayNode as! WalletWordCheckScreenNode).enteredWords + precondition(enteredWords.count == 24) + var allWordsAreValid = true + for word in enteredWords { + if !possibleWordList.contains(word) { + allWordsAreValid = false + break + } + } + if !allWordsAreValid { + strongSelf.view.endEditing(true) + strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: "Incorrect words", text: "Sorry, you have entered incorrect secret words. Please double check and try again.", actions: [ + TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + }) + ], actionLayout: .vertical), in: .window(.root)) + } + let _ = (importWallet(postbox: strongSelf.context.account.postbox, network: strongSelf.context.account.network, tonInstance: strongSelf.tonContext.instance, keychain: strongSelf.tonContext.keychain, wordList: enteredWords) + |> deliverOnMainQueue).start(next: { walletInfo in + guard let strongSelf = self else { + return + } + if let navigationController = strongSelf.navigationController as? NavigationController { + var controllers = navigationController.viewControllers + controllers = controllers.filter { controller in + if controller is WalletSplashScreen { + return false + } + if controller is WalletWordDisplayScreen { + return false + } + if controller is WalletWordCheckScreen { + return false + } + return true + } + controllers.append(WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .success(walletInfo))) + strongSelf.view.endEditing(true) + navigationController.setViewControllers(controllers, animated: true) + } + }, error: { error in + guard let strongSelf = self else { + return + } + strongSelf.view.endEditing(true) + strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: "Incorrect words", text: "Sorry, you have entered incorrect secret words. Please double check and try again.", actions: [ + TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + }) + ], actionLayout: .vertical), in: .window(.root)) + }) + } + }, secondaryAction: { [weak self] in + guard let strongSelf = self else { + return + } + strongSelf.view.endEditing(true) + if let navigationController = strongSelf.navigationController as? NavigationController { + var controllers = navigationController.viewControllers + controllers = controllers.filter { controller in + if controller is WalletSplashScreen { + return false + } + if controller is WalletWordCheckScreen { + return false + } + return true + } + controllers.append(WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .restoreFailed)) + navigationController.setViewControllers(controllers, animated: true) + } + }) + + self.displayNodeDidLoad() + } + + override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + super.containerLayoutUpdated(layout, transition: transition) + + (self.displayNode as! WalletWordCheckScreenNode).containerLayoutUpdated(layout: layout, navigationHeight: self.navigationHeight, transition: transition) + } +} + +private func generateClearIcon(color: UIColor) -> UIImage? { + return generateTintedImage(image: UIImage(bundleImageName: "Components/Search Bar/Clear"), color: color) +} + +private final class WordCheckInputNode: ASDisplayNode, UITextFieldDelegate { + private let next: (WordCheckInputNode) -> Void + private let focused: (WordCheckInputNode) -> Void + + private let backgroundNode: ASImageNode + private let labelNode: ImmediateTextNode + private let inputNode: TextFieldNode + private let clearButtonNode: HighlightableButtonNode + + var text: String { + return self.inputNode.textField.text ?? "" + } + + init(theme: PresentationTheme, index: Int, possibleWordList: [String], next: @escaping (WordCheckInputNode) -> Void, isLast: Bool, focused: @escaping (WordCheckInputNode) -> Void) { + self.next = next + self.focused = focused + + self.backgroundNode = ASImageNode() + self.backgroundNode.displaysAsynchronously = false + self.backgroundNode.displayWithoutProcessing = true + self.backgroundNode.image = generateStretchableFilledCircleImage(diameter: 10.0, color: theme.actionSheet.inputBackgroundColor) + + self.labelNode = ImmediateTextNode() + self.labelNode.attributedText = NSAttributedString(string: "\(index + 1):", font: Font.regular(17.0), textColor: theme.actionSheet.inputPlaceholderColor) + self.labelNode.textAlignment = .right + + self.inputNode = TextFieldNode() + self.inputNode.textField.font = Font.regular(17.0) + self.inputNode.textField.textColor = theme.actionSheet.inputTextColor + var wordTapped: ((String) -> Void)? + self.inputNode.textField.inputAccessoryView = WordCheckInputAccesssoryView(theme: theme, wordList: possibleWordList, wordTapped: { word in + wordTapped?(word) + }) + 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 + } + if isLast { + self.inputNode.textField.returnKeyType = .done + } else { + self.inputNode.textField.returnKeyType = .next + } + + self.clearButtonNode = HighlightableButtonNode() + self.clearButtonNode.setImage(generateClearIcon(color: theme.actionSheet.inputClearButtonColor.withAlphaComponent(0.7)), for: []) + self.clearButtonNode.isHidden = true + + super.init() + + self.addSubnode(self.backgroundNode) + self.addSubnode(self.labelNode) + self.addSubnode(self.inputNode) + self.addSubnode(self.clearButtonNode) + + self.inputNode.textField.delegate = self + self.inputNode.textField.addTarget(self, action: #selector(self.textFieldChanged(_:)), for: .editingChanged) + + self.clearButtonNode.addTarget(self, action: #selector(self.clearPressed), forControlEvents: .touchUpInside) + + wordTapped = { [weak self] word in + guard let strongSelf = self else { + return + } + strongSelf.inputNode.textField.text = word + } + } + + func textFieldDidBeginEditing(_ textField: UITextField) { + let text = self.text + let isEmpty = text.isEmpty + self.clearButtonNode.isHidden = isEmpty + (self.inputNode.textField.inputAccessoryView as? WordCheckInputAccesssoryView)?.updateText(text) + self.focused(self) + } + + func textFieldDidEndEditing(_ textField: UITextField) { + self.clearButtonNode.isHidden = true + (self.inputNode.textField.inputAccessoryView as? WordCheckInputAccesssoryView)?.updateText("") + } + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + self.next(self) + return false + } + + @objc private func textFieldChanged(_ textField: UITextField) { + let text = self.text + if textField.isFirstResponder { + let isEmpty = text.isEmpty + self.clearButtonNode.isHidden = isEmpty + (self.inputNode.textField.inputAccessoryView as? WordCheckInputAccesssoryView)?.updateText(text) + } + } + + @objc private func clearPressed() { + self.inputNode.textField.text = "" + self.textFieldChanged(self.inputNode.textField) + } + + func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) { + let leftInset: CGFloat = 38.0 + let textInset: CGFloat = 5.0 + let rightInset: CGFloat = 38.0 + + transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: size)) + let labelSize = self.labelNode.updateLayout(size) + transition.updateFrameAdditive(node: self.labelNode, frame: CGRect(origin: CGPoint(x: leftInset - labelSize.width, y: floor((size.height - labelSize.height) / 2.0)), size: labelSize)) + transition.updateFrame(node: self.inputNode, frame: CGRect(origin: CGPoint(x: leftInset + textInset, y: 0.0), size: CGSize(width: size.width - leftInset - textInset - rightInset, 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() + } +} + +private final class WordView: UIView { + let string: String + let tapped: () -> Void + + let textNode: ImmediateTextNode + let separator: UIView + + init(theme: PresentationTheme, string: String, tapped: @escaping () -> Void) { + self.string = string + self.tapped = tapped + + let separatorColor: UIColor + let textColor: UIColor + switch theme.rootController.keyboardColor { + case .light: + separatorColor = UIColor(rgb: 0x9e9f9f) + textColor = .black + case .dark: + separatorColor = UIColor(rgb: 0x9e9f9f) + textColor = .white + } + + self.textNode = ImmediateTextNode() + self.textNode.displaysAsynchronously = false + self.textNode.attributedText = NSAttributedString(string: string, font: Font.regular(17.0), textColor: textColor) + self.textNode.isUserInteractionEnabled = false + + self.separator = UIView() + self.separator.backgroundColor = separatorColor + self.separator.isUserInteractionEnabled = false + + super.init(frame: CGRect()) + + self.addSubview(self.separator) + self.addSubnode(self.textNode) + + self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:)))) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc private func tapGesture(_ recognizer: UITapGestureRecognizer) { + if case .ended = recognizer.state { + self.tapped() + } + } + + func updateLayout(size: CGSize) { + let textSize = self.textNode.updateLayout(size) + self.textNode.frame = CGRect(origin: CGPoint(x: floor((size.width - textSize.width) / 2.0), y: floor((size.height - textSize.height) / 2.0)), size: textSize) + + self.separator.frame = CGRect(origin: CGPoint(x: size.width - UIScreenPixel, y: floor((size.height - 24.0) / 2.0)), size: CGSize(width: UIScreenPixel, height: 24.0)) + } +} + +private final class WordCheckInputAccesssoryView: UIInputView { + private let theme: PresentationTheme + private let wordList: [String] + private let wordTapped: (String) -> Void + + private var currentText: String = "" + private let scrollView: UIScrollView + private var wordViews: [WordView] = [] + + override var intrinsicContentSize: CGSize { + return CGSize(width: 100.0, height: 44.0) + } + + init(theme: PresentationTheme, wordList: [String], wordTapped: @escaping (String) -> Void) { + self.theme = theme + self.wordList = wordList + self.wordTapped = wordTapped + + self.scrollView = UIScrollView() + self.scrollView.showsVerticalScrollIndicator = false + self.scrollView.showsHorizontalScrollIndicator = false + + super.init(frame: CGRect(origin: CGPoint(), size: CGSize(width: 100.0, height: 44.0)), inputViewStyle: .keyboard) + + self.addSubview(self.scrollView) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + UIView.performWithoutAnimation { + self.update(size: self.bounds.size) + } + } + + func updateText(_ text: String) { + var words: [String] = [] + if !self.currentText.isEmpty && text.hasPrefix(self.currentText) { + for word in self.wordList { + if word.hasPrefix(text) { + words.append(word) + } + } + } else { + for wordView in self.wordViews { + if wordView.string.hasPrefix(text) { + words.append(wordView.string) + } + } + } + self.currentText = text + var updatedWordViews: [WordView] = [] + if !text.isEmpty { + for i in 0 ..< words.count { + let word = words[i] + var found = false + for view in self.wordViews { + if view.string == word { + view.separator.isHidden = i == words.count - 1 + updatedWordViews.append(view) + found = true + break + } + } + if !found { + let wordView = WordView(theme: self.theme, string: word, tapped: { [weak self] in + self?.wordTapped(word) + }) + wordView.separator.isHidden = i == words.count - 1 + updatedWordViews.append(wordView) + self.scrollView.addSubview(wordView) + } + } + } + for view in self.wordViews { + if !updatedWordViews.contains(where: { $0 === view }) { + view.removeFromSuperview() + } + } + self.wordViews = updatedWordViews + if !self.bounds.width.isZero { + self.update(size: self.bounds.size) + } + } + + func update(size: CGSize) { + var contentWidth: CGFloat = 0.0 + let wordWidth: CGFloat = 140.0 + for wordView in self.wordViews { + let wordFrame = CGRect(origin: CGPoint(x: contentWidth, y: 0.0), size: CGSize(width: wordWidth, height: size.height)) + wordView.frame = wordFrame + wordView.updateLayout(size: wordFrame.size) + contentWidth += wordWidth + } + self.scrollView.frame = CGRect(origin: CGPoint(), size: size) + self.scrollView.contentSize = CGSize(width: contentWidth, height: size.height) + } +} + +private final class WalletWordCheckScreenNode: ViewControllerTracingNode, UIScrollViewDelegate { + private var presentationData: PresentationData + private let mode: WalletWordCheckMode + private let action: () -> Void + private let secondaryAction: () -> Void + + private let navigationBackgroundNode: ASDisplayNode + private let navigationSeparatorNode: ASDisplayNode + private let navigationTitleNode: ImmediateTextNode + private let scrollNode: ASScrollNode + private let iconNode: ASImageNode + private let titleNode: ImmediateTextNode + private let textNode: ImmediateTextNode + private let secondaryActionTitleNode: ImmediateTextNode + private let secondaryActionButtonNode: HighlightTrackingButtonNode + private let inputNodes: [WordCheckInputNode] + private let buttonNode: SolidRoundedButtonNode + + private var navigationHeight: CGFloat? + + var enteredWords: [String] { + return self.inputNodes.map { $0.text } + } + + init(presentationData: PresentationData, mode: WalletWordCheckMode, possibleWordList: [String], action: @escaping () -> Void, secondaryAction: @escaping () -> Void) { + self.presentationData = presentationData + self.mode = mode + self.action = action + self.secondaryAction = secondaryAction + + 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.iconNode = ASImageNode() + self.iconNode.displayWithoutProcessing = true + self.iconNode.displaysAsynchronously = false + + let title: String + let text: String + let buttonText: String + let secondaryActionText: String + + let wordIndices: [Int] + + switch mode { + case .verify: + wordIndices = verifyWordIndices + title = "Test Time!" + text = "Let’s check that you wrote them down correctly. Please enter words\n\(wordIndices[0] + 1), \(wordIndices[1] + 1) and \(wordIndices[2] + 1) below:" + buttonText = "Continue" + secondaryActionText = "" + self.iconNode.image = UIImage(bundleImageName: "Settings/Wallet/WordsCheckIcon") + case .import: + title = "24 Secret Words" + text = "Please restore access to your wallet by\nentering the 24 secret words you wrote down when creating the wallet." + buttonText = "Continue" + secondaryActionText = "I don't have those" + wordIndices = Array(0 ..< 24) + self.iconNode.image = nil + } + + self.navigationTitleNode = ImmediateTextNode() + self.navigationTitleNode.displaysAsynchronously = false + self.navigationTitleNode.attributedText = NSAttributedString(string: title, font: Font.bold(17.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor) + self.navigationTitleNode.maximumNumberOfLines = 0 + self.navigationTitleNode.textAlignment = .center + + 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 = NSAttributedString(string: text, font: Font.regular(16.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor) + self.textNode.maximumNumberOfLines = 0 + self.textNode.lineSpacing = 0.1 + self.textNode.textAlignment = .center + + self.secondaryActionTitleNode = ImmediateTextNode() + self.secondaryActionTitleNode.isUserInteractionEnabled = false + self.secondaryActionTitleNode.displaysAsynchronously = false + self.secondaryActionTitleNode.attributedText = NSAttributedString(string: secondaryActionText, font: Font.regular(16.0), textColor: self.presentationData.theme.list.itemAccentColor) + + self.secondaryActionButtonNode = HighlightTrackingButtonNode() + + var inputNodes: [WordCheckInputNode] = [] + + var nextWord: ((WordCheckInputNode) -> Void)? + var focused: ((WordCheckInputNode) -> Void)? + + for i in 0 ..< wordIndices.count { + inputNodes.append(WordCheckInputNode(theme: presentationData.theme, index: wordIndices[i], possibleWordList: possibleWordList, next: { node in + nextWord?(node) + }, isLast: i == wordIndices.count - 1, focused: { node in + focused?(node) + })) + } + + self.inputNodes = inputNodes + + self.buttonNode = SolidRoundedButtonNode(title: buttonText, theme: self.presentationData.theme, 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.iconNode) + self.scrollNode.addSubnode(self.titleNode) + self.scrollNode.addSubnode(self.textNode) + self.scrollNode.addSubnode(self.secondaryActionTitleNode) + self.scrollNode.addSubnode(self.secondaryActionButtonNode) + self.scrollNode.addSubnode(self.buttonNode) + + for (inputNode) in self.inputNodes { + self.scrollNode.addSubnode(inputNode) + } + + self.navigationBackgroundNode.addSubnode(self.navigationSeparatorNode) + self.navigationBackgroundNode.addSubnode(self.navigationTitleNode) + self.addSubnode(self.navigationBackgroundNode) + + self.buttonNode.pressed = { + action() + } + + self.secondaryActionButtonNode.highligthedChanged = { [weak self] highlighted in + guard let strongSelf = self else { + return + } + if highlighted { + strongSelf.secondaryActionTitleNode.layer.removeAnimation(forKey: "opacity") + strongSelf.secondaryActionTitleNode.alpha = 0.4 + } else { + strongSelf.secondaryActionTitleNode.alpha = 1.0 + strongSelf.secondaryActionTitleNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2) + } + } + + self.secondaryActionButtonNode.addTarget(self, action: #selector(self.secondaryActionPressed), forControlEvents: .touchUpInside) + + nextWord = { [weak self] node in + guard let strongSelf = self else { + return + } + if node === strongSelf.inputNodes.last { + action() + } else { + if let index = strongSelf.inputNodes.firstIndex(where: { $0 === node }) { + strongSelf.inputNodes[index + 1].focus() + } + } + } + focused = { [weak self] node in + guard let strongSelf = self else { + return + } + strongSelf.scrollNode.view.scrollRectToVisible(node.frame.insetBy(dx: 0.0, dy: -10.0), animated: true) + } + } + + @objc private func secondaryActionPressed() { + self.secondaryAction() + } + + override func didLoad() { + super.didLoad() + + self.scrollNode.view.keyboardDismissMode = .interactive + 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) { + let navigationHeight = self.navigationHeight ?? 0.0 + let alpha: CGFloat = scrollView.contentOffset.y >= (self.titleNode.frame.maxY - navigationHeight) ? 1.0 : 0.0 + if self.navigationBackgroundNode.alpha != alpha { + let transition: ContainedViewLayoutTransition = .animated(duration: 0.12, curve: .easeInOut) + transition.updateAlpha(node: self.navigationBackgroundNode, alpha: alpha, beginWithCurrentState: true) + } + } + + 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 = 5.0 + let titleSpacing: CGFloat = 19.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 = self.iconNode.image?.size ?? CGSize() + + let titleSize = self.titleNode.updateLayout(CGSize(width: contentAreaSize.width - sideInset * 2.0, height: contentAreaSize.height)) + let navigationTitleSize = self.navigationTitleNode.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 secondaryActionSize = self.secondaryActionTitleNode.updateLayout(CGSize(width: contentAreaSize.width - sideInset * 2.0, height: contentAreaSize.height)) + + transition.updateFrameAdditive(node: self.navigationTitleNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - navigationTitleSize.width) / 2.0), y: navigationHeight - 44.0 + floor((44.0 - navigationTitleSize.height) / 2.0)), size: navigationTitleSize)) + + var contentHeight: CGFloat = 0.0 + + let contentVerticalOrigin = navigationHeight + 10.0 + + let iconFrame = CGRect(origin: CGPoint(x: floor((contentAreaSize.width - iconSize.width) / 2.0), y: contentVerticalOrigin), size: iconSize) + transition.updateFrameAdditive(node: self.iconNode, 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(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 + textSpacing + + if !secondaryActionSize.width.isZero { + let secondaryActionFrame = CGRect(origin: CGPoint(x: floor((contentAreaSize.width - secondaryActionSize.width) / 2.0), y: contentHeight), size: secondaryActionSize) + transition.updateFrameAdditive(node: self.secondaryActionTitleNode, frame: secondaryActionFrame) + transition.updateFrame(node: self.secondaryActionButtonNode, frame: secondaryActionFrame.insetBy(dx: -10.0, dy: -10.0)) + contentHeight = secondaryActionFrame.maxY + 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 bottomInset = layout.intrinsicInsets.bottom + minimalBottomInset + + let buttonWidth = contentAreaSize.width - buttonSideInset * 2.0 + + let buttonFrame = CGRect(origin: CGPoint(x: floor((contentAreaSize.width - buttonWidth) / 2.0), y: max(contentHeight + buttonSpacing, availableAreaSize.height - bottomInset - buttonHeight)), size: CGSize(width: buttonWidth, height: buttonHeight)) + transition.updateFrame(node: self.buttonNode, frame: buttonFrame) + self.buttonNode.updateLayout(width: buttonFrame.width, transition: transition) + + transition.animateView { + self.scrollNode.view.contentInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: layout.insets(options: [.input]).bottom + 30.0, right: 0.0) + self.scrollNode.view.contentSize = CGSize(width: contentAreaSize.width, height: max(availableAreaSize.height, buttonFrame.maxY + bottomInset) - 30.0) + } + } +} diff --git a/submodules/WalletUI/Sources/WalletWordDisplayScreen.swift b/submodules/WalletUI/Sources/WalletWordDisplayScreen.swift new file mode 100644 index 0000000000..e4ec128350 --- /dev/null +++ b/submodules/WalletUI/Sources/WalletWordDisplayScreen.swift @@ -0,0 +1,323 @@ +import Foundation +import UIKit +import AppBundle +import AccountContext +import TelegramPresentationData +import AsyncDisplayKit +import Display +import Postbox +import TelegramCore +import SolidRoundedButtonNode +import UndoUI +import AlertUI + +public final class WalletWordDisplayScreen: ViewController { + private let context: AccountContext + private let tonContext: TonContext + private var presentationData: PresentationData + private let walletInfo: WalletInfo + private let wordList: [String] + + private let startTime: Double + + public init(context: AccountContext, tonContext: TonContext, walletInfo: WalletInfo, wordList: [String]) { + self.context = context + self.tonContext = tonContext + self.walletInfo = walletInfo + self.wordList = wordList + + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + + let defaultNavigationPresentationData = NavigationBarPresentationData(presentationTheme: self.presentationData.theme, presentationStrings: self.presentationData.strings) + let navigationBarTheme = NavigationBarTheme(buttonColor: defaultNavigationPresentationData.theme.buttonColor, disabledButtonColor: defaultNavigationPresentationData.theme.disabledButtonColor, primaryTextColor: defaultNavigationPresentationData.theme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultNavigationPresentationData.theme.badgeBackgroundColor, badgeStrokeColor: defaultNavigationPresentationData.theme.badgeStrokeColor, badgeTextColor: defaultNavigationPresentationData.theme.badgeTextColor) + + self.startTime = Date().timeIntervalSince1970 + + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: defaultNavigationPresentationData.strings)) + + self.navigationPresentation = .modalInLargeLayout + self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) + self.navigationBar?.intrinsicCanTransitionInline = false + + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_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 = WalletWordDisplayScreenNode(presentationData: self.presentationData, wordList: self.wordList, action: { [weak self] in + guard let strongSelf = self else { + return + } + let deltaTime = Date().timeIntervalSince1970 - strongSelf.startTime + let minimalTimeout: Double + #if DEBUG + minimalTimeout = 1.0 + #else + minimalTimeout = 60.0 + #endif + if deltaTime < minimalTimeout { + strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: "Sure Done?", text: "You didn't have enough time to write those words down.", actions: [TextAlertAction(type: .defaultAction, title: "OK, Sorry", action: { + guard let strongSelf = self else { + return + } + if let path = getAppBundle().path(forResource: "thumbsup", ofType: "tgs") { + strongSelf.present(UndoOverlayController(context: strongSelf.context, content: UndoOverlayContent.emoji(account: strongSelf.context.account, path: path, text: "Apologies Accepted"), elevatedLayout: false, animateInAsReplacement: false, action: { _ in }), in: .current) + } + })]), in: .window(.root)) + } else { + strongSelf.push(WalletWordCheckScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .verify(strongSelf.walletInfo, strongSelf.wordList))) + } + }) + + self.displayNodeDidLoad() + } + + override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + super.containerLayoutUpdated(layout, transition: transition) + + (self.displayNode as! WalletWordDisplayScreenNode).containerLayoutUpdated(layout: layout, navigationHeight: self.navigationHeight, transition: transition) + } +} + +private final class WalletWordDisplayScreenNode: ViewControllerTracingNode, UIScrollViewDelegate { + private var presentationData: PresentationData + private let action: () -> Void + + private let navigationBackgroundNode: ASDisplayNode + private let navigationSeparatorNode: ASDisplayNode + private let navigationTitleNode: ImmediateTextNode + private let scrollNode: ASScrollNode + private let iconNode: ASImageNode + private let titleNode: ImmediateTextNode + private let textNode: ImmediateTextNode + private let wordNodes: [(ImmediateTextNode, ImmediateTextNode, ImmediateTextNode)] + private let buttonNode: SolidRoundedButtonNode + + private var navigationHeight: CGFloat? + + init(presentationData: PresentationData, wordList: [String], action: @escaping () -> Void) { + self.presentationData = presentationData + self.action = action + + 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.iconNode = ASImageNode() + self.iconNode.displayWithoutProcessing = true + self.iconNode.displaysAsynchronously = false + + let title: String = "24 Secret Words" + let text: String = "Write down these 24 words in the correct order and store them in a secret place.\n\nUse these secret words to restore access to your wallet if you lose your passcode or Telegram account." + let buttonText: String = "Done" + + self.iconNode.image = UIImage(bundleImageName: "Settings/Wallet/WordsDisplayIcon") + + 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.navigationTitleNode = ImmediateTextNode() + self.navigationTitleNode.displaysAsynchronously = false + self.navigationTitleNode.attributedText = NSAttributedString(string: title, font: Font.bold(17.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor) + self.navigationTitleNode.maximumNumberOfLines = 0 + self.navigationTitleNode.textAlignment = .center + + self.textNode = ImmediateTextNode() + self.textNode.displaysAsynchronously = false + self.textNode.attributedText = NSAttributedString(string: text, font: Font.regular(16.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor) + self.textNode.maximumNumberOfLines = 0 + self.textNode.lineSpacing = 0.1 + self.textNode.textAlignment = .center + + var wordNodes: [(ImmediateTextNode, ImmediateTextNode, ImmediateTextNode)] = [] + + for i in 0 ..< wordList.count { + let indexNode = ImmediateTextNode() + indexNode.displaysAsynchronously = false + indexNode.attributedText = NSAttributedString(string: "\(i + 1)", font: Font.regular(18.0), textColor: self.presentationData.theme.list.itemSecondaryTextColor) + indexNode.maximumNumberOfLines = 1 + indexNode.textAlignment = .left + + let indexDotNode = ImmediateTextNode() + indexDotNode.displaysAsynchronously = false + indexDotNode.attributedText = NSAttributedString(string: ".", font: Font.regular(18.0), textColor: self.presentationData.theme.list.itemSecondaryTextColor) + indexDotNode.maximumNumberOfLines = 1 + indexDotNode.textAlignment = .left + + let wordNode = ImmediateTextNode() + wordNode.displaysAsynchronously = false + wordNode.attributedText = NSAttributedString(string: wordList[i], font: Font.semibold(18.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor) + wordNode.maximumNumberOfLines = 1 + wordNode.textAlignment = .left + + wordNodes.append((indexNode, indexDotNode, wordNode)) + } + + self.wordNodes = wordNodes + + self.buttonNode = SolidRoundedButtonNode(title: buttonText, theme: self.presentationData.theme, 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.iconNode) + self.scrollNode.addSubnode(self.titleNode) + self.scrollNode.addSubnode(self.textNode) + self.scrollNode.addSubnode(self.buttonNode) + + for (indexNode, indexDotNode, wordNode) in self.wordNodes { + self.scrollNode.addSubnode(indexNode) + self.scrollNode.addSubnode(indexDotNode) + self.scrollNode.addSubnode(wordNode) + } + + self.navigationBackgroundNode.addSubnode(self.navigationSeparatorNode) + self.navigationBackgroundNode.addSubnode(self.navigationTitleNode) + self.addSubnode(self.navigationBackgroundNode) + + self.buttonNode.pressed = { + action() + } + } + + override func didLoad() { + super.didLoad() + + 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) { + let navigationHeight = self.navigationHeight ?? 0.0 + let alpha: CGFloat = scrollView.contentOffset.y >= (self.titleNode.frame.maxY - navigationHeight) ? 1.0 : 0.0 + if self.navigationBackgroundNode.alpha != alpha { + let transition: ContainedViewLayoutTransition = .animated(duration: 0.12, curve: .easeInOut) + transition.updateAlpha(node: self.navigationBackgroundNode, alpha: alpha, beginWithCurrentState: true) + } + } + + func containerLayoutUpdated(layout: ContainerViewLayout, navigationHeight: CGFloat, transition: ContainedViewLayoutTransition) { + self.navigationHeight = navigationHeight + + let sideInset: CGFloat = 32.0 + let buttonSideInset: CGFloat = 48.0 + let iconSpacing: CGFloat = 5.0 + let titleSpacing: CGFloat = 19.0 + let textSpacing: CGFloat = 37.0 + let buttonHeight: CGFloat = 50.0 + let buttonSpacing: CGFloat = 45.0 + let wordSpacing: CGFloat = 12.0 + let indexSpacing: CGFloat = 4.0 + + transition.updateFrame(node: self.navigationBackgroundNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: layout.size.width, height: navigationHeight))) + transition.updateFrame(node: self.navigationSeparatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: navigationHeight), size: CGSize(width: layout.size.width, height: UIScreenPixel))) + + transition.updateFrame(node: self.scrollNode, frame: CGRect(origin: CGPoint(), size: layout.size)) + + let iconSize = self.iconNode.image?.size ?? CGSize(width: 50.0, height: 50.0) + + let titleSize = self.titleNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: layout.size.height)) + let navigationTitleSize = self.navigationTitleNode.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)) + + var contentHeight: CGFloat = 0.0 + + let contentVerticalOrigin = navigationHeight + 10.0 + + let iconFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - iconSize.width) / 2.0), y: contentVerticalOrigin), size: iconSize) + transition.updateFrameAdditive(node: self.iconNode, 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) + + transition.updateFrameAdditive(node: self.navigationTitleNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - navigationTitleSize.width) / 2.0), y: navigationHeight - 44.0 + floor((44.0 - navigationTitleSize.height) / 2.0)), size: navigationTitleSize)) + + contentHeight = textFrame.maxY + textSpacing + + let rowWidth = layout.size.width - buttonSideInset * 2.0 + let rowCount = self.wordNodes.count / 2 + + let indexWidth: CGFloat = 16.0 + + var wordSizes: [(CGSize, CGSize)] = [] + var columnIndexWidth: [CGFloat] = [0.0, 0.0] + var columnWordWidth: [CGFloat] = [0.0, 0.0] + var dotSize: CGSize = CGSize() + + for i in 0 ..< self.wordNodes.count { + let indexSize = self.wordNodes[i].0.updateLayout(CGSize(width: 200.0, height: 100.0)) + dotSize = self.wordNodes[i].1.updateLayout(CGSize(width: 200.0, height: 100.0)) + let wordSize = self.wordNodes[i].2.updateLayout(CGSize(width: 200.0, height: 100.0)) + wordSizes.append((indexSize, wordSize)) + let column = i / rowCount + columnIndexWidth[column] = max(columnIndexWidth[column], indexSize.width) + columnWordWidth[column] = max(columnWordWidth[column], wordSize.width) + } + + for column in 0 ..< 2 { + var columnHeight: CGFloat = 0.0 + for i in 0 ..< self.wordNodes.count { + if !columnHeight.isZero { + columnHeight += wordSpacing + } + if i / rowCount != column { + continue + } + + let horizontalOrigin: CGFloat + let verticalOrigin: CGFloat = contentHeight + columnHeight + if column == 0 { + horizontalOrigin = buttonSideInset + columnIndexWidth[column] + } else { + horizontalOrigin = layout.size.width - buttonSideInset - columnWordWidth[column] - indexSpacing + } + let indexSize = self.wordNodes[i].0.updateLayout(CGSize(width: 200.0, height: 100.0)) + let wordSize = self.wordNodes[i].2.updateLayout(CGSize(width: 200.0, height: 100.0)) + transition.updateFrameAdditive(node: self.wordNodes[i].0, frame: CGRect(origin: CGPoint(x: horizontalOrigin - indexSize.width - dotSize.width, y: verticalOrigin), size: indexSize)) + transition.updateFrameAdditive(node: self.wordNodes[i].1, frame: CGRect(origin: CGPoint(x: horizontalOrigin - dotSize.width, y: verticalOrigin), size: indexSize)) + transition.updateFrameAdditive(node: self.wordNodes[i].2, frame: CGRect(origin: CGPoint(x: horizontalOrigin + indexSpacing, y: verticalOrigin), size: wordSize)) + columnHeight += wordSize.height + } + + if column == 1 { + contentHeight += columnHeight + } + } + + let minimalFullscreenBottomInset: CGFloat = 74.0 + let minimalScrollBottomInset: CGFloat = 30.0 + let fullscreenBottomInset = layout.intrinsicInsets.bottom + minimalFullscreenBottomInset + let scrollBottomInset = layout.intrinsicInsets.bottom + minimalScrollBottomInset + + let buttonWidth = layout.size.width - buttonSideInset * 2.0 + + let buttonFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - buttonWidth) / 2.0), y: max(contentHeight + buttonSpacing, layout.size.height - scrollBottomInset - buttonHeight)), size: CGSize(width: buttonWidth, height: buttonHeight)) + transition.updateFrame(node: self.buttonNode, frame: buttonFrame) + self.buttonNode.updateLayout(width: buttonFrame.width, transition: transition) + + self.scrollNode.view.contentSize = CGSize(width: layout.size.width, height: max(layout.size.height, buttonFrame.maxY + scrollBottomInset)) + } +} diff --git a/submodules/WalletUI/WalletUI.xcodeproj/project.pbxproj b/submodules/WalletUI/WalletUI.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..e86b59dcee --- /dev/null +++ b/submodules/WalletUI/WalletUI.xcodeproj/project.pbxproj @@ -0,0 +1,967 @@ + + + + + archiveVersion + 1 + classes + + + objectVersion + 46 + objects + + 1DD70E29300888A800000000 + + isa + PBXFileReference + name + WalletUI-Debug.xcconfig + path + ../../buck-out/gen/submodules/WalletUI/WalletUI-Debug.xcconfig + sourceTree + SOURCE_ROOT + explicitFileType + text.xcconfig + + 1DD70E29352B961200000000 + + isa + PBXFileReference + name + WalletUI-Profile.xcconfig + path + ../../buck-out/gen/submodules/WalletUI/WalletUI-Profile.xcconfig + sourceTree + SOURCE_ROOT + explicitFileType + text.xcconfig + + 1DD70E29A8C2417400000000 + + isa + PBXFileReference + name + WalletUI-Release.xcconfig + path + ../../buck-out/gen/submodules/WalletUI/WalletUI-Release.xcconfig + sourceTree + SOURCE_ROOT + explicitFileType + text.xcconfig + + B401C9792F7F325000000000 + + isa + PBXGroup + name + Buck (Do Not Modify) + sourceTree + ]]> + children + + 1DD70E29300888A800000000 + 1DD70E29352B961200000000 + 1DD70E29A8C2417400000000 + + + B401C979B781F65D00000000 + + isa + PBXGroup + name + Configurations + sourceTree + ]]> + children + + B401C9792F7F325000000000 + + + 1DD70E299D2580DA00000000 + + isa + PBXFileReference + name + libAccountContext.a + path + libAccountContext.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29F523B9DE00000000 + + isa + PBXFileReference + name + libAlertUI.a + path + libAlertUI.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E292420028600000000 + + isa + PBXFileReference + name + libAnimationUI.a + path + libAnimationUI.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E295915423000000000 + + isa + PBXFileReference + name + libDeviceLocationManager.a + path + libDeviceLocationManager.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29FF334B1F00000000 + + isa + PBXFileReference + name + libDisplay.dylib + path + libDisplay.dylib + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + compiled.mach-o.dylib + + 1DD70E29D6F14E1000000000 + + isa + PBXFileReference + name + libImageBlur.a + path + libImageBlur.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29CE34063500000000 + + isa + PBXFileReference + name + libLocalizedPeerData.a + path + libLocalizedPeerData.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E2936DE2CF900000000 + + isa + PBXFileReference + name + libMediaResources.a + path + libMediaResources.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29BBAF750C00000000 + + isa + PBXFileReference + name + libOverlayStatusController.a + path + libOverlayStatusController.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E290F1A3C6400000000 + + isa + PBXFileReference + name + libPlatformRestrictionMatching.a + path + libPlatformRestrictionMatching.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29DB6520C800000000 + + isa + PBXFileReference + name + libPostbox.dylib + path + libPostbox.dylib + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + compiled.mach-o.dylib + + 1DD70E293E4DE92B00000000 + + isa + PBXFileReference + name + libRadialStatusNode.a + path + libRadialStatusNode.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29524F478E00000000 + + isa + PBXFileReference + name + libSolidRoundedButtonNode.a + path + libSolidRoundedButtonNode.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E293594DCC000000000 + + isa + PBXFileReference + name + libStickerResources.a + path + libStickerResources.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29D65BA68200000000 + + isa + PBXFileReference + name + libSwiftSignalKit.dylib + path + libSwiftSignalKit.dylib + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + compiled.mach-o.dylib + + 1DD70E29F33FDAC300000000 + + isa + PBXFileReference + name + libTelegramAudio.a + path + libTelegramAudio.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29119CDA0700000000 + + isa + PBXFileReference + name + libTelegramCore.dylib + path + libTelegramCore.dylib + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + compiled.mach-o.dylib + + 1DD70E2984A59C1D00000000 + + isa + PBXFileReference + name + libTelegramPresentationData.a + path + libTelegramPresentationData.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29DD3C940F00000000 + + isa + PBXFileReference + name + libTelegramStringFormatting.a + path + libTelegramStringFormatting.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E292395015100000000 + + isa + PBXFileReference + name + libTelegramUIPreferences.a + path + libTelegramUIPreferences.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29BA06E3A600000000 + + isa + PBXFileReference + name + libTemporaryCachedPeerDataManager.a + path + libTemporaryCachedPeerDataManager.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29F0C15F9C00000000 + + isa + PBXFileReference + name + libTextFormat.a + path + libTextFormat.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29CD296A8300000000 + + isa + PBXFileReference + name + libTuples.a + path + libTuples.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E29AE67341000000000 + + isa + PBXFileReference + name + libUndoUI.a + path + libUndoUI.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + 1DD70E2951398CF200000000 + + isa + PBXFileReference + name + libUniversalMediaPlayer.a + path + libUniversalMediaPlayer.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + B401C97968022A5500000000 + + isa + PBXGroup + name + Frameworks + sourceTree + ]]> + children + + 1DD70E299D2580DA00000000 + 1DD70E29F523B9DE00000000 + 1DD70E292420028600000000 + 1DD70E295915423000000000 + 1DD70E29FF334B1F00000000 + 1DD70E29D6F14E1000000000 + 1DD70E29CE34063500000000 + 1DD70E2936DE2CF900000000 + 1DD70E29BBAF750C00000000 + 1DD70E290F1A3C6400000000 + 1DD70E29DB6520C800000000 + 1DD70E293E4DE92B00000000 + 1DD70E29524F478E00000000 + 1DD70E293594DCC000000000 + 1DD70E29D65BA68200000000 + 1DD70E29F33FDAC300000000 + 1DD70E29119CDA0700000000 + 1DD70E2984A59C1D00000000 + 1DD70E29DD3C940F00000000 + 1DD70E292395015100000000 + 1DD70E29BA06E3A600000000 + 1DD70E29F0C15F9C00000000 + 1DD70E29CD296A8300000000 + 1DD70E29AE67341000000000 + 1DD70E2951398CF200000000 + + + 1DD70E29D097476500000000 + + isa + PBXFileReference + name + libWalletUI.a + path + libWalletUI.a + sourceTree + BUILT_PRODUCTS_DIR + explicitFileType + archive.ar + + B401C979C806358400000000 + + isa + PBXGroup + name + Products + sourceTree + ]]> + children + + 1DD70E29D097476500000000 + + + 1DD70E29001F47FB00000000 + + isa + PBXFileReference + name + BUCK + path + BUCK + sourceTree + SOURCE_ROOT + explicitFileType + text.script.python + + 1DD70E29D2B1401800000000 + + isa + PBXFileReference + name + WalletInfoScreen.swift + path + Sources/WalletInfoScreen.swift + sourceTree + SOURCE_ROOT + + 1DD70E2964068E1100000000 + + isa + PBXFileReference + name + WalletSplashScreen.swift + path + Sources/WalletSplashScreen.swift + sourceTree + SOURCE_ROOT + + 1DD70E2936794EB600000000 + + isa + PBXFileReference + name + WalletWordCheckScreen.swift + path + Sources/WalletWordCheckScreen.swift + sourceTree + SOURCE_ROOT + + 1DD70E290678D03000000000 + + isa + PBXFileReference + name + WalletWordDisplayScreen.swift + path + Sources/WalletWordDisplayScreen.swift + sourceTree + SOURCE_ROOT + + B401C979EAB5339800000000 + + isa + PBXGroup + name + Sources + sourceTree + ]]> + children + + 1DD70E29D2B1401800000000 + 1DD70E2964068E1100000000 + 1DD70E2936794EB600000000 + 1DD70E290678D03000000000 + + + B401C979172FA86D00000000 + + isa + PBXGroup + name + WalletUI + sourceTree + ]]> + children + + 1DD70E29001F47FB00000000 + B401C979EAB5339800000000 + + + B401C979EFB6AC4600000000 + + isa + PBXGroup + name + mainGroup + sourceTree + ]]> + children + + B401C979B781F65D00000000 + B401C97968022A5500000000 + B401C979C806358400000000 + B401C979172FA86D00000000 + + + E7A30F04D2B1401800000000 + + isa + PBXBuildFile + fileRef + 1DD70E29D2B1401800000000 + + E7A30F0464068E1100000000 + + isa + PBXBuildFile + fileRef + 1DD70E2964068E1100000000 + + E7A30F0436794EB600000000 + + isa + PBXBuildFile + fileRef + 1DD70E2936794EB600000000 + + E7A30F040678D03000000000 + + isa + PBXBuildFile + fileRef + 1DD70E290678D03000000000 + + 1870857F0000000000000000 + + isa + PBXSourcesBuildPhase + files + + E7A30F04D2B1401800000000 + E7A30F0464068E1100000000 + E7A30F0436794EB600000000 + E7A30F040678D03000000000 + + + E7A30F04D65BA68200000000 + + isa + PBXBuildFile + fileRef + 1DD70E29D65BA68200000000 + + E7A30F045915423000000000 + + isa + PBXBuildFile + fileRef + 1DD70E295915423000000000 + + E7A30F04FF334B1F00000000 + + isa + PBXBuildFile + fileRef + 1DD70E29FF334B1F00000000 + + E7A30F04DB6520C800000000 + + isa + PBXBuildFile + fileRef + 1DD70E29DB6520C800000000 + + E7A30F04F33FDAC300000000 + + isa + PBXBuildFile + fileRef + 1DD70E29F33FDAC300000000 + + E7A30F04119CDA0700000000 + + isa + PBXBuildFile + fileRef + 1DD70E29119CDA0700000000 + + E7A30F0451398CF200000000 + + isa + PBXBuildFile + fileRef + 1DD70E2951398CF200000000 + + E7A30F0436DE2CF900000000 + + isa + PBXBuildFile + fileRef + 1DD70E2936DE2CF900000000 + + E7A30F042395015100000000 + + isa + PBXBuildFile + fileRef + 1DD70E292395015100000000 + + E7A30F0484A59C1D00000000 + + isa + PBXBuildFile + fileRef + 1DD70E2984A59C1D00000000 + + E7A30F04CE34063500000000 + + isa + PBXBuildFile + fileRef + 1DD70E29CE34063500000000 + + E7A30F040F1A3C6400000000 + + isa + PBXBuildFile + fileRef + 1DD70E290F1A3C6400000000 + + E7A30F04F0C15F9C00000000 + + isa + PBXBuildFile + fileRef + 1DD70E29F0C15F9C00000000 + + E7A30F04DD3C940F00000000 + + isa + PBXBuildFile + fileRef + 1DD70E29DD3C940F00000000 + + E7A30F04BA06E3A600000000 + + isa + PBXBuildFile + fileRef + 1DD70E29BA06E3A600000000 + + E7A30F049D2580DA00000000 + + isa + PBXBuildFile + fileRef + 1DD70E299D2580DA00000000 + + E7A30F04F523B9DE00000000 + + isa + PBXBuildFile + fileRef + 1DD70E29F523B9DE00000000 + + E7A30F04BBAF750C00000000 + + isa + PBXBuildFile + fileRef + 1DD70E29BBAF750C00000000 + + E7A30F04524F478E00000000 + + isa + PBXBuildFile + fileRef + 1DD70E29524F478E00000000 + + E7A30F04D6F14E1000000000 + + isa + PBXBuildFile + fileRef + 1DD70E29D6F14E1000000000 + + E7A30F04CD296A8300000000 + + isa + PBXBuildFile + fileRef + 1DD70E29CD296A8300000000 + + E7A30F043594DCC000000000 + + isa + PBXBuildFile + fileRef + 1DD70E293594DCC000000000 + + E7A30F042420028600000000 + + isa + PBXBuildFile + fileRef + 1DD70E292420028600000000 + + E7A30F043E4DE92B00000000 + + isa + PBXBuildFile + fileRef + 1DD70E293E4DE92B00000000 + + E7A30F04AE67341000000000 + + isa + PBXBuildFile + fileRef + 1DD70E29AE67341000000000 + + FAF5FAC90000000000000000 + + isa + PBXCopyFilesBuildPhase + files + + E7A30F04D65BA68200000000 + E7A30F045915423000000000 + E7A30F04FF334B1F00000000 + E7A30F04DB6520C800000000 + E7A30F04F33FDAC300000000 + E7A30F04119CDA0700000000 + E7A30F0451398CF200000000 + E7A30F0436DE2CF900000000 + E7A30F042395015100000000 + E7A30F0484A59C1D00000000 + E7A30F04CE34063500000000 + E7A30F040F1A3C6400000000 + E7A30F04F0C15F9C00000000 + E7A30F04DD3C940F00000000 + E7A30F04BA06E3A600000000 + E7A30F049D2580DA00000000 + E7A30F04F523B9DE00000000 + E7A30F04BBAF750C00000000 + E7A30F04524F478E00000000 + E7A30F04D6F14E1000000000 + E7A30F04CD296A8300000000 + E7A30F043594DCC000000000 + E7A30F042420028600000000 + E7A30F043E4DE92B00000000 + E7A30F04AE67341000000000 + + name + Fake Swift Dependencies (Copy Files Phase) + runOnlyForDeploymentPostprocessing + 1 + dstSubfolderSpec + 16 + dstPath + + + 4952437303EDA63300000000 + + isa + XCBuildConfiguration + name + Debug + buildSettings + + + baseConfigurationReference + 1DD70E29300888A800000000 + + 4952437350C7218900000000 + + isa + XCBuildConfiguration + name + Profile + buildSettings + + + baseConfigurationReference + 1DD70E29352B961200000000 + + 49524373A439BFE700000000 + + isa + XCBuildConfiguration + name + Release + buildSettings + + + baseConfigurationReference + 1DD70E29A8C2417400000000 + + 218C37090000000000000000 + + isa + XCConfigurationList + buildConfigurations + + 4952437303EDA63300000000 + 4952437350C7218900000000 + 49524373A439BFE700000000 + + defaultConfigurationIsVisible + + + E66DC04E172FA86D00000000 + + isa + PBXNativeTarget + name + WalletUI + productName + WalletUI + productReference + 1DD70E29D097476500000000 + productType + com.apple.product-type.library.static + dependencies + + + buildPhases + + 1870857F0000000000000000 + FAF5FAC90000000000000000 + + buildConfigurationList + 218C37090000000000000000 + + 4952437303EDA63300000001 + + isa + XCBuildConfiguration + name + Debug + buildSettings + + + + 4952437350C7218900000001 + + isa + XCBuildConfiguration + name + Profile + buildSettings + + + + 49524373A439BFE700000001 + + isa + XCBuildConfiguration + name + Release + buildSettings + + + + 218C37090000000000000001 + + isa + XCConfigurationList + buildConfigurations + + 4952437303EDA63300000001 + 4952437350C7218900000001 + 49524373A439BFE700000001 + + defaultConfigurationIsVisible + + + 96C84793172FA86D00000000 + + isa + PBXProject + mainGroup + B401C979EFB6AC4600000000 + targets + + E66DC04E172FA86D00000000 + + buildConfigurationList + 218C37090000000000000001 + compatibilityVersion + Xcode 3.2 + attributes + + LastUpgradeCheck + 9999 + + + + rootObject + 96C84793172FA86D00000000 + + \ No newline at end of file diff --git a/submodules/WalletUI/WalletUI.xcodeproj/xcshareddata/xcschemes/WalletUI.xcscheme b/submodules/WalletUI/WalletUI.xcodeproj/xcshareddata/xcschemes/WalletUI.xcscheme new file mode 100644 index 0000000000..99f513a9b7 --- /dev/null +++ b/submodules/WalletUI/WalletUI.xcodeproj/xcshareddata/xcschemes/WalletUI.xcscheme @@ -0,0 +1 @@ + \ No newline at end of file