Copy disabled (too large)
Download .txt
Showing preview only (28,502K chars total). Download the full file to get everything.
Repository: forkgram/tdesktop
Branch: dev
Commit: be34977021b5
Files: 2804
Total size: 26.6 MB
Directory structure:
gitextract_khvlzyi6/
├── .agents/
│ └── skills/
│ └── task-think/
│ ├── PROMPTS.md
│ └── SKILL.md
├── .claude/
│ ├── commands/
│ │ ├── icon.md
│ │ ├── planner.md
│ │ ├── reflect.md
│ │ ├── release.md
│ │ ├── task.md
│ │ └── withtest.md
│ ├── grab_clipboard.ps1
│ ├── grab_clipboard.sh
│ └── iterate.ps1
├── .cursorignore
├── .devcontainer.json
├── .gitattributes
├── .github/
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE/
│ │ ├── BUG_REPORT.yml
│ │ ├── FEATURE_REQUEST.yml
│ │ └── config.yml
│ ├── dependabot.yml
│ ├── scripts/
│ │ └── generate_changelog.py
│ └── workflows/
│ ├── changelog.yml
│ ├── docker.yml
│ ├── full_source.yml
│ ├── inno.yml
│ ├── jekyll-gh-pages.yml
│ ├── linux.yml
│ ├── mac.yml
│ ├── mac_packaged.yml
│ ├── needs-user-action.yml
│ ├── snap.yml
│ ├── waiting-for-answer.yml
│ └── win.yml
├── .gitignore
├── .gitmodules
├── AGENTS.md
├── CLAUDE.md
├── CMakeLists.txt
├── LEGAL
├── LICENSE
├── README.md
├── REVIEW.md
├── Telegram/
│ ├── CMakeLists.txt
│ ├── Resources/
│ │ ├── animations/
│ │ │ ├── ban.tgs
│ │ │ ├── blocked_peers_empty.tgs
│ │ │ ├── cake.tgs
│ │ │ ├── camera_outline.tgs
│ │ │ ├── change_number.tgs
│ │ │ ├── chat/
│ │ │ │ ├── sparkles_emoji.tgs
│ │ │ │ ├── video_to_voice.tgs
│ │ │ │ ├── voice_to_video.tgs
│ │ │ │ └── white_flag_emoji.tgs
│ │ │ ├── chat_link.tgs
│ │ │ ├── cloud_filters.tgs
│ │ │ ├── cloud_password/
│ │ │ │ ├── email.tgs
│ │ │ │ ├── hint.tgs
│ │ │ │ ├── intro.tgs
│ │ │ │ ├── password_input.tgs
│ │ │ │ └── validate.tgs
│ │ │ ├── cocoon.tgs
│ │ │ ├── collectible_phone.tgs
│ │ │ ├── collectible_username.tgs
│ │ │ ├── craft_failed.tgs
│ │ │ ├── craft_progress.tgs
│ │ │ ├── diamond.tgs
│ │ │ ├── dice/
│ │ │ │ ├── bball_idle.tgs
│ │ │ │ ├── dart_idle.tgs
│ │ │ │ ├── dice_6.tgs
│ │ │ │ ├── dice_idle.tgs
│ │ │ │ ├── fball_idle.tgs
│ │ │ │ ├── slot_0_idle.tgs
│ │ │ │ ├── slot_1_idle.tgs
│ │ │ │ ├── slot_2_idle.tgs
│ │ │ │ ├── slot_back.tgs
│ │ │ │ ├── slot_pull.tgs
│ │ │ │ └── winners.tgs
│ │ │ ├── discussion.tgs
│ │ │ ├── edit_peers/
│ │ │ │ ├── direct_messages.tgs
│ │ │ │ ├── topics.tgs
│ │ │ │ ├── topics_list.tgs
│ │ │ │ └── topics_tabs.tgs
│ │ │ ├── filters.tgs
│ │ │ ├── greeting.tgs
│ │ │ ├── hello_status.tgs
│ │ │ ├── hours.tgs
│ │ │ ├── local_passcode_enter.tgs
│ │ │ ├── location.tgs
│ │ │ ├── media_forbidden.tgs
│ │ │ ├── my_gifts_empty.tgs
│ │ │ ├── no_chats.tgs
│ │ │ ├── noresults.tgs
│ │ │ ├── palette.tgs
│ │ │ ├── passkeys.tgs
│ │ │ ├── phone.tgs
│ │ │ ├── photo_editor/
│ │ │ │ ├── arrow.tgs
│ │ │ │ ├── blur.tgs
│ │ │ │ ├── eraser.tgs
│ │ │ │ ├── marker.tgs
│ │ │ │ └── pen.tgs
│ │ │ ├── photo_suggest_icon.tgs
│ │ │ ├── profile/
│ │ │ │ ├── profile_muting.tgs
│ │ │ │ └── profile_unmuting.tgs
│ │ │ ├── robot.tgs
│ │ │ ├── rtmp.tgs
│ │ │ ├── search.tgs
│ │ │ ├── show_or_premium_lastseen.tgs
│ │ │ ├── show_or_premium_readtime.tgs
│ │ │ ├── sleep.tgs
│ │ │ ├── star_reaction/
│ │ │ │ ├── appear.tgs
│ │ │ │ ├── center.tgs
│ │ │ │ ├── effect1.tgs
│ │ │ │ ├── effect2.tgs
│ │ │ │ ├── effect3.tgs
│ │ │ │ ├── select.tgs
│ │ │ │ └── toast.tgs
│ │ │ ├── starref_link.tgs
│ │ │ ├── stats.tgs
│ │ │ ├── stats_boosts.tgs
│ │ │ ├── stats_earn.tgs
│ │ │ ├── stop.tgs
│ │ │ ├── swipe_action/
│ │ │ │ ├── archive.tgs
│ │ │ │ ├── delete.tgs
│ │ │ │ ├── disabled.tgs
│ │ │ │ ├── mute.tgs
│ │ │ │ ├── pin.tgs
│ │ │ │ ├── read.tgs
│ │ │ │ ├── unarchive.tgs
│ │ │ │ ├── unmute.tgs
│ │ │ │ ├── unpin.tgs
│ │ │ │ └── unread.tgs
│ │ │ ├── toast/
│ │ │ │ ├── chats_filter_in.tgs
│ │ │ │ ├── saved_messages.tgs
│ │ │ │ └── tagged.tgs
│ │ │ ├── transcribe_loading.tgs
│ │ │ ├── ttl.tgs
│ │ │ ├── voice_ttl_idle.tgs
│ │ │ ├── voice_ttl_start.tgs
│ │ │ └── writing.tgs
│ │ ├── art/
│ │ │ ├── background.tgv
│ │ │ └── mac_setup.tiff
│ │ ├── day-blue.tdesktop-theme
│ │ ├── day-custom-base.tdesktop-theme
│ │ ├── default_shortcuts-custom.json
│ │ ├── export_html/
│ │ │ ├── css/
│ │ │ │ └── style.css
│ │ │ └── js/
│ │ │ └── script.js
│ │ ├── icons/
│ │ │ ├── calls/
│ │ │ │ ├── hands.lottie
│ │ │ │ └── voice.lottie
│ │ │ ├── poll/
│ │ │ │ ├── toast_hide_results.tgs
│ │ │ │ └── uploading.tgs
│ │ │ └── settings/
│ │ │ └── devices/
│ │ │ ├── device_desktop_mac.lottie
│ │ │ ├── device_desktop_win.lottie
│ │ │ ├── device_linux.lottie
│ │ │ ├── device_linux_ubuntu.lottie
│ │ │ ├── device_phone_android.lottie
│ │ │ ├── device_phone_ios.lottie
│ │ │ ├── device_tablet_ios.lottie
│ │ │ ├── device_web_chrome.lottie
│ │ │ ├── device_web_edge.lottie
│ │ │ ├── device_web_firefox.lottie
│ │ │ └── device_web_safari.lottie
│ │ ├── iv_html/
│ │ │ ├── highlight.9.12.0.css
│ │ │ ├── highlight.9.12.0.js
│ │ │ ├── morphdom-umd.min.2.7.2.js
│ │ │ ├── page.css
│ │ │ └── page.js
│ │ ├── langs/
│ │ │ ├── cloud_lang.strings
│ │ │ ├── de.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── en.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── es.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── it.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── ko.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── lang.strings
│ │ │ ├── nl.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── pt-BR.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── refresh.py
│ │ │ ├── refresh.sh
│ │ │ └── stale.py
│ │ ├── night-custom-base.tdesktop-theme
│ │ ├── night-green.tdesktop-theme
│ │ ├── night.tdesktop-theme
│ │ ├── numbers.txt
│ │ ├── picker_html/
│ │ │ ├── picker.css
│ │ │ └── picker.js
│ │ ├── qrc/
│ │ │ ├── emoji_1.qrc
│ │ │ ├── emoji_2.qrc
│ │ │ ├── emoji_3.qrc
│ │ │ ├── emoji_4.qrc
│ │ │ ├── emoji_5.qrc
│ │ │ ├── emoji_6.qrc
│ │ │ ├── emoji_7.qrc
│ │ │ ├── emoji_8.qrc
│ │ │ ├── emoji_preview.qrc
│ │ │ ├── telegram/
│ │ │ │ ├── animations.qrc
│ │ │ │ ├── export.qrc
│ │ │ │ ├── iv.qrc
│ │ │ │ ├── mac_icons.qrc
│ │ │ │ ├── picker.qrc
│ │ │ │ ├── sounds.qrc
│ │ │ │ └── telegram.qrc
│ │ │ └── telegram.qrc
│ │ ├── uwp/
│ │ │ ├── AppX/
│ │ │ │ └── AppxManifest.xml
│ │ │ └── priconfig.xml
│ │ └── winrc/
│ │ ├── Telegram.manifest
│ │ ├── Telegram.rc
│ │ └── Updater.rc
│ ├── SourceFiles/
│ │ ├── _other/
│ │ │ ├── packer.cpp
│ │ │ ├── packer.h
│ │ │ ├── startup_task_win.cpp
│ │ │ ├── updater.h
│ │ │ ├── updater_linux.cpp
│ │ │ ├── updater_osx.m
│ │ │ └── updater_win.cpp
│ │ ├── api/
│ │ │ ├── api_as_copy.cpp
│ │ │ ├── api_as_copy.h
│ │ │ ├── api_attached_stickers.cpp
│ │ │ ├── api_attached_stickers.h
│ │ │ ├── api_authorizations.cpp
│ │ │ ├── api_authorizations.h
│ │ │ ├── api_blocked_peers.cpp
│ │ │ ├── api_blocked_peers.h
│ │ │ ├── api_bot.cpp
│ │ │ ├── api_bot.h
│ │ │ ├── api_chat_filters.cpp
│ │ │ ├── api_chat_filters.h
│ │ │ ├── api_chat_filters_remove_manager.cpp
│ │ │ ├── api_chat_filters_remove_manager.h
│ │ │ ├── api_chat_invite.cpp
│ │ │ ├── api_chat_invite.h
│ │ │ ├── api_chat_links.cpp
│ │ │ ├── api_chat_links.h
│ │ │ ├── api_chat_participants.cpp
│ │ │ ├── api_chat_participants.h
│ │ │ ├── api_cloud_password.cpp
│ │ │ ├── api_cloud_password.h
│ │ │ ├── api_common.cpp
│ │ │ ├── api_common.h
│ │ │ ├── api_compose_with_ai.cpp
│ │ │ ├── api_compose_with_ai.h
│ │ │ ├── api_confirm_phone.cpp
│ │ │ ├── api_confirm_phone.h
│ │ │ ├── api_credits.cpp
│ │ │ ├── api_credits.h
│ │ │ ├── api_credits_history_entry.cpp
│ │ │ ├── api_credits_history_entry.h
│ │ │ ├── api_earn.cpp
│ │ │ ├── api_earn.h
│ │ │ ├── api_editing.cpp
│ │ │ ├── api_editing.h
│ │ │ ├── api_filter_updates.h
│ │ │ ├── api_global_privacy.cpp
│ │ │ ├── api_global_privacy.h
│ │ │ ├── api_hash.cpp
│ │ │ ├── api_hash.h
│ │ │ ├── api_invite_links.cpp
│ │ │ ├── api_invite_links.h
│ │ │ ├── api_media.cpp
│ │ │ ├── api_media.h
│ │ │ ├── api_messages_search.cpp
│ │ │ ├── api_messages_search.h
│ │ │ ├── api_messages_search_merged.cpp
│ │ │ ├── api_messages_search_merged.h
│ │ │ ├── api_peer_colors.cpp
│ │ │ ├── api_peer_colors.h
│ │ │ ├── api_peer_photo.cpp
│ │ │ ├── api_peer_photo.h
│ │ │ ├── api_peer_search.cpp
│ │ │ ├── api_peer_search.h
│ │ │ ├── api_polls.cpp
│ │ │ ├── api_polls.h
│ │ │ ├── api_premium.cpp
│ │ │ ├── api_premium.h
│ │ │ ├── api_premium_option.cpp
│ │ │ ├── api_premium_option.h
│ │ │ ├── api_reactions_notify_settings.cpp
│ │ │ ├── api_reactions_notify_settings.h
│ │ │ ├── api_read_metrics.cpp
│ │ │ ├── api_read_metrics.h
│ │ │ ├── api_report.cpp
│ │ │ ├── api_report.h
│ │ │ ├── api_ringtones.cpp
│ │ │ ├── api_ringtones.h
│ │ │ ├── api_self_destruct.cpp
│ │ │ ├── api_self_destruct.h
│ │ │ ├── api_send_progress.cpp
│ │ │ ├── api_send_progress.h
│ │ │ ├── api_sending.cpp
│ │ │ ├── api_sending.h
│ │ │ ├── api_sensitive_content.cpp
│ │ │ ├── api_sensitive_content.h
│ │ │ ├── api_single_message_search.cpp
│ │ │ ├── api_single_message_search.h
│ │ │ ├── api_statistics.cpp
│ │ │ ├── api_statistics.h
│ │ │ ├── api_statistics_data_deserialize.cpp
│ │ │ ├── api_statistics_data_deserialize.h
│ │ │ ├── api_statistics_sender.cpp
│ │ │ ├── api_statistics_sender.h
│ │ │ ├── api_suggest_post.cpp
│ │ │ ├── api_suggest_post.h
│ │ │ ├── api_text_entities.cpp
│ │ │ ├── api_text_entities.h
│ │ │ ├── api_todo_lists.cpp
│ │ │ ├── api_todo_lists.h
│ │ │ ├── api_toggling_media.cpp
│ │ │ ├── api_toggling_media.h
│ │ │ ├── api_transcribes.cpp
│ │ │ ├── api_transcribes.h
│ │ │ ├── api_unread_things.cpp
│ │ │ ├── api_unread_things.h
│ │ │ ├── api_updates.cpp
│ │ │ ├── api_updates.h
│ │ │ ├── api_user_names.cpp
│ │ │ ├── api_user_names.h
│ │ │ ├── api_user_privacy.cpp
│ │ │ ├── api_user_privacy.h
│ │ │ ├── api_views.cpp
│ │ │ ├── api_views.h
│ │ │ ├── api_websites.cpp
│ │ │ ├── api_websites.h
│ │ │ ├── api_who_reacted.cpp
│ │ │ └── api_who_reacted.h
│ │ ├── apiwrap.cpp
│ │ ├── apiwrap.h
│ │ ├── boxes/
│ │ │ ├── about_box.cpp
│ │ │ ├── about_box.h
│ │ │ ├── about_sponsored_box.cpp
│ │ │ ├── about_sponsored_box.h
│ │ │ ├── abstract_box.cpp
│ │ │ ├── abstract_box.h
│ │ │ ├── add_contact_box.cpp
│ │ │ ├── add_contact_box.h
│ │ │ ├── auto_download_box.cpp
│ │ │ ├── auto_download_box.h
│ │ │ ├── auto_lock_box.cpp
│ │ │ ├── auto_lock_box.h
│ │ │ ├── background_box.cpp
│ │ │ ├── background_box.h
│ │ │ ├── background_preview_box.cpp
│ │ │ ├── background_preview_box.h
│ │ │ ├── boxes.style
│ │ │ ├── choose_filter_box.cpp
│ │ │ ├── choose_filter_box.h
│ │ │ ├── compose_ai_box.cpp
│ │ │ ├── compose_ai_box.h
│ │ │ ├── confirm_box.cpp
│ │ │ ├── connection_box.cpp
│ │ │ ├── connection_box.h
│ │ │ ├── contacts_box.cpp
│ │ │ ├── create_poll_box.cpp
│ │ │ ├── create_poll_box.h
│ │ │ ├── delete_messages_box.cpp
│ │ │ ├── delete_messages_box.h
│ │ │ ├── dictionaries_manager.cpp
│ │ │ ├── dictionaries_manager.h
│ │ │ ├── download_path_box.cpp
│ │ │ ├── download_path_box.h
│ │ │ ├── edit_caption_box.cpp
│ │ │ ├── edit_caption_box.h
│ │ │ ├── edit_privacy_box.cpp
│ │ │ ├── edit_privacy_box.h
│ │ │ ├── edit_todo_list_box.cpp
│ │ │ ├── edit_todo_list_box.h
│ │ │ ├── filters/
│ │ │ │ ├── edit_filter_box.cpp
│ │ │ │ ├── edit_filter_box.h
│ │ │ │ ├── edit_filter_chats_list.cpp
│ │ │ │ ├── edit_filter_chats_list.h
│ │ │ │ ├── edit_filter_chats_preview.cpp
│ │ │ │ ├── edit_filter_chats_preview.h
│ │ │ │ ├── edit_filter_links.cpp
│ │ │ │ └── edit_filter_links.h
│ │ │ ├── gift_credits_box.cpp
│ │ │ ├── gift_credits_box.h
│ │ │ ├── gift_premium_box.cpp
│ │ │ ├── gift_premium_box.h
│ │ │ ├── language_box.cpp
│ │ │ ├── language_box.h
│ │ │ ├── local_storage_box.cpp
│ │ │ ├── local_storage_box.h
│ │ │ ├── max_invite_box.cpp
│ │ │ ├── max_invite_box.h
│ │ │ ├── moderate_messages_box.cpp
│ │ │ ├── moderate_messages_box.h
│ │ │ ├── passcode_box.cpp
│ │ │ ├── passcode_box.h
│ │ │ ├── peer_list_box.cpp
│ │ │ ├── peer_list_box.h
│ │ │ ├── peer_list_controllers.cpp
│ │ │ ├── peer_list_controllers.h
│ │ │ ├── peer_list_widgets.cpp
│ │ │ ├── peer_list_widgets.h
│ │ │ ├── peer_lists_box.cpp
│ │ │ ├── peer_lists_box.h
│ │ │ ├── peers/
│ │ │ │ ├── add_bot_to_chat_box.cpp
│ │ │ │ ├── add_bot_to_chat_box.h
│ │ │ │ ├── add_participants_box.cpp
│ │ │ │ ├── add_participants_box.h
│ │ │ │ ├── channel_ownership_transfer.cpp
│ │ │ │ ├── channel_ownership_transfer.h
│ │ │ │ ├── choose_peer_box.cpp
│ │ │ │ ├── choose_peer_box.h
│ │ │ │ ├── create_managed_bot_box.cpp
│ │ │ │ ├── create_managed_bot_box.h
│ │ │ │ ├── edit_contact_box.cpp
│ │ │ │ ├── edit_contact_box.h
│ │ │ │ ├── edit_discussion_link_box.cpp
│ │ │ │ ├── edit_discussion_link_box.h
│ │ │ │ ├── edit_forum_topic_box.cpp
│ │ │ │ ├── edit_forum_topic_box.h
│ │ │ │ ├── edit_members_visible.cpp
│ │ │ │ ├── edit_members_visible.h
│ │ │ │ ├── edit_participant_box.cpp
│ │ │ │ ├── edit_participant_box.h
│ │ │ │ ├── edit_participants_box.cpp
│ │ │ │ ├── edit_participants_box.h
│ │ │ │ ├── edit_peer_color_box.cpp
│ │ │ │ ├── edit_peer_color_box.h
│ │ │ │ ├── edit_peer_common.h
│ │ │ │ ├── edit_peer_history_visibility_box.cpp
│ │ │ │ ├── edit_peer_history_visibility_box.h
│ │ │ │ ├── edit_peer_info_box.cpp
│ │ │ │ ├── edit_peer_info_box.h
│ │ │ │ ├── edit_peer_invite_link.cpp
│ │ │ │ ├── edit_peer_invite_link.h
│ │ │ │ ├── edit_peer_invite_links.cpp
│ │ │ │ ├── edit_peer_invite_links.h
│ │ │ │ ├── edit_peer_permissions_box.cpp
│ │ │ │ ├── edit_peer_permissions_box.h
│ │ │ │ ├── edit_peer_reactions.cpp
│ │ │ │ ├── edit_peer_reactions.h
│ │ │ │ ├── edit_peer_requests_box.cpp
│ │ │ │ ├── edit_peer_requests_box.h
│ │ │ │ ├── edit_peer_type_box.cpp
│ │ │ │ ├── edit_peer_type_box.h
│ │ │ │ ├── edit_peer_usernames_list.cpp
│ │ │ │ ├── edit_peer_usernames_list.h
│ │ │ │ ├── edit_tag_control.cpp
│ │ │ │ ├── edit_tag_control.h
│ │ │ │ ├── peer_short_info_box.cpp
│ │ │ │ ├── peer_short_info_box.h
│ │ │ │ ├── prepare_short_info_box.cpp
│ │ │ │ ├── prepare_short_info_box.h
│ │ │ │ ├── replace_boost_box.cpp
│ │ │ │ ├── replace_boost_box.h
│ │ │ │ ├── tag_info_box.cpp
│ │ │ │ ├── tag_info_box.h
│ │ │ │ ├── toggle_topics_box.cpp
│ │ │ │ ├── toggle_topics_box.h
│ │ │ │ ├── verify_peers_box.cpp
│ │ │ │ └── verify_peers_box.h
│ │ │ ├── phone_banned_box.cpp
│ │ │ ├── phone_banned_box.h
│ │ │ ├── pin_messages_box.cpp
│ │ │ ├── pin_messages_box.h
│ │ │ ├── polls.style
│ │ │ ├── premium_limits_box.cpp
│ │ │ ├── premium_limits_box.h
│ │ │ ├── premium_preview_box.cpp
│ │ │ ├── premium_preview_box.h
│ │ │ ├── reactions_settings_box.cpp
│ │ │ ├── reactions_settings_box.h
│ │ │ ├── report_messages_box.cpp
│ │ │ ├── report_messages_box.h
│ │ │ ├── ringtones_box.cpp
│ │ │ ├── ringtones_box.h
│ │ │ ├── select_future_owner_box.cpp
│ │ │ ├── select_future_owner_box.h
│ │ │ ├── self_destruction_box.cpp
│ │ │ ├── self_destruction_box.h
│ │ │ ├── send_credits_box.cpp
│ │ │ ├── send_credits_box.h
│ │ │ ├── send_files_box.cpp
│ │ │ ├── send_files_box.h
│ │ │ ├── send_gif_with_caption_box.cpp
│ │ │ ├── send_gif_with_caption_box.h
│ │ │ ├── share_box.cpp
│ │ │ ├── share_box.h
│ │ │ ├── star_gift_auction_box.cpp
│ │ │ ├── star_gift_auction_box.h
│ │ │ ├── star_gift_box.cpp
│ │ │ ├── star_gift_box.h
│ │ │ ├── star_gift_cover_box.cpp
│ │ │ ├── star_gift_cover_box.h
│ │ │ ├── star_gift_craft_animation.cpp
│ │ │ ├── star_gift_craft_animation.h
│ │ │ ├── star_gift_craft_box.cpp
│ │ │ ├── star_gift_craft_box.h
│ │ │ ├── star_gift_preview_box.cpp
│ │ │ ├── star_gift_preview_box.h
│ │ │ ├── star_gift_resale_box.cpp
│ │ │ ├── star_gift_resale_box.h
│ │ │ ├── sticker_set_box.cpp
│ │ │ ├── sticker_set_box.h
│ │ │ ├── stickers_box.cpp
│ │ │ ├── stickers_box.h
│ │ │ ├── transfer_gift_box.cpp
│ │ │ ├── transfer_gift_box.h
│ │ │ ├── translate_box.cpp
│ │ │ ├── translate_box.h
│ │ │ ├── translate_box_content.cpp
│ │ │ ├── translate_box_content.h
│ │ │ ├── url_auth_box.cpp
│ │ │ ├── url_auth_box.h
│ │ │ ├── url_auth_box_content.cpp
│ │ │ ├── url_auth_box_content.h
│ │ │ ├── username_box.cpp
│ │ │ └── username_box.h
│ │ ├── calls/
│ │ │ ├── calls.style
│ │ │ ├── calls_box_controller.cpp
│ │ │ ├── calls_box_controller.h
│ │ │ ├── calls_call.cpp
│ │ │ ├── calls_call.h
│ │ │ ├── calls_controller.cpp
│ │ │ ├── calls_controller.h
│ │ │ ├── calls_controller_tgvoip.h
│ │ │ ├── calls_controller_webrtc.cpp
│ │ │ ├── calls_controller_webrtc.h
│ │ │ ├── calls_emoji_fingerprint.cpp
│ │ │ ├── calls_emoji_fingerprint.h
│ │ │ ├── calls_instance.cpp
│ │ │ ├── calls_instance.h
│ │ │ ├── calls_panel.cpp
│ │ │ ├── calls_panel.h
│ │ │ ├── calls_panel_background.cpp
│ │ │ ├── calls_panel_background.h
│ │ │ ├── calls_signal_bars.cpp
│ │ │ ├── calls_signal_bars.h
│ │ │ ├── calls_top_bar.cpp
│ │ │ ├── calls_top_bar.h
│ │ │ ├── calls_userpic.cpp
│ │ │ ├── calls_userpic.h
│ │ │ ├── calls_video_bubble.cpp
│ │ │ ├── calls_video_bubble.h
│ │ │ ├── calls_video_incoming.cpp
│ │ │ ├── calls_video_incoming.h
│ │ │ ├── calls_window.cpp
│ │ │ ├── calls_window.h
│ │ │ ├── group/
│ │ │ │ ├── calls_choose_join_as.cpp
│ │ │ │ ├── calls_choose_join_as.h
│ │ │ │ ├── calls_cover_item.cpp
│ │ │ │ ├── calls_cover_item.h
│ │ │ │ ├── calls_group_call.cpp
│ │ │ │ ├── calls_group_call.h
│ │ │ │ ├── calls_group_common.cpp
│ │ │ │ ├── calls_group_common.h
│ │ │ │ ├── calls_group_invite_controller.cpp
│ │ │ │ ├── calls_group_invite_controller.h
│ │ │ │ ├── calls_group_members.cpp
│ │ │ │ ├── calls_group_members.h
│ │ │ │ ├── calls_group_members_row.cpp
│ │ │ │ ├── calls_group_members_row.h
│ │ │ │ ├── calls_group_menu.cpp
│ │ │ │ ├── calls_group_menu.h
│ │ │ │ ├── calls_group_message_encryption.cpp
│ │ │ │ ├── calls_group_message_encryption.h
│ │ │ │ ├── calls_group_message_field.cpp
│ │ │ │ ├── calls_group_message_field.h
│ │ │ │ ├── calls_group_messages.cpp
│ │ │ │ ├── calls_group_messages.h
│ │ │ │ ├── calls_group_messages_ui.cpp
│ │ │ │ ├── calls_group_messages_ui.h
│ │ │ │ ├── calls_group_panel.cpp
│ │ │ │ ├── calls_group_panel.h
│ │ │ │ ├── calls_group_rtmp.cpp
│ │ │ │ ├── calls_group_rtmp.h
│ │ │ │ ├── calls_group_settings.cpp
│ │ │ │ ├── calls_group_settings.h
│ │ │ │ ├── calls_group_stars_box.cpp
│ │ │ │ ├── calls_group_stars_box.h
│ │ │ │ ├── calls_group_toasts.cpp
│ │ │ │ ├── calls_group_toasts.h
│ │ │ │ ├── calls_group_viewport.cpp
│ │ │ │ ├── calls_group_viewport.h
│ │ │ │ ├── calls_group_viewport_opengl.cpp
│ │ │ │ ├── calls_group_viewport_opengl.h
│ │ │ │ ├── calls_group_viewport_raster.cpp
│ │ │ │ ├── calls_group_viewport_raster.h
│ │ │ │ ├── calls_group_viewport_rhi.cpp
│ │ │ │ ├── calls_group_viewport_rhi.h
│ │ │ │ ├── calls_group_viewport_tile.cpp
│ │ │ │ ├── calls_group_viewport_tile.h
│ │ │ │ ├── calls_volume_item.cpp
│ │ │ │ ├── calls_volume_item.h
│ │ │ │ └── ui/
│ │ │ │ ├── calls_group_recording_box.cpp
│ │ │ │ ├── calls_group_recording_box.h
│ │ │ │ ├── calls_group_scheduled_labels.cpp
│ │ │ │ ├── calls_group_scheduled_labels.h
│ │ │ │ ├── calls_group_stars_coloring.cpp
│ │ │ │ ├── calls_group_stars_coloring.h
│ │ │ │ ├── desktop_capture_choose_source.cpp
│ │ │ │ └── desktop_capture_choose_source.h
│ │ │ └── ui/
│ │ │ ├── calls_device_menu.cpp
│ │ │ └── calls_device_menu.h
│ │ ├── chat_helpers/
│ │ │ ├── bot_command.cpp
│ │ │ ├── bot_command.h
│ │ │ ├── bot_keyboard.cpp
│ │ │ ├── bot_keyboard.h
│ │ │ ├── chat_helpers.style
│ │ │ ├── compose/
│ │ │ │ ├── compose_features.h
│ │ │ │ ├── compose_show.cpp
│ │ │ │ └── compose_show.h
│ │ │ ├── emoji_interactions.cpp
│ │ │ ├── emoji_interactions.h
│ │ │ ├── emoji_keywords.cpp
│ │ │ ├── emoji_keywords.h
│ │ │ ├── emoji_list_widget.cpp
│ │ │ ├── emoji_list_widget.h
│ │ │ ├── emoji_sets_manager.cpp
│ │ │ ├── emoji_sets_manager.h
│ │ │ ├── emoji_suggestions_widget.cpp
│ │ │ ├── emoji_suggestions_widget.h
│ │ │ ├── field_autocomplete.cpp
│ │ │ ├── field_autocomplete.h
│ │ │ ├── field_characters_count_manager.cpp
│ │ │ ├── field_characters_count_manager.h
│ │ │ ├── gifs_list_widget.cpp
│ │ │ ├── gifs_list_widget.h
│ │ │ ├── message_field.cpp
│ │ │ ├── message_field.h
│ │ │ ├── share_message_phrase_factory.cpp
│ │ │ ├── share_message_phrase_factory.h
│ │ │ ├── spellchecker_common.cpp
│ │ │ ├── spellchecker_common.h
│ │ │ ├── stickers_dice_pack.cpp
│ │ │ ├── stickers_dice_pack.h
│ │ │ ├── stickers_emoji_image_loader.cpp
│ │ │ ├── stickers_emoji_image_loader.h
│ │ │ ├── stickers_emoji_pack.cpp
│ │ │ ├── stickers_emoji_pack.h
│ │ │ ├── stickers_gift_box_pack.cpp
│ │ │ ├── stickers_gift_box_pack.h
│ │ │ ├── stickers_list_footer.cpp
│ │ │ ├── stickers_list_footer.h
│ │ │ ├── stickers_list_widget.cpp
│ │ │ ├── stickers_list_widget.h
│ │ │ ├── stickers_lottie.cpp
│ │ │ ├── stickers_lottie.h
│ │ │ ├── tabbed_panel.cpp
│ │ │ ├── tabbed_panel.h
│ │ │ ├── tabbed_section.cpp
│ │ │ ├── tabbed_section.h
│ │ │ ├── tabbed_selector.cpp
│ │ │ ├── tabbed_selector.h
│ │ │ ├── ttl_media_layer_widget.cpp
│ │ │ └── ttl_media_layer_widget.h
│ │ ├── codegen/
│ │ │ └── scheme/
│ │ │ └── codegen_scheme.py
│ │ ├── config.h
│ │ ├── core/
│ │ │ ├── application.cpp
│ │ │ ├── application.h
│ │ │ ├── bank_card_click_handler.cpp
│ │ │ ├── bank_card_click_handler.h
│ │ │ ├── base_integration.cpp
│ │ │ ├── base_integration.h
│ │ │ ├── cached_webview_availability.h
│ │ │ ├── changelogs.cpp
│ │ │ ├── changelogs.h
│ │ │ ├── click_handler_types.cpp
│ │ │ ├── click_handler_types.h
│ │ │ ├── core_cloud_password.cpp
│ │ │ ├── core_cloud_password.h
│ │ │ ├── core_settings.cpp
│ │ │ ├── core_settings.h
│ │ │ ├── core_settings_proxy.cpp
│ │ │ ├── core_settings_proxy.h
│ │ │ ├── crash_report_window.cpp
│ │ │ ├── crash_report_window.h
│ │ │ ├── crash_reports.cpp
│ │ │ ├── crash_reports.h
│ │ │ ├── credits_amount.h
│ │ │ ├── current_geo_location.cpp
│ │ │ ├── current_geo_location.h
│ │ │ ├── deadlock_detector.h
│ │ │ ├── deep_links/
│ │ │ │ ├── deep_links_chats.cpp
│ │ │ │ ├── deep_links_chats.h
│ │ │ │ ├── deep_links_contacts.cpp
│ │ │ │ ├── deep_links_contacts.h
│ │ │ │ ├── deep_links_new.cpp
│ │ │ │ ├── deep_links_new.h
│ │ │ │ ├── deep_links_router.cpp
│ │ │ │ ├── deep_links_router.h
│ │ │ │ ├── deep_links_settings.cpp
│ │ │ │ ├── deep_links_settings.h
│ │ │ │ └── deep_links_types.h
│ │ │ ├── file_location.cpp
│ │ │ ├── file_location.h
│ │ │ ├── file_utilities.cpp
│ │ │ ├── file_utilities.h
│ │ │ ├── fork_settings.cpp
│ │ │ ├── fork_settings.h
│ │ │ ├── launcher.cpp
│ │ │ ├── launcher.h
│ │ │ ├── local_url_handlers.cpp
│ │ │ ├── local_url_handlers.h
│ │ │ ├── mime_type.cpp
│ │ │ ├── mime_type.h
│ │ │ ├── phone_click_handler.cpp
│ │ │ ├── phone_click_handler.h
│ │ │ ├── sandbox.cpp
│ │ │ ├── sandbox.h
│ │ │ ├── shortcuts.cpp
│ │ │ ├── shortcuts.h
│ │ │ ├── ui_integration.cpp
│ │ │ ├── ui_integration.h
│ │ │ ├── update_checker.cpp
│ │ │ ├── update_checker.h
│ │ │ ├── utils.cpp
│ │ │ ├── utils.h
│ │ │ └── version.h
│ │ ├── countries/
│ │ │ ├── countries_instance.cpp
│ │ │ ├── countries_instance.h
│ │ │ ├── countries_manager.cpp
│ │ │ └── countries_manager.h
│ │ ├── data/
│ │ │ ├── business/
│ │ │ │ ├── data_business_chatbots.cpp
│ │ │ │ ├── data_business_chatbots.h
│ │ │ │ ├── data_business_common.cpp
│ │ │ │ ├── data_business_common.h
│ │ │ │ ├── data_business_info.cpp
│ │ │ │ ├── data_business_info.h
│ │ │ │ ├── data_shortcut_messages.cpp
│ │ │ │ └── data_shortcut_messages.h
│ │ │ ├── components/
│ │ │ │ ├── credits.cpp
│ │ │ │ ├── credits.h
│ │ │ │ ├── factchecks.cpp
│ │ │ │ ├── factchecks.h
│ │ │ │ ├── gift_auctions.cpp
│ │ │ │ ├── gift_auctions.h
│ │ │ │ ├── location_pickers.cpp
│ │ │ │ ├── location_pickers.h
│ │ │ │ ├── passkeys.cpp
│ │ │ │ ├── passkeys.h
│ │ │ │ ├── promo_suggestions.cpp
│ │ │ │ ├── promo_suggestions.h
│ │ │ │ ├── recent_peers.cpp
│ │ │ │ ├── recent_peers.h
│ │ │ │ ├── recent_shared_media_gifts.cpp
│ │ │ │ ├── recent_shared_media_gifts.h
│ │ │ │ ├── scheduled_messages.cpp
│ │ │ │ ├── scheduled_messages.h
│ │ │ │ ├── sponsored_messages.cpp
│ │ │ │ ├── sponsored_messages.h
│ │ │ │ ├── top_peers.cpp
│ │ │ │ └── top_peers.h
│ │ │ ├── data_abstract_sparse_ids.h
│ │ │ ├── data_abstract_structure.cpp
│ │ │ ├── data_abstract_structure.h
│ │ │ ├── data_audio_msg_id.cpp
│ │ │ ├── data_audio_msg_id.h
│ │ │ ├── data_authorization.h
│ │ │ ├── data_auto_download.cpp
│ │ │ ├── data_auto_download.h
│ │ │ ├── data_birthday.cpp
│ │ │ ├── data_birthday.h
│ │ │ ├── data_boosts.h
│ │ │ ├── data_bot_app.cpp
│ │ │ ├── data_bot_app.h
│ │ │ ├── data_changes.cpp
│ │ │ ├── data_changes.h
│ │ │ ├── data_channel.cpp
│ │ │ ├── data_channel.h
│ │ │ ├── data_channel_admins.cpp
│ │ │ ├── data_channel_admins.h
│ │ │ ├── data_channel_earn.h
│ │ │ ├── data_chat.cpp
│ │ │ ├── data_chat.h
│ │ │ ├── data_chat_filters.cpp
│ │ │ ├── data_chat_filters.h
│ │ │ ├── data_chat_participant_status.cpp
│ │ │ ├── data_chat_participant_status.h
│ │ │ ├── data_cloud_file.cpp
│ │ │ ├── data_cloud_file.h
│ │ │ ├── data_cloud_themes.cpp
│ │ │ ├── data_cloud_themes.h
│ │ │ ├── data_credits.h
│ │ │ ├── data_credits_earn.h
│ │ │ ├── data_document.cpp
│ │ │ ├── data_document.h
│ │ │ ├── data_document_media.cpp
│ │ │ ├── data_document_media.h
│ │ │ ├── data_document_resolver.cpp
│ │ │ ├── data_document_resolver.h
│ │ │ ├── data_download_manager.cpp
│ │ │ ├── data_download_manager.h
│ │ │ ├── data_drafts.cpp
│ │ │ ├── data_drafts.h
│ │ │ ├── data_emoji_statuses.cpp
│ │ │ ├── data_emoji_statuses.h
│ │ │ ├── data_file_click_handler.cpp
│ │ │ ├── data_file_click_handler.h
│ │ │ ├── data_file_origin.cpp
│ │ │ ├── data_file_origin.h
│ │ │ ├── data_flags.h
│ │ │ ├── data_folder.cpp
│ │ │ ├── data_folder.h
│ │ │ ├── data_forum.cpp
│ │ │ ├── data_forum.h
│ │ │ ├── data_forum_icons.cpp
│ │ │ ├── data_forum_icons.h
│ │ │ ├── data_forum_topic.cpp
│ │ │ ├── data_forum_topic.h
│ │ │ ├── data_game.cpp
│ │ │ ├── data_game.h
│ │ │ ├── data_group_call.cpp
│ │ │ ├── data_group_call.h
│ │ │ ├── data_groups.cpp
│ │ │ ├── data_groups.h
│ │ │ ├── data_histories.cpp
│ │ │ ├── data_histories.h
│ │ │ ├── data_history_messages.cpp
│ │ │ ├── data_history_messages.h
│ │ │ ├── data_lastseen_status.h
│ │ │ ├── data_location.cpp
│ │ │ ├── data_location.h
│ │ │ ├── data_media_preload.cpp
│ │ │ ├── data_media_preload.h
│ │ │ ├── data_media_rotation.cpp
│ │ │ ├── data_media_rotation.h
│ │ │ ├── data_media_types.cpp
│ │ │ ├── data_media_types.h
│ │ │ ├── data_message_reaction_id.cpp
│ │ │ ├── data_message_reaction_id.h
│ │ │ ├── data_message_reactions.cpp
│ │ │ ├── data_message_reactions.h
│ │ │ ├── data_messages.cpp
│ │ │ ├── data_messages.h
│ │ │ ├── data_msg_id.h
│ │ │ ├── data_passkey_deserialize.cpp
│ │ │ ├── data_passkey_deserialize.h
│ │ │ ├── data_peer.cpp
│ │ │ ├── data_peer.h
│ │ │ ├── data_peer_bot_command.cpp
│ │ │ ├── data_peer_bot_command.h
│ │ │ ├── data_peer_bot_commands.cpp
│ │ │ ├── data_peer_bot_commands.h
│ │ │ ├── data_peer_colors.h
│ │ │ ├── data_peer_common.h
│ │ │ ├── data_peer_id.cpp
│ │ │ ├── data_peer_id.h
│ │ │ ├── data_peer_values.cpp
│ │ │ ├── data_peer_values.h
│ │ │ ├── data_photo.cpp
│ │ │ ├── data_photo.h
│ │ │ ├── data_photo_media.cpp
│ │ │ ├── data_photo_media.h
│ │ │ ├── data_poll.cpp
│ │ │ ├── data_poll.h
│ │ │ ├── data_poll_messages.cpp
│ │ │ ├── data_poll_messages.h
│ │ │ ├── data_premium_limits.cpp
│ │ │ ├── data_premium_limits.h
│ │ │ ├── data_premium_subscription_option.h
│ │ │ ├── data_pts_waiter.cpp
│ │ │ ├── data_pts_waiter.h
│ │ │ ├── data_replies_list.cpp
│ │ │ ├── data_replies_list.h
│ │ │ ├── data_reply_preview.cpp
│ │ │ ├── data_reply_preview.h
│ │ │ ├── data_report.h
│ │ │ ├── data_saved_messages.cpp
│ │ │ ├── data_saved_messages.h
│ │ │ ├── data_saved_music.cpp
│ │ │ ├── data_saved_music.h
│ │ │ ├── data_saved_sublist.cpp
│ │ │ ├── data_saved_sublist.h
│ │ │ ├── data_search_calendar.cpp
│ │ │ ├── data_search_calendar.h
│ │ │ ├── data_search_controller.cpp
│ │ │ ├── data_search_controller.h
│ │ │ ├── data_send_action.cpp
│ │ │ ├── data_send_action.h
│ │ │ ├── data_session.cpp
│ │ │ ├── data_session.h
│ │ │ ├── data_shared_media.cpp
│ │ │ ├── data_shared_media.h
│ │ │ ├── data_sparse_ids.cpp
│ │ │ ├── data_sparse_ids.h
│ │ │ ├── data_star_gift.cpp
│ │ │ ├── data_star_gift.h
│ │ │ ├── data_statistics.h
│ │ │ ├── data_statistics_chart.cpp
│ │ │ ├── data_statistics_chart.h
│ │ │ ├── data_stories.cpp
│ │ │ ├── data_stories.h
│ │ │ ├── data_stories_ids.cpp
│ │ │ ├── data_stories_ids.h
│ │ │ ├── data_story.cpp
│ │ │ ├── data_story.h
│ │ │ ├── data_streaming.cpp
│ │ │ ├── data_streaming.h
│ │ │ ├── data_subscriptions.h
│ │ │ ├── data_thread.cpp
│ │ │ ├── data_thread.h
│ │ │ ├── data_todo_list.cpp
│ │ │ ├── data_todo_list.h
│ │ │ ├── data_types.cpp
│ │ │ ├── data_types.h
│ │ │ ├── data_unread_value.cpp
│ │ │ ├── data_unread_value.h
│ │ │ ├── data_user.cpp
│ │ │ ├── data_user.h
│ │ │ ├── data_user_names.cpp
│ │ │ ├── data_user_names.h
│ │ │ ├── data_user_photos.cpp
│ │ │ ├── data_user_photos.h
│ │ │ ├── data_wall_paper.cpp
│ │ │ ├── data_wall_paper.h
│ │ │ ├── data_web_page.cpp
│ │ │ ├── data_web_page.h
│ │ │ ├── notify/
│ │ │ │ ├── data_notify_settings.cpp
│ │ │ │ ├── data_notify_settings.h
│ │ │ │ ├── data_peer_notify_settings.cpp
│ │ │ │ ├── data_peer_notify_settings.h
│ │ │ │ ├── data_peer_notify_volume.cpp
│ │ │ │ └── data_peer_notify_volume.h
│ │ │ ├── raw/
│ │ │ │ ├── raw_countries_bounds.cpp
│ │ │ │ └── raw_countries_bounds.h
│ │ │ └── stickers/
│ │ │ ├── data_custom_emoji.cpp
│ │ │ ├── data_custom_emoji.h
│ │ │ ├── data_stickers.cpp
│ │ │ ├── data_stickers.h
│ │ │ ├── data_stickers_set.cpp
│ │ │ └── data_stickers_set.h
│ │ ├── dialogs/
│ │ │ ├── dialogs.style
│ │ │ ├── dialogs_common.h
│ │ │ ├── dialogs_entry.cpp
│ │ │ ├── dialogs_entry.h
│ │ │ ├── dialogs_indexed_list.cpp
│ │ │ ├── dialogs_indexed_list.h
│ │ │ ├── dialogs_inner_widget.cpp
│ │ │ ├── dialogs_inner_widget.h
│ │ │ ├── dialogs_key.cpp
│ │ │ ├── dialogs_key.h
│ │ │ ├── dialogs_list.cpp
│ │ │ ├── dialogs_list.h
│ │ │ ├── dialogs_main_list.cpp
│ │ │ ├── dialogs_main_list.h
│ │ │ ├── dialogs_pinned_list.cpp
│ │ │ ├── dialogs_pinned_list.h
│ │ │ ├── dialogs_quick_action.cpp
│ │ │ ├── dialogs_quick_action.h
│ │ │ ├── dialogs_row.cpp
│ │ │ ├── dialogs_row.h
│ │ │ ├── dialogs_search_from_controllers.cpp
│ │ │ ├── dialogs_search_from_controllers.h
│ │ │ ├── dialogs_search_posts.cpp
│ │ │ ├── dialogs_search_posts.h
│ │ │ ├── dialogs_search_tags.cpp
│ │ │ ├── dialogs_search_tags.h
│ │ │ ├── dialogs_three_state_icon.h
│ │ │ ├── dialogs_top_bar_suggestion.cpp
│ │ │ ├── dialogs_top_bar_suggestion.h
│ │ │ ├── dialogs_widget.cpp
│ │ │ ├── dialogs_widget.h
│ │ │ └── ui/
│ │ │ ├── chat_search_empty.cpp
│ │ │ ├── chat_search_empty.h
│ │ │ ├── chat_search_in.cpp
│ │ │ ├── chat_search_in.h
│ │ │ ├── dialogs_layout.cpp
│ │ │ ├── dialogs_layout.h
│ │ │ ├── dialogs_message_view.cpp
│ │ │ ├── dialogs_message_view.h
│ │ │ ├── dialogs_quick_action.h
│ │ │ ├── dialogs_quick_action_context.h
│ │ │ ├── dialogs_stories_content.cpp
│ │ │ ├── dialogs_stories_content.h
│ │ │ ├── dialogs_stories_list.cpp
│ │ │ ├── dialogs_stories_list.h
│ │ │ ├── dialogs_suggestions.cpp
│ │ │ ├── dialogs_suggestions.h
│ │ │ ├── dialogs_top_bar_suggestion_content.cpp
│ │ │ ├── dialogs_top_bar_suggestion_content.h
│ │ │ ├── dialogs_topics_view.cpp
│ │ │ ├── dialogs_topics_view.h
│ │ │ ├── dialogs_video_userpic.cpp
│ │ │ ├── dialogs_video_userpic.h
│ │ │ ├── posts_search_intro.cpp
│ │ │ ├── posts_search_intro.h
│ │ │ ├── top_peers_strip.cpp
│ │ │ └── top_peers_strip.h
│ │ ├── editor/
│ │ │ ├── color_picker.cpp
│ │ │ ├── color_picker.h
│ │ │ ├── controllers/
│ │ │ │ ├── controllers.h
│ │ │ │ ├── stickers_panel_controller.cpp
│ │ │ │ ├── stickers_panel_controller.h
│ │ │ │ ├── undo_controller.cpp
│ │ │ │ └── undo_controller.h
│ │ │ ├── editor.style
│ │ │ ├── editor_crop.cpp
│ │ │ ├── editor_crop.h
│ │ │ ├── editor_layer_widget.cpp
│ │ │ ├── editor_layer_widget.h
│ │ │ ├── editor_paint.cpp
│ │ │ ├── editor_paint.h
│ │ │ ├── photo_editor.cpp
│ │ │ ├── photo_editor.h
│ │ │ ├── photo_editor_common.cpp
│ │ │ ├── photo_editor_common.h
│ │ │ ├── photo_editor_content.cpp
│ │ │ ├── photo_editor_content.h
│ │ │ ├── photo_editor_controls.cpp
│ │ │ ├── photo_editor_controls.h
│ │ │ ├── photo_editor_inner_common.h
│ │ │ ├── photo_editor_layer_widget.cpp
│ │ │ ├── photo_editor_layer_widget.h
│ │ │ └── scene/
│ │ │ ├── scene.cpp
│ │ │ ├── scene.h
│ │ │ ├── scene_item_base.cpp
│ │ │ ├── scene_item_base.h
│ │ │ ├── scene_item_canvas.cpp
│ │ │ ├── scene_item_canvas.h
│ │ │ ├── scene_item_image.cpp
│ │ │ ├── scene_item_image.h
│ │ │ ├── scene_item_line.cpp
│ │ │ ├── scene_item_line.h
│ │ │ ├── scene_item_sticker.cpp
│ │ │ └── scene_item_sticker.h
│ │ ├── export/
│ │ │ ├── data/
│ │ │ │ ├── export_data_types.cpp
│ │ │ │ └── export_data_types.h
│ │ │ ├── export_api_wrap.cpp
│ │ │ ├── export_api_wrap.h
│ │ │ ├── export_controller.cpp
│ │ │ ├── export_controller.h
│ │ │ ├── export_manager.cpp
│ │ │ ├── export_manager.h
│ │ │ ├── export_pch.h
│ │ │ ├── export_settings.cpp
│ │ │ ├── export_settings.h
│ │ │ ├── output/
│ │ │ │ ├── export_output_abstract.cpp
│ │ │ │ ├── export_output_abstract.h
│ │ │ │ ├── export_output_file.cpp
│ │ │ │ ├── export_output_file.h
│ │ │ │ ├── export_output_html.cpp
│ │ │ │ ├── export_output_html.h
│ │ │ │ ├── export_output_html_and_json.cpp
│ │ │ │ ├── export_output_html_and_json.h
│ │ │ │ ├── export_output_json.cpp
│ │ │ │ ├── export_output_json.h
│ │ │ │ ├── export_output_result.h
│ │ │ │ ├── export_output_stats.cpp
│ │ │ │ └── export_output_stats.h
│ │ │ └── view/
│ │ │ ├── export.style
│ │ │ ├── export_view_content.cpp
│ │ │ ├── export_view_content.h
│ │ │ ├── export_view_panel_controller.cpp
│ │ │ ├── export_view_panel_controller.h
│ │ │ ├── export_view_progress.cpp
│ │ │ ├── export_view_progress.h
│ │ │ ├── export_view_settings.cpp
│ │ │ ├── export_view_settings.h
│ │ │ ├── export_view_top_bar.cpp
│ │ │ └── export_view_top_bar.h
│ │ ├── ffmpeg/
│ │ │ ├── ffmpeg_bytes_io_wrap.h
│ │ │ ├── ffmpeg_frame_generator.cpp
│ │ │ ├── ffmpeg_frame_generator.h
│ │ │ ├── ffmpeg_utility.cpp
│ │ │ └── ffmpeg_utility.h
│ │ ├── forkgram/
│ │ │ ├── gpu_demo_renderer.cpp
│ │ │ ├── gpu_demo_renderer.h
│ │ │ ├── uri_menu.cpp
│ │ │ ├── uri_menu.h
│ │ │ ├── uri_open.cpp
│ │ │ └── uri_open.h
│ │ ├── history/
│ │ │ ├── admin_log/
│ │ │ │ ├── history_admin_log_filter.cpp
│ │ │ │ ├── history_admin_log_filter.h
│ │ │ │ ├── history_admin_log_filter_value.h
│ │ │ │ ├── history_admin_log_inner.cpp
│ │ │ │ ├── history_admin_log_inner.h
│ │ │ │ ├── history_admin_log_item.cpp
│ │ │ │ ├── history_admin_log_item.h
│ │ │ │ ├── history_admin_log_section.cpp
│ │ │ │ └── history_admin_log_section.h
│ │ │ ├── history.cpp
│ │ │ ├── history.h
│ │ │ ├── history_drag_area.cpp
│ │ │ ├── history_drag_area.h
│ │ │ ├── history_inner_widget.cpp
│ │ │ ├── history_inner_widget.h
│ │ │ ├── history_item.cpp
│ │ │ ├── history_item.h
│ │ │ ├── history_item_components.cpp
│ │ │ ├── history_item_components.h
│ │ │ ├── history_item_edition.cpp
│ │ │ ├── history_item_edition.h
│ │ │ ├── history_item_helpers.cpp
│ │ │ ├── history_item_helpers.h
│ │ │ ├── history_item_reply_markup.cpp
│ │ │ ├── history_item_reply_markup.h
│ │ │ ├── history_item_text.cpp
│ │ │ ├── history_item_text.h
│ │ │ ├── history_location_manager.cpp
│ │ │ ├── history_location_manager.h
│ │ │ ├── history_message.cpp
│ │ │ ├── history_streamed_drafts.cpp
│ │ │ ├── history_streamed_drafts.h
│ │ │ ├── history_translation.cpp
│ │ │ ├── history_translation.h
│ │ │ ├── history_unread_things.cpp
│ │ │ ├── history_unread_things.h
│ │ │ ├── history_view_highlight_manager.cpp
│ │ │ ├── history_view_highlight_manager.h
│ │ │ ├── history_view_swipe_back_session.cpp
│ │ │ ├── history_view_swipe_back_session.h
│ │ │ ├── history_view_top_toast.cpp
│ │ │ ├── history_view_top_toast.h
│ │ │ ├── history_widget.cpp
│ │ │ ├── history_widget.h
│ │ │ └── view/
│ │ │ ├── controls/
│ │ │ │ ├── compose_controls_common.h
│ │ │ │ ├── history_view_characters_limit.cpp
│ │ │ │ ├── history_view_characters_limit.h
│ │ │ │ ├── history_view_compose_ai_button.cpp
│ │ │ │ ├── history_view_compose_ai_button.h
│ │ │ │ ├── history_view_compose_ai_tooltip.cpp
│ │ │ │ ├── history_view_compose_ai_tooltip.h
│ │ │ │ ├── history_view_compose_controls.cpp
│ │ │ │ ├── history_view_compose_controls.h
│ │ │ │ ├── history_view_compose_media_edit_manager.cpp
│ │ │ │ ├── history_view_compose_media_edit_manager.h
│ │ │ │ ├── history_view_compose_search.cpp
│ │ │ │ ├── history_view_compose_search.h
│ │ │ │ ├── history_view_draft_options.cpp
│ │ │ │ ├── history_view_draft_options.h
│ │ │ │ ├── history_view_forward_panel.cpp
│ │ │ │ ├── history_view_forward_panel.h
│ │ │ │ ├── history_view_suggest_options.cpp
│ │ │ │ ├── history_view_suggest_options.h
│ │ │ │ ├── history_view_ttl_button.cpp
│ │ │ │ ├── history_view_ttl_button.h
│ │ │ │ ├── history_view_voice_record_bar.cpp
│ │ │ │ ├── history_view_voice_record_bar.h
│ │ │ │ ├── history_view_voice_record_button.cpp
│ │ │ │ ├── history_view_voice_record_button.h
│ │ │ │ ├── history_view_webpage_processor.cpp
│ │ │ │ └── history_view_webpage_processor.h
│ │ │ ├── history_view_about_view.cpp
│ │ │ ├── history_view_about_view.h
│ │ │ ├── history_view_add_poll_option.cpp
│ │ │ ├── history_view_add_poll_option.h
│ │ │ ├── history_view_bottom_info.cpp
│ │ │ ├── history_view_bottom_info.h
│ │ │ ├── history_view_chat_preview.cpp
│ │ │ ├── history_view_chat_preview.h
│ │ │ ├── history_view_chat_section.cpp
│ │ │ ├── history_view_chat_section.h
│ │ │ ├── history_view_contact_status.cpp
│ │ │ ├── history_view_contact_status.h
│ │ │ ├── history_view_context_menu.cpp
│ │ │ ├── history_view_context_menu.h
│ │ │ ├── history_view_context_menu_fork.cpp
│ │ │ ├── history_view_context_menu_fork.h
│ │ │ ├── history_view_corner_buttons.cpp
│ │ │ ├── history_view_corner_buttons.h
│ │ │ ├── history_view_cursor_state.cpp
│ │ │ ├── history_view_cursor_state.h
│ │ │ ├── history_view_draw_to_reply.cpp
│ │ │ ├── history_view_draw_to_reply.h
│ │ │ ├── history_view_element.cpp
│ │ │ ├── history_view_element.h
│ │ │ ├── history_view_element_overlay.cpp
│ │ │ ├── history_view_element_overlay.h
│ │ │ ├── history_view_emoji_interactions.cpp
│ │ │ ├── history_view_emoji_interactions.h
│ │ │ ├── history_view_empty_list_bubble.cpp
│ │ │ ├── history_view_empty_list_bubble.h
│ │ │ ├── history_view_fake_items.cpp
│ │ │ ├── history_view_fake_items.h
│ │ │ ├── history_view_group_call_bar.cpp
│ │ │ ├── history_view_group_call_bar.h
│ │ │ ├── history_view_group_members_widget.cpp
│ │ │ ├── history_view_group_members_widget.h
│ │ │ ├── history_view_item_preview.h
│ │ │ ├── history_view_list_widget.cpp
│ │ │ ├── history_view_list_widget.h
│ │ │ ├── history_view_message.cpp
│ │ │ ├── history_view_message.h
│ │ │ ├── history_view_object.h
│ │ │ ├── history_view_paid_reaction_toast.cpp
│ │ │ ├── history_view_paid_reaction_toast.h
│ │ │ ├── history_view_pinned_bar.cpp
│ │ │ ├── history_view_pinned_bar.h
│ │ │ ├── history_view_pinned_section.cpp
│ │ │ ├── history_view_pinned_section.h
│ │ │ ├── history_view_pinned_tracker.cpp
│ │ │ ├── history_view_pinned_tracker.h
│ │ │ ├── history_view_quick_action.cpp
│ │ │ ├── history_view_quick_action.h
│ │ │ ├── history_view_reaction_preview.cpp
│ │ │ ├── history_view_reaction_preview.h
│ │ │ ├── history_view_read_metrics_tracker.cpp
│ │ │ ├── history_view_read_metrics_tracker.h
│ │ │ ├── history_view_reply.cpp
│ │ │ ├── history_view_reply.h
│ │ │ ├── history_view_reply_button.cpp
│ │ │ ├── history_view_reply_button.h
│ │ │ ├── history_view_requests_bar.cpp
│ │ │ ├── history_view_requests_bar.h
│ │ │ ├── history_view_schedule_box.cpp
│ │ │ ├── history_view_schedule_box.h
│ │ │ ├── history_view_scheduled_section.cpp
│ │ │ ├── history_view_scheduled_section.h
│ │ │ ├── history_view_self_forwards_tagger.cpp
│ │ │ ├── history_view_self_forwards_tagger.h
│ │ │ ├── history_view_send_action.cpp
│ │ │ ├── history_view_send_action.h
│ │ │ ├── history_view_service_message.cpp
│ │ │ ├── history_view_service_message.h
│ │ │ ├── history_view_sponsored_click_handler.cpp
│ │ │ ├── history_view_sponsored_click_handler.h
│ │ │ ├── history_view_sticker_toast.cpp
│ │ │ ├── history_view_sticker_toast.h
│ │ │ ├── history_view_subsection_tabs.cpp
│ │ │ ├── history_view_subsection_tabs.h
│ │ │ ├── history_view_summary_header.cpp
│ │ │ ├── history_view_summary_header.h
│ │ │ ├── history_view_text_helper.cpp
│ │ │ ├── history_view_text_helper.h
│ │ │ ├── history_view_top_bar_widget.cpp
│ │ │ ├── history_view_top_bar_widget.h
│ │ │ ├── history_view_top_peers_selector.cpp
│ │ │ ├── history_view_top_peers_selector.h
│ │ │ ├── history_view_transcribe_button.cpp
│ │ │ ├── history_view_transcribe_button.h
│ │ │ ├── history_view_translate_bar.cpp
│ │ │ ├── history_view_translate_bar.h
│ │ │ ├── history_view_translate_tracker.cpp
│ │ │ ├── history_view_translate_tracker.h
│ │ │ ├── history_view_view_button.cpp
│ │ │ ├── history_view_view_button.h
│ │ │ ├── history_view_webpage_preview.cpp
│ │ │ ├── history_view_webpage_preview.h
│ │ │ ├── media/
│ │ │ │ ├── history_view_birthday_suggestion.cpp
│ │ │ │ ├── history_view_birthday_suggestion.h
│ │ │ │ ├── history_view_call.cpp
│ │ │ │ ├── history_view_call.h
│ │ │ │ ├── history_view_contact.cpp
│ │ │ │ ├── history_view_contact.h
│ │ │ │ ├── history_view_custom_emoji.cpp
│ │ │ │ ├── history_view_custom_emoji.h
│ │ │ │ ├── history_view_dice.cpp
│ │ │ │ ├── history_view_dice.h
│ │ │ │ ├── history_view_document.cpp
│ │ │ │ ├── history_view_document.h
│ │ │ │ ├── history_view_file.cpp
│ │ │ │ ├── history_view_file.h
│ │ │ │ ├── history_view_game.cpp
│ │ │ │ ├── history_view_game.h
│ │ │ │ ├── history_view_gif.cpp
│ │ │ │ ├── history_view_gif.h
│ │ │ │ ├── history_view_giveaway.cpp
│ │ │ │ ├── history_view_giveaway.h
│ │ │ │ ├── history_view_invoice.cpp
│ │ │ │ ├── history_view_invoice.h
│ │ │ │ ├── history_view_large_emoji.cpp
│ │ │ │ ├── history_view_large_emoji.h
│ │ │ │ ├── history_view_location.cpp
│ │ │ │ ├── history_view_location.h
│ │ │ │ ├── history_view_media.cpp
│ │ │ │ ├── history_view_media.h
│ │ │ │ ├── history_view_media_common.cpp
│ │ │ │ ├── history_view_media_common.h
│ │ │ │ ├── history_view_media_generic.cpp
│ │ │ │ ├── history_view_media_generic.h
│ │ │ │ ├── history_view_media_grouped.cpp
│ │ │ │ ├── history_view_media_grouped.h
│ │ │ │ ├── history_view_media_spoiler.cpp
│ │ │ │ ├── history_view_media_spoiler.h
│ │ │ │ ├── history_view_media_unwrapped.cpp
│ │ │ │ ├── history_view_media_unwrapped.h
│ │ │ │ ├── history_view_no_forwards_request.cpp
│ │ │ │ ├── history_view_no_forwards_request.h
│ │ │ │ ├── history_view_photo.cpp
│ │ │ │ ├── history_view_photo.h
│ │ │ │ ├── history_view_poll.cpp
│ │ │ │ ├── history_view_poll.h
│ │ │ │ ├── history_view_premium_gift.cpp
│ │ │ │ ├── history_view_premium_gift.h
│ │ │ │ ├── history_view_save_document_action.cpp
│ │ │ │ ├── history_view_save_document_action.h
│ │ │ │ ├── history_view_service_box.cpp
│ │ │ │ ├── history_view_service_box.h
│ │ │ │ ├── history_view_similar_channels.cpp
│ │ │ │ ├── history_view_similar_channels.h
│ │ │ │ ├── history_view_slot_machine.cpp
│ │ │ │ ├── history_view_slot_machine.h
│ │ │ │ ├── history_view_sticker.cpp
│ │ │ │ ├── history_view_sticker.h
│ │ │ │ ├── history_view_sticker_player.cpp
│ │ │ │ ├── history_view_sticker_player.h
│ │ │ │ ├── history_view_sticker_player_abstract.h
│ │ │ │ ├── history_view_story_mention.cpp
│ │ │ │ ├── history_view_story_mention.h
│ │ │ │ ├── history_view_suggest_decision.cpp
│ │ │ │ ├── history_view_suggest_decision.h
│ │ │ │ ├── history_view_theme_document.cpp
│ │ │ │ ├── history_view_theme_document.h
│ │ │ │ ├── history_view_todo_list.cpp
│ │ │ │ ├── history_view_todo_list.h
│ │ │ │ ├── history_view_unique_gift.cpp
│ │ │ │ ├── history_view_unique_gift.h
│ │ │ │ ├── history_view_userpic_suggestion.cpp
│ │ │ │ ├── history_view_userpic_suggestion.h
│ │ │ │ ├── history_view_web_page.cpp
│ │ │ │ ├── history_view_web_page.h
│ │ │ │ └── menu/
│ │ │ │ ├── history_view_poll_menu.cpp
│ │ │ │ └── history_view_poll_menu.h
│ │ │ └── reactions/
│ │ │ ├── history_view_reactions.cpp
│ │ │ ├── history_view_reactions.h
│ │ │ ├── history_view_reactions_button.cpp
│ │ │ ├── history_view_reactions_button.h
│ │ │ ├── history_view_reactions_list.cpp
│ │ │ ├── history_view_reactions_list.h
│ │ │ ├── history_view_reactions_selector.cpp
│ │ │ ├── history_view_reactions_selector.h
│ │ │ ├── history_view_reactions_strip.cpp
│ │ │ ├── history_view_reactions_strip.h
│ │ │ ├── history_view_reactions_tabs.cpp
│ │ │ └── history_view_reactions_tabs.h
│ │ ├── info/
│ │ │ ├── bot/
│ │ │ │ ├── earn/
│ │ │ │ │ ├── info_bot_earn_list.cpp
│ │ │ │ │ ├── info_bot_earn_list.h
│ │ │ │ │ ├── info_bot_earn_widget.cpp
│ │ │ │ │ └── info_bot_earn_widget.h
│ │ │ │ └── starref/
│ │ │ │ ├── info_bot_starref_common.cpp
│ │ │ │ ├── info_bot_starref_common.h
│ │ │ │ ├── info_bot_starref_join_widget.cpp
│ │ │ │ ├── info_bot_starref_join_widget.h
│ │ │ │ ├── info_bot_starref_setup_widget.cpp
│ │ │ │ └── info_bot_starref_setup_widget.h
│ │ │ ├── channel_statistics/
│ │ │ │ ├── boosts/
│ │ │ │ │ ├── create_giveaway_box.cpp
│ │ │ │ │ ├── create_giveaway_box.h
│ │ │ │ │ ├── giveaway/
│ │ │ │ │ │ ├── boost_badge.cpp
│ │ │ │ │ │ ├── boost_badge.h
│ │ │ │ │ │ ├── giveaway.style
│ │ │ │ │ │ ├── giveaway_list_controllers.cpp
│ │ │ │ │ │ ├── giveaway_list_controllers.h
│ │ │ │ │ │ ├── giveaway_type_row.cpp
│ │ │ │ │ │ ├── giveaway_type_row.h
│ │ │ │ │ │ ├── select_countries_box.cpp
│ │ │ │ │ │ └── select_countries_box.h
│ │ │ │ │ ├── info_boosts_inner_widget.cpp
│ │ │ │ │ ├── info_boosts_inner_widget.h
│ │ │ │ │ ├── info_boosts_widget.cpp
│ │ │ │ │ └── info_boosts_widget.h
│ │ │ │ └── earn/
│ │ │ │ ├── channel_earn.style
│ │ │ │ ├── earn_format.cpp
│ │ │ │ ├── earn_format.h
│ │ │ │ ├── earn_icons.cpp
│ │ │ │ ├── earn_icons.h
│ │ │ │ ├── info_channel_earn_list.cpp
│ │ │ │ ├── info_channel_earn_list.h
│ │ │ │ ├── info_channel_earn_widget.cpp
│ │ │ │ └── info_channel_earn_widget.h
│ │ │ ├── common_groups/
│ │ │ │ ├── info_common_groups_inner_widget.cpp
│ │ │ │ ├── info_common_groups_inner_widget.h
│ │ │ │ ├── info_common_groups_widget.cpp
│ │ │ │ └── info_common_groups_widget.h
│ │ │ ├── downloads/
│ │ │ │ ├── info_downloads_inner_widget.cpp
│ │ │ │ ├── info_downloads_inner_widget.h
│ │ │ │ ├── info_downloads_provider.cpp
│ │ │ │ ├── info_downloads_provider.h
│ │ │ │ ├── info_downloads_widget.cpp
│ │ │ │ └── info_downloads_widget.h
│ │ │ ├── global_media/
│ │ │ │ ├── info_global_media_inner_widget.cpp
│ │ │ │ ├── info_global_media_inner_widget.h
│ │ │ │ ├── info_global_media_provider.cpp
│ │ │ │ ├── info_global_media_provider.h
│ │ │ │ ├── info_global_media_widget.cpp
│ │ │ │ └── info_global_media_widget.h
│ │ │ ├── info.style
│ │ │ ├── info_content_widget.cpp
│ │ │ ├── info_content_widget.h
│ │ │ ├── info_controller.cpp
│ │ │ ├── info_controller.h
│ │ │ ├── info_flexible_scroll.cpp
│ │ │ ├── info_flexible_scroll.h
│ │ │ ├── info_layer_widget.cpp
│ │ │ ├── info_layer_widget.h
│ │ │ ├── info_memento.cpp
│ │ │ ├── info_memento.h
│ │ │ ├── info_section_widget.cpp
│ │ │ ├── info_section_widget.h
│ │ │ ├── info_top_bar.cpp
│ │ │ ├── info_top_bar.h
│ │ │ ├── info_wrap_widget.cpp
│ │ │ ├── info_wrap_widget.h
│ │ │ ├── media/
│ │ │ │ ├── info_media_buttons.cpp
│ │ │ │ ├── info_media_buttons.h
│ │ │ │ ├── info_media_common.cpp
│ │ │ │ ├── info_media_common.h
│ │ │ │ ├── info_media_empty_widget.cpp
│ │ │ │ ├── info_media_empty_widget.h
│ │ │ │ ├── info_media_inner_widget.cpp
│ │ │ │ ├── info_media_inner_widget.h
│ │ │ │ ├── info_media_list_section.cpp
│ │ │ │ ├── info_media_list_section.h
│ │ │ │ ├── info_media_list_widget.cpp
│ │ │ │ ├── info_media_list_widget.h
│ │ │ │ ├── info_media_provider.cpp
│ │ │ │ ├── info_media_provider.h
│ │ │ │ ├── info_media_widget.cpp
│ │ │ │ └── info_media_widget.h
│ │ │ ├── members/
│ │ │ │ ├── info_members_widget.cpp
│ │ │ │ └── info_members_widget.h
│ │ │ ├── peer_gifts/
│ │ │ │ ├── info_peer_gifts_collections.cpp
│ │ │ │ ├── info_peer_gifts_collections.h
│ │ │ │ ├── info_peer_gifts_common.cpp
│ │ │ │ ├── info_peer_gifts_common.h
│ │ │ │ ├── info_peer_gifts_widget.cpp
│ │ │ │ └── info_peer_gifts_widget.h
│ │ │ ├── polls/
│ │ │ │ ├── info_polls_list_widget.cpp
│ │ │ │ ├── info_polls_list_widget.h
│ │ │ │ ├── info_polls_results_inner_widget.cpp
│ │ │ │ ├── info_polls_results_inner_widget.h
│ │ │ │ ├── info_polls_results_widget.cpp
│ │ │ │ └── info_polls_results_widget.h
│ │ │ ├── profile/
│ │ │ │ ├── info_levels.style
│ │ │ │ ├── info_profile_actions.cpp
│ │ │ │ ├── info_profile_actions.h
│ │ │ │ ├── info_profile_badge.cpp
│ │ │ │ ├── info_profile_badge.h
│ │ │ │ ├── info_profile_badge_tooltip.cpp
│ │ │ │ ├── info_profile_badge_tooltip.h
│ │ │ │ ├── info_profile_cover.cpp
│ │ │ │ ├── info_profile_cover.h
│ │ │ │ ├── info_profile_emoji_status_panel.cpp
│ │ │ │ ├── info_profile_emoji_status_panel.h
│ │ │ │ ├── info_profile_icon.cpp
│ │ │ │ ├── info_profile_icon.h
│ │ │ │ ├── info_profile_inner_widget.cpp
│ │ │ │ ├── info_profile_inner_widget.h
│ │ │ │ ├── info_profile_members.cpp
│ │ │ │ ├── info_profile_members.h
│ │ │ │ ├── info_profile_members_controllers.cpp
│ │ │ │ ├── info_profile_members_controllers.h
│ │ │ │ ├── info_profile_music_button.cpp
│ │ │ │ ├── info_profile_music_button.h
│ │ │ │ ├── info_profile_phone_menu.cpp
│ │ │ │ ├── info_profile_phone_menu.h
│ │ │ │ ├── info_profile_status_label.cpp
│ │ │ │ ├── info_profile_status_label.h
│ │ │ │ ├── info_profile_text.cpp
│ │ │ │ ├── info_profile_text.h
│ │ │ │ ├── info_profile_top_bar.cpp
│ │ │ │ ├── info_profile_top_bar.h
│ │ │ │ ├── info_profile_top_bar_action_button.cpp
│ │ │ │ ├── info_profile_top_bar_action_button.h
│ │ │ │ ├── info_profile_values.cpp
│ │ │ │ ├── info_profile_values.h
│ │ │ │ ├── info_profile_widget.cpp
│ │ │ │ └── info_profile_widget.h
│ │ │ ├── reactions_list/
│ │ │ │ ├── info_reactions_list_widget.cpp
│ │ │ │ └── info_reactions_list_widget.h
│ │ │ ├── requests_list/
│ │ │ │ ├── info_requests_list_widget.cpp
│ │ │ │ └── info_requests_list_widget.h
│ │ │ ├── saved/
│ │ │ │ ├── info_saved_music_common.cpp
│ │ │ │ ├── info_saved_music_common.h
│ │ │ │ ├── info_saved_music_provider.cpp
│ │ │ │ ├── info_saved_music_provider.h
│ │ │ │ ├── info_saved_music_widget.cpp
│ │ │ │ ├── info_saved_music_widget.h
│ │ │ │ ├── info_saved_sublists_widget.cpp
│ │ │ │ └── info_saved_sublists_widget.h
│ │ │ ├── settings/
│ │ │ │ ├── info_settings_widget.cpp
│ │ │ │ └── info_settings_widget.h
│ │ │ ├── similar_peers/
│ │ │ │ ├── info_similar_peers_widget.cpp
│ │ │ │ └── info_similar_peers_widget.h
│ │ │ ├── statistics/
│ │ │ │ ├── info_statistics_common.h
│ │ │ │ ├── info_statistics_inner_widget.cpp
│ │ │ │ ├── info_statistics_inner_widget.h
│ │ │ │ ├── info_statistics_list_controllers.cpp
│ │ │ │ ├── info_statistics_list_controllers.h
│ │ │ │ ├── info_statistics_recent_message.cpp
│ │ │ │ ├── info_statistics_recent_message.h
│ │ │ │ ├── info_statistics_tag.h
│ │ │ │ ├── info_statistics_widget.cpp
│ │ │ │ └── info_statistics_widget.h
│ │ │ ├── stories/
│ │ │ │ ├── info_stories_albums.cpp
│ │ │ │ ├── info_stories_albums.h
│ │ │ │ ├── info_stories_common.h
│ │ │ │ ├── info_stories_inner_widget.cpp
│ │ │ │ ├── info_stories_inner_widget.h
│ │ │ │ ├── info_stories_provider.cpp
│ │ │ │ ├── info_stories_provider.h
│ │ │ │ ├── info_stories_widget.cpp
│ │ │ │ └── info_stories_widget.h
│ │ │ └── userpic/
│ │ │ ├── info_userpic_bubble_wrap.cpp
│ │ │ ├── info_userpic_bubble_wrap.h
│ │ │ ├── info_userpic_builder.style
│ │ │ ├── info_userpic_color_circle_button.cpp
│ │ │ ├── info_userpic_color_circle_button.h
│ │ │ ├── info_userpic_colors_editor.cpp
│ │ │ ├── info_userpic_colors_editor.h
│ │ │ ├── info_userpic_emoji_builder.cpp
│ │ │ ├── info_userpic_emoji_builder.h
│ │ │ ├── info_userpic_emoji_builder_common.cpp
│ │ │ ├── info_userpic_emoji_builder_common.h
│ │ │ ├── info_userpic_emoji_builder_layer.cpp
│ │ │ ├── info_userpic_emoji_builder_layer.h
│ │ │ ├── info_userpic_emoji_builder_menu_item.cpp
│ │ │ ├── info_userpic_emoji_builder_menu_item.h
│ │ │ ├── info_userpic_emoji_builder_preview.cpp
│ │ │ ├── info_userpic_emoji_builder_preview.h
│ │ │ ├── info_userpic_emoji_builder_widget.cpp
│ │ │ └── info_userpic_emoji_builder_widget.h
│ │ ├── inline_bots/
│ │ │ ├── bot_attach_web_view.cpp
│ │ │ ├── bot_attach_web_view.h
│ │ │ ├── inline_bot_confirm_prepared.cpp
│ │ │ ├── inline_bot_confirm_prepared.h
│ │ │ ├── inline_bot_downloads.cpp
│ │ │ ├── inline_bot_downloads.h
│ │ │ ├── inline_bot_layout_internal.cpp
│ │ │ ├── inline_bot_layout_internal.h
│ │ │ ├── inline_bot_layout_item.cpp
│ │ │ ├── inline_bot_layout_item.h
│ │ │ ├── inline_bot_result.cpp
│ │ │ ├── inline_bot_result.h
│ │ │ ├── inline_bot_send_data.cpp
│ │ │ ├── inline_bot_send_data.h
│ │ │ ├── inline_bot_storage.cpp
│ │ │ ├── inline_bot_storage.h
│ │ │ ├── inline_results_inner.cpp
│ │ │ ├── inline_results_inner.h
│ │ │ ├── inline_results_widget.cpp
│ │ │ └── inline_results_widget.h
│ │ ├── intro/
│ │ │ ├── intro.style
│ │ │ ├── intro_code.cpp
│ │ │ ├── intro_code.h
│ │ │ ├── intro_code_input.cpp
│ │ │ ├── intro_code_input.h
│ │ │ ├── intro_email.cpp
│ │ │ ├── intro_email.h
│ │ │ ├── intro_password_check.cpp
│ │ │ ├── intro_password_check.h
│ │ │ ├── intro_phone.cpp
│ │ │ ├── intro_phone.h
│ │ │ ├── intro_qr.cpp
│ │ │ ├── intro_qr.h
│ │ │ ├── intro_signup.cpp
│ │ │ ├── intro_signup.h
│ │ │ ├── intro_start.cpp
│ │ │ ├── intro_start.h
│ │ │ ├── intro_step.cpp
│ │ │ ├── intro_step.h
│ │ │ ├── intro_widget.cpp
│ │ │ └── intro_widget.h
│ │ ├── iv/
│ │ │ ├── iv.style
│ │ │ ├── iv_controller.cpp
│ │ │ ├── iv_controller.h
│ │ │ ├── iv_data.cpp
│ │ │ ├── iv_data.h
│ │ │ ├── iv_delegate.h
│ │ │ ├── iv_delegate_impl.cpp
│ │ │ ├── iv_delegate_impl.h
│ │ │ ├── iv_instance.cpp
│ │ │ ├── iv_instance.h
│ │ │ ├── iv_pch.h
│ │ │ ├── iv_prepare.cpp
│ │ │ └── iv_prepare.h
│ │ ├── lang/
│ │ │ ├── lang_cloud_manager.cpp
│ │ │ ├── lang_cloud_manager.h
│ │ │ ├── lang_file_parser.cpp
│ │ │ ├── lang_file_parser.h
│ │ │ ├── lang_hardcoded.h
│ │ │ ├── lang_instance.cpp
│ │ │ ├── lang_instance.h
│ │ │ ├── lang_keys.cpp
│ │ │ ├── lang_keys.h
│ │ │ ├── lang_numbers_animation.cpp
│ │ │ ├── lang_numbers_animation.h
│ │ │ ├── lang_pch.h
│ │ │ ├── lang_tag.cpp
│ │ │ ├── lang_tag.h
│ │ │ ├── lang_text_entity.cpp
│ │ │ ├── lang_text_entity.h
│ │ │ ├── lang_translator.cpp
│ │ │ ├── lang_translator.h
│ │ │ ├── lang_values.h
│ │ │ ├── translate_mtproto_provider.cpp
│ │ │ ├── translate_mtproto_provider.h
│ │ │ ├── translate_provider.cpp
│ │ │ ├── translate_provider.h
│ │ │ ├── translate_url_provider.cpp
│ │ │ └── translate_url_provider.h
│ │ ├── languages.h
│ │ ├── layout/
│ │ │ ├── abstract_layout_item.cpp
│ │ │ ├── abstract_layout_item.h
│ │ │ ├── layout_document_generic_preview.cpp
│ │ │ ├── layout_document_generic_preview.h
│ │ │ ├── layout_item_base.cpp
│ │ │ ├── layout_item_base.h
│ │ │ ├── layout_mosaic.cpp
│ │ │ ├── layout_mosaic.h
│ │ │ ├── layout_position.cpp
│ │ │ ├── layout_position.h
│ │ │ ├── layout_selection.cpp
│ │ │ └── layout_selection.h
│ │ ├── logs.cpp
│ │ ├── logs.h
│ │ ├── main/
│ │ │ ├── main_account.cpp
│ │ │ ├── main_account.h
│ │ │ ├── main_app_config.cpp
│ │ │ ├── main_app_config.h
│ │ │ ├── main_app_config_values.cpp
│ │ │ ├── main_app_config_values.h
│ │ │ ├── main_domain.cpp
│ │ │ ├── main_domain.h
│ │ │ ├── main_session.cpp
│ │ │ ├── main_session.h
│ │ │ ├── main_session_settings.cpp
│ │ │ ├── main_session_settings.h
│ │ │ └── session/
│ │ │ ├── send_as_peers.cpp
│ │ │ ├── send_as_peers.h
│ │ │ ├── session_show.cpp
│ │ │ └── session_show.h
│ │ ├── main.cpp
│ │ ├── mainwidget.cpp
│ │ ├── mainwidget.h
│ │ ├── mainwindow.cpp
│ │ ├── mainwindow.h
│ │ ├── media/
│ │ │ ├── audio/
│ │ │ │ ├── media_audio.cpp
│ │ │ │ ├── media_audio.h
│ │ │ │ ├── media_audio_capture.cpp
│ │ │ │ ├── media_audio_capture.h
│ │ │ │ ├── media_audio_capture_common.h
│ │ │ │ ├── media_audio_edit.cpp
│ │ │ │ ├── media_audio_edit.h
│ │ │ │ ├── media_audio_ffmpeg_loader.cpp
│ │ │ │ ├── media_audio_ffmpeg_loader.h
│ │ │ │ ├── media_audio_loader.cpp
│ │ │ │ ├── media_audio_loader.h
│ │ │ │ ├── media_audio_loaders.cpp
│ │ │ │ ├── media_audio_loaders.h
│ │ │ │ ├── media_audio_local_cache.cpp
│ │ │ │ ├── media_audio_local_cache.h
│ │ │ │ ├── media_audio_track.cpp
│ │ │ │ ├── media_audio_track.h
│ │ │ │ ├── media_child_ffmpeg_loader.cpp
│ │ │ │ └── media_child_ffmpeg_loader.h
│ │ │ ├── clip/
│ │ │ │ ├── media_clip_check_streaming.cpp
│ │ │ │ ├── media_clip_check_streaming.h
│ │ │ │ ├── media_clip_ffmpeg.cpp
│ │ │ │ ├── media_clip_ffmpeg.h
│ │ │ │ ├── media_clip_implementation.cpp
│ │ │ │ ├── media_clip_implementation.h
│ │ │ │ ├── media_clip_reader.cpp
│ │ │ │ └── media_clip_reader.h
│ │ │ ├── media_common.h
│ │ │ ├── player/
│ │ │ │ ├── media_player.style
│ │ │ │ ├── media_player_button.cpp
│ │ │ │ ├── media_player_button.h
│ │ │ │ ├── media_player_dropdown.cpp
│ │ │ │ ├── media_player_dropdown.h
│ │ │ │ ├── media_player_float.cpp
│ │ │ │ ├── media_player_float.h
│ │ │ │ ├── media_player_instance.cpp
│ │ │ │ ├── media_player_instance.h
│ │ │ │ ├── media_player_listen_tracker.cpp
│ │ │ │ ├── media_player_listen_tracker.h
│ │ │ │ ├── media_player_panel.cpp
│ │ │ │ ├── media_player_panel.h
│ │ │ │ ├── media_player_volume_controller.cpp
│ │ │ │ ├── media_player_volume_controller.h
│ │ │ │ ├── media_player_widget.cpp
│ │ │ │ └── media_player_widget.h
│ │ │ ├── stories/
│ │ │ │ ├── media_stories.style
│ │ │ │ ├── media_stories_caption_full_view.cpp
│ │ │ │ ├── media_stories_caption_full_view.h
│ │ │ │ ├── media_stories_controller.cpp
│ │ │ │ ├── media_stories_controller.h
│ │ │ │ ├── media_stories_delegate.cpp
│ │ │ │ ├── media_stories_delegate.h
│ │ │ │ ├── media_stories_header.cpp
│ │ │ │ ├── media_stories_header.h
│ │ │ │ ├── media_stories_reactions.cpp
│ │ │ │ ├── media_stories_reactions.h
│ │ │ │ ├── media_stories_recent_views.cpp
│ │ │ │ ├── media_stories_recent_views.h
│ │ │ │ ├── media_stories_reply.cpp
│ │ │ │ ├── media_stories_reply.h
│ │ │ │ ├── media_stories_repost_view.cpp
│ │ │ │ ├── media_stories_repost_view.h
│ │ │ │ ├── media_stories_share.cpp
│ │ │ │ ├── media_stories_share.h
│ │ │ │ ├── media_stories_sibling.cpp
│ │ │ │ ├── media_stories_sibling.h
│ │ │ │ ├── media_stories_slider.cpp
│ │ │ │ ├── media_stories_slider.h
│ │ │ │ ├── media_stories_stealth.cpp
│ │ │ │ ├── media_stories_stealth.h
│ │ │ │ ├── media_stories_view.cpp
│ │ │ │ └── media_stories_view.h
│ │ │ ├── streaming/
│ │ │ │ ├── media_streaming_audio_track.cpp
│ │ │ │ ├── media_streaming_audio_track.h
│ │ │ │ ├── media_streaming_common.h
│ │ │ │ ├── media_streaming_document.cpp
│ │ │ │ ├── media_streaming_document.h
│ │ │ │ ├── media_streaming_file.cpp
│ │ │ │ ├── media_streaming_file.h
│ │ │ │ ├── media_streaming_file_delegate.h
│ │ │ │ ├── media_streaming_instance.cpp
│ │ │ │ ├── media_streaming_instance.h
│ │ │ │ ├── media_streaming_loader.cpp
│ │ │ │ ├── media_streaming_loader.h
│ │ │ │ ├── media_streaming_loader_local.cpp
│ │ │ │ ├── media_streaming_loader_local.h
│ │ │ │ ├── media_streaming_loader_mtproto.cpp
│ │ │ │ ├── media_streaming_loader_mtproto.h
│ │ │ │ ├── media_streaming_player.cpp
│ │ │ │ ├── media_streaming_player.h
│ │ │ │ ├── media_streaming_reader.cpp
│ │ │ │ ├── media_streaming_reader.h
│ │ │ │ ├── media_streaming_round_preview.cpp
│ │ │ │ ├── media_streaming_round_preview.h
│ │ │ │ ├── media_streaming_utility.cpp
│ │ │ │ ├── media_streaming_utility.h
│ │ │ │ ├── media_streaming_video_track.cpp
│ │ │ │ └── media_streaming_video_track.h
│ │ │ ├── system_media_controls_manager.cpp
│ │ │ ├── system_media_controls_manager.h
│ │ │ └── view/
│ │ │ ├── media_view.style
│ │ │ ├── media_view_group_thumbs.cpp
│ │ │ ├── media_view_group_thumbs.h
│ │ │ ├── media_view_metal_texture.h
│ │ │ ├── media_view_metal_texture.mm
│ │ │ ├── media_view_open_common.cpp
│ │ │ ├── media_view_open_common.h
│ │ │ ├── media_view_overlay_opengl.cpp
│ │ │ ├── media_view_overlay_opengl.h
│ │ │ ├── media_view_overlay_raster.cpp
│ │ │ ├── media_view_overlay_raster.h
│ │ │ ├── media_view_overlay_renderer.h
│ │ │ ├── media_view_overlay_rhi.cpp
│ │ │ ├── media_view_overlay_rhi.h
│ │ │ ├── media_view_overlay_widget.cpp
│ │ │ ├── media_view_overlay_widget.h
│ │ │ ├── media_view_pip.cpp
│ │ │ ├── media_view_pip.h
│ │ │ ├── media_view_pip_opengl.cpp
│ │ │ ├── media_view_pip_opengl.h
│ │ │ ├── media_view_pip_raster.cpp
│ │ │ ├── media_view_pip_raster.h
│ │ │ ├── media_view_pip_renderer.h
│ │ │ ├── media_view_pip_rhi.cpp
│ │ │ ├── media_view_pip_rhi.h
│ │ │ ├── media_view_playback_controls.cpp
│ │ │ ├── media_view_playback_controls.h
│ │ │ ├── media_view_playback_progress.cpp
│ │ │ ├── media_view_playback_progress.h
│ │ │ ├── media_view_playback_sponsored.cpp
│ │ │ ├── media_view_playback_sponsored.h
│ │ │ ├── media_view_video_stream.cpp
│ │ │ └── media_view_video_stream.h
│ │ ├── menu/
│ │ │ ├── gift_resale_filter.cpp
│ │ │ ├── gift_resale_filter.h
│ │ │ ├── menu_antispam_validator.cpp
│ │ │ ├── menu_antispam_validator.h
│ │ │ ├── menu_check_item.cpp
│ │ │ ├── menu_check_item.h
│ │ │ ├── menu_checked_action.cpp
│ │ │ ├── menu_checked_action.h
│ │ │ ├── menu_dock.cpp
│ │ │ ├── menu_dock.h
│ │ │ ├── menu_item_download_files.cpp
│ │ │ ├── menu_item_download_files.h
│ │ │ ├── menu_item_rate_transcribe.cpp
│ │ │ ├── menu_item_rate_transcribe.h
│ │ │ ├── menu_item_rate_transcribe_session.cpp
│ │ │ ├── menu_item_rate_transcribe_session.h
│ │ │ ├── menu_mute.cpp
│ │ │ ├── menu_mute.h
│ │ │ ├── menu_send.cpp
│ │ │ ├── menu_send.h
│ │ │ ├── menu_sponsored.cpp
│ │ │ ├── menu_sponsored.h
│ │ │ ├── menu_timecode_action.cpp
│ │ │ ├── menu_timecode_action.h
│ │ │ ├── menu_ttl.cpp
│ │ │ ├── menu_ttl.h
│ │ │ ├── menu_ttl_validator.cpp
│ │ │ └── menu_ttl_validator.h
│ │ ├── mtproto/
│ │ │ ├── config_loader.cpp
│ │ │ ├── config_loader.h
│ │ │ ├── connection_abstract.cpp
│ │ │ ├── connection_abstract.h
│ │ │ ├── connection_http.cpp
│ │ │ ├── connection_http.h
│ │ │ ├── connection_resolving.cpp
│ │ │ ├── connection_resolving.h
│ │ │ ├── connection_tcp.cpp
│ │ │ ├── connection_tcp.h
│ │ │ ├── core_types.h
│ │ │ ├── dedicated_file_loader.cpp
│ │ │ ├── dedicated_file_loader.h
│ │ │ ├── details/
│ │ │ │ ├── mtproto_abstract_socket.cpp
│ │ │ │ ├── mtproto_abstract_socket.h
│ │ │ │ ├── mtproto_bound_key_creator.cpp
│ │ │ │ ├── mtproto_bound_key_creator.h
│ │ │ │ ├── mtproto_dc_key_binder.cpp
│ │ │ │ ├── mtproto_dc_key_binder.h
│ │ │ │ ├── mtproto_dc_key_creator.cpp
│ │ │ │ ├── mtproto_dc_key_creator.h
│ │ │ │ ├── mtproto_dcenter.cpp
│ │ │ │ ├── mtproto_dcenter.h
│ │ │ │ ├── mtproto_domain_resolver.cpp
│ │ │ │ ├── mtproto_domain_resolver.h
│ │ │ │ ├── mtproto_dump_to_text.cpp
│ │ │ │ ├── mtproto_dump_to_text.h
│ │ │ │ ├── mtproto_received_ids_manager.cpp
│ │ │ │ ├── mtproto_received_ids_manager.h
│ │ │ │ ├── mtproto_rsa_public_key.cpp
│ │ │ │ ├── mtproto_rsa_public_key.h
│ │ │ │ ├── mtproto_serialized_request.cpp
│ │ │ │ ├── mtproto_serialized_request.h
│ │ │ │ ├── mtproto_tcp_socket.cpp
│ │ │ │ ├── mtproto_tcp_socket.h
│ │ │ │ ├── mtproto_tls_socket.cpp
│ │ │ │ └── mtproto_tls_socket.h
│ │ │ ├── facade.cpp
│ │ │ ├── facade.h
│ │ │ ├── mtp_instance.cpp
│ │ │ ├── mtp_instance.h
│ │ │ ├── mtproto_auth_key.cpp
│ │ │ ├── mtproto_auth_key.h
│ │ │ ├── mtproto_concurrent_sender.cpp
│ │ │ ├── mtproto_concurrent_sender.h
│ │ │ ├── mtproto_config.cpp
│ │ │ ├── mtproto_config.h
│ │ │ ├── mtproto_dc_options.cpp
│ │ │ ├── mtproto_dc_options.h
│ │ │ ├── mtproto_dh_utils.cpp
│ │ │ ├── mtproto_dh_utils.h
│ │ │ ├── mtproto_pch.h
│ │ │ ├── mtproto_proxy_data.cpp
│ │ │ ├── mtproto_proxy_data.h
│ │ │ ├── mtproto_response.cpp
│ │ │ ├── mtproto_response.h
│ │ │ ├── scheme/
│ │ │ │ ├── api.tl
│ │ │ │ └── mtproto.tl
│ │ │ ├── sender.h
│ │ │ ├── session.cpp
│ │ │ ├── session.h
│ │ │ ├── session_private.cpp
│ │ │ ├── session_private.h
│ │ │ ├── special_config_request.cpp
│ │ │ ├── special_config_request.h
│ │ │ └── type_utils.h
│ │ ├── old_settings/
│ │ │ ├── settings_chat_settings_widget.cpp
│ │ │ └── settings_chat_settings_widget.h
│ │ ├── overview/
│ │ │ ├── overview.style
│ │ │ ├── overview_checkbox.cpp
│ │ │ ├── overview_checkbox.h
│ │ │ ├── overview_layout.cpp
│ │ │ ├── overview_layout.h
│ │ │ └── overview_layout_delegate.h
│ │ ├── passport/
│ │ │ ├── passport.style
│ │ │ ├── passport_edit_identity_box.cpp
│ │ │ ├── passport_edit_identity_box.h
│ │ │ ├── passport_encryption.cpp
│ │ │ ├── passport_encryption.h
│ │ │ ├── passport_form_controller.cpp
│ │ │ ├── passport_form_controller.h
│ │ │ ├── passport_form_row.cpp
│ │ │ ├── passport_form_row.h
│ │ │ ├── passport_form_view_controller.cpp
│ │ │ ├── passport_form_view_controller.h
│ │ │ ├── passport_panel.cpp
│ │ │ ├── passport_panel.h
│ │ │ ├── passport_panel_controller.cpp
│ │ │ ├── passport_panel_controller.h
│ │ │ ├── passport_panel_edit_contact.cpp
│ │ │ ├── passport_panel_edit_contact.h
│ │ │ ├── passport_panel_edit_document.cpp
│ │ │ ├── passport_panel_edit_document.h
│ │ │ ├── passport_panel_edit_scans.cpp
│ │ │ ├── passport_panel_edit_scans.h
│ │ │ ├── passport_panel_form.cpp
│ │ │ ├── passport_panel_form.h
│ │ │ ├── passport_panel_password.cpp
│ │ │ ├── passport_panel_password.h
│ │ │ └── ui/
│ │ │ ├── passport_details_row.cpp
│ │ │ ├── passport_details_row.h
│ │ │ ├── passport_form_row.cpp
│ │ │ └── passport_form_row.h
│ │ ├── payments/
│ │ │ ├── payments_checkout_process.cpp
│ │ │ ├── payments_checkout_process.h
│ │ │ ├── payments_form.cpp
│ │ │ ├── payments_form.h
│ │ │ ├── payments_non_panel_process.cpp
│ │ │ ├── payments_non_panel_process.h
│ │ │ ├── payments_reaction_process.cpp
│ │ │ ├── payments_reaction_process.h
│ │ │ ├── smartglocal/
│ │ │ │ ├── smartglocal_api_client.cpp
│ │ │ │ ├── smartglocal_api_client.h
│ │ │ │ ├── smartglocal_callbacks.h
│ │ │ │ ├── smartglocal_card.cpp
│ │ │ │ ├── smartglocal_card.h
│ │ │ │ ├── smartglocal_error.cpp
│ │ │ │ ├── smartglocal_error.h
│ │ │ │ ├── smartglocal_token.cpp
│ │ │ │ └── smartglocal_token.h
│ │ │ ├── stripe/
│ │ │ │ ├── stripe_address.h
│ │ │ │ ├── stripe_api_client.cpp
│ │ │ │ ├── stripe_api_client.h
│ │ │ │ ├── stripe_callbacks.h
│ │ │ │ ├── stripe_card.cpp
│ │ │ │ ├── stripe_card.h
│ │ │ │ ├── stripe_card_params.cpp
│ │ │ │ ├── stripe_card_params.h
│ │ │ │ ├── stripe_card_validator.cpp
│ │ │ │ ├── stripe_card_validator.h
│ │ │ │ ├── stripe_decode.cpp
│ │ │ │ ├── stripe_decode.h
│ │ │ │ ├── stripe_error.cpp
│ │ │ │ ├── stripe_error.h
│ │ │ │ ├── stripe_form_encodable.h
│ │ │ │ ├── stripe_form_encoder.cpp
│ │ │ │ ├── stripe_form_encoder.h
│ │ │ │ ├── stripe_payment_configuration.h
│ │ │ │ ├── stripe_pch.h
│ │ │ │ ├── stripe_token.cpp
│ │ │ │ └── stripe_token.h
│ │ │ └── ui/
│ │ │ ├── payments.style
│ │ │ ├── payments_edit_card.cpp
│ │ │ ├── payments_edit_card.h
│ │ │ ├── payments_edit_information.cpp
│ │ │ ├── payments_edit_information.h
│ │ │ ├── payments_field.cpp
│ │ │ ├── payments_field.h
│ │ │ ├── payments_form_summary.cpp
│ │ │ ├── payments_form_summary.h
│ │ │ ├── payments_panel.cpp
│ │ │ ├── payments_panel.h
│ │ │ ├── payments_panel_data.h
│ │ │ ├── payments_panel_delegate.h
│ │ │ ├── payments_reaction_box.cpp
│ │ │ └── payments_reaction_box.h
│ │ ├── platform/
│ │ │ ├── linux/
│ │ │ │ ├── current_geo_location_linux.cpp
│ │ │ │ ├── current_geo_location_linux.h
│ │ │ │ ├── file_utilities_linux.cpp
│ │ │ │ ├── file_utilities_linux.h
│ │ │ │ ├── integration_linux.cpp
│ │ │ │ ├── integration_linux.h
│ │ │ │ ├── launcher_linux.cpp
│ │ │ │ ├── launcher_linux.h
│ │ │ │ ├── main_window_linux.cpp
│ │ │ │ ├── main_window_linux.h
│ │ │ │ ├── notifications_manager_linux.cpp
│ │ │ │ ├── notifications_manager_linux.h
│ │ │ │ ├── org.freedesktop.Notifications.xml
│ │ │ │ ├── overlay_widget_linux.h
│ │ │ │ ├── specific_linux.cpp
│ │ │ │ ├── specific_linux.h
│ │ │ │ ├── text_recognition_linux.h
│ │ │ │ ├── translate_provider_linux.cpp
│ │ │ │ ├── translate_provider_linux.h
│ │ │ │ ├── tray_linux.cpp
│ │ │ │ ├── tray_linux.h
│ │ │ │ └── webauthn_linux.cpp
│ │ │ ├── mac/
│ │ │ │ ├── current_geo_location_mac.h
│ │ │ │ ├── current_geo_location_mac.mm
│ │ │ │ ├── file_bookmark_mac.h
│ │ │ │ ├── file_bookmark_mac.mm
│ │ │ │ ├── file_utilities_mac.h
│ │ │ │ ├── file_utilities_mac.mm
│ │ │ │ ├── integration_mac.h
│ │ │ │ ├── integration_mac.mm
│ │ │ │ ├── launcher_mac.h
│ │ │ │ ├── launcher_mac.mm
│ │ │ │ ├── mac_iconv_helper.c
│ │ │ │ ├── main_window_mac.h
│ │ │ │ ├── main_window_mac.mm
│ │ │ │ ├── notifications_manager_mac.h
│ │ │ │ ├── notifications_manager_mac.mm
│ │ │ │ ├── overlay_widget_mac.h
│ │ │ │ ├── overlay_widget_mac.mm
│ │ │ │ ├── specific_mac.h
│ │ │ │ ├── specific_mac.mm
│ │ │ │ ├── specific_mac_p.h
│ │ │ │ ├── specific_mac_p.mm
│ │ │ │ ├── text_recognition_mac.h
│ │ │ │ ├── text_recognition_mac.mm
│ │ │ │ ├── touchbar/
│ │ │ │ │ ├── items/
│ │ │ │ │ │ ├── mac_formatter_item.h
│ │ │ │ │ │ ├── mac_formatter_item.mm
│ │ │ │ │ │ ├── mac_pinned_chats_item.h
│ │ │ │ │ │ ├── mac_pinned_chats_item.mm
│ │ │ │ │ │ ├── mac_scrubber_item.h
│ │ │ │ │ │ └── mac_scrubber_item.mm
│ │ │ │ │ ├── mac_touchbar_audio.h
│ │ │ │ │ ├── mac_touchbar_audio.mm
│ │ │ │ │ ├── mac_touchbar_common.h
│ │ │ │ │ ├── mac_touchbar_common.mm
│ │ │ │ │ ├── mac_touchbar_controls.h
│ │ │ │ │ ├── mac_touchbar_controls.mm
│ │ │ │ │ ├── mac_touchbar_main.h
│ │ │ │ │ ├── mac_touchbar_main.mm
│ │ │ │ │ ├── mac_touchbar_manager.h
│ │ │ │ │ ├── mac_touchbar_manager.mm
│ │ │ │ │ ├── mac_touchbar_media_view.h
│ │ │ │ │ └── mac_touchbar_media_view.mm
│ │ │ │ ├── translate_provider_mac.h
│ │ │ │ ├── translate_provider_mac.mm
│ │ │ │ ├── tray_mac.h
│ │ │ │ ├── tray_mac.mm
│ │ │ │ ├── webauthn_mac.mm
│ │ │ │ └── window_title_mac.mm
│ │ │ ├── platform_current_geo_location.h
│ │ │ ├── platform_file_bookmark.h
│ │ │ ├── platform_file_utilities.h
│ │ │ ├── platform_integration.cpp
│ │ │ ├── platform_integration.h
│ │ │ ├── platform_launcher.h
│ │ │ ├── platform_main_window.h
│ │ │ ├── platform_notifications_manager.h
│ │ │ ├── platform_overlay_widget.cpp
│ │ │ ├── platform_overlay_widget.h
│ │ │ ├── platform_specific.h
│ │ │ ├── platform_text_recognition.h
│ │ │ ├── platform_translate_provider.h
│ │ │ ├── platform_tray.h
│ │ │ ├── platform_webauthn.h
│ │ │ ├── platform_window_title.h
│ │ │ └── win/
│ │ │ ├── current_geo_location_win.cpp
│ │ │ ├── current_geo_location_win.h
│ │ │ ├── file_utilities_win.cpp
│ │ │ ├── file_utilities_win.h
│ │ │ ├── integration_win.cpp
│ │ │ ├── integration_win.h
│ │ │ ├── launcher_win.cpp
│ │ │ ├── launcher_win.h
│ │ │ ├── main_window_win.cpp
│ │ │ ├── main_window_win.h
│ │ │ ├── notifications_manager_win.cpp
│ │ │ ├── notifications_manager_win.h
│ │ │ ├── overlay_widget_win.h
│ │ │ ├── specific_win.cpp
│ │ │ ├── specific_win.h
│ │ │ ├── text_recognition_win.h
│ │ │ ├── translate_provider_win.h
│ │ │ ├── tray_win.cpp
│ │ │ ├── tray_win.h
│ │ │ ├── webauthn_win.cpp
│ │ │ ├── windows_app_user_model_id.cpp
│ │ │ ├── windows_app_user_model_id.h
│ │ │ ├── windows_autostart_task.cpp
│ │ │ ├── windows_autostart_task.h
│ │ │ ├── windows_dlls.cpp
│ │ │ ├── windows_dlls.h
│ │ │ ├── windows_quiethours.idl
│ │ │ ├── windows_toast_activator.cpp
│ │ │ ├── windows_toast_activator.h
│ │ │ └── windows_toastactivator.idl
│ │ ├── poll/
│ │ │ ├── poll_media_upload.cpp
│ │ │ └── poll_media_upload.h
│ │ ├── profile/
│ │ │ ├── profile.style
│ │ │ ├── profile_back_button.cpp
│ │ │ ├── profile_back_button.h
│ │ │ ├── profile_block_widget.cpp
│ │ │ ├── profile_block_widget.h
│ │ │ ├── profile_cover_drop_area.cpp
│ │ │ └── profile_cover_drop_area.h
│ │ ├── settings/
│ │ │ ├── business/
│ │ │ │ ├── settings_away_message.cpp
│ │ │ │ ├── settings_away_message.h
│ │ │ │ ├── settings_chat_intro.cpp
│ │ │ │ ├── settings_chat_intro.h
│ │ │ │ ├── settings_chat_links.cpp
│ │ │ │ ├── settings_chat_links.h
│ │ │ │ ├── settings_chatbots.cpp
│ │ │ │ ├── settings_chatbots.h
│ │ │ │ ├── settings_greeting.cpp
│ │ │ │ ├── settings_greeting.h
│ │ │ │ ├── settings_location.cpp
│ │ │ │ ├── settings_location.h
│ │ │ │ ├── settings_quick_replies.cpp
│ │ │ │ ├── settings_quick_replies.h
│ │ │ │ ├── settings_recipients_helper.cpp
│ │ │ │ ├── settings_recipients_helper.h
│ │ │ │ ├── settings_shortcut_messages.cpp
│ │ │ │ ├── settings_shortcut_messages.h
│ │ │ │ ├── settings_working_hours.cpp
│ │ │ │ └── settings_working_hours.h
│ │ │ ├── cloud_password/
│ │ │ │ ├── settings_cloud_password_common.cpp
│ │ │ │ ├── settings_cloud_password_common.h
│ │ │ │ ├── settings_cloud_password_email.cpp
│ │ │ │ ├── settings_cloud_password_email.h
│ │ │ │ ├── settings_cloud_password_email_confirm.cpp
│ │ │ │ ├── settings_cloud_password_email_confirm.h
│ │ │ │ ├── settings_cloud_password_hint.cpp
│ │ │ │ ├── settings_cloud_password_hint.h
│ │ │ │ ├── settings_cloud_password_input.cpp
│ │ │ │ ├── settings_cloud_password_input.h
│ │ │ │ ├── settings_cloud_password_login_email.cpp
│ │ │ │ ├── settings_cloud_password_login_email.h
│ │ │ │ ├── settings_cloud_password_login_email_confirm.cpp
│ │ │ │ ├── settings_cloud_password_login_email_confirm.h
│ │ │ │ ├── settings_cloud_password_manage.cpp
│ │ │ │ ├── settings_cloud_password_manage.h
│ │ │ │ ├── settings_cloud_password_start.cpp
│ │ │ │ ├── settings_cloud_password_start.h
│ │ │ │ ├── settings_cloud_password_step.cpp
│ │ │ │ ├── settings_cloud_password_step.h
│ │ │ │ ├── settings_cloud_password_validate_icon.cpp
│ │ │ │ └── settings_cloud_password_validate_icon.h
│ │ │ ├── detailed_settings_button.cpp
│ │ │ ├── detailed_settings_button.h
│ │ │ ├── sections/
│ │ │ │ ├── settings_active_sessions.cpp
│ │ │ │ ├── settings_active_sessions.h
│ │ │ │ ├── settings_advanced.cpp
│ │ │ │ ├── settings_advanced.h
│ │ │ │ ├── settings_blocked_peers.cpp
│ │ │ │ ├── settings_blocked_peers.h
│ │ │ │ ├── settings_business.cpp
│ │ │ │ ├── settings_business.h
│ │ │ │ ├── settings_calls.cpp
│ │ │ │ ├── settings_calls.h
│ │ │ │ ├── settings_chat.cpp
│ │ │ │ ├── settings_chat.h
│ │ │ │ ├── settings_credits.cpp
│ │ │ │ ├── settings_credits.h
│ │ │ │ ├── settings_folders.cpp
│ │ │ │ ├── settings_folders.h
│ │ │ │ ├── settings_fork.cpp
│ │ │ │ ├── settings_fork.h
│ │ │ │ ├── settings_global_ttl.cpp
│ │ │ │ ├── settings_global_ttl.h
│ │ │ │ ├── settings_information.cpp
│ │ │ │ ├── settings_information.h
│ │ │ │ ├── settings_link_device.cpp
│ │ │ │ ├── settings_link_device.h
│ │ │ │ ├── settings_local_passcode.cpp
│ │ │ │ ├── settings_local_passcode.h
│ │ │ │ ├── settings_main.cpp
│ │ │ │ ├── settings_main.h
│ │ │ │ ├── settings_notifications.cpp
│ │ │ │ ├── settings_notifications.h
│ │ │ │ ├── settings_notifications_reactions.cpp
│ │ │ │ ├── settings_notifications_reactions.h
│ │ │ │ ├── settings_notifications_type.cpp
│ │ │ │ ├── settings_notifications_type.h
│ │ │ │ ├── settings_passkeys.cpp
│ │ │ │ ├── settings_passkeys.h
│ │ │ │ ├── settings_premium.cpp
│ │ │ │ ├── settings_premium.h
│ │ │ │ ├── settings_privacy_security.cpp
│ │ │ │ ├── settings_privacy_security.h
│ │ │ │ ├── settings_shortcuts.cpp
│ │ │ │ ├── settings_shortcuts.h
│ │ │ │ ├── settings_websites.cpp
│ │ │ │ └── settings_websites.h
│ │ │ ├── settings.style
│ │ │ ├── settings_builder.cpp
│ │ │ ├── settings_builder.h
│ │ │ ├── settings_codes.cpp
│ │ │ ├── settings_codes.h
│ │ │ ├── settings_common.cpp
│ │ │ ├── settings_common.h
│ │ │ ├── settings_common_session.cpp
│ │ │ ├── settings_common_session.h
│ │ │ ├── settings_credits_graphics.cpp
│ │ │ ├── settings_credits_graphics.h
│ │ │ ├── settings_experimental.cpp
│ │ │ ├── settings_experimental.h
│ │ │ ├── settings_faq_suggestions.cpp
│ │ │ ├── settings_faq_suggestions.h
│ │ │ ├── settings_intro.cpp
│ │ │ ├── settings_intro.h
│ │ │ ├── settings_notifications_common.h
│ │ │ ├── settings_power_saving.cpp
│ │ │ ├── settings_power_saving.h
│ │ │ ├── settings_privacy_controllers.cpp
│ │ │ ├── settings_privacy_controllers.h
│ │ │ ├── settings_recent_searches.cpp
│ │ │ ├── settings_recent_searches.h
│ │ │ ├── settings_scale_preview.cpp
│ │ │ ├── settings_scale_preview.h
│ │ │ ├── settings_search.cpp
│ │ │ ├── settings_search.h
│ │ │ └── settings_type.h
│ │ ├── settings.cpp
│ │ ├── settings.h
│ │ ├── statistics/
│ │ │ ├── chart_lines_filter_controller.cpp
│ │ │ ├── chart_lines_filter_controller.h
│ │ │ ├── chart_rulers_data.cpp
│ │ │ ├── chart_rulers_data.h
│ │ │ ├── chart_widget.cpp
│ │ │ ├── chart_widget.h
│ │ │ ├── segment_tree.cpp
│ │ │ ├── segment_tree.h
│ │ │ ├── statistics.style
│ │ │ ├── statistics_common.h
│ │ │ ├── statistics_data_deserialize.cpp
│ │ │ ├── statistics_data_deserialize.h
│ │ │ ├── statistics_format_values.cpp
│ │ │ ├── statistics_format_values.h
│ │ │ ├── statistics_graphics.cpp
│ │ │ ├── statistics_graphics.h
│ │ │ ├── statistics_types.h
│ │ │ ├── view/
│ │ │ │ ├── abstract_chart_view.cpp
│ │ │ │ ├── abstract_chart_view.h
│ │ │ │ ├── bar_chart_view.cpp
│ │ │ │ ├── bar_chart_view.h
│ │ │ │ ├── chart_rulers_view.cpp
│ │ │ │ ├── chart_rulers_view.h
│ │ │ │ ├── chart_view_factory.cpp
│ │ │ │ ├── chart_view_factory.h
│ │ │ │ ├── linear_chart_view.cpp
│ │ │ │ ├── linear_chart_view.h
│ │ │ │ ├── stack_chart_common.cpp
│ │ │ │ ├── stack_chart_common.h
│ │ │ │ ├── stack_linear_chart_common.cpp
│ │ │ │ ├── stack_linear_chart_common.h
│ │ │ │ ├── stack_linear_chart_view.cpp
│ │ │ │ └── stack_linear_chart_view.h
│ │ │ └── widgets/
│ │ │ ├── chart_header_widget.cpp
│ │ │ ├── chart_header_widget.h
│ │ │ ├── chart_lines_filter_widget.cpp
│ │ │ ├── chart_lines_filter_widget.h
│ │ │ ├── point_details_widget.cpp
│ │ │ └── point_details_widget.h
│ │ ├── stdafx.h
│ │ ├── storage/
│ │ │ ├── details/
│ │ │ │ ├── storage_file_utilities.cpp
│ │ │ │ ├── storage_file_utilities.h
│ │ │ │ ├── storage_settings_scheme.cpp
│ │ │ │ └── storage_settings_scheme.h
│ │ │ ├── download_manager_mtproto.cpp
│ │ │ ├── download_manager_mtproto.h
│ │ │ ├── file_download.cpp
│ │ │ ├── file_download.h
│ │ │ ├── file_download_mtproto.cpp
│ │ │ ├── file_download_mtproto.h
│ │ │ ├── file_download_web.cpp
│ │ │ ├── file_download_web.h
│ │ │ ├── file_upload.cpp
│ │ │ ├── file_upload.h
│ │ │ ├── localimageloader.cpp
│ │ │ ├── localimageloader.h
│ │ │ ├── localstorage.cpp
│ │ │ ├── localstorage.h
│ │ │ ├── serialize_common.cpp
│ │ │ ├── serialize_common.h
│ │ │ ├── serialize_document.cpp
│ │ │ ├── serialize_document.h
│ │ │ ├── serialize_peer.cpp
│ │ │ ├── serialize_peer.h
│ │ │ ├── storage_account.cpp
│ │ │ ├── storage_account.h
│ │ │ ├── storage_cloud_blob.cpp
│ │ │ ├── storage_cloud_blob.h
│ │ │ ├── storage_domain.cpp
│ │ │ ├── storage_domain.h
│ │ │ ├── storage_facade.cpp
│ │ │ ├── storage_facade.h
│ │ │ ├── storage_file_lock.h
│ │ │ ├── storage_file_lock_posix.cpp
│ │ │ ├── storage_file_lock_win.cpp
│ │ │ ├── storage_media_prepare.cpp
│ │ │ ├── storage_media_prepare.h
│ │ │ ├── storage_shared_media.cpp
│ │ │ ├── storage_shared_media.h
│ │ │ ├── storage_sparse_ids_list.cpp
│ │ │ ├── storage_sparse_ids_list.h
│ │ │ ├── storage_user_photos.cpp
│ │ │ ├── storage_user_photos.h
│ │ │ ├── streamed_file_downloader.cpp
│ │ │ └── streamed_file_downloader.h
│ │ ├── support/
│ │ │ ├── support_autocomplete.cpp
│ │ │ ├── support_autocomplete.h
│ │ │ ├── support_common.cpp
│ │ │ ├── support_common.h
│ │ │ ├── support_helper.cpp
│ │ │ ├── support_helper.h
│ │ │ ├── support_preload.cpp
│ │ │ ├── support_preload.h
│ │ │ ├── support_templates.cpp
│ │ │ └── support_templates.h
│ │ ├── tde2e/
│ │ │ ├── tde2e_api.cpp
│ │ │ ├── tde2e_api.h
│ │ │ ├── tde2e_integration.cpp
│ │ │ └── tde2e_integration.h
│ │ ├── tests/
│ │ │ ├── test_main.cpp
│ │ │ ├── test_main.h
│ │ │ └── test_text.cpp
│ │ ├── tray.cpp
│ │ ├── tray.h
│ │ ├── tray_accounts_menu.cpp
│ │ ├── tray_accounts_menu.h
│ │ ├── tray_accounts_menu_dummy.cpp
│ │ ├── ui/
│ │ │ ├── boxes/
│ │ │ │ ├── about_cocoon_box.cpp
│ │ │ │ ├── about_cocoon_box.h
│ │ │ │ ├── auto_delete_settings.cpp
│ │ │ │ ├── auto_delete_settings.h
│ │ │ │ ├── boost_box.cpp
│ │ │ │ ├── boost_box.h
│ │ │ │ ├── calendar_box.cpp
│ │ │ │ ├── calendar_box.h
│ │ │ │ ├── choose_date_time.cpp
│ │ │ │ ├── choose_date_time.h
│ │ │ │ ├── choose_font_box.cpp
│ │ │ │ ├── choose_font_box.h
│ │ │ │ ├── choose_language_box.cpp
│ │ │ │ ├── choose_language_box.h
│ │ │ │ ├── choose_time.cpp
│ │ │ │ ├── choose_time.h
│ │ │ │ ├── collectible_info_box.cpp
│ │ │ │ ├── collectible_info_box.h
│ │ │ │ ├── confirm_box.cpp
│ │ │ │ ├── confirm_box.h
│ │ │ │ ├── confirm_phone_box.cpp
│ │ │ │ ├── confirm_phone_box.h
│ │ │ │ ├── country_select_box.cpp
│ │ │ │ ├── country_select_box.h
│ │ │ │ ├── edit_birthday_box.cpp
│ │ │ │ ├── edit_birthday_box.h
│ │ │ │ ├── edit_factcheck_box.cpp
│ │ │ │ ├── edit_factcheck_box.h
│ │ │ │ ├── edit_invite_link.cpp
│ │ │ │ ├── edit_invite_link.h
│ │ │ │ ├── edit_invite_link_session.cpp
│ │ │ │ ├── edit_invite_link_session.h
│ │ │ │ ├── emoji_stake_box.cpp
│ │ │ │ ├── emoji_stake_box.h
│ │ │ │ ├── peer_qr_box.cpp
│ │ │ │ ├── peer_qr_box.h
│ │ │ │ ├── rate_call_box.cpp
│ │ │ │ ├── rate_call_box.h
│ │ │ │ ├── report_box_graphics.cpp
│ │ │ │ ├── report_box_graphics.h
│ │ │ │ ├── show_or_premium_box.cpp
│ │ │ │ ├── show_or_premium_box.h
│ │ │ │ ├── single_choice_box.cpp
│ │ │ │ ├── single_choice_box.h
│ │ │ │ ├── time_picker_box.cpp
│ │ │ │ └── time_picker_box.h
│ │ │ ├── cached_round_corners.cpp
│ │ │ ├── cached_round_corners.h
│ │ │ ├── chat/
│ │ │ │ ├── attach/
│ │ │ │ │ ├── attach_abstract_single_file_preview.cpp
│ │ │ │ │ ├── attach_abstract_single_file_preview.h
│ │ │ │ │ ├── attach_abstract_single_media_preview.cpp
│ │ │ │ │ ├── attach_abstract_single_media_preview.h
│ │ │ │ │ ├── attach_abstract_single_preview.h
│ │ │ │ │ ├── attach_album_preview.cpp
│ │ │ │ │ ├── attach_album_preview.h
│ │ │ │ │ ├── attach_album_thumbnail.cpp
│ │ │ │ │ ├── attach_album_thumbnail.h
│ │ │ │ │ ├── attach_bot_downloads.cpp
│ │ │ │ │ ├── attach_bot_downloads.h
│ │ │ │ │ ├── attach_bot_webview.cpp
│ │ │ │ │ ├── attach_bot_webview.h
│ │ │ │ │ ├── attach_controls.cpp
│ │ │ │ │ ├── attach_controls.h
│ │ │ │ │ ├── attach_extensions.cpp
│ │ │ │ │ ├── attach_extensions.h
│ │ │ │ │ ├── attach_item_single_file_preview.cpp
│ │ │ │ │ ├── attach_item_single_file_preview.h
│ │ │ │ │ ├── attach_item_single_media_preview.cpp
│ │ │ │ │ ├── attach_item_single_media_preview.h
│ │ │ │ │ ├── attach_prepare.cpp
│ │ │ │ │ ├── attach_prepare.h
│ │ │ │ │ ├── attach_send_files_way.cpp
│ │ │ │ │ ├── attach_send_files_way.h
│ │ │ │ │ ├── attach_single_file_preview.cpp
│ │ │ │ │ ├── attach_single_file_preview.h
│ │ │ │ │ ├── attach_single_media_preview.cpp
│ │ │ │ │ └── attach_single_media_preview.h
│ │ │ │ ├── chat.style
│ │ │ │ ├── chat_style.cpp
│ │ │ │ ├── chat_style.h
│ │ │ │ ├── chat_style_radius.cpp
│ │ │ │ ├── chat_style_radius.h
│ │ │ │ ├── chat_theme.cpp
│ │ │ │ ├── chat_theme.h
│ │ │ │ ├── chats_filter_tag.cpp
│ │ │ │ ├── chats_filter_tag.h
│ │ │ │ ├── choose_send_as.cpp
│ │ │ │ ├── choose_send_as.h
│ │ │ │ ├── choose_theme_controller.cpp
│ │ │ │ ├── choose_theme_controller.h
│ │ │ │ ├── continuous_scroll.cpp
│ │ │ │ ├── continuous_scroll.h
│ │ │ │ ├── forward_options_box.cpp
│ │ │ │ ├── forward_options_box.h
│ │ │ │ ├── group_call_bar.cpp
│ │ │ │ ├── group_call_bar.h
│ │ │ │ ├── group_call_userpics.cpp
│ │ │ │ ├── group_call_userpics.h
│ │ │ │ ├── message_bar.cpp
│ │ │ │ ├── message_bar.h
│ │ │ │ ├── message_bubble.cpp
│ │ │ │ ├── message_bubble.h
│ │ │ │ ├── more_chats_bar.cpp
│ │ │ │ ├── more_chats_bar.h
│ │ │ │ ├── pinned_bar.cpp
│ │ │ │ ├── pinned_bar.h
│ │ │ │ ├── requests_bar.cpp
│ │ │ │ ├── requests_bar.h
│ │ │ │ ├── sponsored_message_bar.cpp
│ │ │ │ └── sponsored_message_bar.h
│ │ │ ├── color_contrast.cpp
│ │ │ ├── color_contrast.h
│ │ │ ├── color_indices.style
│ │ │ ├── color_int_conversion.cpp
│ │ │ ├── color_int_conversion.h
│ │ │ ├── controls/
│ │ │ │ ├── button_labels.cpp
│ │ │ │ ├── button_labels.h
│ │ │ │ ├── call_mute_button.cpp
│ │ │ │ ├── call_mute_button.h
│ │ │ │ ├── chat_service_checkbox.cpp
│ │ │ │ ├── chat_service_checkbox.h
│ │ │ │ ├── compose_ai_button_factory.cpp
│ │ │ │ ├── compose_ai_button_factory.h
│ │ │ │ ├── delete_message_context_action.cpp
│ │ │ │ ├── delete_message_context_action.h
│ │ │ │ ├── download_bar.cpp
│ │ │ │ ├── download_bar.h
│ │ │ │ ├── dynamic_images_strip.cpp
│ │ │ │ ├── dynamic_images_strip.h
│ │ │ │ ├── emoji_button.cpp
│ │ │ │ ├── emoji_button.h
│ │ │ │ ├── emoji_button_factory.cpp
│ │ │ │ ├── emoji_button_factory.h
│ │ │ │ ├── feature_list.cpp
│ │ │ │ ├── feature_list.h
│ │ │ │ ├── filter_link_header.cpp
│ │ │ │ ├── filter_link_header.h
│ │ │ │ ├── invite_link_buttons.cpp
│ │ │ │ ├── invite_link_buttons.h
│ │ │ │ ├── invite_link_label.cpp
│ │ │ │ ├── invite_link_label.h
│ │ │ │ ├── jump_down_button.cpp
│ │ │ │ ├── jump_down_button.h
│ │ │ │ ├── labeled_emoji_tabs.cpp
│ │ │ │ ├── labeled_emoji_tabs.h
│ │ │ │ ├── location_picker.cpp
│ │ │ │ ├── location_picker.h
│ │ │ │ ├── peer_list_dummy.cpp
│ │ │ │ ├── peer_list_dummy.h
│ │ │ │ ├── popup_selector.cpp
│ │ │ │ ├── popup_selector.h
│ │ │ │ ├── round_video_recorder.cpp
│ │ │ │ ├── round_video_recorder.h
│ │ │ │ ├── round_video_recorder_data.h
│ │ │ │ ├── send_as_button.cpp
│ │ │ │ ├── send_as_button.h
│ │ │ │ ├── send_button.cpp
│ │ │ │ ├── send_button.h
│ │ │ │ ├── silent_toggle.cpp
│ │ │ │ ├── silent_toggle.h
│ │ │ │ ├── stars_rating.cpp
│ │ │ │ ├── stars_rating.h
│ │ │ │ ├── sub_tabs.cpp
│ │ │ │ ├── sub_tabs.h
│ │ │ │ ├── subsection_tabs_slider.cpp
│ │ │ │ ├── subsection_tabs_slider.h
│ │ │ │ ├── subsection_tabs_slider_reorder.cpp
│ │ │ │ ├── subsection_tabs_slider_reorder.h
│ │ │ │ ├── swipe_handler.cpp
│ │ │ │ ├── swipe_handler.h
│ │ │ │ ├── swipe_handler_data.h
│ │ │ │ ├── tabbed_search.cpp
│ │ │ │ ├── tabbed_search.h
│ │ │ │ ├── table_rows.cpp
│ │ │ │ ├── table_rows.h
│ │ │ │ ├── ton_common.cpp
│ │ │ │ ├── ton_common.h
│ │ │ │ ├── userpic_button.cpp
│ │ │ │ ├── userpic_button.h
│ │ │ │ ├── who_reacted_context_action.cpp
│ │ │ │ ├── who_reacted_context_action.h
│ │ │ │ ├── window_outdated_bar.cpp
│ │ │ │ ├── window_outdated_bar.h
│ │ │ │ ├── window_outdated_bar_dummy.cpp
│ │ │ │ ├── window_screen_reader_bar.cpp
│ │ │ │ └── window_screen_reader_bar.h
│ │ │ ├── countryinput.cpp
│ │ │ ├── countryinput.h
│ │ │ ├── dynamic_thumbnails.cpp
│ │ │ ├── dynamic_thumbnails.h
│ │ │ ├── effects/
│ │ │ │ ├── credits.style
│ │ │ │ ├── credits_graphics.cpp
│ │ │ │ ├── credits_graphics.h
│ │ │ │ ├── emoji_fly_animation.cpp
│ │ │ │ ├── emoji_fly_animation.h
│ │ │ │ ├── fireworks_animation.cpp
│ │ │ │ ├── fireworks_animation.h
│ │ │ │ ├── glare.cpp
│ │ │ │ ├── glare.h
│ │ │ │ ├── loading_element.cpp
│ │ │ │ ├── loading_element.h
│ │ │ │ ├── message_sending_animation_common.h
│ │ │ │ ├── message_sending_animation_controller.cpp
│ │ │ │ ├── message_sending_animation_controller.h
│ │ │ │ ├── ministar_particles.cpp
│ │ │ │ ├── ministar_particles.h
│ │ │ │ ├── outline_segments.cpp
│ │ │ │ ├── outline_segments.h
│ │ │ │ ├── premium.style
│ │ │ │ ├── premium_bubble.cpp
│ │ │ │ ├── premium_bubble.h
│ │ │ │ ├── premium_graphics.cpp
│ │ │ │ ├── premium_graphics.h
│ │ │ │ ├── premium_stars.cpp
│ │ │ │ ├── premium_stars.h
│ │ │ │ ├── premium_stars_colored.cpp
│ │ │ │ ├── premium_stars_colored.h
│ │ │ │ ├── premium_top_bar.cpp
│ │ │ │ ├── premium_top_bar.h
│ │ │ │ ├── reaction_fly_animation.cpp
│ │ │ │ ├── reaction_fly_animation.h
│ │ │ │ ├── round_checkbox.cpp
│ │ │ │ ├── round_checkbox.h
│ │ │ │ ├── scroll_content_shadow.cpp
│ │ │ │ ├── scroll_content_shadow.h
│ │ │ │ ├── send_action_animations.cpp
│ │ │ │ ├── send_action_animations.h
│ │ │ │ ├── shake_animation.cpp
│ │ │ │ ├── shake_animation.h
│ │ │ │ ├── skeleton_animation.cpp
│ │ │ │ ├── skeleton_animation.h
│ │ │ │ ├── snowflakes.cpp
│ │ │ │ ├── snowflakes.h
│ │ │ │ ├── thanos_effect.cpp
│ │ │ │ ├── thanos_effect.h
│ │ │ │ ├── thanos_effect_controller.cpp
│ │ │ │ ├── thanos_effect_controller.h
│ │ │ │ ├── thanos_effect_renderer.cpp
│ │ │ │ ├── thanos_effect_renderer.h
│ │ │ │ ├── thanos_effect_session.cpp
│ │ │ │ ├── thanos_effect_session.h
│ │ │ │ ├── toggle_arrow.cpp
│ │ │ │ ├── toggle_arrow.h
│ │ │ │ ├── ttl_icon.cpp
│ │ │ │ ├── ttl_icon.h
│ │ │ │ ├── upload_progress_overlay.cpp
│ │ │ │ └── upload_progress_overlay.h
│ │ │ ├── empty_userpic.cpp
│ │ │ ├── empty_userpic.h
│ │ │ ├── filter_icon_panel.cpp
│ │ │ ├── filter_icon_panel.h
│ │ │ ├── filter_icons.cpp
│ │ │ ├── filter_icons.h
│ │ │ ├── filter_icons.style
│ │ │ ├── grouped_layout.cpp
│ │ │ ├── grouped_layout.h
│ │ │ ├── image/
│ │ │ │ ├── image.cpp
│ │ │ │ ├── image.h
│ │ │ │ ├── image_location.cpp
│ │ │ │ ├── image_location.h
│ │ │ │ ├── image_location_factory.cpp
│ │ │ │ ├── image_location_factory.h
│ │ │ │ ├── image_source.cpp
│ │ │ │ ├── svg_preview.cpp
│ │ │ │ └── svg_preview.h
│ │ │ ├── item_text_options.cpp
│ │ │ ├── item_text_options.h
│ │ │ ├── menu_icons.style
│ │ │ ├── new_badges.cpp
│ │ │ ├── new_badges.h
│ │ │ ├── peer/
│ │ │ │ ├── color_sample.cpp
│ │ │ │ ├── color_sample.h
│ │ │ │ ├── video_userpic_player.cpp
│ │ │ │ └── video_userpic_player.h
│ │ │ ├── power_saving.cpp
│ │ │ ├── power_saving.h
│ │ │ ├── resize_area.h
│ │ │ ├── search_field_controller.cpp
│ │ │ ├── search_field_controller.h
│ │ │ ├── td_common.style
│ │ │ ├── text/
│ │ │ │ ├── format_song_document_name.cpp
│ │ │ │ ├── format_song_document_name.h
│ │ │ │ ├── format_song_name.cpp
│ │ │ │ ├── format_song_name.h
│ │ │ │ ├── format_values.cpp
│ │ │ │ ├── format_values.h
│ │ │ │ ├── text_lottie_custom_emoji.cpp
│ │ │ │ ├── text_lottie_custom_emoji.h
│ │ │ │ ├── text_options.cpp
│ │ │ │ └── text_options.h
│ │ │ ├── top_background_gradient.cpp
│ │ │ ├── top_background_gradient.h
│ │ │ ├── ui_pch.h
│ │ │ ├── unread_badge.cpp
│ │ │ ├── unread_badge.h
│ │ │ ├── unread_badge_paint.cpp
│ │ │ ├── unread_badge_paint.h
│ │ │ ├── unread_counter_format.cpp
│ │ │ ├── unread_counter_format.h
│ │ │ ├── userpic_view.cpp
│ │ │ ├── userpic_view.h
│ │ │ ├── vertical_list.cpp
│ │ │ ├── vertical_list.h
│ │ │ ├── webview_helpers.cpp
│ │ │ ├── webview_helpers.h
│ │ │ └── widgets/
│ │ │ ├── chat_filters_tabs_slider.cpp
│ │ │ ├── chat_filters_tabs_slider.h
│ │ │ ├── chat_filters_tabs_slider_reorder.cpp
│ │ │ ├── chat_filters_tabs_slider_reorder.h
│ │ │ ├── chat_filters_tabs_strip.cpp
│ │ │ ├── chat_filters_tabs_strip.h
│ │ │ ├── color_editor.cpp
│ │ │ ├── color_editor.h
│ │ │ ├── continuous_sliders.cpp
│ │ │ ├── continuous_sliders.h
│ │ │ ├── cross_fade_label.cpp
│ │ │ ├── cross_fade_label.h
│ │ │ ├── discrete_sliders.cpp
│ │ │ ├── discrete_sliders.h
│ │ │ ├── expandable_peer_list.cpp
│ │ │ ├── expandable_peer_list.h
│ │ │ ├── fields/
│ │ │ │ ├── special_fields.cpp
│ │ │ │ ├── special_fields.h
│ │ │ │ ├── time_part_input_with_placeholder.cpp
│ │ │ │ └── time_part_input_with_placeholder.h
│ │ │ ├── gradient_round_button.cpp
│ │ │ ├── gradient_round_button.h
│ │ │ ├── horizontal_fit_container.cpp
│ │ │ ├── horizontal_fit_container.h
│ │ │ ├── level_meter.cpp
│ │ │ ├── level_meter.h
│ │ │ ├── middle_click_autoscroll.cpp
│ │ │ ├── middle_click_autoscroll.h
│ │ │ ├── multi_select.cpp
│ │ │ ├── multi_select.h
│ │ │ ├── participants_check_view.cpp
│ │ │ ├── participants_check_view.h
│ │ │ ├── peer_bubble.cpp
│ │ │ ├── peer_bubble.h
│ │ │ ├── sent_code_field.cpp
│ │ │ ├── sent_code_field.h
│ │ │ ├── slider_natural_width.h
│ │ │ ├── vertical_drum_picker.cpp
│ │ │ └── vertical_drum_picker.h
│ │ └── window/
│ │ ├── main_window.cpp
│ │ ├── main_window.h
│ │ ├── notifications_manager.cpp
│ │ ├── notifications_manager.h
│ │ ├── notifications_manager_default.cpp
│ │ ├── notifications_manager_default.h
│ │ ├── notifications_utilities.cpp
│ │ ├── notifications_utilities.h
│ │ ├── section_memento.h
│ │ ├── section_widget.cpp
│ │ ├── section_widget.h
│ │ ├── session/
│ │ │ └── window_session_media.cpp
│ │ ├── themes/
│ │ │ ├── window_theme.cpp
│ │ │ ├── window_theme.h
│ │ │ ├── window_theme_editor.cpp
│ │ │ ├── window_theme_editor.h
│ │ │ ├── window_theme_editor_block.cpp
│ │ │ ├── window_theme_editor_block.h
│ │ │ ├── window_theme_editor_box.cpp
│ │ │ ├── window_theme_editor_box.h
│ │ │ ├── window_theme_preview.cpp
│ │ │ ├── window_theme_preview.h
│ │ │ ├── window_theme_warning.cpp
│ │ │ ├── window_theme_warning.h
│ │ │ ├── window_themes_cloud_list.cpp
│ │ │ ├── window_themes_cloud_list.h
│ │ │ ├── window_themes_embedded.cpp
│ │ │ ├── window_themes_embedded.h
│ │ │ ├── window_themes_generate_name.cpp
│ │ │ └── window_themes_generate_name.h
│ │ ├── window.style
│ │ ├── window_adaptive.cpp
│ │ ├── window_adaptive.h
│ │ ├── window_chat_preview.cpp
│ │ ├── window_chat_preview.h
│ │ ├── window_chat_switch_process.cpp
│ │ ├── window_chat_switch_process.h
│ │ ├── window_connecting_widget.cpp
│ │ ├── window_connecting_widget.h
│ │ ├── window_controller.cpp
│ │ ├── window_controller.h
│ │ ├── window_filters_menu.cpp
│ │ ├── window_filters_menu.h
│ │ ├── window_history_hider.cpp
│ │ ├── window_history_hider.h
│ │ ├── window_lock_widgets.cpp
│ │ ├── window_lock_widgets.h
│ │ ├── window_main_menu.cpp
│ │ ├── window_main_menu.h
│ │ ├── window_main_menu_helpers.cpp
│ │ ├── window_main_menu_helpers.h
│ │ ├── window_media_preview.cpp
│ │ ├── window_media_preview.h
│ │ ├── window_peer_menu.cpp
│ │ ├── window_peer_menu.h
│ │ ├── window_section_common.h
│ │ ├── window_separate_id.cpp
│ │ ├── window_separate_id.h
│ │ ├── window_session_controller.cpp
│ │ ├── window_session_controller.h
│ │ ├── window_session_controller_link_info.h
│ │ ├── window_setup_email.cpp
│ │ ├── window_setup_email.h
│ │ ├── window_slide_animation.cpp
│ │ ├── window_slide_animation.h
│ │ └── window_top_bar_wrap.h
│ ├── Telegram/
│ │ ├── Breakpad.entitlements
│ │ ├── Images.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Telegram Lite.entitlements
│ │ └── Telegram.entitlements
│ ├── Telegram.plist
│ ├── ThirdParty/
│ │ └── minizip/
│ │ ├── crypt.h
│ │ ├── ioapi.c
│ │ ├── ioapi.h
│ │ ├── unzip.c
│ │ ├── unzip.h
│ │ ├── zip.c
│ │ └── zip.h
│ ├── build/
│ │ ├── build.bat
│ │ ├── build.sh
│ │ ├── changelog2appstream.py
│ │ ├── deploy.sh
│ │ ├── docker/
│ │ │ ├── build.sh
│ │ │ └── centos_env/
│ │ │ ├── .gitignore
│ │ │ ├── Dockerfile
│ │ │ ├── build.sh
│ │ │ ├── centos_env/
│ │ │ │ └── __init__.py
│ │ │ ├── gen_dockerfile.py
│ │ │ ├── pyproject.toml
│ │ │ └── run.sh
│ │ ├── mac_store_upload.sh
│ │ ├── prepare/
│ │ │ ├── linux.sh
│ │ │ ├── mac.sh
│ │ │ ├── prepare.py
│ │ │ └── win.bat
│ │ ├── qt_version.py
│ │ ├── release.py
│ │ ├── release.sh
│ │ ├── replace.vbs
│ │ ├── set_version.bat
│ │ ├── set_version.py
│ │ ├── set_version.sh
│ │ ├── setup.iss
│ │ ├── test_package.bat
│ │ ├── updates.py
│ │ ├── updates.sh
│ │ └── version
│ ├── cmake/
│ │ ├── generate_appstream_changelog.cmake
│ │ ├── generate_lang.cmake
│ │ ├── generate_midl.cmake
│ │ ├── generate_numbers.cmake
│ │ ├── generate_scheme.cmake
│ │ ├── lib_ffmpeg.cmake
│ │ ├── lib_prisma.cmake
│ │ ├── lib_stripe.cmake
│ │ ├── lib_tgcalls.cmake
│ │ ├── qrhi_shaders.cmake
│ │ ├── td_export.cmake
│ │ ├── td_forkgram.cmake
│ │ ├── td_iv.cmake
│ │ ├── td_lang.cmake
│ │ ├── td_mtproto.cmake
│ │ ├── td_scheme.cmake
│ │ ├── td_tde2e.cmake
│ │ ├── td_ui.cmake
│ │ ├── telegram_apple_swift_runtime.cmake
│ │ ├── telegram_options.cmake
│ │ └── tests.cmake
│ ├── configure.bat
│ ├── configure.py
│ ├── configure.sh
│ ├── create.bat
│ ├── gyp/
│ │ └── telegram/
│ │ └── sources.txt
│ └── shaders/
│ ├── argb32.frag
│ ├── argb32.vert
│ ├── blur_h.frag
│ ├── blur_v.frag
│ ├── controls.frag
│ ├── demo.frag
│ ├── demo.vert
│ ├── fill.frag
│ ├── fill.vert
│ ├── group_frame.frag
│ ├── group_frame.vert
│ ├── incoming_shadow.frag
│ ├── incoming_yuv420.frag
│ ├── noise.frag
│ ├── nv12.frag
│ ├── nv12_content.frag
│ ├── passthrough.vert
│ ├── pip_argb32.frag
│ ├── pip_controls.frag
│ ├── pip_controls.vert
│ ├── pip_nv12.frag
│ ├── pip_yuv420.frag
│ ├── rounded_corners.frag
│ ├── static_content.frag
│ ├── thanos.frag
│ ├── thanos.vert
│ ├── thanos_init.comp
│ ├── thanos_update.comp
│ ├── transparent_content.frag
│ ├── yuv420.frag
│ └── yuv420_content.frag
├── _config_github_pages.yml
├── changelog.txt
├── docs/
│ ├── api_credentials.md
│ ├── building-linux.md
│ ├── building-mac.md
│ ├── building-mas.md
│ ├── building-win.md
│ └── misc.txt
├── index.html
├── lib/
│ └── xdg/
│ ├── org.telegram.desktop.desktop
│ ├── org.telegram.desktop.metainfo.xml
│ └── org.telegram.desktop.service
├── patches/
│ ├── cmake_qt611.patch
│ └── cmake_zbar.patch
└── snap/
└── snapcraft.yaml
================================================
FILE CONTENTS
================================================
================================================
FILE: .agents/skills/task-think/PROMPTS.md
================================================
# Phase Prompts
Use these templates as Codex subagent messages. Use them as same-session checklists only for Phase 0, intentional main-session build work, Phase 7, or when delegation is unavailable from the start. Replace `<TASK>`, `<PROJECT>`, `<LETTER>`, and `<REPO_ROOT>`.
## Orchestration Rules
- Phase 0 runs in the main session.
- When delegation is available, use a fresh subagent for Phase 1, Phase 2, Phase 3, each Phase 4 implementation unit, and each Phase 6 pass. Do not switch those phases to same-session midstream because of a timeout or missing artifact.
- Phase 7 runs in the main session on Windows because it depends on the final local diff and touched-file set.
- Write each phase prompt to `.ai/<PROJECT>/<LETTER>/logs/phase-<name>.prompt.md` before execution.
- If you delegate a phase, send the prompt file contents as the initial `spawn_agent` message.
- When writing the phase prompt file, append the standard progress file contract and the standard compact reply block below so the subagent knows how to surface progress before the final artifact.
- After each phase completes, write `.ai/<PROJECT>/<LETTER>/logs/phase-<name>.result.md` summarizing the status, files touched, and any follow-up notes.
- Use `fork_context: false` by default. If the phase depends on thread-only context or UI attachments, pass that context explicitly or enable `fork_context` only for that phase.
- Prefer `worker` for phases that write files. Use `default` for plan or review passes if that fits the host better. Use `explorer` only for narrow read-only questions.
- When supported, request `model: gpt-5.4` and `reasoning_effort: xhigh` for delegated phases.
- Default wait budget for delegated phases is 5 minutes while the phase is clearly still in progress. Successful completion may wake earlier, so this does not delay finished work.
- When a phase appears close to landing, use 1-2 minute waits until it finishes.
- A `wait_agent` timeout is not failure. On timeout, inspect both the expected artifact and the matching progress file before deciding anything.
- If the expected artifact exists and shows progress, wait again.
- If the expected artifact is not ready but the progress file mtime moved or its heartbeat counter increased since the previous check, wait again. Prefer mtime checks first and avoid rereading the file unless you need detail. Do not count that as a failed wait.
- If neither the expected artifact nor the progress file moved since the previous blocked check, send one short follow-up asking the same agent to refresh the progress file, finish the required artifact, and return the standard compact reply block, then wait again.
- If the same agent still produces no usable artifact and no meaningful progress-file movement after two full default waits and one follow-up, close it and retry the phase in a fresh subagent.
- For Phase 1, Phase 2, Phase 3, Phase 4, and Phase 6, if delegated retries still fail, stop and ask the user rather than rerunning the phase locally.
- Never use `codex exec`, background shell child processes, or JSONL child-session logging from this skill.
## Standard Progress File Contract
Append this verbatim to every delegated phase prompt:
```text
Before deep work, create or update the matching progress file in `.ai/<PROJECT>/<LETTER>/logs/`.
Use `<phase-name>.progress.md` as a concise heartbeat with:
- `Heartbeat: <N>` on the first line, incremented on each meaningful update
- Current step
- Files being read or edited
- Concrete findings or decisions so far
- Blocker or next checkpoint
Update it sparingly: preferably at natural milestones, and otherwise only after a longer quiet stretch such as roughly 5-10 minutes.
Keep it tiny so the parent can usually rely on file mtime or the heartbeat counter instead of rereading the whole file.
Do not wait until the final artifact to write progress.
```
## Standard Compact Reply Block
Append this verbatim to every delegated phase prompt:
```text
Before replying in chat, write the required artifact(s) to disk.
Reply in 8 lines or fewer using exactly these keys:
STATUS: <DONE|BLOCKED|APPROVED|NEEDS_CHANGES>
ARTIFACTS: <paths>
TOUCHED: <repo paths or none>
BLOCKER: <none or one short line>
Do not restate the full context, plan, diff, or long reasoning in the chat reply.
```
## Artifact-Based Completion Checks
- Phase 1 is complete only when `about.md` and `context.md` both exist and are non-empty.
- Phase 2 is complete only when `plan.md` exists, contains a `## Status` section, and no unintended source edits were made.
- Phase 3 is complete only when `plan.md` contains both `Phases:` in the Status section and `Assessed: yes`.
- Phase 4 is complete only when the target phase checkbox changed to checked and the touched-file list matches the owned write set, or the blocker explains any mismatch.
- Phase 5 is complete only when the build outcome is known and the build checkbox is updated on success.
- Phase 6a is complete only when `review<R>.md` exists and contains a verdict line.
- Phase 6b is complete only when the requested fixes were applied and the post-fix build outcome is known.
## Phase 0: Setup
Record the current time now and store it as `$START_TIME`. You will use this at the end to display total elapsed time.
Before running any phase prompts, determine whether this is a new project or a follow-up task.
Follow-up detection:
1. Extract the first word or token from the task description. Call it `FIRST_TOKEN`.
2. Check `.ai/` to see existing project names.
3. Check whether `.ai/<FIRST_TOKEN>/about.md` exists.
4. If the file exists, this is a follow-up task. The project name is `FIRST_TOKEN`. The task description is everything after `FIRST_TOKEN`.
5. If the file does not exist, this is a new project. The full input is the task description.
Do not proceed until you have determined follow-up vs new.
For new projects:
- Using the list of existing projects, pick a unique short name (1-2 lowercase words, hyphen-separated) that does not collide.
- Create `.ai/<PROJECT>/`, `.ai/<PROJECT>/a/`, and `.ai/<PROJECT>/a/logs/`.
- Set `<LETTER>` = `a`.
For follow-up tasks:
- Scan `.ai/<PROJECT>/` for existing task folders (`a/`, `b/`, ...). Find the latest one (highest letter).
- The previous task letter = that highest letter.
- The new task letter = next letter in sequence.
- Create `.ai/<PROJECT>/<LETTER>/` and `.ai/<PROJECT>/<LETTER>/logs/`.
Then proceed to Phase 1. Follow-up tasks do not skip context gathering. They use a modified Phase 1F prompt.
## Phase 1: Context (New Project, letter = `a`)
```text
You are a context-gathering agent for a large C++ codebase (Telegram Desktop).
TASK: <TASK>
YOUR JOB: Read AGENTS.md, inspect the codebase, find all files and code relevant to this task, and write two documents.
Steps:
1. Read AGENTS.md for project conventions and build instructions.
2. Search the codebase for files, classes, functions, and patterns related to the task.
3. Read all potentially relevant files. Be thorough and prefer reading more rather than less.
4. For each relevant file, note:
- file path
- relevant line ranges
- what the code does and how it relates to the task
- key data structures, function signatures, and patterns used
5. Look for similar existing features that could serve as a reference implementation.
6. Check api.tl if the task involves Telegram API.
7. Check .style files if the task involves UI.
8. Check lang.strings if the task involves user-visible text.
Write two files.
File 1: .ai/<PROJECT>/about.md
This file is not used by any agent in the current task. It exists solely as a starting point for a future follow-up task's context gatherer. No planning, implementation, or review phase should rely on it during the current task.
Write it as if the project is already fully implemented and working. It should contain:
- Project: What this project does (feature description, goals, scope)
- Architecture: High-level architectural decisions, which modules are involved, how they interact
- Key Design Decisions: Important choices made about the approach
- Relevant Codebase Areas: Which parts of the codebase this project touches, key types and APIs involved
Do not include temporal state like "Current State", "Pending Changes", "Not yet implemented", or "TODO". Describe the project as a complete, coherent whole.
File 2: .ai/<PROJECT>/a/context.md
This is the primary task-specific implementation context. All downstream phases should be able to work from this file plus the referenced source files. It must be self-contained. Include:
- Task Description: The full task restated clearly
- Relevant Files: Every file path with line ranges and descriptions
- Key Code Patterns: How similar things are done in the codebase, with snippets when useful
- Data Structures: Relevant types, structs, classes
- API Methods: Any TL schema methods involved, copied from api.tl when useful
- UI Styles: Any relevant style definitions
- Localization: Any relevant string keys
- Build Info: Build command and any special notes
- Reference Implementations: Similar features that can serve as templates
Be extremely thorough. Another agent with no prior context will rely on this file.
Do not implement code in this phase.
```
## Phase 1F: Context (Follow-up Task, letter = `b`, `c`, ...)
```text
You are a context-gathering agent for a follow-up task on an existing project in a large C++ codebase (Telegram Desktop).
NEW TASK: <TASK>
YOUR JOB: Read the existing project state, gather any additional context needed, and produce fresh documents for the new task.
Steps:
1. Read AGENTS.md for project conventions and build instructions.
2. Read .ai/<PROJECT>/about.md. This is the project-level blueprint describing everything done so far.
3. Read .ai/<PROJECT>/<PREV_LETTER>/context.md. This is the previous task's gathered context.
4. Understand what has already been implemented by reading the actual source files referenced in about.md and the previous context.
5. Based on the new task description, search the codebase for any additional files, classes, functions, and patterns that are relevant to the new task but not already covered.
6. Read all newly relevant files thoroughly.
Write two files.
File 1: .ai/<PROJECT>/about.md (rewrite)
Rewrite this file instead of appending to it. The new about.md must be a single coherent document that describes the project as if everything, including this new task's changes, is already fully implemented and working.
It should incorporate:
- everything from the old about.md that is still accurate and relevant
- the new task's functionality described as part of the project, not as a pending change
- any changed design decisions or architectural updates from the new task requirements
It should not contain:
- temporal state such as "Current State", "Pending Changes", or "TODO"
- history of how requirements changed between tasks
- references to "the old approach" versus "the new approach"
- task-by-task changelog or timeline
- information that contradicts the new task requirements
File 2: .ai/<PROJECT>/<LETTER>/context.md
This is the primary document for the new task. It must be self-contained and should include:
- Task Description: The new task restated clearly, with enough project background that an implementation agent can understand it without reading any other .ai files
- Relevant Files: Every file path with line ranges relevant to this task
- Key Code Patterns: How similar things are done in the codebase
- Data Structures: Relevant types, structs, classes
- API Methods: Any TL schema methods involved
- UI Styles: Any relevant style definitions
- Localization: Any relevant string keys
- Build Info: Build command and any special notes
- Reference Implementations: Similar features that can serve as templates
Be extremely thorough. Another agent with no prior context should be able to work from this file alone.
Do not implement code in this phase.
```
## Phase 2: Plan
```text
You are a planning agent. You must create a detailed implementation plan.
Read these files:
- .ai/<PROJECT>/<LETTER>/context.md
- Then read the specific source files referenced in context.md to understand the code deeply.
Create a detailed plan in: .ai/<PROJECT>/<LETTER>/plan.md
The plan.md should contain:
## Task
<one-line summary>
## Approach
<high-level description of the implementation approach>
## Files to Modify
<list of files that will be created or modified>
## Files to Create
<list of new files, if any>
## Implementation Steps
Each step must be specific enough that an agent can execute it without ambiguity:
- exact file paths
- exact function names
- what code to add, modify, or remove
- where exactly in the file (after which function, in which class, and so on)
Number every step. Group steps into phases if there are more than about eight steps.
### Phase 1: <name>
1. <specific step>
2. <specific step>
### Phase 2: <name> (if needed)
1. <specific step>
## Build Verification
- build command to run
- expected outcome
## Status
- [ ] Phase 1: <name>
- [ ] Phase 2: <name> (if applicable)
- [ ] Build verification
- [ ] Code review
Do not implement code in this phase.
```
## Phase 3: Plan Assessment
```text
You are a plan assessment agent. Review and refine an implementation plan.
Read these files:
- .ai/<PROJECT>/<LETTER>/context.md
- .ai/<PROJECT>/<LETTER>/plan.md
- Then read the actual source files referenced to verify the plan makes sense.
Assess the plan:
1. Correctness: Are the file paths and line references accurate? Does the plan reference real functions and types?
2. Completeness: Are there missing steps? Edge cases not handled?
3. Code quality: Will the plan minimize code duplication? Does it follow existing codebase patterns from AGENTS.md?
4. Design: Could the approach be improved? Are there better patterns already used in the codebase?
5. Phase sizing: Each phase should be implementable by a single agent in one session. If a phase has more than about 8-10 substantive code changes, split it further.
Update plan.md with your refinements. Keep the same structure but:
- fix any inaccuracies
- add missing steps
- improve the approach if you found better patterns
- ensure phases are properly sized for single-agent execution
- add a line at the top of the Status section: `Phases: <N>`
- add `Assessed: yes` at the bottom of the file
If the plan is small enough for a single agent (roughly 8 steps or fewer), mark it as a single phase.
Do not implement code in this phase.
```
## Phase 4: Implementation
Run one implementation unit per plan phase. Keep implementation phases sequential by default. Parallelize only if their write sets are disjoint and the plan makes that safe.
For each phase in the plan that is not yet marked as done, use this prompt:
```text
You are an implementation agent working on phase <N> of an implementation plan.
Read these files first:
- .ai/<PROJECT>/<LETTER>/context.md
- .ai/<PROJECT>/<LETTER>/plan.md
Then read the source files you will be modifying.
Your owned write set for this phase:
<OWNED_WRITE_SET>
YOUR TASK: Implement only Phase <N> from the plan:
<paste the specific phase steps here>
Rules:
- Follow the plan precisely.
- Follow AGENTS.md coding conventions.
- You are not alone in the codebase. Respect existing changes and do not revert unrelated work.
- Do not modify .ai/ files except to update the Status section in plan.md.
- When done, update plan.md Status section: change `- [ ] Phase <N>: ...` to `- [x] Phase <N>: ...`
- Do not work on other phases.
When finished, report what you did, which files you changed, and any issues encountered.
```
After each implementation phase:
1. Use a narrow read or search to confirm the status line was updated.
2. Verify the owned write set and touched files with a small diff summary such as `git diff --name-only`.
3. If more phases remain, run the next implementation phase.
4. If all phases are done, proceed to build verification.
## Phase 5: Build Verification
Only run this phase if the task modified project source code.
Prefer running the build in the main session because it is critical-path work. If you delegate it, use a worker subagent and wait immediately for the result.
```text
You are a build verification agent.
Read these files:
- .ai/<PROJECT>/<LETTER>/context.md
- .ai/<PROJECT>/<LETTER>/plan.md
The implementation is complete. Your job is to build the project and fix any build errors that block the planned work.
Steps:
1. Run (from repository root): cmake --build ./out --config Debug --target Telegram
2. If the build succeeds, update plan.md: change `- [ ] Build verification` to `- [x] Build verification`
3. If the build fails:
a. Read the error messages carefully
b. Read the relevant source files
c. Fix the errors in accordance with the plan and AGENTS.md conventions
d. Rebuild and repeat until the build passes
e. Update plan.md status when done
Rules:
- Only fix build errors. Do not refactor or improve code beyond what is needed for a passing build.
- Follow AGENTS.md conventions.
- If build fails with file-locked errors (C1041, LNK1104, "cannot open output file", or similar access-denied lock issues), stop and report the lock. Do not retry.
- You are not alone in the codebase. Respect existing changes and do not revert unrelated work.
When finished, report the build result and which files, if any, you changed.
```
## Phase 6: Code Review Loop
After build verification passes, run up to 3 review-fix iterations. Set iteration counter `R = 1`.
Review loop:
```text
LOOP:
1. Run review phase 6a with iteration R.
2. Read review<R>.md verdict:
- "APPROVED" -> go to FINISH
- "NEEDS_CHANGES" -> run fix phase 6b
3. After fix work completes and build passes:
R = R + 1
If R > 3 -> go to FINISH
Otherwise -> go to step 1
FINISH:
- Update plan.md: change `- [ ] Code review` to `- [x] Code review`
- Proceed to Phase 7 on Windows, otherwise proceed to Completion
```
### Step 6a: Code Review
```text
You are a code review agent for Telegram Desktop (C++ / Qt).
Read these files:
- .ai/<PROJECT>/<LETTER>/context.md
- .ai/<PROJECT>/<LETTER>/plan.md
- REVIEW.md
- If R > 1, also read .ai/<PROJECT>/<LETTER>/review<R-1>.md
Then run `git diff` to see the current uncommitted changes for this task.
Read the modified source files in full to understand the changes in context.
Perform a focused code review using these criteria, in order:
1. Correctness and safety: Obvious logic errors, missing null checks at API boundaries, potential crashes, use-after-free, dangling references, race conditions.
2. Dead code: Added or left-behind code that is never used within the scope of the changes.
3. Redundant changes: Diff hunks that have no functional effect.
4. Code duplication: Repeated logic that should be shared.
5. Wrong placement: Code added to a module where it does not logically belong.
6. Function decomposition: Whether an extracted helper would clearly improve readability.
7. Module structure: Only in exceptional cases where a large new chunk of code clearly belongs elsewhere.
8. Style compliance: REVIEW.md rules and AGENTS.md conventions.
Important guidelines:
- Review only the changes made, not pre-existing code outside the scope of the task.
- Be pragmatic. Each suggestion should have a clear, concrete benefit.
- Do not suggest comments, docstrings, or over-engineering.
Write your review to: .ai/<PROJECT>/<LETTER>/review<R>.md
The review document should contain:
## Code Review - Iteration <R>
## Summary
<1-2 sentence overall assessment>
## Verdict: <APPROVED or NEEDS_CHANGES>
If the verdict is NEEDS_CHANGES, continue with:
## Changes Required
### <Issue 1 title>
- Category: <dead code | duplication | wrong placement | function decomposition | module structure | style | correctness>
- File(s): <file paths>
- Problem: <clear description>
- Fix: <specific description of what to change>
Keep the list focused. Prioritize the most impactful issues.
When finished, report your verdict clearly as: APPROVED or NEEDS_CHANGES.
```
### Step 6b: Review Fix
```text
You are a review fix agent. You implement improvements identified during code review.
Read these files:
- .ai/<PROJECT>/<LETTER>/context.md
- .ai/<PROJECT>/<LETTER>/plan.md
- .ai/<PROJECT>/<LETTER>/review<R>.md
Then read the source files mentioned in the review.
YOUR TASK: Implement all changes listed in review<R>.md.
Rules:
- Implement exactly the review changes, nothing more.
- Follow AGENTS.md coding conventions.
- You are not alone in the codebase. Respect existing changes and do not revert unrelated work.
- Do not modify .ai/ files except where the review process explicitly requires it.
After all changes are made:
1. Build (from repository root): cmake --build ./out --config Debug --target Telegram
2. If the build fails, fix build errors and rebuild until it passes.
3. If build fails with file-locked errors (C1041, LNK1104, "cannot open output file", or similar access-denied lock issues), stop and report the lock. Do not retry.
When finished, report what changes were made and which files you touched.
```
## Phase 7: Windows Text Normalization
Run this phase only on Windows hosts and only after the review loop has finished.
Use the current task's result logs as the source of truth for what Codex touched. Do not sweep the whole repo and do not rewrite unrelated files from a dirty worktree.
```text
You are performing the final Windows-only text normalization phase for task-think.
Read these files:
- .ai/<PROJECT>/<LETTER>/plan.md
- .ai/<PROJECT>/<LETTER>/logs/phase-4*.result.md
- .ai/<PROJECT>/<LETTER>/logs/phase-5*.result.md
- .ai/<PROJECT>/<LETTER>/logs/phase-6*.result.md
Your job:
- Collect the union of repo file paths listed under "Touched files" in those result logs.
- Keep only files inside the repository that currently exist and are textual project files: source, headers, build/config files, localization files, style files, and similar text assets.
- Exclude `.ai/`, `out/`, binary files, and unrelated user files that were not touched by Codex in this task.
- Rewrite each kept file so all line endings are CRLF.
- If a kept file is UTF-8 or ASCII text, write it back as UTF-8 without BOM. Never add a UTF-8 BOM to source/config/project text files.
- Preserve file content otherwise. Preserve whether the file ended with a trailing newline.
Rules:
- Run this phase in the main session on Windows.
- Do not modify files outside the touched-file set for the current task.
- Do not rewrite binary files.
- When scripting this phase, do not use writer APIs or defaults that emit UTF-8 with BOM.
- If a file cannot be normalized safely, record it as a failure instead of silently skipping it.
When finished:
1. Write `.ai/<PROJECT>/<LETTER>/logs/phase-7-line-endings.result.md`
2. Include:
- whether the phase completed
- which files were normalized
- which files were skipped and why
- whether any UTF-8 BOMs were removed or verified absent
- any failures that need to be mentioned in the final summary
```
## Completion
When all phases, including build verification, code review, and Windows line ending normalization when applicable, are done:
1. Read the final `plan.md` and report the summary to the user.
2. Show which files were modified or created.
3. Note any issues encountered during implementation.
4. Summarize the code review iterations: how many rounds, what was found and fixed, or whether it was approved on the first pass.
5. On Windows, mention the text-normalization result briefly: which project files were normalized, whether any BOMs were removed, or whether nothing needed changes.
6. Calculate and display the total elapsed time since `$START_TIME` (format as `Xh Ym Zs`, omitting zero components).
7. Remind the user of the project name so they can request follow-up tasks within the same project.
## Error Handling
- If any phase fails or gets stuck, follow the timeout and retry rules above. Do not close an agent solely because the final artifact is missing while its progress file is still advancing. For Phase 1, Phase 2, Phase 3, Phase 4, and Phase 6, do not rerun locally after delegated retries fail; ask the user instead.
- If `context.md` or `plan.md` is not written properly by a phase, rerun that phase in a fresh subagent with more specific instructions.
- If build errors persist after the build phase's attempts, report the remaining errors to the user.
- If a review-fix phase introduces new build errors that it cannot resolve, report to the user.
## Prompt Delivery And Logs
For each phase:
1. Write the full prompt to `.ai/<PROJECT>/<LETTER>/logs/phase-<name>.prompt.md`
2. Delegate by sending that prompt text to a fresh subagent, or use it as a same-session checklist only for the designated main-session phases or when delegation was unavailable from the start
3. For delegated phases, expect a matching `.ai/<PROJECT>/<LETTER>/logs/phase-<name>.progress.md` heartbeat while work is in flight
4. Save a concise completion note to `.ai/<PROJECT>/<LETTER>/logs/phase-<name>.result.md`
For review iterations, include the iteration in the file name, for example:
- `phase-6a-review-1.prompt.md`
- `phase-6a-review-1.result.md`
- `phase-6b-fix-1.prompt.md`
- `phase-6b-fix-1.result.md`
## Subagent Pattern
Use this pattern conceptually for delegated phases:
1. Write the phase prompt file.
2. Spawn a fresh subagent with the phase prompt, usually with `fork_context: false`.
3. Require the agent to create the matching progress file early and refresh it sparingly: at natural milestones when possible, otherwise only after a longer quiet stretch such as roughly 5-10 minutes.
4. Wait in 5-minute intervals when the next step is blocked on that phase, checking both the final artifact and the progress file on timeout.
5. When the phase looks close to finishing, switch to 1-2 minute waits.
6. Prefer filesystem mtime checks on the progress file first. If its mtime moved or the heartbeat counter increased, keep waiting; do not treat that as a stall.
7. If neither the artifact nor the progress file moves, send one short follow-up to the same agent, then retry once with a fresh subagent before involving the user.
8. Validate the expected artifact or code changes with small shell summaries and the completion checks above.
9. Write the result log from the validated outcome and the compact reply block.
Do not replace this pattern with shell-launched `codex exec`.
================================================
FILE: .agents/skills/task-think/SKILL.md
================================================
---
name: task-think
description: Orchestrate a multi-phase implementation workflow for this repository with artifact files under .ai/<project-name>/<letter>/ using Codex subagents instead of shell-spawned child processes. Use when the user wants one prompt to drive context gathering, planning, plan assessment, implementation, build verification, and review with persistent artifacts, clear phase handoffs, and a thin parent thread. Prefer spawn_agent/send_input/wait_agent, keep heavy pre-build work delegated when possible, and avoid pulling timed-out phases back into the main session.
---
# Task Pipeline
Run a full implementation workflow with repository artifacts and clear phase boundaries.
## Inputs
Collect:
- task description
- optional project name (if missing, derive a short kebab-case name)
- optional constraints (files, architecture, risk tolerance)
- optional screenshot paths
If screenshots are attached in UI but not present as files, write a brief textual summary into the task artifacts before spawning fresh subagents so later phases can read the requirements without inheriting the whole parent thread.
## Overview
The workflow is organized around projects. Each project lives in `.ai/<project-name>/` and can contain multiple sequential tasks (labeled `a`, `b`, `c`, ... `z`).
Project structure:
```text
.ai/<project-name>/
about.md # Single source of truth for the entire project
a/ # First task
context.md # Gathered codebase context for this task
plan.md # Implementation plan
review1.md # Code review documents (up to 3 iterations)
review2.md
review3.md
logs/
phase-*.prompt.md
phase-*.progress.md
phase-*.result.md
b/ # Follow-up task
context.md
plan.md
review1.md
logs/
...
c/ # Another follow-up task
...
```
- `about.md` is the project-level blueprint: a single comprehensive document describing what this project does and how it works, written as if everything is already fully implemented. It contains no temporal state ("current state", "pending changes", "not yet implemented"). It is rewritten, not appended to, each time a new task starts, incorporating the new task's changes as if they were always part of the design.
- Each task folder (`a/`, `b/`, ...) contains self-contained files for that task. The task's `context.md` carries all task-specific information: what specifically needs to change, the delta from the current codebase, gathered file references, and code patterns. Planning, implementation, and review phases should rely on the current task folder.
## Artifacts
Create and maintain:
- `.ai/<project-name>/about.md`
- `.ai/<project-name>/<letter>/context.md`
- `.ai/<project-name>/<letter>/plan.md`
- `.ai/<project-name>/<letter>/review<R>.md` (up to 3 review iterations)
- `.ai/<project-name>/<letter>/logs/phase-<name>.prompt.md`
- `.ai/<project-name>/<letter>/logs/phase-<name>.progress.md` for delegated phases
- `.ai/<project-name>/<letter>/logs/phase-<name>.result.md`
Each `phase-<name>.result.md` should capture a concise outcome summary: whether the phase completed, which files it touched, and any follow-up notes or blockers.
Each delegated `phase-<name>.progress.md` should act as a heartbeat: a tiny monotonic counter plus current step, files being read or edited, concrete findings so far, and the next checkpoint. It is not a final artifact; it exists so the parent can distinguish active research from a truly stuck subagent without rereading large context.
## Phases
Run these phases sequentially:
1. Phase 0: Setup - Record start time, detect follow-up vs new project, create directories.
2. Phase 1: Context Gathering - Read codebase, write `about.md` and `context.md`. Use Phase 1F for follow-up tasks.
3. Phase 2: Planning - Read context, write detailed `plan.md` with numbered steps grouped into phases.
4. Phase 3: Plan Assessment - Review and refine the plan for correctness, completeness, code quality, and phase sizing.
5. Phase 4: Implementation - Execute one implementation unit per plan phase.
6. Phase 5: Build Verification - Build the project, fix any build errors. Skip if no source code was modified.
7. Phase 6: Code Review Loop - Run review and fix iterations until approved or the iteration limit is reached.
8. Phase 7: Windows Text Normalization - On Windows only, after review passes and before the final summary, normalize LF to CRLF for the text source/config files Codex edited in this task and ensure rewritten UTF-8 project files are saved without BOM.
Use the phase prompt templates in `PROMPTS.md`.
## Execution Mode
Use Codex subagents as the primary orchestration mechanism.
- When delegation is available, Phase 1, Phase 2, Phase 3, each Phase 4 implementation unit, and each Phase 6 review or review-fix pass must run in fresh subagents. Do not rerun those phases in the main session midstream just because a wait timed out or an artifact is missing.
- Run Phase 7 in the main session on Windows because it depends on the final local file state and the exact touched-file set for the current task.
- When any same-session helper rewrites Windows project text files, preserve CRLF and write UTF-8 without BOM. Avoid writer APIs or defaults that silently inject a UTF-8 BOM.
- The main session may read `context.md` once after Phase 1 and `plan.md` once after Phase 3. After that, prefer narrow shell checks, file existence checks, and status-line reads instead of rereading full documents or diffs.
- Prefer `worker` for phases that write files. Use `explorer` only for narrow read-only questions that unblock your next local step.
- Keep `fork_context` off by default. Pass the phase prompt and explicit file paths instead of the whole thread unless the phase truly needs prior conversational context or thread-only attachments.
- When the platform supports it, request `model: gpt-5.4` and `reasoning_effort: xhigh` for spawned phase agents. If overrides are unavailable, inherit the current session settings.
- Write the exact phase prompt to the matching `logs/phase-<name>.prompt.md` file before you delegate. Use the same prompt file as a checklist if you later need to fall back to same-session execution.
- For delegated phases, require an early `logs/phase-<name>.progress.md` heartbeat before deep work. The subagent should create or update it early, keep it tiny, and refresh it sparingly: preferably at natural milestones, and otherwise only after a longer quiet stretch such as roughly 5-10 minutes.
- In every delegated prompt, require a compact final reply with only status, artifact paths, touched files, and blocker or `none`. Detailed reasoning belongs in `.ai/` artifacts, not in the chat reply.
- After a subagent finishes, verify that the expected artifacts or code changes exist, then write a short result log in `logs/phase-<name>.result.md`.
- For delegated phases, use `wait_agent` with a 5-minute timeout by default while a phase is still clearly in progress. Successful completion may wake earlier, so this does not add latency to finished phases.
- When a phase looks close to completion — for example the final artifact has appeared, a build is in its final pass, or the agent said it is wrapping up — switch to 1-2 minute waits until it lands.
- A timeout is not a failure; it only means no final status arrived yet. Do not treat short waits as stall detection for research-heavy phases.
- On timeout, inspect the expected artifact, the phase progress file mtime, and the worktree for movement. Prefer mtime checks first; only reread the progress file when you need detail.
- If the progress file mtime moved or its heartbeat counter increased since the previous check, treat that as active progress and wait again.
- If no usable final artifact exists yet but the progress file is appearing or advancing, keep the same subagent alive. Progress-file movement does not count toward the retry limit.
- If no usable final artifact exists yet and neither the expected artifact nor the progress file has moved since the previous blocked check, send one short follow-up asking the same subagent to refresh the progress file, finish the artifact, and return the compact status block, then wait again.
- Only if the same subagent still shows no meaningful movement in either the expected artifact or the progress file after two full default waits and one follow-up should you close it and rerun that phase in a fresh subagent.
- Use `wait_agent` only when the next step is blocked on the result. While the delegated phase runs, do small non-overlapping local tasks such as validating directory structure or preparing the next prompt file.
- Build verification is critical-path work. Prefer running the build in the main session, and only delegate a bounded build-fix phase when there is a concrete reason.
- If subagents are unavailable in the current environment, or current policy does not allow delegation from the start, run the phase in the main session using the same prompt files. Otherwise, do not switch a pre-build phase to same-session midstream. Never fall back to shell-spawned `codex exec` child processes from this skill.
## Verification Rules
- If build or test commands fail due to file locks or access-denied outputs (C1041, LNK1104), stop and ask the user to close locking processes before retrying.
- Treat a delegated phase as complete only when the required artifact or status update exists on disk and matches the phase goals; do not rely on the chat reply alone.
- Never claim completion without:
- implemented code changes present
- build attempt results recorded
- review pass documented with any follow-up fixes
- on Windows, if the task edited project source/config text files, a CRLF / no-BOM normalization pass recorded after review
## Completion Criteria
Mark complete only when:
- All plan phases are done
- Build verification is recorded
- Review issues are addressed or explicitly deferred with rationale
- On Windows, Codex-edited project source/config text files have been normalized to CRLF, any UTF-8 rewrites were saved without BOM, and the result is logged
- Display total elapsed time since start (format: `Xh Ym Zs`, omitting zero components)
- Remind the user of the project name so they can request follow-up tasks within the same project
## Error Handling
- If any phase fails, times out, or gets stuck, follow the retry ladder from Execution Mode. Do not close an agent solely because the final artifact is missing while its progress file is still moving. After two delegated attempts remain blocked with no meaningful progress, report the issue to the user. Do not absorb the phase into the main session before build unless delegation was unavailable from the start.
- If `context.md` or `plan.md` is not written properly by a phase, rerun that phase in a fresh subagent with more specific instructions. Do not repair it locally before build unless delegation was unavailable from the start.
- If build errors persist after the build phase's attempts, report the remaining errors to the user.
- If a review-fix phase introduces new build errors that it cannot resolve, report to the user.
- If Phase 7 cannot safely normalize a touched file on Windows or remove an introduced UTF-8 BOM from a touched project text file, record the failure in the result log and report it in the final summary instead of silently skipping it.
## User Invocation
Use plain language with the skill name in the request, for example:
`Use local task-think skill with subagents: make sure FileLoadTask::process does not create or read QPixmap on background threads; use QImage with ARGB32_Premultiplied instead.`
For follow-up tasks on an existing project:
`Use local task-think skill with subagents: my-project also handle the case where the file is already cached`
If screenshots are relevant, include file paths in the same prompt when possible.
================================================
FILE: .claude/commands/icon.md
================================================
---
description: Generate an SVG icon from a design mockup using vectosolve vectorization
allowed-tools: Read, Write, Edit, Glob, Grep, Bash, Agent, AskUserQuestion, TodoWrite, mcp__vectosolve__vectorize
---
# Icon - SVG Icon Generation from Design Mockup
You generate production-quality SVG icons for Telegram Desktop by vectorizing design mockup screenshots using the vectosolve MCP service, then post-processing the result to match the Telegram icon format.
**Arguments:** `$ARGUMENTS` = "$ARGUMENTS"
If `$ARGUMENTS` is empty, ask the user to describe the icon they want and paste a cropped screenshot of it.
## Overview
The workflow takes a cropped screenshot of an icon from a design mockup (grabbed from the clipboard), vectorizes it via the vectosolve MCP, then post-processes the SVG (recolor to white-on-transparent, restructure to minimal format, set 24x24 output size).
Working directory: `.ai/icon_{name}/` with iterations labeled by letter (`a/`, `b/`, ...), each containing `source.png`. Output SVGs are in the icon root: `a.svg`, `b.svg`, etc.
Follow-ups are supported: `/icon {icon_name} <description>` continues from where the previous run left off.
## Phase 0: Setup
**Record the current time** (using `date` or equivalent) as `$START_TIME`.
### Step 0a: Clipboard grab (MUST be the VERY FIRST action)
If there is an image attached to the user's message:
1. Generate a random 8-character hex string for `HASH` (use `openssl rand -hex 4` or similar).
2. **IMMEDIATELY** — before any other processing — run this Bash command to save the clipboard image:
```bash
HASH=$(openssl rand -hex 4) && if [[ "$OSTYPE" == darwin* ]]; then bash .claude/grab_clipboard.sh ".ai/icon_${HASH}.png"; else powershell -ExecutionPolicy Bypass -File .claude/grab_clipboard.ps1 ".ai/icon_${HASH}.png"; fi
```
On macOS `.claude/grab_clipboard.sh` is used; on Windows `.claude/grab_clipboard.ps1`. Both grab the current clipboard image and save it to the specified path.
3. If the command fails (exit 1 / no image on clipboard):
- Tell the user: **"Clipboard doesn't contain an image. Please copy the icon area first, then retry."** (On macOS: Cmd+Ctrl+Shift+4 to snip to clipboard; on Windows: Win+Shift+S.)
- **STOP IMMEDIATELY. Do NOT continue.** You cannot use the image pasted in the conversation — it exists only as pixels in the chat, not as a file you can send to vectosolve. The clipboard grab is the ONLY way to get the image to disk. Do not attempt any workaround.
4. Read back the saved `.ai/icon_HASH.png` using the Read tool.
5. Compare it visually with the image pasted in the conversation. They should depict the same thing.
- If they look **completely different**: delete `.ai/icon_HASH.png` and fail:
> "The clipboard image doesn't match what you pasted. Please re-copy and retry."
- If they look the same (or close enough): proceed. Store the temp path.
If NO image is attached to the message, skip this step entirely.
### Step 0b: Fail-fast — verify vectosolve MCP
Check that the `mcp__vectosolve__vectorize` tool is available by looking at your available tools list. If it is NOT available, fail immediately with:
> vectosolve MCP is not configured. Set it up with:
> ```
> claude mcp add vectosolve --scope user -e VECTOSOLVE_API_KEY=vs_xxx -- npx @vectosolve/mcp
> ```
> Then restart Claude Code.
### Step 0c: Follow-up detection
Extract the first word/token from `$ARGUMENTS` (everything before the first space or newline). Call it `FIRST_TOKEN`.
Run these TWO commands using the Bash tool, **IN PARALLEL**:
1. `ls .ai/` — to see all existing icon project names
2. `ls .ai/icon_{FIRST_TOKEN}/context.md` — to check if this specific icon project exists
**Evaluate the results:**
- If command 2 **succeeds** (context.md exists): this is a **follow-up**. The icon name is `FIRST_TOKEN`. The follow-up description is everything in `$ARGUMENTS` after `FIRST_TOKEN`.
- If command 2 **fails** (not found): this is a **new icon**. The full `$ARGUMENTS` is the icon description.
### Step 0d: New icon setup
1. Parse `$ARGUMENTS` to determine:
- **Icon description**: what the icon should depict
- **Icon type**: default is `menu` (24x24 menu/button icon). User may specify otherwise.
- **Target subfolder**: `menu/` by default, or another subfolder if specified.
2. Choose an icon file name:
- Lowercase letters and underscores only — **NO hyphens**
- Match existing naming conventions (check `Telegram/Resources/icons/{subfolder}/`)
- Must NOT conflict with existing icons
- Must NOT collide with existing `.ai/icon_{name}/` directories
3. Create `.ai/icon_{name}/` and `.ai/icon_{name}/a/`.
4. Write `.ai/icon_{name}/context.md` with:
```
## Icon: {icon_name}
Type: {menu/other}
Target: Telegram/Resources/icons/{subfolder}/{icon_name}.svg
## Original Request
{full $ARGUMENTS text}
## Follow-ups
(none yet)
```
5. Set `LETTER` to `a`.
### Step 0e: Follow-up setup
1. Read `.ai/icon_{name}/context.md` to get the icon type, subfolder, and full history.
2. Find the latest existing letter folder in `.ai/icon_{name}/` (highest letter).
3. Set `LETTER` to the next letter after the latest.
4. Create `.ai/icon_{name}/{LETTER}/`.
5. Update `.ai/icon_{name}/context.md` — append the follow-up description to the `## Follow-ups` section:
```
### Follow-up (starting at letter {LETTER})
{follow-up description}
```
### Step 0f: Place source image
If a clipboard image was grabbed in Step 0a:
1. Copy (or move) `.ai/icon_HASH.png` → `.ai/icon_{name}/source.png` (overwrite if exists — this is always the latest source).
2. Copy it to `.ai/icon_{name}/{LETTER}/source.png` (archive per-iteration source).
3. Delete the temp `.ai/icon_HASH.png` if it was copied (not moved).
If NO image was grabbed:
- **New icon with no image**: Ask the user to provide a screenshot. STOP.
- **Follow-up with no image**: The existing `source.png` in the icon root carries forward. Copy it to `.ai/icon_{name}/{LETTER}/source.png`. If no source.png exists at all, ask the user for an image.
### Step 0g: Verify renderer
Locate the render tool (`codegen_style` with `--render-svg` mode):
```bash
if [[ "$OSTYPE" == darwin* ]]; then
ls out/Debug/codegen_style
else
ls out/Telegram/codegen/codegen/style/Debug/codegen_style.exe
fi
```
If missing, build it: `cmake --build out --config Debug --target codegen_style`
Test on a known good SVG (use the appropriate binary path for the OS):
```bash
CODEGEN=$(if [[ "$OSTYPE" == darwin* ]]; then echo out/Debug/codegen_style; else echo out/Telegram/codegen/codegen/style/Debug/codegen_style.exe; fi)
$CODEGEN --render-svg Telegram/Resources/icons/menu/tag_add.svg .ai/icon_{name}/test_render.png 512
```
If works → delete test render, set `RENDER_AVAILABLE = true`. If fails → `RENDER_AVAILABLE = false`.
## Phase 1: Vectorize & Post-process
### Step 1a: Call vectosolve
Use the `mcp__vectosolve__vectorize` tool with `file_path` set to the **absolute path** of `.ai/icon_{name}/{LETTER}/source.png`.
**If this fails, STOP IMMEDIATELY.** Do NOT try to generate the SVG manually or by any other means. Report the error to the user and let them fix the issue (bad API key, no credits, network error, etc.).
Save the returned SVG content to `.ai/icon_{name}/{LETTER}/raw_vectosolve.svg`.
The MCP tool calls the vectosolve API ($0.20/call). The API key is stored in `~/.claude.json` MCP config (never in the repository).
### Step 1b: Post-process the SVG
The vectosolve SVG will have colors from the mockup, arbitrary dimensions, and possibly a non-square aspect ratio from a non-square screenshot crop. Post-processing fixes this by adjusting the **viewBox** — leave path coordinates untouched.
**Do NOT transform path coordinates.** Vectosolve's paths are correct — the only thing wrong is the framing. All geometry adjustments are done by manipulating the `viewBox` and the `width`/`height` attributes.
#### Sub-step 1: Read the request and determine parameters
Before touching the SVG, determine these from the user's request and context.md:
1. **Output size** (`OUT_W × OUT_H`): default is `24px × 24px` for menu icons. The user may request different dimensions (e.g., 36×36, 48×48, or non-square). Always check the request.
2. **Content padding**: default is ~2px equivalent on each side at the output scale (so content fills roughly (OUT_W-4) × (OUT_H-4)). The user may request different padding or edge-to-edge.
3. **Centering**: default is centered both horizontally and vertically. The user may request specific alignment (e.g., "align to bottom").
#### Sub-step 2: Parse the raw SVG
1. Extract the `viewBox`: `viewBox="VB_X VB_Y VB_W VB_H"` (typically `0 0 W H`).
2. Identify ALL paths. Classify each:
- **Background**: a rect or path spanning the full viewBox (first path that's a simple rectangle matching the viewBox bounds). **Remove it entirely.**
- **Content**: the actual icon shapes. **Keep these, paths unchanged.**
3. If paths have `transform="translate(TX,TY)"` attributes, that's fine — keep them as-is. The viewBox framing will work regardless.
#### Sub-step 3: Compute the content bounding box
Estimate the bounding box of the content paths (after removing the background). You can either:
- Eyeball it from the path coordinates (look at first/last M commands and extremes of curves)
- Or for precision, write a quick script to parse the paths and find min/max X/Y
Call the result: `CX_MIN, CY_MIN, CX_MAX, CY_MAX`. Content dimensions: `CW = CX_MAX - CX_MIN`, `CH = CY_MAX - CY_MIN`.
#### Sub-step 4: Compute the new viewBox
The viewBox determines what part of the SVG coordinate space maps to the output rectangle. By expanding the viewBox beyond the content bounds, we add padding. By making the viewBox aspect ratio match the output aspect ratio, we prevent stretching.
1. **Output aspect ratio**: `OUT_AR = OUT_W / OUT_H` (for 24×24 this is 1.0).
2. **Padding in SVG coordinates**: we want ~2px padding at output scale. The scale factor is `OUT_W / VB_CONTENT_W` approximately, so padding in SVG coords = `2 * (CW / (OUT_W - 4))` (or similar — the exact formula depends on which dimension is dominant). Simpler approach: aim for content to occupy ~83% of the viewBox (≈ 20/24), so:
- `PADDED_W = CW / 0.83`
- `PADDED_H = CH / 0.83`
3. **Match output aspect ratio**: the viewBox aspect ratio must equal `OUT_AR` to avoid stretching.
- If `PADDED_W / PADDED_H > OUT_AR`: width is dominant → `VB_W = PADDED_W`, `VB_H = VB_W / OUT_AR`
- If `PADDED_W / PADDED_H < OUT_AR`: height is dominant → `VB_H = PADDED_H`, `VB_W = VB_H * OUT_AR`
- If equal: `VB_W = PADDED_W`, `VB_H = PADDED_H`
4. **Center the content** in the new viewBox:
- `VB_X = CX_MIN - (VB_W - CW) / 2`
- `VB_Y = CY_MIN - (VB_H - CH) / 2`
- (Adjust if the user requested non-centered alignment)
The new viewBox is: `viewBox="VB_X VB_Y VB_W VB_H"`.
#### Sub-step 5: Recolor to white-on-transparent
- Replace ALL `fill` color values (anything that isn't `none`) with `#FFFFFF`.
- Remove ALL `stroke` and `stroke-width` attributes entirely.
- Remove `opacity` attributes if present.
#### Sub-step 6: Determine path composition
Look at the icon's visual structure and decide how paths should combine:
- **Outlined shape** (e.g., circle outline with something inside): combine outer + inner cutout into one `<path>` with `fill-rule="evenodd"`.
- **Separate distinct parts** (e.g., magnifying glass + checkmark): keep as separate `<path>` elements.
- **Filled shape with cutout** (e.g., filled circle with checkmark punched out): combine into one path with `fill-rule="evenodd"`.
#### Sub-step 7: Assemble final SVG
```xml
<?xml version="1.0" encoding="UTF-8"?>
<svg width="{OUT_W}px" height="{OUT_H}px" viewBox="{VB_X} {VB_Y} {VB_W} {VB_H}" xmlns="http://www.w3.org/2000/svg">
<g stroke="none" fill="none" fill-rule="evenodd">
<path d="..." fill="#FFFFFF"></path>
</g>
</svg>
```
- `width`/`height` = the output size from the request (default `24px`/`24px`).
- `viewBox` = the computed viewBox from Sub-step 4. The SVG renderer maps this coordinate region to the output size.
- Path `d` attributes are **unchanged** from vectosolve output (just background removed, colors replaced).
- No `<title>`, `id`, `xmlns:xlink`, `version`, `class`, `style`, XML comments, `<metadata>`, or `preserveAspectRatio`.
- No `<circle>`, `<rect>`, `<line>` — only `<path>`.
Write the final SVG to `.ai/icon_{name}/{LETTER}.svg`.
### Step 1c: Render
If `RENDER_AVAILABLE`:
```bash
$CODEGEN --render-svg ".ai/icon_{name}/{LETTER}.svg" ".ai/icon_{name}/render_{LETTER}.png" 512
```
Read the render to visually verify the result.
## Phase 2: Review
After rendering, assess the result:
1. **Recognizable?** The icon should be clearly identifiable as the intended symbol.
2. **Scale reasonable?** Should fill the space appropriately with ~2-3px padding.
3. **Clean lines?** No broken paths, artifacts, or unwanted elements.
4. **Correct colors?** All white on transparent (no leftover colors from the mockup).
If the result looks good → proceed to Phase 3 (Output).
If there are fixable issues (stray element, missed color, etc.) → fix the SVG directly, re-render, and re-check.
If the result is poor (vectosolve couldn't handle the input well) → report to the user and suggest:
- Trying a cleaner/larger crop of the icon
- Providing a different screenshot
- Following up: `/icon {icon_name} <description of what to change>`
## Phase 3: Output
1. Read the `Target:` line from `.ai/icon_{name}/context.md` to get the output path.
2. Copy the final SVG to that target path (e.g., `Telegram/Resources/icons/menu/{icon_name}.svg`).
3. Update `.ai/icon_{name}/context.md` — append to the end:
```
## Latest Output
Letter: {LETTER}
Written to: {target_path}
```
4. Report to the user:
- Final icon file path
- Number of vectosolve calls made (cost at $0.20/call)
- Suggest verifying visually
- Working directory `.ai/icon_{name}/` has all iterations
- Elapsed time since `$START_TIME` (format `Xm Ys`)
- Follow-up: `/icon {icon_name} <description of what to change>`
## Text-only Follow-ups (no new image)
When a follow-up has no attached image, the user wants to refine the existing SVG based on text feedback. In this case:
1. Skip Phase 1 (no vectosolve call needed).
2. Read the latest SVG (`.ai/icon_{name}/{prev_letter}.svg`).
3. Read the latest render if available.
4. Apply the user's requested changes by editing the SVG directly.
5. Save as `.ai/icon_{name}/{LETTER}.svg`.
6. Render, review, and output as normal (Phases 1c → 3).
If the changes are too complex for manual SVG editing, suggest the user provide a new screenshot instead.
## Error Handling
- If clipboard grab fails → tell user to re-copy and retry.
- If vectosolve returns an error → report it and suggest a different/cleaner screenshot.
- If vectosolve returns SVG that can't be parsed → save raw output for debugging, report to user.
- If the render helper fails → set `RENDER_AVAILABLE = false`, continue with SVG-only review.
- If post-processing produces a broken SVG → fall back to the raw vectosolve output and do lighter cleanup.
================================================
FILE: .claude/commands/planner.md
================================================
---
description: Plan and create a repetitive task automation (prompt.md + tasks.json pair)
allowed-tools: Read, Write, Edit, Glob, Grep, Bash(mkdir:*), Bash(ls:*), AskUserQuestion
---
# Task Planner - Create Automated Task Workflows
You are setting up a new **repetitive task automation** for Claude Code. The goal is to create a folder in `.ai/<featurename>/` containing:
- `prompt.md` - Detailed instructions for the autonomous agent
- `tasks.json` - List of tasks with completion tracking
This pair can then be executed via `.claude/iterate.ps1 <featurename>`.
## Your Workflow
### 1. Understand the Goal
First, understand what the user wants to automate. Ask clarifying questions using AskUserQuestion if needed:
- What is the overall goal/feature being implemented?
- What are the individual tasks involved?
- Are there dependencies between tasks?
- What files/areas of the codebase are involved?
- Are there any reference examples or patterns to follow?
### 2. Choose a Feature Name
The `<featurename>` should be:
- Short (1-2 words, lowercase, hyphen-separated)
- Easy to type on command line
- Descriptive of the work being done
- Not already used in `.ai/`
Check existing folders:
```bash
ls .ai/
```
Suggest a name to the user or let them specify one directly via $ARGUMENTS.
### 3. Create the Folder and Files
Create `.ai/<featurename>/`:
**prompt.md** should include:
- Overview of what we're doing
- Architecture/context needed
- Step-by-step instructions for each task type
- Code patterns and examples
- Build/test commands
- Commit message format (see below)
### Commit Message Guidelines
All prompts should specify commit message length requirements:
- **Soft limit**: ~50 characters (ideal length for first line)
- **Hard limit**: 76 characters (must not exceed)
Example instruction for prompt.md:
```
## Commit Format
First line: Short summary ending with a dot (aim for ~50 chars, max 76 chars)
<Optional body with details, also ending with a dot.>
IMPORTANT: Never try to commit files in .ai/
```
**tasks.json** format:
```json
{
"tasks": [
{
"id": "task-id",
"title": "Short task title",
"description": "Detailed description of what to do",
"started": false,
"completed": false,
"dependencies": ["other-task-id"]
}
]
}
```
### 4. Iterate with the User
After creating initial files, the user may want to:
- Add more tasks to tasks.json
- Refine the prompt with more details
- Add examples or patterns
- Clarify instructions
Keep refining until the user is satisfied.
## Arguments
If `$ARGUMENTS` is provided, it's the feature name to use:
- `$ARGUMENTS` = "$ARGUMENTS"
If empty, you'll need to determine/suggest a name based on the discussion.
## Examples
### Example 1: Settings Migration
```
/taskplanner settings-upgrade
```
Creates `.ai/settings-upgrade/` with prompt and tasks for migrating settings sections.
### Example 2: Open-ended
```
/taskplanner
```
Starts a conversation to understand what needs to be automated, then creates the appropriate folder.
## Starting Point
Let's begin! Please describe:
1. What repetitive coding task do you want to automate?
2. What is the end goal?
3. Do you have initial tasks in mind, or should we discover them together?
================================================
FILE: .claude/commands/reflect.md
================================================
---
description: Learn from corrections — examine staged vs unstaged diffs and optionally distill insights into AGENTS.md or REVIEW.md
allowed-tools: Read, Edit, Bash(git diff:*), Bash(git status:*), Bash(git log:*), Bash(ls:*), AskUserQuestion
---
# Reflect — Learn from Corrections
You are a reflection agent. Your job is to examine the difference between what an AI agent produced (staged changes) and what the user corrected (unstaged changes), and determine whether any **general, reusable insight** can be extracted and added to the project's coding guidelines.
**CRITICAL: Use extended thinking ultrathink for your analysis. This requires deep, careful reasoning.**
## Arguments
`$ARGUMENTS` = "$ARGUMENTS"
If `$ARGUMENTS` is provided, it is a task name (project name from the `/task` workflow). This means the agent was working within `.ai/<task-name>/` and you should read the task context for deeper understanding of what the agent was trying to do.
If `$ARGUMENTS` is empty, skip the task context step — just work from the diffs alone.
## Context
The workflow is:
1. An AI agent implemented something and its changes were staged (`git add`).
2. The user reviewed and corrected the agent's work. These corrections are unstaged.
3. You are now invoked to reflect on what went wrong and whether it reveals a pattern.
## Step 1: Gather the Diffs and Task Context
Run these commands in parallel:
```bash
git diff --cached # What the agent wrote (staged)
git diff # What the user corrected (unstaged, on top of staged)
git status # Which files are involved
```
If either diff is empty, tell the user and stop. Both diffs must be non-empty for reflection to be meaningful.
### Task context (only if `$ARGUMENTS` is non-empty)
The task name is `$ARGUMENTS`. Read the task's project context:
1. Read `.ai/$ARGUMENTS/about.md` — the project-level description of what this feature does.
2. Find the latest task iteration folder: list `.ai/$ARGUMENTS/` and pick the folder with the highest letter (`a`, `b`, `c`, ...).
3. Read `.ai/$ARGUMENTS/<latest-letter>/context.md` — the detailed implementation context the agent was working from.
This helps you distinguish between:
- **Task-specific mistakes** — the agent misunderstood this particular feature's requirements or made a wrong choice within the specific problem. These are NOT documentation-worthy.
- **General convention mistakes** — the agent did something that violates a pattern the codebase follows broadly, regardless of which feature is being implemented. These ARE potentially documentation-worthy.
Having the task context makes this distinction much sharper. Without it, you might mistake a task-specific correction for a general pattern or vice versa.
## Step 2: Read the Current Guidelines
Read both files:
- `AGENTS.md` — development guidelines: build system, coding style, API usage patterns, UI styling, localization, rpl, architectural conventions, "how to do things"
- `REVIEW.md` — mechanical style and formatting rules: brace placement, operator position, type checks, variable initialization, call formatting
Read them carefully. You need to know exactly what's already documented to avoid duplicates and detect contradictions.
## Step 3: Analyze the Corrections
Now think deeply. For each correction the user made, ask yourself:
1. **What did the agent do wrong?** Understand the specific mistake.
2. **Why was it wrong?** Identify the underlying principle.
3. **Is this already covered by AGENTS.md or REVIEW.md?** Check carefully:
- If the existing rule's scope, title, and examples **clearly cover** this exact scenario and the agent just ignored it — that's not a documentation problem. Skip it.
- If the existing rule **technically applies** but its scope is too narrow, its examples don't illustrate this usage pattern, or its wording would reasonably lead an agent to think it doesn't apply here — **the rule needs improvement**. Treat this as a potential insight (broaden the scope, add examples, adjust wording). A rule that agents repeatedly violate is an ineffective rule.
4. **Is this specific to this particular task, or is it general?** Most corrections are task-specific ("wrong variable here", "this should call that function instead"). These are NOT documentation-worthy. Only patterns that would apply across many different tasks are worth capturing.
5. **Would documenting this actually help a future agent?** Some things are too context-dependent or too obvious to be useful as a written rule. Be honest about this.
## Step 4: Decision
After analysis, you MUST reach one of these conclusions:
### Conclusion A: No actionable insight
The corrections are purely task-specific, or the existing documentation clearly and specifically covers the exact scenario and the agent simply ignored it. Say what the corrections were and why no doc changes are needed. Then **stop**.
### Conclusion B: New insight found
You can articulate a **concise, general rule** that:
- Applies broadly (not just to this one task)
- Is not already documented
- Would genuinely help a future agent avoid the same class of mistake
- Can be expressed in a few sentences with a clear code example
If you have a new insight, proceed to Step 5.
### Conclusion C: Existing rule needs improvement
A rule already exists in AGENTS.md or REVIEW.md, but its **scope is too narrow**, its **examples don't cover** the pattern the agent encountered, or its **wording** would reasonably lead an agent to think the rule doesn't apply. The agent's mistake is evidence the rule isn't effective.
This is NOT the same as Conclusion A. The test: would a careful agent, reading the existing rule, clearly know it applies to this specific situation? If no — the rule needs to be broadened, its examples expanded, or its title/scope adjusted. Proceed to Step 5.
**Common signs of an ineffective rule:**
- The rule's title or scope restricts it to a context narrower than the actual principle (e.g., "in localization calls" when the pattern applies generally)
- The examples only show one usage pattern, and the agent encountered a different one
- The wording describes *what* to use but not *when* — so agents only apply it in situations that look like the examples
## Step 5: Categorize and Check for Contradictions
### Where does it belong?
- **REVIEW.md** — if it's a mechanical/style rule: formatting, naming, syntax preferences, call structure, brace/operator placement, type usage patterns. Rules that can be checked by looking at code locally without understanding the broader feature.
- **AGENTS.md** — if it's an architectural/behavioral guideline: how to use APIs, where to place code, design patterns, build conventions, module organization, reactive patterns (rpl), localization usage, style system usage. Rules that require understanding the broader context.
### Does it contradict existing content?
Read the target file again carefully. Check if:
1. The new insight **contradicts** an existing rule — if so, do NOT just append or just remove. Instead, use AskUserQuestion to present both the existing rule and the new insight to the user, explain the contradiction, and ask how to reconcile them.
2. The new insight **overlaps** with an existing rule — if so, consider whether the existing rule should be extended/refined rather than adding a separate entry.
3. The new insight is **complementary** — it adds something new without conflicting. This is the simplest case.
## Step 6: Propose the Change
**Do NOT silently edit the files.** First, present your proposed change to the user:
- Quote the exact text you want to add or modify
- Explain which file and where in the file
- Explain why this is general enough to document
- If modifying existing text, show the before and after
Use AskUserQuestion to get the user's approval before making any edit.
Only after the user approves, apply the edit using the Edit tool.
## Rules
- **Keep docs lean and high-signal.** Don't add vague or overly specific rules. But don't default to inaction either — if the user had to manually fix something that a better-worded rule would have prevented, improving that rule is high-signal work.
- **Never dump corrections verbatim.** The goal is distilled principles, not a changelog of mistakes.
- **One insight per reflection, maximum.** If you think you see multiple insights, pick the strongest one. You can always run `/reflect` again next time.
- **Keep the same style.** Match the formatting, tone, and level of detail of the target file. REVIEW.md uses specific before/after code examples. AGENTS.md uses explanatory sections with code snippets.
- **Don't add "don't do X" rules.** Frame rules positively: "do Y" is better than "don't do X." Show the right way, not just the wrong way.
- **No meta-commentary.** Don't add notes like "Added after reflection on..." — the rule should read as if it was always there.
================================================
FILE: .claude/commands/release.md
================================================
---
description: Prepare changelog, set version, and commit a new release
allowed-tools: Read, Bash, Edit, Grep, AskUserQuestion
---
# Release — Changelog, Set Version, Commit
Full release flow: generate changelog entry, run `set_version`, and commit.
**Arguments:** `$ARGUMENTS` = "$ARGUMENTS"
Parse `$ARGUMENTS` for two optional parts (in any order):
- A **version number** like `6.7` or `6.7.0` — if provided, use it as the new version exactly.
- The word **"beta"** — if present, mark the release as beta.
If no version number is given, auto-increment the patch component (see step 2).
## Steps
### 1. Check git status is clean
Run `git status --porcelain`. If there are any uncommitted changes, **stop** and ask the user to commit or discard them before proceeding. Do not continue until status is clean.
### 2. Read the current changelog
Read `changelog.txt` from the repository root. Note the **latest version number** on the first line (e.g. `6.6.3 beta (12.03.26)`). Parse its major.minor.patch components.
### 3. Determine the new version number
- **If a version was provided in arguments**, use it directly (append `.0` if only major.minor was given).
- **If no version was provided**, auto-increment from the latest changelog version:
- If it was a beta, and the new release is **not** beta, reuse the same version number but drop "beta".
- If the new release is beta and the latest was also beta with the same major.minor, bump patch.
- Otherwise bump the patch component by 1.
- Present the chosen version to the user and ask for confirmation before proceeding. If the user suggests a different version, use that instead.
### 4. Fetch tags and determine the last release tag
Run `git fetch origin --tags` first to ensure all tags from the public repository are available locally. Then run `git tag --sort=-v:refname` and find the most recent `v*` tag. This is the baseline for the diff.
### 5. Collect commits
Run `git log <last-tag>..HEAD --oneline` to get all commits since the last release.
### 6. Write the changelog entry
Analyze every commit message. Group them mentally into features, improvements, and bug fixes. Then produce **brief, user-facing bullet points** following these rules:
- **Style:** Match the existing changelog tone exactly — short, imperative sentences starting with a verb (Fix, Add, Allow, Show, Improve, Support…). Keep the trailing periods (the existing changelog uses them).
- **Brevity:** Each bullet should be one short sentence, around 80 characters when possible. No implementation details. No commit hashes.
- **Selection:** Only include changes that matter to end users. Skip CI, build infra, submodule bumps, code style, refactors, and intermediate WIP commits. Collapse many related commits (e.g. a dozen image-editor commits) into one or two bullets.
- **Ordering:** Features first, then improvements, then bug fixes.
- **Quantity:** Aim for 4-12 bullets total depending on the amount of changes.
### 7. Format and insert into changelog.txt
Use this exact format (date is today in DD.MM.YY):
```
<version> [beta ](DD.MM.YY)
- Bullet one.
- Bullet two.
```
Prepend the new entry at the very top of `changelog.txt`, separated by a blank line from the previous first entry. Use the Edit tool.
### 8. Wait for approval
After writing the entry to `changelog.txt` (step 7), tell the user the changelog has been updated and ask them to review it in the IDE. They can edit it directly and tell you to continue, or tell you what to change in chat. Do **not** print the full entry in chat — the file itself is the review surface.
**Do NOT proceed until the user explicitly approves.**
### 9. Run set_version
Once approved, run the `set_version` script from the repository root. On Windows:
```
.\Telegram\build\set_version.bat <version_arg>
```
Where `<version_arg>` is formatted as the `set_version` script expects:
- Stable: `6.7.0` or `6.7`
- Beta: `6.7.0.beta`
Verify the script exits successfully (exit code 0). If it fails, show the error and stop.
### 10. Commit
Stage all changes and create a commit. The commit message format:
**First line:**
- For stable: `Version <major>.<minor>.` if patch is 0, otherwise `Version <major>.<minor>.<patch>.`
- For beta: `Beta version <major>.<minor>.<patch>.`
**Then an empty line, then the changelog bullets.** Copy bullet lines from the changelog as-is. Only wrap lines that exceed 72 characters; shorter lines must stay on a single line. When wrapping is needed, break at logically correct places (between words/phrases) and indent continuation lines with two spaces.
Example commit message:
```
Beta version 6.6.3.
- Drawing tools in image editor
(brush, marker, eraser, arrow).
- Draw-to-reply button in media viewer.
- Trim recorded voice messages.
- Fix reorder freeze in chats list.
```
Use a HEREDOC to pass the message to `git commit -a`.
### 11. Done
Run `git log -1` to show the resulting commit and confirm success.
================================================
FILE: .claude/commands/task.md
================================================
---
description: Implement a feature or fix using multi-agent workflow with fresh context at each phase
allowed-tools: Read, Write, Edit, Glob, Grep, Bash, Task, AskUserQuestion, TodoWrite
---
# Task - Multi-Agent Implementation Workflow
You orchestrate a multi-phase implementation workflow that uses fresh agent spawns to work within context window limits on a large codebase.
**Arguments:** `$ARGUMENTS` = "$ARGUMENTS"
If `$ARGUMENTS` is provided, it's the task description. If empty, ask the user what they want implemented.
## Overview
The workflow is organized around **projects**. Each project lives in `.ai/<project-name>/` and can contain multiple sequential **tasks** (labeled `a`, `b`, `c`, ... `z`).
Project structure:
```
.ai/<project-name>/
about.md # Single source of truth for the entire project
a/ # First task
context.md # Gathered codebase context for this task
plan.md # Implementation plan
review1.md # Code review documents (up to 3)
review2.md
review3.md
b/ # Follow-up task
context.md
plan.md
review1.md
c/ # Another follow-up task
...
```
- `about.md` is the project-level blueprint — a single comprehensive document describing what this project does and how it works, written as if everything is already fully implemented. It contains no temporal state ("current state", "pending changes", "not yet implemented"). It is **rewritten** (not appended to) each time a new task starts, incorporating the new task's changes as if they were always part of the design.
- Each task folder (`a/`, `b/`, ...) contains self-contained files for that task. The task's `context.md` carries all task-specific information: what specifically needs to change, the delta from the current codebase, gathered file references and code patterns. Planning, implementation, and review agents only read the current task's folder.
## Phase 0: Setup
**Record the current time now** (using `Get-Date` in PowerShell or equivalent) and store it as `$START_TIME`. You will use this at the end to display total elapsed time.
⚠️ **CRITICAL: Follow-up detection MUST happen FIRST, before anything else.**
### Step 0a: Follow-up detection (MANDATORY — do this BEFORE understanding the task)
Extract the first word/token from `$ARGUMENTS` (everything before the first space or newline). Call it `FIRST_TOKEN`.
Then run these TWO commands using the Bash tool, IN PARALLEL, right now:
1. `ls .ai/` — to see all existing project names
2. `ls .ai/<FIRST_TOKEN>/about.md` — to check if this specific project exists
**Evaluate the results:**
- If command 2 **succeeds** (the file exists): this is a **follow-up task**. The project name is `FIRST_TOKEN`. The task description is everything in `$ARGUMENTS` AFTER `FIRST_TOKEN` (strip leading whitespace).
- If command 2 **fails** (file not found): this is a **new project**. The full `$ARGUMENTS` is the task description.
**Do NOT proceed to step 0b until you have run these commands and determined follow-up vs new.**
### Step 0b: Project setup
**For new projects:**
- Using the list from command 1, pick a unique short name (1-2 lowercase words, hyphen-separated) that doesn't collide with existing projects.
- Create `.ai/<project-name>/` and `.ai/<project-name>/a/`.
- Set current task letter = `a`.
**For follow-up tasks:**
- Scan `.ai/<project-name>/` for existing task folders (`a/`, `b/`, ...). Find the latest one (highest letter).
- The previous task letter = that highest letter.
- The new task letter = next letter in sequence.
- Create `.ai/<project-name>/<new-letter>/`.
Then proceed to Phase 1 (Context Gathering) in both cases. Follow-up tasks do NOT skip context gathering — they go through a modified version of it.
## Phase 1: Context Gathering
### For New Projects (task letter = `a`)
Spawn an agent (Task tool, subagent_type=`general-purpose`) with this prompt structure:
```
You are a context-gathering agent for a large C++ codebase (Telegram Desktop).
TASK: <paste the user's task description here>
YOUR JOB: Read AGENTS.md, inspect the codebase, find ALL files and code relevant to this task, and write two documents.
Steps:
1. Read AGENTS.md for project conventions and build instructions.
2. Search the codebase for files, classes, functions, and patterns related to the task.
3. Read all potentially relevant files. Be thorough - read more rather than less.
4. For each relevant file, note:
- File path
- Relevant line ranges
- What the code does and how it relates to the task
- Key data structures, function signatures, patterns used
5. Look for similar existing features that could serve as a reference implementation.
6. Check api.tl if the task involves Telegram API.
7. Check .style files if the task involves UI.
8. Check lang.strings if the task involves user-visible text.
Write TWO files:
### File 1: .ai/<project-name>/about.md
NOTE: This file is NOT used by any agent in the current task. It exists solely as a starting point for a FUTURE follow-up task's context gatherer. No planning, implementation, or review agent will ever read it. Only the context-gathering agent of the next follow-up task reads about.md (together with the latest context.md) to produce a fresh context.md for that next task.
Write it as if the project is already fully implemented and working. It should contain:
- **Project**: What this project does (feature description, goals, scope)
- **Architecture**: High-level architectural decisions, which modules are involved, how they interact
- **Key Design Decisions**: Important choices made about the approach
- **Relevant Codebase Areas**: Which parts of the codebase this project touches, key types and APIs involved
Do NOT include temporal state like "Current State", "Pending Changes", "Not yet implemented", "TODO", or any other framing that distinguishes between "done" and "not done". Describe the project as a complete, coherent whole — as if everything is already working. This is a project overview, not a status tracker. Task-specific work belongs exclusively in context.md.
### File 2: .ai/<project-name>/a/context.md
This is the task-specific implementation context. This is the PRIMARY document — all downstream agents (planning, implementation, review) will read ONLY this file. It must be completely self-contained. It should contain:
- **Task Description**: The full task restated clearly
- **Relevant Files**: Every file path with line ranges and descriptions of what's there
- **Key Code Patterns**: How similar things are done in the codebase (with code snippets)
- **Data Structures**: Relevant types, structs, classes
- **API Methods**: Any TL schema methods involved (copied from api.tl)
- **UI Styles**: Any relevant style definitions
- **Localization**: Any relevant string keys
- **Build Info**: Build command and any special notes
- **Reference Implementations**: Similar features that can serve as templates
Be extremely thorough. Another agent with NO prior context will read this file and must be able to understand everything needed to implement the task.
```
After this agent completes, read both `about.md` and `a/context.md` to verify they were written properly.
### For Follow-up Tasks (task letter = `b`, `c`, ...)
Spawn an agent (Task tool, subagent_type=`general-purpose`) with this prompt structure:
```
You are a context-gathering agent for a follow-up task on an existing project in a large C++ codebase (Telegram Desktop).
NEW TASK: <paste the follow-up task description here>
YOUR JOB: Read the existing project state, gather any additional context needed, and produce fresh documents for the new task.
Steps:
1. Read AGENTS.md for project conventions and build instructions.
2. Read .ai/<project-name>/about.md — this is the project-level blueprint describing everything done so far.
3. Read .ai/<project-name>/<previous-letter>/context.md — this is the previous task's gathered context.
4. Understand what has already been implemented by reading the actual source files referenced in about.md and the previous context.
5. Based on the NEW TASK description, search the codebase for any ADDITIONAL files, classes, functions, and patterns that are relevant to the new task but not already covered.
6. Read all newly relevant files thoroughly.
Write TWO files:
### File 1: .ai/<project-name>/about.md (REWRITE)
NOTE: This file is NOT used by any agent in the current task. It exists solely as a starting point for a FUTURE follow-up task's context gatherer. No planning, implementation, or review agent will ever read it. You are rewriting it now so that the next follow-up has an accurate project overview to start from.
REWRITE this file (not append). The new about.md must be a single coherent document that describes the project as if everything — including this new task's changes — is already fully implemented and working.
It should incorporate:
- Everything from the old about.md that is still accurate and relevant
- The new task's functionality described as part of the project (not as "changes to make")
- Any changed design decisions or architectural updates from the new task requirements
It should NOT contain:
- Any temporal state: "Current State", "Pending Changes", "TODO", "Not yet implemented"
- History of how requirements changed between tasks
- References to "the old approach" vs "the new approach"
- Task-by-task changelog or timeline
- Any distinction between "what was done before" and "what this task adds"
- Information that contradicts the new task requirements (if the new task changes direction, the about.md should reflect the NEW direction as if it was always the plan)
Think of about.md as "the complete description of what this project does and how it works." Someone reading it should understand the full project as a finished product, without knowing it went through multiple tasks.
### File 2: .ai/<project-name>/<new-letter>/context.md
This is the PRIMARY document — all downstream agents (planning, implementation, review) will read ONLY this file. It must be completely self-contained. about.md will NOT be available to them.
It should contain:
- **Task Description**: The new task restated clearly, with enough project background (from about.md and previous context.md) that an implementation agent can understand it without reading any other .ai/ files
- **Relevant Files**: Every file path with line ranges relevant to THIS task (including files modified by previous tasks and any newly relevant files)
- **Key Code Patterns**: How similar things are done in the codebase
- **Data Structures**: Relevant types, structs, classes
- **API Methods**: Any TL schema methods involved
- **UI Styles**: Any relevant style definitions
- **Localization**: Any relevant string keys
- **Build Info**: Build command and any special notes
- **Reference Implementations**: Similar features that can serve as templates
Be extremely thorough. Another agent with NO prior context will read ONLY this file and must be able to understand everything needed to implement the new task. Do NOT assume the reader has seen about.md or any previous task files. The context.md is the single source of truth for all downstream agents — it must include all relevant project background, not just the delta.
```
After this agent completes, read both `about.md` and `<new-letter>/context.md` to verify they were written properly.
## Phase 2: Planning
Spawn an agent (Task tool, subagent_type=`general-purpose`) with this prompt structure:
```
You are a planning agent. You must create a detailed implementation plan.
Read these files:
- .ai/<project-name>/<letter>/context.md - Contains all gathered context for this task
- Then read the specific source files referenced in context.md to understand the code deeply.
Think carefully about the implementation approach.
Create a detailed plan in: .ai/<project-name>/<letter>/plan.md
The plan.md should contain:
## Task
<one-line summary>
## Approach
<high-level description of the implementation approach>
## Files to Modify
<list of files that will be created or modified>
## Files to Create
<list of new files, if any>
## Implementation Steps
Each step must be specific enough that an agent can execute it without ambiguity:
- Exact file paths
- Exact function names
- What code to add/modify/remove
- Where exactly in the file (after which function, in which class, etc.)
Number every step. Group steps into phases if there are more than ~8 steps.
### Phase 1: <name>
1. <specific step>
2. <specific step>
...
### Phase 2: <name> (if needed)
...
## Build Verification
- Build command to run
- Expected outcome
## Status
- [ ] Phase 1: <name>
- [ ] Phase 2: <name> (if applicable)
- [ ] Build verification
- [ ] Code review
```
After this agent completes, read `plan.md` to verify it was written properly.
## Phase 3: Plan Assessment
Spawn an agent (Task tool, subagent_type=`general-purpose`) with this prompt structure:
```
You are a plan assessment agent. Review and refine an implementation plan.
Read these files:
- .ai/<project-name>/<letter>/context.md
- .ai/<project-name>/<letter>/plan.md
- Then read the actual source files referenced to verify the plan makes sense.
Carefully assess the plan:
1. **Correctness**: Are the file paths and line references accurate? Does the plan reference real functions and types?
2. **Completeness**: Are there missing steps? Edge cases not handled?
3. **Code quality**: Will the plan minimize code duplication? Does it follow existing codebase patterns from AGENTS.md?
4. **Design**: Could the approach be improved? Are there better patterns already used in the codebase?
5. **Phase sizing**: Each phase should be implementable by a single agent in one session. If a phase has more than ~8-10 substantive code changes, split it further.
Update plan.md with your refinements. Keep the same structure but:
- Fix any inaccuracies
- Add missing steps
- Improve the approach if you found better patterns
- Ensure phases are properly sized for single-agent execution
- Add a line at the top of the Status section: `Phases: <N>` indicating how many implementation phases there are
- Add `Assessed: yes` at the bottom of the file
If the plan is small enough for a single agent (roughly <=8 steps), mark it as a single phase.
```
After this agent completes, read `plan.md` to verify it was assessed.
## Phase 4: Implementation
Now read `plan.md` yourself to understand the phases.
For each phase in the plan that is not yet marked as done, spawn an implementation agent (Task tool, subagent_type=`general-purpose`):
```
You are an implementation agent working on phase <N> of an implementation plan.
Read these files first:
- .ai/<project-name>/<letter>/context.md - Full codebase context
- .ai/<project-name>/<letter>/plan.md - Implementation plan
Then read the source files you'll be modifying.
YOUR TASK: Implement ONLY Phase <N> from the plan:
<paste the specific phase steps here>
Rules:
- Follow the plan precisely
- Follow AGENTS.md coding conventions (no comments except complex algorithms, use auto, empty line before closing brace, etc.)
- Do NOT modify .ai/ files except to update the Status section in plan.md
- When done, update plan.md Status section: change `- [ ] Phase <N>: ...` to `- [x] Phase <N>: ...`
- Do NOT work on other phases
When finished, report what you did and any issues encountered.
```
After each implementation agent returns:
1. Read `plan.md` to check the status was updated.
2. If more phases remain, spawn the next implementation agent.
3. If all phases are done, proceed to build verification.
## Phase 5: Build Verification
Only run this phase if the task involved modifying project source code (not just docs or config).
Spawn a build verification agent (Task tool, subagent_type=`general-purpose`):
```
You are a build verification agent.
Read these files:
- .ai/<project-name>/<letter>/context.md
- .ai/<project-name>/<letter>/plan.md
The implementation is complete. Your job is to build the project and fix any build errors.
Steps:
1. Run (from repository root): cmake --build ./out --config Debug --target Telegram
2. If the build succeeds, update plan.md: change `- [ ] Build verification` to `- [x] Build verification`
3. If the build fails:
a. Read the error messages carefully
b. Read the relevant source files
c. Fix the errors in accordance with the plan and AGENTS.md conventions
d. Rebuild and repeat until the build passes
e. Update plan.md status when done
Rules:
- Only fix build errors, do not refactor or improve code
- Follow AGENTS.md conventions
- If build fails with file-locked errors (C1041, LNK1104), STOP and report - do not retry
When finished, report the build result.
```
After the build agent returns, read `plan.md` to confirm the final status. Then proceed to Phase 6.
## Phase 6: Code Review Loop
After build verification passes, run up to 3 review-fix iterations to improve code quality. Set iteration counter `R = 1`.
### Review Loop
```
LOOP:
1. Spawn review agent (Step 6a) with iteration R
2. Read review<R>.md verdict:
- "APPROVED" → go to FINISH
- Has improvement suggestions → spawn fix agent (Step 6b)
3. After fix agent completes and build passes:
R = R + 1
If R > 3 → go to FINISH (stop iterating, accept current state)
Otherwise → go to step 1
FINISH:
- Update plan.md: change `- [ ] Code review` to `- [x] Code review`
- Proceed to Completion
```
### Step 6a: Code Review Agent
Spawn an agent (Task tool, subagent_type=`general-purpose`):
```
You are a code review agent for Telegram Desktop (C++ / Qt).
Read these files:
- .ai/<project-name>/<letter>/context.md - Codebase context
- .ai/<project-name>/<letter>/plan.md - Implementation plan
- REVIEW.md - Style and formatting rules to enforce
<if R > 1, also read:>
- .ai/<project-name>/<letter>/review<R-1>.md - Previous review (to see what was already addressed)
Then run `git diff` to see all uncommitted changes made by the implementation. Implementation agents do not commit, so `git diff` shows exactly the current feature's changes.
Then read the modified source files in full to understand changes in context.
Perform a thorough code review.
REVIEW CRITERIA (in order of importance):
1. **Correctness and safety**: Obvious logic errors, missing null checks at API boundaries, potential crashes, use-after-free, dangling references, race conditions. This is the highest priority — bugs and safety issues must be caught first. Do NOT nitpick internal code that relies on framework guarantees.
2. **Dead code**: Any code added or left behind that is never called or used, within the scope of the changes. Unused variables, unreachable branches, leftover scaffolding.
3. **Redundant changes**: Changes in the diff that have no functional effect — moving declarations or code blocks to a different location without reason, reformatting untouched code, reordering includes or fields with no purpose. Every line in the diff should serve the feature. If a file appears in `git diff` but contains only no-op rearrangements, flag it for revert.
4. **Code duplication**: Unnecessary repetition of logic that should be shared. Look for near-identical blocks that differ only in minor details and could be unified.
5. **Wrong placement**: Code added to a module where it doesn't logically belong. If another existing module is a clearly better fit for the new code, flag it. Consider the existing module boundaries and responsibilities visible in context.md.
6. **Function decomposition**: For longer functions (roughly 50+ lines), consider whether a logical sub-task could be cleanly extracted into a separate function. This is NOT a hard rule — a 100-line function that flows naturally and isn't easily divisible is perfectly fine. But sometimes even a 20-line function contains a clear isolated subtask that reads better as two 10-line functions. The key is to think about it each time: does extracting improve readability and reduce cognitive load, or does it just scatter logic across call sites for no real benefit? Only suggest extraction when there's a genuinely self-contained piece of logic with a clear name and purpose.
7. **Module structure**: Only in exceptional cases — if a large amount of newly added code (hundreds of lines) is logically distinct from the rest of its host module, suggest extracting it into a new module. But do NOT suggest new modules lightly: every module adds significant build overhead due to PCH and heavy template usage. Only suggest this when the new code is both large enough AND logically separated enough to justify it. At the same time, don't let modules grow into multi-thousand-line monoliths either.
8. **Style compliance**: Verify adherence to REVIEW.md rules (empty line before closing brace, operators at start of continuation lines, minimize type checks with direct cast instead of is+as, no if-with-initializer when simpler alternatives exist) and AGENTS.md conventions (no unnecessary comments, `auto` usage, no hardcoded sizes — must use .style definitions), etc.
IMPORTANT GUIDELINES:
- Review ONLY the changes made, not pre-existing code in the repository.
- Be pragmatic. Don't suggest changes for the sake of it. Each suggestion should have a clear, concrete benefit.
- Don't suggest adding comments, docstrings, or type annotations — the codebase style avoids these.
- Don't suggest error handling for impossible scenarios or over-engineering.
Write your review to: .ai/<project-name>/<letter>/review<R>.md
The review document should contain:
## Code Review - Iteration <R>
## Summary
<1-2 sentence overall assessment>
## Verdict: <APPROVED or NEEDS_CHANGES>
<If APPROVED, stop here. Everything looks good.>
<If NEEDS_CHANGES, continue with:>
## Changes Required
### <Issue 1 title>
- **Category**: <dead code | duplication | wrong placement | function decomposition | module structure | style | correctness>
- **File(s)**: <file paths>
- **Problem**: <clear description of what's wrong>
- **Fix**: <specific description of what to change>
### <Issue 2 title>
...
Keep the list focused. Only include issues that genuinely improve the code. If you find yourself listing more than ~5-6 issues, prioritize the most impactful ones.
When finished, report your verdict clearly as: APPROVED or NEEDS_CHANGES.
```
After the review agent returns, read `review<R>.md`. If the verdict is APPROVED, proceed to Completion. If NEEDS_CHANGES, spawn the fix agent.
### Step 6b: Review Fix Agent
Spawn an agent (Task tool, subagent_type=`general-purpose`):
```
You are a review fix agent. You implement improvements identified during code review.
Read these files:
- .ai/<project-name>/<letter>/context.md - Codebase context
- .ai/<project-name>/<letter>/plan.md - Original implementation plan
- .ai/<project-name>/<letter>/review<R>.md - Code review with required changes
Then read the source files mentioned in the review.
YOUR TASK: Implement ALL changes listed in review<R>.md.
For each issue in the review:
1. Read the relevant source file(s).
2. Make the specified change.
3. Verify the change makes sense in context.
After all changes are made:
1. Build (from repository root): cmake --build ./out --config Debug --target Telegram
2. If the build fails, fix build errors and rebuild until it passes.
3. If build fails with file-locked errors (C1041, LNK1104), STOP and report - do not retry.
Rules:
- Implement exactly the changes from the review, nothing more.
- Follow AGENTS.md coding conventions.
- Do NOT modify .ai/ files.
When finished, report what changes were made.
```
After the fix agent returns, increment R and loop back to Step 6a (unless R > 3, in which case proceed to Completion).
## Completion
When all phases including build verification and code review are done:
1. Read the final `plan.md` and report the summary to the user.
2. Show which files were modified/created.
3. Note any issues encountered during implementation.
4. Summarize code review iterations: how many rounds, what was found and fixed, or if it was approved on first pass.
5. Calculate and display the total elapsed time since `$START_TIME` (format as `Xh Ym Zs`, omitting zero components — e.g. `12m 34s` or `1h 5m 12s`).
6. Remind the user of the project name so they can use `/task <project-name> <follow-up description>` for follow-up changes.
## Error Handling
- If any agent fails or gets stuck, report the issue to the user and ask how to proceed.
- If context.md or plan.md is not written properly by an agent, re-spawn that agent with more specific instructions.
- If build errors persist after the build agent's attempts, report the remaining errors to the user.
- If a review fix agent introduces new build errors that it cannot resolve, report to the user.
================================================
FILE: .claude/commands/withtest.md
================================================
---
description: Implement a feature using multi-agent workflow, then iteratively test and fix it in-app
allowed-tools: Read, Write, Edit, Glob, Grep, Bash, Task, AskUserQuestion, TodoWrite
---
# WithTest - Multi-Agent Implementation + Testing Workflow
You orchestrate a multi-phase implementation workflow followed by an iterative testing/fixing loop. This is an extended version of `/task` that adds in-app programmatic testing after the build succeeds.
**Arguments:** `$ARGUMENTS` = "$ARGUMENTS"
If `$ARGUMENTS` is provided, it's the task description. If empty, ask the user what they want implemented.
## Overview
The workflow produces `.ai/<feature-name>/` containing:
- `context.md` - Gathered codebase context relevant to the task
- `plan.md` - Detailed implementation plan with phases and status
- `testN.md` - Test plan for iteration N
- `resultN.md` - Test result report for iteration N
- `planN.md` - Fix plan for iteration N (if implementation bugs found)
- `screenshots/` - Screenshots captured during test runs
Two major stages:
1. **Implementation** (Phases 0-5) - same as `/task`
2. **Testing Loop** (Phase 6) - iterative test-plan → test-do → test-run → test-check cycle
---
## STAGE 1: IMPLEMENTATION (Phases 0-5)
These phases are identical to the `/task` workflow.
### Phase 0: Setup
1. Understand the task from `$ARGUMENTS` or ask the user.
2. **Follow-up detection:** Check if `$ARGUMENTS` starts with a task name (the first word/token before any whitespace or newline). Look for `.ai/<that-name>/` directory:
- If `.ai/<that-name>/` exists AND contains both `context.md` and `plan.md`, this is a **follow-up task**. Read both files. The rest of `$ARGUMENTS` (after the task name) is the follow-up task description describing what additional changes are needed.
- If no matching directory exists, this is a **new task** - proceed normally.
3. For new tasks: check existing folders in `.ai/` to pick a unique short name (1-2 lowercase words, hyphen-separated) and create `.ai/<feature-name>/`.
4. For follow-up tasks: the folder already exists, skip creation.
### Follow-up Task Flow
When a follow-up task is detected (existing `.ai/<name>/` with `context.md` and `plan.md`):
1. Skip Phase 1 (Context Gathering) - context already exists.
2. Skip Phase 2 (Planning) - original plan already exists.
3. Go directly to **Phase 2F (Follow-up Planning)** instead of Phase 3.
**Phase 2F: Follow-up Planning**
Spawn an agent (Task tool, subagent_type=`general-purpose`) with this prompt:
```
You are a planning agent for a follow-up task on an existing implementation.
Read these files:
- .ai/<feature-name>/context.md - Previously gathered codebase context
- .ai/<feature-name>/plan.md - Previous implementation plan (already completed)
Then read the source files referenced in context.md and plan.md to understand what was already implemented.
FOLLOW-UP TASK: <paste the follow-up task description here>
The previous plan was already implemented and tested. Now there are follow-up changes needed.
YOUR JOB:
1. Understand what was already done from plan.md (look at the completed phases).
2. Read the actual source files to see the current state of the code.
3. If context.md needs updates for the follow-up task (new files relevant, new patterns needed), update it with additional sections marked "## Follow-up Context (iteration 2)" or similar.
4. Create a NEW follow-up plan. Update plan.md by:
- Keep the existing content as history (do NOT delete it)
- Add a new section at the end:
---
## Follow-up Task
<description>
## Follow-up Approach
<high-level description>
## Follow-up Files to Modify
<list>
## Follow-up Implementation Steps
### Phase F1: <name>
1. <specific step>
2. ...
### Phase F2: <name> (if needed)
...
## Follow-up Status
Phases: <N>
- [ ] Phase F1: <name>
- [ ] Phase F2: <name> (if applicable)
- [ ] Build verification
- [ ] Testing
Assessed: yes
Reason carefully. The follow-up plan should be self-contained enough that an implementation agent can execute it by reading context.md and the updated plan.md.
```
After this agent completes, read `plan.md` to verify the follow-up plan was written. Then proceed to Phase 4 (Implementation), using the follow-up phases (F1, F2, etc.) instead of the original phases. After implementation and build verification, proceed to Stage 2 (Testing Loop) as normal.
### New Task Flow
When this is a new task (no existing folder), proceed with Phases 1-5 as described below.
### Phase 1: Context Gathering
Spawn an agent (Task tool, subagent_type=`general-purpose`) with this prompt structure:
```
You are a context-gathering agent for a large C++ codebase (Telegram Desktop).
TASK: <paste the user's task description here>
YOUR JOB: Read CLAUDE.md, inspect the codebase, find ALL files and code relevant to this task, and write a comprehensive context document.
Steps:
1. Read CLAUDE.md for project conventions and build instructions.
2. Search the codebase for files, classes, functions, and patterns related to the task.
3. Read all potentially relevant files. Be thorough - read more rather than less.
4. For each relevant file, note:
- File path
- Relevant line ranges
- What the code does and how it relates to the task
- Key data structures, function signatures, patterns used
5. Look for similar existing features that could serve as a reference implementation.
6. Check api.tl if the task involves Telegram API.
7. Check .style files if the task involves UI.
8. Check lang.strings if the task involves user-visible text.
Write your findings to: .ai/<feature-name>/context.md
The context.md should contain:
- **Task Description**: The full task restated clearly
- **Relevant Files**: Every file path with line ranges and descriptions of what's there
- **Key Code Patterns**: How similar things are done in the codebase (with code snippets)
- **Data Structures**: Relevant types, structs, classes
- **API Methods**: Any TL schema methods involved (copied from api.tl)
- **UI Styles**: Any relevant style definitions
- **Localization**: Any relevant string keys
- **Build Info**: Build command and any special notes
- **Reference Implementations**: Similar features that can serve as templates
Be extremely thorough. Another agent with NO prior context will read this file and must be able to understand everything needed to implement the task.
```
After this agent completes, read `context.md` to verify it was written properly.
### Phase 2: Planning
Spawn an agent (Task tool, subagent_type=`general-purpose`) with this prompt structure:
```
You are a planning agent. You must create a detailed implementation plan.
Read these files:
- .ai/<feature-name>/context.md - Contains all gathered context
- Then read the specific source files referenced in context.md to understand the code deeply.
Think carefully about the implementation approach.
Create a detailed plan in: .ai/<feature-name>/plan.md
The plan.md should contain:
## Task
<one-line summary>
## Approach
<high-level description of the implementation approach>
## Files to Modify
<list of files that will be created or modified>
## Files to Create
<list of new files, if any>
## Implementation Steps
Each step must be specific enough that an agent can execute it without ambiguity:
- Exact file paths
- Exact function names
- What code to add/modify/remove
- Where exactly in the file (after which function, in which class, etc.)
Number every step. Group steps into phases if there are more than ~8 steps.
### Phase 1: <name>
1. <specific step>
2. <specific step>
...
### Phase 2: <name> (if needed)
...
## Build Verification
- Build command to run
- Expected outcome
## Status
- [ ] Phase 1: <name>
- [ ] Phase 2: <name> (if applicable)
- [ ] Build verification
- [ ] Testing
```
After this agent completes, read `plan.md` to verify it was written properly.
### Phase 3: Plan Assessment
Spawn an agent (Task tool, subagent_type=`general-purpose`) with this prompt structure:
```
You are a plan assessment agent. Review and refine an implementation plan.
Read these files:
- .ai/<feature-name>/context.md
- .ai/<feature-name>/plan.md
- Then read the actual source files referenced to verify the plan makes sense.
Carefully assess the plan:
1. **Correctness**: Are the file paths and line references accurate? Does the plan reference real functions and types?
2. **Completeness**: Are there missing steps? Edge cases not handled?
3. **Code quality**: Will the plan minimize code duplication? Does it follow existing codebase patterns from CLAUDE.md?
4. **Design**: Could the approach be improved? Are there better patterns already used in the codebase?
5. **Phase sizing**: Each phase should be implementable by a single agent in one session. If a phase has more than ~8-10 substantive code changes, split it further.
Update plan.md with your refinements. Keep the same structure but:
- Fix any inaccuracies
- Add missing steps
- Improve the approach if you found better patterns
- Ensure phases are properly sized for single-agent execution
- Add a line at the top of the Status section: `Phases: <N>` indicating how many implementation phases there are
- Add `Assessed: yes` at the bottom of the file
If the plan is small enough for a single agent (roughly <=8 steps), mark it as a single phase.
```
After this agent completes, read `plan.md` to verify it was assessed.
### Phase 4: Implementation
Now read `plan.md` yourself to understand the phases.
For each phase in the plan that is not yet marked as done, spawn an implementation agent (Task tool, subagent_type=`general-purpose`):
```
You are an implementation agent working on phase <N> of an implementation plan.
Read these files first:
- .ai/<feature-name>/context.md - Full codebase context
- .ai/<feature-name>/plan.md - Implementation plan
Then read the source files you'll be modifying.
YOUR TASK: Implement ONLY Phase <N> from the plan:
<paste the specific phase steps here>
Rules:
- Follow the plan precisely
- Follow CLAUDE.md coding conventions (no comments except complex algorithms, use auto, empty line before closing brace, etc.)
- Do NOT modify .ai/ files except to update the Status section in plan.md
- When done, update plan.md Status section: change `- [ ] Phase <N>: ...` to `- [x] Phase <N>: ...`
- Do NOT work on other phases
When finished, report what you did and any issues encountered.
```
After each implementation agent returns:
1. Read `plan.md` to check the status was updated.
2. If more phases remain, spawn the next implementation agent.
3. If all phases are done, proceed to build verification.
### Phase 5: Build Verification
Spawn a build verification agent (Task tool, subagent_type=`general-purpose`):
```
You are a build verification agent.
Read these files:
- .ai/<feature-name>/context.md
- .ai/<feature-name>/plan.md
The implementation is complete. Your job is to build the project and fix any build errors.
Steps:
1. Run: cmake --build "c:\Telegram\tdesktop\out" --config Debug --target Telegram
2. If the build succeeds, update plan.md: change `- [ ] Build verification` to `- [x] Build verification`
3. If the build fails:
a. Read the error messages carefully
b. Read the relevant source files
c. Fix the errors in accordance with the plan and CLAUDE.md conventions
d. Rebuild and repeat until the build passes
e. Update plan.md status when done
Rules:
- Only fix build errors, do not refactor or improve code
- Follow CLAUDE.md conventions
- If build fails with file-locked errors (C1041, LNK1104), STOP and report - do not retry
When finished, report the build result.
```
After the build agent returns, read `plan.md` to confirm build verification passed. If it did, proceed to Stage 2.
---
## STAGE 2: TESTING LOOP (Phase 6)
This stage iteratively tests the implementation in-app and fixes issues. It maintains an iteration counter `N` starting at 1.
**Key concept:** Since the project has tight coupling and no unit test infrastructure, we test by injecting `#ifdef _DEBUG` blocks into the app code that perform actions, write to `log.txt`, save screenshots, and call `Core::Quit()` when done. An agent then runs the app and observes the output.
### Git Submodule Awareness
Before ANY git operation (commit, stash, stash pop), the agent must:
1. Run `git submodule status` to check for modified submodules.
2. If submodules have changes, commit/stash those submodules FIRST, individually:
```
cd <submodule-path> && git add -A && git commit -m "[wip-N] test changes" && cd <repo-root>
```
or for stash:
```
cd <submodule-path> && git stash && cd <repo-root>
```
3. Then operate on the main repo.
### Step 6a: Test Plan (test-plan agent)
Spawn an agent (Task tool, subagent_type=`general-purpose`):
```
You are a test-planning agent for Telegram Desktop (C++ / Qt).
Read these files:
- .ai/<feature-name>/context.md
- .ai/<feature-name>/plan.md
<if N > 1, also include:>
- .ai/<feature-name>/result<N-1>.md - Previous test result
<if a planN.md triggered this iteration:>
- .ai/<feature-name>/plan<trigger>.md - Fix plan that was just implemented
CURRENT ITERATION: <N>
YOUR TASKS:
1. **Commit current implementation changes.**
- Run `git submodule status` to check for modified submodules.
- If any submodules are dirty, go into each one and commit:
`cd <submodule> && git add -A && git commit -m "[wip-<N>]" && cd <repo-root>`
- Then in main repo: `git add -A && git commit -m "[wip-<N>]"`
- Do NOT add files in .ai/ to the commit.
2. <If N > 1> **Restore previous test code.**
- Run `git submodule status` and `git stash list` in any dirty submodules to check for stashed test code.
- Pop submodule stashes first: `cd <submodule> && git stash pop && cd <repo-root>`
- Then pop main repo stash: `git stash pop`
- Read the previous test<N-1>.md to understand what was tested before.
- Decide: reuse/modify existing test code or start fresh.
3. **Plan the test code.**
Carefully design test code that will verify the implementation works correctly.
The test code must:
- Be wrapped in `#ifdef _DEBUG` blocks so it only runs in Debug builds
- Be injected at appropriate points in the app lifecycle (e.g., after main window shows, after chats load, etc.)
- Write progress and results to a log file. Use a dedicated path like:
`QFile logFile("c:/Telegram/tdesktop/.ai/<feature-name>/test_log.txt");`
Open with `QIODevice::Append | QIODevice::Text`, write with QTextStream, and flush after every write.
- Save screenshots where visual verification is needed:
`widget->grab().save("c:/Telegram/tdesktop/.ai/<feature-name>/screenshots/<name>.png");`
Log each screenshot save: `"SCREENSHOT: <full-path>"`
- Use `QTimer::singleShot(...)` or deferred calls to schedule test steps after UI events settle
- Call `Core::Quit()` when all test steps complete, so the app exits cleanly
- Log `"TEST_COMPLETE"` right before `Core::Quit()` so the test-run agent knows testing finished
- Log `"TEST_STEP: <description>"` before each major step for progress tracking
- Log `"TEST_RESULT: PASS: <what>"` or `"TEST_RESULT: FAIL: <what> - <details>"` for each check
Consider what needs testing:
- Does the new UI appear correctly?
- Do interactions work (clicks, navigation)?
- Does data flow correctly?
- Are there edge cases to verify?
4. **Write the test plan** to `.ai/<feature-name>/test<N>.md` containing:
## Test Iteration <N>
## What We're Testing
<description of what this test verifies>
## Test Steps
1. <step>: what we do, what we expect, how we verify
2. ...
## Code Injection Points
- File: <path>, Location: <where in file>, Purpose: <what this block does>
- ...
## Expected Log Output
<example of what test_log.txt should contain if everything works>
## Expected Screenshots
- <name>.png: should show <description>
- ...
## Success Criteria
- <criterion 1>
- <criterion 2>
- ...
When finished, report what test plan was created.
```
### Step 6b: Test Implementation (test-do agent)
Spawn an agent (Task tool, subagent_type=`general-purpose`):
```
You are a test implementation agent for Telegram Desktop (C++ / Qt).
Read these files:
- .ai/<feature-name>/context.md
- .ai/<feature-name>/plan.md
- .ai/<feature-name>/test<N>.md - The test plan to implement
YOUR TASK: Implement the test code described in test<N>.md.
Rules:
- ALL test code MUST be inside `#ifdef _DEBUG` blocks
- Place test code at the injection points specified in the test plan
- Make sure the screenshots folder exists: create `.ai/<feature-name>/screenshots/` directory
- Delete any old test_log.txt before the test starts (in code, at the first test step)
- Use QTimer::singleShot for delayed operations to let the UI settle
- Flush log writes immediately (don't buffer)
- End with logging "TEST_COMPLETE" and calling Core::Quit()
- Follow CLAUDE.md coding conventions
- Make sure the code compiles: run `cmake --build "c:\Telegram\tdesktop\out" --config Debug --target Telegram`
- If build fails, fix errors and rebuild until it passes
- If build fails with file-locked errors (C1041, LNK1104), STOP and report
When finished, report what test code was added and where.
```
### Step 6c: Test Run (test-run agent)
Spawn an agent (Task tool, subagent_type=`general-purpose`):
```
You are a test execution agent. You run the Telegram Desktop app and observe test output.
Read these files:
- .ai/<feature-name>/test<N>.md - The test plan (so you know what to expect)
YOUR TASK: Run the built app and monitor test execution.
Steps:
1. **Prepare.**
- Delete old test_log.txt if it exists: `del "c:\Telegram\tdesktop\docs\ai\work\<feature-name>\test_log.txt" 2>nul`
- Ensure screenshots folder exists: `mkdir "c:\Telegram\tdesktop\docs\ai\work\<feature-name>\screenshots" 2>nul`
2. **Launch the app.**
- Run in background: `start "" "c:\Telegram\tdesktop\out\Debug\Telegram.exe"`
- Note the time of launch.
3. **Monitor test_log.txt in a polling loop.**
- Every 5 seconds, read the log file to check for new output.
- When you see `"SCREENSHOT: <path>"`, read the screenshot image file to visually verify it.
- Track which TEST_STEP entries appear.
- Track TEST_RESULT entries (PASS/FAIL).
4. **Detect completion or failure.**
- **Success**: Log contains `"TEST_COMPLETE"` - the app should exit on its own shortly after.
- **Crash**: The process disappears before `"TEST_COMPLETE"`. Check for crash dumps or error dialogs.
- **Hang/Timeout**: If no new log output for 120 seconds and no `"TEST_COMPLETE"`, kill the process:
`taskkill /IM Telegram.exe /F`
- **No log at all**: If no test_log.txt appears within 60 seconds of launch, kill the process.
5. **After the process exits (or is killed), wait 5 seconds, then:**
- Read the full final test_log.txt
- Read all screenshot files saved during the test
- Check for any leftover Telegram.exe processes: `tasklist /FI "IMAGENAME eq Telegram.exe"` and kill if needed
6. **Write the result report** to `.ai/<feature-name>/result<N>.md`:
## Test Result - Iteration <N>
## Outcome: <PASS / FAIL / CRASH / TIMEOUT>
## Log Output
<full contents of test_log.txt, or note that it was empty/missing>
## Screenshot Analysis
- <name>.png: <description of what you see, whether it matches expectations from test<N>.md>
- ...
## Test Results Summary
- PASS: <list>
- FAIL: <list>
## Issues Found
<any problems observed, unexpected behavior, etc.>
## Raw Details
<process exit code if available, timing information, any stderr output>
When finished, report the test outcome.
```
After the test-run agent returns, read `result<N>.md`.
### Step 6d: Test Assessment (test-check agent)
Spawn an agent (Task tool, subagent_type=`general-purpose`):
```
You are a test assessment agent. You analyze test results and decide next steps.
Read these files:
- .ai/<feature-name>/context.md
- .ai/<feature-name>/plan.md
- .ai/<feature-name>/test<N>.md
- .ai/<feature-name>/result<N>.md
<if N > 1, also read previous test/result pairs for history>
Carefully analyze the test results.
DECIDE one of three outcomes:
### Outcome A: ALL TESTS PASS
If all test results are PASS and screenshots look correct:
1. Write to result<N>.md (append): `\n## Verdict: PASS`
2. Report "ALL_TESTS_PASS" so the orchestrator knows to finish.
### Outcome B: TEST CODE NEEDS CHANGES
If the test itself was flawed (wrong assertions, bad timing, insufficient waits, screenshot taken too early, wrong injection point, etc.) but the implementation seems correct:
1. Describe what's wrong with the test and what to change.
2. Make the changes directly to the test code in the source files.
3. Rebuild: `cmake --build "c:\Telegram\tdesktop\out" --config Debug --target Telegram`
4. If build fails with file-locked errors (C1041, LNK1104), STOP and report.
5. Write the updated test description to `.ai/<feature-name>/test<N+1>.md` explaining what changed and why.
6. Report "TEST_NEEDS_RERUN" so the orchestrator goes back to step 6c.
### Outcome C: IMPLEMENTATION HAS BUGS
If the test results indicate actual bugs in the implementation (not test issues):
1. Analyze what's wrong with the implementation.
2. Write a fix plan to `.ai/<feature-name>/plan<N>.md`:
## Fix Plan - Iteration <N>
## Problem
<what the test revealed>
## Root Cause
<analysis of why the implementation is wrong>
## Fix Steps
1. <specific fix with file path, location, what to change>
2. ...
3. Stash the test code (it will be restored later):
- Run `git submodule status` and stash dirty submodules first:
`cd <submodule> && git stash && cd <repo-root>`
- Then: `git stash`
4. Report "IMPLEMENTATION_NEEDS_FIX" so the orchestrator goes to re-implementation.
When finished, report your verdict clearly as one of: ALL_TESTS_PASS, TEST_NEEDS_RERUN, IMPLEMENTATION_NEEDS_FIX.
```
### Orchestrator Loop Logic
After Phase 5 (build verification) succeeds, you (the orchestrator) run the testing loop:
```
Set N = 1
LOOP:
1. Spawn test-plan agent (Step 6a) with iteration N
2. Spawn test-do agent (Step 6b) with iteration N
3. Spawn test-run agent (Step 6c) with iteration N
4. Spawn test-check agent (Step 6d) with iteration N
5. Read the verdict:
- "ALL_TESTS_PASS" → go to FINISH
- "TEST_NEEDS_RERUN" →
N = N + 1
go to step 3 (skip 6a and 6b, test code was already updated by test-check)
- "IMPLEMENTATION_NEEDS_FIX" →
Spawn implementation fix agent (see below)
N = N + 1
go to step 1 (full restart: new commit, stash pop test code, etc.)
6. Safety: if N > 5, stop and report to user - too many iterations.
FINISH:
- Stash or revert all test code (#ifdef _DEBUG blocks):
- git submodule status, stash submodules if dirty
- git stash (to save test code separately, user may want it later)
- Update plan.md: change `- [ ] Testing` to `- [x] Testing`
- Report to user
```
### Implementation Fix Agent
When test-check reports IMPLEMENTATION_NEEDS_FIX, spawn this agent:
```
You are an implementation fix agent.
Read these files:
- .ai/<feature-name>/context.md
- .ai/<feature-name>/plan.md
- .ai/<feature-name>/plan<N>.md - The fix plan from test assessment
Then read the source files mentioned in the fix plan.
YOUR TASK: Implement the fixes described in plan<N>.md.
Steps:
1. Read and understand the fix plan.
2. Make the specified code changes.
3. Build: `cmake --build "c:\Telegram\tdesktop\out" --config Debug --target Telegram`
4. Fix any build errors.
5. If build fails with file-locked errors (C1041, LNK1104), STOP and report.
Rules:
- Only make changes specified in the fix plan
- Follow CLAUDE.md conventions
- Do NOT touch test code or .ai/ files (except plan.md status if relevant)
When finished, report what was fixed.
```
---
## Completion
When the testing loop finishes (ALL_TESTS_PASS or user stops it):
1. Read the final `plan.md` and report full summary to the user.
2. List all files modified/created by the implementation.
3. Summarize test iterations: how many rounds, what was found and fixed.
4. Note that test code is stashed (available via `git stash pop` if needed).
5. Note any remaining concerns.
## Error Handling
- If any agent fails or gets stuck, report the issue to the user and ask how to proceed.
- If context.md or plan.md is not written properly by an agent, re-spawn that agent with more specific instructions.
- If build errors persist after agent attempts, report remaining errors to the user.
- If the testing loop exceeds 5 iterations, stop and report - something fundamental may be wrong.
- If the app crashes repeatedly, report to user - may need manual investigation.
- If file-locked build errors occur at ANY point, stop immediately and ask user to close Telegram.exe.
================================================
FILE: .claude/grab_clipboard.ps1
================================================
param([string]$outPath)
Add-Type -AssemblyName System.Windows.Forms
$img = [System.Windows.Forms.Clipboard]::GetImage()
if ($img) {
$img.Save($outPath, [System.Drawing.Imaging.ImageFormat]::Png)
Write-Host "Saved to $outPath"
exit 0
} else {
Write-Host "No image on clipboard"
exit 1
}
================================================
FILE: .claude/grab_clipboard.sh
================================================
#!/bin/bash
# Grab clipboard image on macOS and save as PNG.
outPath="$1"
if [ -z "$outPath" ]; then
echo "Usage: grab_clipboard.sh <output.png>"
exit 1
fi
osascript -e '
set theFile to POSIX file "'"$outPath"'"
try
set theImage to the clipboard as «class PNGf»
on error
return "no image"
end try
set fh to open for access theFile with write permission
write theImage to fh
close access fh
return "ok"
' 2>/dev/null | grep -q "ok"
if [ $? -eq 0 ]; then
echo "Saved to $outPath"
exit 0
else
echo "No image on clipboard"
exit 1
fi
================================================
FILE: .claude/iterate.ps1
================================================
#!/usr/bin/env pwsh
# Iterative Task Runner
# Runs Claude Code in a loop to complete tasks from a taskplanner-created folder
#
# Usage: .\docs\ai\iterate.ps1 <featurename> [-MaxIterations N] [-Interactive] [-DryRun] [-SingleCommit] [-NoCommit]
#
# Arguments:
# featurename Name of the folder in .ai/ containing prompt.md and tasks.json
# -MaxIterations Maximum iterations before stopping (default: 50)
# -Interactive Pause between iterations for user confirmation (default: auto/no pause)
# -DryRun Show what would be executed without running
# -SingleCommit Don't commit after each task, commit all changes at the end
# -NoCommit Don't commit at all (no per-task commits, no final commit)
param(
[Parameter(Position=0, Mandatory=$true)]
[string]$FeatureName,
[int]$MaxIterations = 50,
[switch]$Interactive,
[switch]$DryRun,
[switch]$SingleCommit,
[switch]$NoCommit
)
$ErrorActionPreference = "Stop"
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$RepoRoot = Resolve-Path (Join-Path $ScriptDir "..\..")
$WorkDir = Join-Path $ScriptDir "work\$FeatureName"
$PromptMd = Join-Path $WorkDir "prompt.md"
$TasksJson = Join-Path $WorkDir "tasks.json"
$BuildOutputDir = Join-Path $RepoRoot "out\Debug"
$TelegramExe = Join-Path $BuildOutputDir "Telegram.exe"
$TelegramPdb = Join-Path $BuildOutputDir "Telegram.pdb"
function Format-Duration {
param([int]$Seconds)
if ($Seconds -lt 60) {
return "${Seconds}s"
} elseif ($Seconds -lt 3600) {
$min = [math]::Floor($Seconds / 60)
$sec = $Seconds % 60
return "${min}m ${sec}s"
} else {
$hr = [math]::Floor($Seconds / 3600)
$min = [math]::Floor(($Seconds % 3600) / 60)
$sec = $Seconds % 60
return "${hr}h ${min}m ${sec}s"
}
}
function Test-BuildFilesUnlocked {
$filesToCheck = @($TelegramExe, $TelegramPdb)
foreach ($file in $filesToCheck) {
if (Test-Path $file) {
try {
Remove-Item $file -Force -ErrorAction Stop
Write-Host "Removed: $file" -ForegroundColor DarkGray
}
catch {
Write-Host ""
Write-Host "========================================" -ForegroundColor Red
Write-Host " ERROR: Cannot delete build output" -ForegroundColor Red
Write-Host " File is locked: $file" -ForegroundColor Red
Write-Host "" -ForegroundColor Red
Write-Host " Please close Telegram.exe and any" -ForegroundColor Red
Write-Host " debugger, then try again." -ForegroundColor Red
Write-Host "========================================" -ForegroundColor Red
Write-Host ""
return $false
}
}
}
return $true
}
function Show-ClaudeStream {
param([string]$Line)
try {
$obj = $Line | ConvertFrom-Json -ErrorAction Stop
switch ($obj.type) {
"assistant" {
if ($obj.message.content) {
foreach ($block in $obj.message.content) {
if ($block.type -eq "text") {
Write-Host $block.text -ForegroundColor White
}
elseif ($block.type -eq "tool_use") {
$summary = ""
if ($block.input) {
if ($block.input.file_path) {
$summary = $block.input.file_path
} elseif ($block.input.pattern) {
$summary = $block.input.pattern
} elseif ($block.input.command) {
$cmd = $block.input.command
if ($cmd.Length -gt 60) { $cmd = $cmd.Substring(0, 60) + "..." }
$summary = $cmd
} else {
$inputStr = $block.input | ConvertTo-Json -Compress -Depth 1
if ($inputStr.Length -gt 60) { $inputStr = $inputStr.Substring(0, 60) + "..." }
$summary = $inputStr
}
}
Write-Host "[Tool: $($block.name)] $summary" -ForegroundColor Yellow
}
}
}
}
"user" {
# Tool results - skip verbose output
}
"result" {
Write-Host "`n--- Session Complete ---" -ForegroundColor Cyan
if ($obj.cost_usd) {
Write-Host "Cost: `$$($obj.cost_usd)" -ForegroundColor DarkCyan
}
}
"system" {
# System messages - skip
}
}
}
catch {
# Not valid JSON, skip
}
}
# Verify feature folder exists
if (-not (Test-Path $WorkDir)) {
Write-Error "Feature folder not found: $WorkDir`nRun '/taskplanner $FeatureName' first to create it."
exit 1
}
# Verify required files exist
foreach ($file in @($PromptMd, $TasksJson)) {
if (-not (Test-Path $file)) {
Write-Error "Required file not found: $file"
exit 1
}
}
if ($SingleCommit -or $NoCommit) {
$AfterImplementation = @"
- Mark the task completed in tasks.json ("completed": true)
- If new tasks emerged, add them to tasks.json
"@
$CommitRule = "- Do NOT commit changes after task is done, just mark it as done in tasks.json. Commit will be done when all tasks are complete, separately."
} else {
$AfterImplementation = @"
- Mark the task completed in tasks.json ("completed": true)
- Commit your changes
- If new tasks emerged, add them to tasks.json
"@
$CommitRule = ""
}
$Prompt = @"
You are an autonomous coding agent working on: $FeatureName
Read these files for context:
- .ai/$FeatureName/prompt.md - Detailed instructions and architecture
- .ai/$FeatureName/tasks.json - Task list with completion status
Do exactly ONE task per iteration.
## Steps
1. Read tasks.json and find the most suitable task to implement (it can be first uncompleted task or it can be some task in the middle, if it is better suited to be implemented right now, respecting dependencies)
2. Plan the implementation carefully
3. Implement that ONE task only
4. After successful implementation:
$AfterImplementation
## Critical Rules
- Only mark a task complete if you verified the work is done (build passes, etc.)
- If stuck, document the issue in the task's notes field and move on
- Do ONE task per iteration, then stop
- NEVER try to commit files in .ai/
$CommitRule
## Completion Signal
If ALL tasks in tasks.json have "completed": true, output exactly:
===ALL_TASKS_COMPLETE===
"@
$CommitPrompt = @"
You are an autonomous coding agent. All tasks for "$FeatureName" are now complete.
Your job: Create a single commit with all the changes.
## Steps
1. Run git status to see all modified files
2. Run git diff to review the changes
3. Create a commit with a short summary (aim for ~50 chars, max 76 chars) describing what was implemented
4. The commit message should describe the overall feature/fix, not list individual changes
## Critical Rules
- NEVER try to commit files in .ai/
- Use a concise commit message that captures the essence of the work done
"@
Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
Write-Host " Iterative Task Runner" -ForegroundColor Cyan
Write-Host " Feature: $FeatureName" -ForegroundColor Cyan
Write-Host " Max iterations: $MaxIterations" -ForegroundColor Cyan
Write-Host " Mode: $(if ($Interactive) { 'Interactive' } else { 'Auto' })" -ForegroundColor Cyan
Write-Host " Commit: $(if ($NoCommit) { 'None' } elseif ($SingleCommit) { 'Single (at end)' } else { 'Per task' })" -ForegroundColor Cyan
Write-Host " Working directory: $RepoRoot" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
if ($DryRun) {
Write-Host "[DRY RUN] Would execute with prompt:" -ForegroundColor Yellow
Write-Host $Prompt
Write-Host ""
Write-Host "Feature folder: $WorkDir" -ForegroundColor Yellow
Write-Host "Prompt file: $PromptMd" -ForegroundColor Yellow
Write-Host "Tasks file: $TasksJson" -ForegroundColor Yellow
exit 0
}
Push-Location $RepoRoot
$ScriptStartTime = Get-Date
$IterationTimes = @()
try {
for ($i = 1; $i -le $MaxIterations; $i++) {
Write-Host ""
Write-Host "========================================" -ForegroundColor Yellow
Write-Host " Iteration $i of $MaxIterations" -ForegroundColor Yellow
Write-Host "========================================" -ForegroundColor Yellow
Write-Host ""
if (-not (Test-BuildFilesUnlocked)) {
exit 1
}
$IterationStartTime = Get-Date
claude --dangerously-skip-permissions --verbose -p $Prompt --output-format stream-json 2>&1 | ForEach-Object {
Show-ClaudeStream $_
}
$IterationEndTime = Get-Date
$IterationDuration = [int]($IterationEndTime - $IterationStartTime).TotalSeconds
$IterationTimes += $IterationDuration
Write-Host "Iteration time: $(Format-Duration $IterationDuration)" -ForegroundColor DarkCyan
# Check task status after each run
$tasks = Get-Content $TasksJson | ConvertFrom-Json
$incomplete = @($tasks.tasks | Where-Object { -not $_.completed })
$inProgress = @($tasks.tasks | Where-Object { $_.started -and -not $_.completed })
if ($incomplete.Count -eq 0) {
if ($SingleCommit -and -not $NoCommit) {
$i++
if ($i -le $MaxIterations) {
Write-Host ""
Write-Host "========================================" -ForegroundColor Yellow
Write-Host " Final commit iteration" -ForegroundColor Yellow
Write-Host "========================================" -ForegroundColor Yellow
Write-Host ""
$CommitStartTime = Get-Date
claude --dangerously-skip-permissions --verbose -p $CommitPrompt --output-format stream-json 2>&1 | ForEach-Object {
Show-ClaudeStream $_
}
$CommitEndTime = Get-Date
$CommitDuration = [int]($CommitEndTime - $CommitStartTime).TotalSeconds
$IterationTimes += $CommitDuration
Write-Host "Commit time: $(Format-Duration $CommitDuration)" -ForegroundColor DarkCyan
} else {
Write-Host ""
Write-Host "========================================" -ForegroundColor Red
Write-Host " Max iterations reached before commit" -ForegroundColor Red
Write-Host " Run manually: git add . && git commit" -ForegroundColor Red
Write-Host "========================================" -ForegroundColor Red
Write-Host ""
exit 1
}
}
$TotalTime = [int]((Get-Date) - $ScriptStartTime).TotalSeconds
$AvgTime = if ($IterationTimes.Count -gt 0) { [int](($IterationTimes | Measure-Object -Sum).Sum / $IterationTimes.Count) } else { 0 }
Write-Host ""
Write-Host "========================================" -ForegroundColor Green
Write-Host " ALL TASKS COMPLETE!" -ForegroundColor Green
Write-Host " Feature: $FeatureName" -ForegroundColor Green
Write-Host " Iterations: $($IterationTimes.Count)" -ForegroundColor Green
Write-Host " Total time: $(Format-Duration $TotalTime)" -ForegroundColor Green
Write-Host " Avg per iteration: $(Format-Duration $AvgTime)" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Green
Write-Host ""
exit 0
}
Write-Host ""
Write-Host "Remaining tasks: $($incomplete.Count)" -ForegroundColor Cyan
if ($inProgress.Count -gt 0) {
Write-Host "In progress: $($inProgress[0].title)" -ForegroundColor Yellow
}
if ($Interactive) {
Write-Host "Press Enter to continue, Ctrl+C to stop..." -ForegroundColor Cyan
Read-Host
} else {
Start-Sleep -Seconds 2
}
}
$TotalTime = [int]((Get-Date) - $ScriptStartTime).TotalSeconds
$AvgTime = if ($IterationTimes.Count -gt 0) { [int](($IterationTimes | Measure-Object -Sum).Sum / $IterationTimes.Count) } else { 0 }
Write-Host ""
Write-Host "========================================" -ForegroundColor Red
Write-Host " Max iterations ($MaxIterations) reached" -ForegroundColor Red
Write-Host " Check tasks.json for remaining tasks" -ForegroundColor Red
Write-Host " Total time: $(Format-Duration $TotalTime)" -ForegroundColor Red
Write-Host " Avg per iteration: $(Format-Duration $AvgTime)" -ForegroundColor Red
Write-Host "========================================" -ForegroundColor Red
Write-Host ""
exit 1
}
finally {
Pop-Location
}
================================================
FILE: .cursorignore
================================================
# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv)
Telegram/ThirdParty/
================================================
FILE: .devcontainer.json
================================================
{
"name": "CentOS",
"image": "tdesktop:centos_env",
"customizations": {
"vscode": {
"settings": {
"C_Cpp.intelliSenseEngine": "disabled",
"cmake.generator": "Ninja Multi-Config",
"cmake.buildDirectory": "${workspaceFolder}/out",
"cmake.copyCompileCommands": "${workspaceFolder}/compile_commands.json"
},
"extensions": [
"ms-vscode.cpptools-extension-pack",
"llvm-vs-code-extensions.vscode-clangd",
"TheQtCompany.qt",
"ms-python.python",
"ms-azuretools.vscode-docker",
"eamodio.gitlens"
]
}
},
"capAdd": [
"SYS_PTRACE"
],
"securityOpt": [
"seccomp=unconfined"
],
"workspaceMount": "source=${localWorkspaceFolder},target=/usr/src/tdesktop,type=bind,consistency=cached",
"workspaceFolder": "/usr/src/tdesktop"
}
================================================
FILE: .gitattributes
================================================
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto
# Ensure diffs have LF endings
*.diff text eol=lf
*.bat text eol=crlf
# Ensure lottie animations are treated as binary files
*.lottie binary
================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contributing
This document describes how you can contribute to Telegram Desktop. Please read it carefully.
**Table of Contents**
* [What contributions are accepted](#what-contributions-are-accepted)
* [Build instructions](#build-instructions)
* [Pull upstream changes into your fork regularly](#pull-upstream-changes-into-your-fork-regularly)
* [How to get your pull request accepted](#how-to-get-your-pull-request-accepted)
* [Keep your pull requests limited to a single issue](#keep-your-pull-requests-limited-to-a-single-issue)
* [Squash your commits to a single commit](#squash-your-commits-to-a-single-commit)
* [Don't mix code changes with whitespace cleanup](#dont-mix-code-changes-with-whitespace-cleanup)
* [Keep your code simple!](#keep-your-code-simple)
* [Test your changes!](#test-your-changes)
* [Write a good commit message](#write-a-good-commit-message)
## What contributions are accepted
We highly appreciate your contributions in the matter of fixing bugs and optimizing the Telegram Desktop source code and its documentation. In case of fixing the existing user experience please push to your fork and [submit a pull request][pr].
Wait for us. We try to review your pull requests as fast as possible.
If we find issues with your pull request, we may suggest some changes and improvements.
Unfortunately we **do not merge** any pull requests that have new feature implementations, translations to new languages and those which introduce any new user interface elements.
If you have a translations-related contribution, check out [Translations platform][translate].
Telegram Desktop is not a standalone application but a part of [Telegram project][telegram], so all the decisions about the features, languages, user experience, user interface and the design are made inside Telegram team, often according to some roadmap which is not public.
## Build instructions
See the [README.md][build_instructions] for details on the various build
environments.
## Pull upstream changes into your fork regularly
Telegram Desktop is advancing quickly. It is therefore critical that you pull upstream changes into your fork on a regular basis. Nothing is worse than putting in a days of hard work into a pull request only to have it rejected because it has diverged too far from upstream.
To pull in upstream changes:
git remote add upstream https://github.com/telegramdesktop/tdesktop.git
git fetch upstream master
Check the log to be sure that you actually want the changes, before merging:
git log upstream/master
Then rebase your changes on the latest commits in the `master` branch:
git rebase upstream/master
After that, you have to force push your commits:
git push --force
For more info, see [GitHub Help][help_fork_repo].
## How to get your pull request accepted
We want to improve Telegram Desktop with your contributions. But we also want to provide a stable experience for our users and the community. Follow these rules and you should succeed without a problem!
### Keep your pull requests limited to a single issue
Pull requests should be as small/atomic as possible. Large, wide-sweeping changes in a pull request will be **rejected**, with comments to isolate the specific code in your pull request. Some examples:
* If you are making spelling corrections in the docs, don't modify other files.
* If you are adding new functions don't '*cleanup*' unrelated functions. That cleanup belongs in another pull request.
#### Squash your commits to a single commit
To keep the history of the project clean, you should make one commit per pull request.
If you already have multiple commits, you can add the commits together (squash them) with the following commands in Git Bash:
1. Open `Git Bash` (or `Git Shell`)
2. Enter following command to squash the recent {N} commits: `git reset --soft HEAD~{N} && git commit` (replace `{N}` with the number of commits you want to squash)
3. Press <kbd>i</kbd> to get into Insert-mode
4. Enter the commit message of the new commit
5. After adding the message, press <kbd>ESC</kbd> to get out of the Insert-mode
6. Write `:wq` and press <kbd>Enter</kbd> to save the new message or write `:q!` to discard your changes
7. Enter `git push --force` to push the new commit to the remote repository
For example, if you want to squash the last 5 commits, use `git reset --soft HEAD~5 && git commit`
### Don't mix code changes with whitespace cleanup
If you change two lines of code and correct 200 lines of whitespace issues in a file the diff on that pull request is functionally unreadable and will be **rejected**. Whitespace cleanups need to be in their own pull request.
### Keep your code simple!
Please keep your code as clean and straightforward as possible.
Furthermore, the pixel shortage is over. We want to see:
* `opacity` instead of `o`
* `placeholder` instead of `ph`
* `myFunctionThatDoesThings()` instead of `mftdt()`
### Test your changes!
Before you submit a pull request, please test your changes. Verify that Telegram Desktop still works and your changes don't cause other issue or crashes.
### Write a good commit message
* Explain why you make the changes. [More infos about a good commit message.][commit_message]
* If you fix an issue with your commit, please close the issue by [adding one of the keywords and the issue number][closing-issues-via-commit-messages] to your commit message.
For example: `Fix #545`
[//]: # (LINKS)
[telegram]: https://telegram.org/
[help_fork_repo]: https://help.github.com/articles/fork-a-repo/
[help_change_commit_message]: https://help.github.com/articles/changing-a-commit-message/
[commit_message]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
[pr]: https://github.com/telegramdesktop/tdesktop/compare
[build_instructions]: https://github.com/telegramdesktop/tdesktop/blob/master/README.md#build-instructions
[closing-issues-via-commit-messages]: https://help.github.com/articles/closing-issues-via-commit-messages/
[translate]: https://translations.telegram.org
================================================
FILE: .github/ISSUE_TEMPLATE/BUG_REPORT.yml
================================================
name: Bug report
description: Report errors or unexpected behavior.
labels: [bug]
body:
- type: markdown
attributes:
value: |
Thanks for reporting issues of Telegram Desktop!
To make it easier for us to help you please enter detailed information below.
- type: textarea
attributes:
label: Steps to reproduce
placeholder: |
1.
2.
3.
validations:
required: true
- type: textarea
attributes:
label: Expected behaviour
placeholder: Tell us what should happen
validations:
required: true
- type: textarea
attributes:
label: Actual behaviour
placeholder: Tell us what happens instead
validations:
required: true
- type: input
attributes:
label: Operating system
description: >
Your operating system name, version and desktop environment.
**Don't use kernel version (uname), it's useless.**
validations:
required: true
- type: input
attributes:
label: Version of Telegram Desktop
description: >
Please note we don't support versions from Linux distro repositories.
If you need support for these versions, **please contact your distro maintainer**
or your distro bugtracker.
**Don't use 'latest'**, specify actual version, **that's a reason to close your issue**.
validations:
required: true
- type: dropdown
attributes:
label: Installation source
multiple: false
options:
- Static binary from official website
- Microsoft Store
- Mac App Store
- Flatpak
- Snap
- Other (unofficial) source
validations:
required: true
- type: input
attributes:
label: Crash ID
description: >
If you're reporting a crash, please enter the crash ID from the crash reporter
opening on the next launch after crash. **You have to enable beta versions
installation in Settings -> Advanced for the reporter to appear.**
You don't have to wait for a beta version to arrive.
- type: textarea
attributes:
label: Logs
description: >
You can find log.txt using the `viewlogs`
[cheat code](https://github.com/telegramdesktop/tdesktop/wiki/Cheat-Codes).
placeholder: Insert log.txt here (if necessary)
render: shell
================================================
FILE: .github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml
================================================
---
name: Feature request
description: Suggest an idea.
labels: [enhancement]
body:
- type: textarea
attributes:
label: Is your feature request related to a problem?
placeholder: A clear and concise description of what the problem is.
validations:
required: true
- type: textarea
attributes:
label: Describe the solution you'd like
placeholder: A clear and concise description of what you want to happen.
validations:
required: true
- type: textarea
attributes:
label: Describe alternatives you've considered
placeholder: A clear and concise description of any alternative solutions or features you've considered.
validations:
required: true
- type: textarea
attributes:
label: Additional context
placeholder: Add any other context or screenshots about the feature request here.
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Platform-wide issue
url: https://bugs.telegram.org
about: Any bug report or feature request affecting more than only Telegram Desktop.
- name: Issue of other client
url: https://bugs.telegram.org
about: Any bug report or feature request not about Telegram Desktop.
- name: Question
url: https://t.me/TelegramDesktopTalk
about: Ask a question.
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
================================================
FILE: .github/scripts/generate_changelog.py
================================================
#!/usr/bin/env python3
"""Convert changelog.txt to a static HTML page for GitHub Pages."""
import re
import shutil
import sys
import html
from pathlib import Path
MONTHS = [
"", "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December",
]
VERSION_RE = re.compile(
r"^(\d+\.\d+(?:\.\d+)?)\s*" # version number
r"(?:(alpha|beta|dev|stable)\s*)?" # optional tag
r"\((\d{2})\.(\d{2})\.(\d{2,4})\)$" # date (DD.MM.YY or DD.MM.YYYY)
)
def parse_date(day: str, month: str, year: str) -> tuple[str, str, str]:
"""Return (sort_key, raw_display, full_display) from DD, MM, YY strings."""
y = int(year)
if y < 100:
y += 2000
m = int(month)
d = int(day)
sort_key = f"{y:04d}-{m:02d}-{d:02d}"
raw_display = f"{day}.{month}.{year}"
full_display = f"{d} {MONTHS[m]} {y}"
return sort_key, raw_display, full_display
def parse_changelog(text: str) -> list[dict]:
entries = []
current = None
for raw_line in text.splitlines():
line = raw_line.rstrip()
m = VERSION_RE.match(line)
if m:
if current:
entries.append(current)
version, tag, day, month, year = m.groups()
sort_key, raw_date, full_date = parse_date(day, month, year)
current = {
"version": version,
"tag": tag or "",
"date": raw_date,
"full_date": full_date,
"sort_key": sort_key,
"lines": [],
}
elif current is not None:
# Skip blank lines at the start
if not line and not current["lines"]:
continue
# Skip stray artifact lines
if line.strip() in ("),", "),"):
continue
current["lines"].append(line)
if current:
entries.append(current)
# Trim trailing blank lines from each entry
for entry in entries:
while entry["lines"] and not entry["lines"][-1]:
entry["lines"].pop()
return entries
def render_entry(entry: dict) -> str:
version = html.escape(entry["version"])
tag = entry["tag"]
date = html.escape(entry["date"])
anchor = f"v{version}"
tag_html = ""
if tag and tag not in ("stable",):
tag_html = f' {html.escape(tag)}'
parts = [
f'<article class="entry" id="{anchor}">',
f' <h2><a class="anchor" href="#{anchor}"></a>'
f'{version}{tag_html}'
f' <time>{date}</time></h2>',
]
in_list = False
for line in entry["lines"]:
stripped = line.lstrip()
if stripped.startswith("- ") or stripped.startswith("\u2014 "):
# Bullet point (- or em dash)
if not in_list:
parts.append(" <ul>")
in_list = True
bullet_text = stripped[2:]
parts.append(f" <li>{html.escape(bullet_text)}</li>")
else:
if in_list:
parts.append(" </ul>")
in_list = False
if stripped:
parts.append(f" <p>{html.escape(stripped)}</p>")
if in_list:
parts.append(" </ul>")
parts.append("</article>")
return "\n".join(parts)
def build_html(entries: list[dict]) -> str:
count = len(entries)
first_date = entries[-1]["full_date"] if entries else ""
latest_version = entries[0]["version"] if entries else ""
entries_html = "\n\n".join(render_entry(e) for e in entries)
return f"""<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Version history</title>
<link rel="icon" type="image/png" sizes="32x32" href="icon32.png">
<link rel="icon" type="image/png" sizes="16x16" href="icon16.png">
<style>
* {{ margin: 0; padding: 0; box-sizing: border-box; }}
body {{
font: 12px / 18px "Lucida Grande", "Lucida Sans Unicode", Arial,
Helvetica, Verdana, sans-serif;
background: #fff;
color: #000;
}}
header {{
background: #1d98dc;
color: #fff;
padding: 2rem 1.5rem;
text-align: center;
}}
header h1 {{ font-size: 18px; font-weight: 700; }}
header p {{ opacity: .85; margin-top: 4px; font-size: 12px; }}
.container {{
max-width: 600px;
margin: 0 auto;
padding: 20px 15px;
}}
.search-box {{
position: sticky;
top: 0;
z-index: 10;
background: #fff;
padding: 8px 0 12px;
}}
.search-box input {{
width: 100%;
padding: 6px 10px;
font: 12px / 18px "Lucida Grande", "Lucida Sans Unicode", Arial,
Helvetica, Verdana, sans-serif;
border: 1px solid #ccc;
border-radius: 4px;
background: #fff;
color: #000;
outline: none;
}}
.search-box input:focus {{ border-color: #1d98dc; }}
.entry {{
padding: 14px 0 4px;
scroll-margin-top: 48px;
}}
.entry h2 {{
font-size: 16px;
font-weight: 700;
line-height: 22px;
margin-bottom: 6px;
position: relative;
}}
.entry h2 .anchor {{
position: absolute;
left: -24px;
top: 0;
width: 24px;
height: 22px;
display: block;
opacity: 0;
transition: opacity .15s;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 16 16'%3E%3Cpath fill='%23168acd' d='M7.775 3.275a.75.75 0 0 0 1.06 1.06l1.25-1.25a2 2 0 1 1 2.83 2.83l-2.5 2.5a2 2 0 0 1-2.83 0 .75.75 0 0 0-1.06 1.06 3.5 3.5 0 0 0 4.95 0l2.5-2.5a3.5 3.5 0 0 0-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 0 1 0-2.83l2.5-2.5a2 2 0 0 1 2.83 0 .75.75 0 0 0 1.06-1.06 3.5 3.5 0 0 0-4.95 0l-2.5 2.5a3.5 3.5 0 0 0 4.95 4.95l1.25-1.25a.75.75 0 0 0-1.06-1.06l-1.25 1.25a2 2 0 0 1-2.83 0z'/%3E%3C/svg%3E") 0 center / 18px no-repeat;
cursor: pointer;
}}
.entry h2:hover .anchor {{ opacity: .6; }}
.entry h2 .anchor:hover {{ opacity: 1; }}
.entry h2 time {{
font-size: 12px;
font-weight: 400;
color: #999;
margin-left: 6px;
}}
.entry ul {{
margin: 0 0 4px 8px;
padding: 0;
list-style: none;
}}
.entry li {{
padding: 2px 0 2px 16px;
position: relative;
color: #333;
}}
.entry li::before {{
content: "";
position: absolute;
left: 0;
top: 9px;
width: 6px;
height: 6px;
border-radius: 50%;
background: #009be1;
}}
.entry p {{
margin: 4px 0;
color: #555;
font-style: italic;
}}
.hidden {{ display: none; }}
footer {{
text-align: center;
padding: 24px 15px;
font-size: 11px;
color: #999;
}}
footer a {{ color: #168acd; text-decoration: none; }}
footer a:hover {{ text-decoration: underline; }}
</style>
</head>
<body>
<header>
<h1>Version history</h1>
<p>{count} releases since {first_date} · latest: {latest_version}</p>
</header>
<div class="container">
<div class="search-box">
<input type="text" id="search" placeholder="Search versions and changes\u2026"
autocomplete="off" spellcheck="false">
</div>
<div id="entries">
{entries_html}
</div>
</div>
<footer>
Auto-generated from
<a href="https://github.com/telegramdesktop/tdesktop/blob/dev/changelog.txt">changelog.txt</a>.
Source code is published under
<a href="https://github.com/telegramdesktop/tdesktop">GPL v3</a>.
</footer>
<script>
(function() {{
var input = document.getElementById('search');
var entries = document.querySelectorAll('.entry');
var timer;
input.addEventListener('input', function() {{
clearTimeout(timer);
timer = setTimeout(function() {{
var q = input.value.toLowerCase().trim();
entries.forEach(function(el) {{
if (!q) {{
el.classList.remove('hidden');
}} else {{
el.classList.toggle('hidden', el.textContent.toLowerCase().indexOf(q) === -1);
}}
}});
}}, 150);
}});
// Anchor links: copy URL on click
document.addEventListener('click', function(e) {{
var anchor = e.target.closest('.anchor');
if (!anchor) return;
e.preventDefault();
var url = location.origin + location.pathname + anchor.getAttribute('href');
history.replaceState(null, '', anchor.getAttribute('href'));
if (navigator.clipboard) {{
navigator.clipboard.writeText(url);
}}
}});
}})();
</script>
</body>
</html>"""
def main():
repo = Path(__file__).resolve().parent.parent.parent
src = repo / "changelog.txt"
if len(sys.argv) > 1:
src = Path(sys.argv[1])
out = repo / "docs" / "changelog" / "index.html"
if len(sys.argv) > 2:
out = Path(sys.argv[2])
text = src.read_text(encoding="utf-8")
entries = parse_changelog(text)
html_content = build_html(entries)
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text(html_content, encoding="utf-8")
# Copy favicon files from resources
icons_src = repo / "Telegram" / "Resources" / "art"
for name in ("icon16.png", "icon32.png"):
icon = icons_src / name
if icon.exists():
shutil.copy2(icon, out.parent / name)
print(f"Generated {out} ({len(entries)} entries, {out.stat().st_size:,} bytes)")
if __name__ == "__main__":
main()
================================================
FILE: .github/workflows/changelog.yml
================================================
name: Changelog
on:
push:
branches: [dev]
paths: [changelog.txt]
release:
types: [published]
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: pages
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: "3.12"
- name: Generate HTML
run: python .github/scripts/generate_changelog.py
- name: Upload pages artifact
uses: actions/upload-pages-artifact@v4
with:
path: docs
deploy:
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deploy.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deploy
uses: actions/deploy-pages@v4
================================================
FILE: .github/workflows/docker.yml
================================================
name: Docker.
on:
push:
paths:
- '.github/workflows/docker.yml'
- 'Telegram/build/docker/centos_env/**'
jobs:
docker:
name: Ubuntu
runs-on: ubuntu-latest
if: github.ref_name == github.event.repository.default_branch
env:
IMAGE_TAG: ghcr.io/${{ github.repository }}/centos_env:latest
steps:
- name: Clone.
uses: actions/checkout@v6
with:
submodules: recursive
- name: First set up.
run: |
sudo apt update
curl -sSL https://install.python-poetry.org | python3 -
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin
- name: Free up some disk space.
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be
with:
tool-cache: true
- name: Docker image build.
run: |
cd Telegram/build/docker/centos_env
poetry install
DEBUG= LTO= poetry run gen_dockerfile | DOCKER_BUILDKIT=1 docker build -t $IMAGE_TAG -
- name: Push the Docker image.
run: docker push $IMAGE_TAG
================================================
FILE: .github/workflows/full_source.yml
================================================
name: Upload full source to release.
on:
release:
types: released
workflow_dispatch:
inputs:
release_version:
description: 'The version of the release to upload'
required: true
default: 'v1.0.0'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Clone.
uses: actions/checkout@v2
with:
submodules: recursive
- name: Install prerequisites.
run: |
pip install git-archive-all
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
# Use the release version from the input if available.
p="frk-${{ github.event.inputs.release_version }}-full.tar.gz"
else
# Otherwise fallback to the release event.
p="frk-v${GITHUB_REF##*/v}-full.tar.gz"
fi
echo "TAG=$p" >> $GITHUB_ENV
- name: Build assets.
run: |
mkdir -p dist/
echo "$TAG"
~/.local/bin/git-archive-all ./dist/${TAG}
- name: Get release ID by tag.
id: get_release
if: github.event_name == 'workflow_dispatch'
uses: cardinalby/git-get-release-action@master
env:
GITHUB_TOKEN: ${{ github.token }}
with:
tag: ${{ github.event.inputs.release_version }}
- name: Set upload URL for release event.
id: set_upload_url
if: github.event_name == 'release'
run: |
echo "upload_url=${{ github.event.release.upload_url }}" >> $GITHUB_OUTPUT
- name: Upload.
uses: lovasoa/upload-release-asset@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.get_release.outputs.upload_url || steps.set_upload_url.outputs.upload_url }}
asset_path: ./dist/${{ env.TAG }}
asset_label: Source code (tar.gz, full)
asset_name: ${{ env.TAG }}
asset_content_type: application/x-gzip
================================================
FILE: .github/workflows/inno.yml
================================================
name: Create Inno Setup Installers
on:
release:
types: [released]
workflow_dispatch:
inputs:
version:
description: 'Version number (e.g., 1.2.3)'
required: true
jobs:
create-installers:
runs-on: windows-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Get version
id: version
run: |
# For workflow_dispatch
if (-not [string]::IsNullOrEmpty("${{ github.event.inputs.version }}")) {
echo "version=${{ github.event.inputs.version }}" >> $env:GITHUB_OUTPUT
echo "version_full=${{ github.event.inputs.version }}" >> $env:GITHUB_OUTPUT
} else {
# For release event
echo "version=$($env:GITHUB_REF -replace 'refs/tags/', '')" >> $env:GITHUB_OUTPUT
echo "version_full=$($env:GITHUB_REF -replace 'refs/tags/', '')" >> $env:GITHUB_OUTPUT
}
shell: pwsh
- name: Download x64 zip
uses: robinraju/release-downloader@v1.12
with:
repository: ${{ github.repository }}
tag: ${{ steps.version.outputs.version_full }}
fileName: Telegram.zip
out-file-path: ./artifacts/x64/
- name: Download x86 zip
uses: robinraju/release-downloader@v1.12
with:
repository: ${{ github.repository }}
tag: ${{ steps.version.outputs.version_full }}
fileName: Telegram_x86.zip
out-file-path: ./artifacts/x86/
- name: Extract x64 zip
run: |
Expand-Archive -Path ./artifacts/x64/Telegram.zip -DestinationPath ./artifacts/x64/extracted
- name: Extract x86 zip
run: |
Expand-Archive -Path ./artifacts/x86/Telegram_x86.zip -DestinationPath ./artifacts/x86/extracted
- name: Install Inno Setup
run: |
choco install innosetup -y
- name: Prepare directories
run: |
New-Item -ItemType Directory -Path ./Telegram/build/release_x64 -Force
New-Item -ItemType Directory -Path ./Telegram/build/release_x86 -Force
Copy-Item -Path ./artifacts/x64/extracted/* -Destination ./Telegram/build/release_x64 -Recurse -Force
Copy-Item -Path ./artifacts/x86/extracted/* -Destination ./Telegram/build/release_x86 -Recurse -Force
- name: Get release ID by tag.
id: get_release
if: github.event_name == 'workflow_dispatch'
uses: cardinalby/git-get-release-action@master
env:
GITHUB_TOKEN: ${{ github.token }}
with:
tag: ${{ github.event.inputs.version }}
- name: Set upload URL for release event.
id: set_upload_url
if: github.event_name == 'release'
run: |
echo "upload_url=${{ github.event.release.upload_url }}" >> $env:GITHUB_OUTPUT
- name: Create x64 installer
id: create_x64
run: |
$cleanVersion = "${{ steps.version.outputs.version }}".TrimStart('v')
echo "Version: $cleanVersion."
iscc ./Telegram/build/setup.iss `
/dMyAppVersion=$cleanVersion `
/dMyAppVersionZero=$cleanVersion `
/dMyAppVersionFull=$cleanVersion `
/dMyBuildTarget="win64" `
/dReleasePath="../../artifacts/x64/extracted" `
/dSourcePath="../SourceFiles/"
# Find the output exe file
$exePath = Get-ChildItem -Path "." -Filter "tsetup-x64.$cleanVersion.exe" -Recurse | Select-Object -First 1 -ExpandProperty FullName
if ($exePath) {
echo "$exePath"
echo "output_file=$exePath" >> $env:GITHUB_OUTPUT
} else {
Write-Error "Output exe file not found"
exit 1
}
- name: Create x86 installer
id: create_x86
run: |
$cleanVersion = "${{ steps.version.outputs.version }}".TrimStart('v')
echo "Version: $cleanVersion."
iscc ./Telegram/build/setup.iss `
/dMyAppVersion=$cleanVersion `
/dMyAppVersionZero=$cleanVersion `
/dMyAppVersionFull=$cleanVersion `
/dMyBuildTarget="win32" `
/dReleasePath="../../artifacts/x86/extracted" `
/dSourcePath="../SourceFiles/"
# Find the output exe file
$exePath = Get-ChildItem -Path "." -Filter "tsetup.$cleanVersion.exe" -Recurse | Select-Object -First 1 -ExpandProperty FullName
if ($exePath) {
echo "$exePath"
echo "output_file=$exePath" >> $env:GITHUB_OUTPUT
} else {
Write-Error "Output exe file not found"
exit 1
}
- name: Upload x64 installer to release
uses: lovasoa/upload-release-asset@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.get_release.outputs.upload_url || steps.set_upload_url.outputs.upload_url }}
asset_path: ${{ steps.create_x64.outputs.output_file }}
asset_name: Telegram Windows x64 Installer.exe
asset_content_type: application/octet-stream
- name: Upload x86 installer to release
uses: lovasoa/upload-release-asset@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.get_release.outputs.upload_url || steps.set_upload_url.outputs.upload_url }}
asset_path: ${{ steps.create_x86.outputs.output_file }}
asset_name: Telegram Windows x32 Installer.exe
asset_content_type: application/octet-stream
================================================
FILE: .github/workflows/jekyll-gh-pages.yml
================================================
# Sample workflow for building and deploying a Jekyll site to GitHub Pages
name: Deploy Jekyll with GitHub Pages dependencies preinstalled
on:
# Runs on pushes targeting the default branch
push:
branches: ["dev"]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
# Build job
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Build with Jekyll
uses: actions/jekyll-build-pages@v1
with:
source: ./
destination: ./_site
jekyll_config: _config_github_pages.yml
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
# Deployment job
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
================================================
FILE: .github/workflows/linux.yml
================================================
name: Linux.
on:
workflow_dispatch:
inputs:
version:
description: 'Version label (e.g., v5.15.3)'
required: false
type: string
release:
types: [published]
repository_dispatch:
types: ["Restart linux workflow."]
push:
paths-ignore:
- 'docs/**'
- '**.md'
- 'changelog.txt'
- 'LEGAL'
- 'LICENSE'
- '.github/**'
- '!.github/workflows/linux.yml'
- 'snap/**'
- 'Telegram/build/**'
- '!Telegram/build/docker/centos_env/**'
- 'Telegram/Resources/uwp/**'
- 'Telegram/Resources/winrc/**'
- 'Telegram/SourceFiles/platform/win/**'
- 'Telegram/SourceFiles/platform/mac/**'
- 'Telegram/Telegram/**'
- 'Telegram/configure.bat'
- 'Telegram/Telegram.plist'
pull_request:
paths-ignore:
- 'docs/**'
- '**.md'
- 'changelog.txt'
- 'LEGAL'
- 'LICENSE'
- '.github/**'
- '!.github/workflows/linux.yml'
- 'snap/**'
- 'Telegram/build/**'
- '!Telegram/build/docker/centos_env/**'
- 'Telegram/Resources/uwp/**'
- 'Telegram/Resources/winrc/**'
- 'Telegram/SourceFiles/platform/win/**'
- 'Telegram/SourceFiles/platform/mac/**'
- 'Telegram/Telegram/**'
- 'Telegram/configure.bat'
- 'Telegram/Telegram.plist'
jobs:
linux:
name: Rocky Linux 8
runs-on: ubuntu-latest
strategy:
matrix:
defines:
- ""
env:
UPLOAD_ARTIFACT: "true"
ONLY_CACHE: "false"
IMAGE_TAG: tdesktop:centos_env
steps:
- name: Validate upload secret parts.
env:
UPDATER_UPLOAD_BASE64: ${{ secrets.UPDATER_UPLOAD_BASE64 }}
UPDATER_UPLOAD_BASE64_PART1: ${{ secrets.UPDATER_UPLOAD_BASE64_PART1 }}
UPDATER_UPLOAD_BASE64_PART2: ${{ secrets.UPDATER_UPLOAD_BASE64_PART2 }}
UPDATER_UPLOAD_BASE64_PART3: ${{ secrets.UPDATER_UPLOAD_BASE64_PART3 }}
run: |
echo "UPDATER_UPLOAD_BASE64 length: ${#UPDATER_UPLOAD_BASE64}"
echo "UPDATER_UPLOAD_BASE64_PART1 length: ${#UPDATER_UPLOAD_BASE64_PART1}"
echo "UPDATER_UPLOAD_BASE64_PART2 length: ${#UPDATER_UPLOAD_BASE64_PART2}"
echo "UPDATER_UPLOAD_BASE64_PART3 length: ${#UPDATER_UPLOAD_BASE64_PART3}"
MERGED_UPLOAD_BASE64="${UPDATER_UPLOAD_BASE64_PART1}${UPDATER_UPLOAD_BASE64_PART2}${UPDATER_UPLOAD_BASE64_PART3}"
if [ -z "${MERGED_UPLOAD_BASE64}" ]; then
MERGED_UPLOAD_BASE64="${UPDATER_UPLOAD_BASE64}"
fi
echo "Merged parts length: ${#MERGED_UPLOAD_BASE64}"
if [ -z "${MERGED_UPLOAD_BASE64}" ]; then
echo "No upload base64 payload provided."
exit 0
fi
if ! printf "%s" "${MERGED_UPLOAD_BASE64}" | base64 --decode > /tmp/updater_upload_check.zip 2>/tmp/updater_upload_check.err; then
echo "Base64 decode failed."
cat /tmp/updater_upload_check.err
exit 1
fi
if [ ! -s /tmp/updater_upload_check.zip ]; then
echo "Decoded payload is empty."
exit 1
fi
echo "Decoded file info: $(file -b /tmp/updater_upload_check.zip)"
- name: Clone.
uses: actions/checkout@v6
with:
submodules: recursive
- name: First set up.
run: |
sudo apt update
curl -sSL https://install.python-poetry.org | python3 -
cd Telegram/build/docker/centos_env
poetry install
DOCKERFILE=$(DEBUG= LTO= poetry run gen_dockerfile)
echo "$DOCKERFILE" > Dockerfile
rm -rf __pycache__
sudo apt -y install wget 7zip unzip
cd $GITHUB_WORKSPACE/..
rm -rf DesktopPrivate
mkdir -p DesktopPrivate
if [ -n "${{ secrets.DESKTOP_PRIVATE_BASE64 }}" ]; then
echo "${{ secrets.DESKTOP_PRIVATE_BASE64 }}" | base64 --decode > desktop_private.zip
unzip -oq desktop_private.zip -d DesktopPrivate
else
cd DesktopPrivate
echo "#pragma once" > alpha_private.h
echo "#pragma once" > packer_private.h
echo '${{ secrets.ALPHA_PRIVATE }}' >> alpha_private.h
echo '${{ secrets.PACKER_PRIVATE }}' >> packer_private.h
cd ..
fi
wget ${{ secrets.PACK_FILE }} -O p.7z
7za x p.7z -p${{ secrets.PACK_FILE_PASSWORD }}
- name: Free up some disk space.
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be
with:
tool-cache: true
- name: Set up Docker Buildx.
uses: docker/setup-buildx-action@v4
- name: Libraries cache.
uses: actions/cache@v5
with:
path: ${{ runner.temp }}/.buildx-cache
key: ${{ runner.OS }}-libs-${{ hashFiles('Telegram/build/docker/centos_env/**') }}
restore-keys: ${{ runner.OS }}-libs-
- name: Libraries.
uses: docker/build-push-action@v7
with:
context: Telegram/build/docker/centos_env
load: ${{ env.ONLY_CACHE == 'false' }}
tags: ${{ env.IMAGE_TAG }}
cache-from: type=local,src=${{ runner.temp }}/.buildx-cache
cache-to: type=local,dest=${{ runner.temp }}/.buildx-cache-new,mode=max
- name: Move cache.
run: |
rm -rf ${{ runner.temp }}/.buildx-cache
mv ${{ runner.temp }}/.buildx-cache{-new,}
- name: Telegram Desktop build.
if: env.ONLY_CACHE == 'false'
run: |
DEFINE=""
if [ -n "${{ matrix.defines }}" ]; then
DEFINE="-D ${{ matrix.defines }}=ON"
echo Define from matrix: $DEFINE
echo "ARTIFACT_NAME=Telegram ${{ matrix.defines }}" >> $GITHUB_ENV
else
echo "ARTIFACT_NAME=Telegram" >> $GITHUB_ENV
fi
docker run --rm \
-u $(id -u) \
-v $PWD:/usr/src/tdesktop \
-v $PWD/../DesktopPrivate:/usr/src/DesktopPrivate \
$IMAGE_TAG \
/usr/src/tdesktop/Telegram/build/docker/centos_env/build.sh \
-D TDESKTOP_API_ID=${{ secrets.API_ID }} \
-D TDESKTOP_API_HASH=${{ secrets.API_HASH }} \
-D DESKTOP_APP_SPECIAL_TARGET=linux \
$DEFINE
strip -s out/MinSizeRel/Forkgram
- name: Check.
if: env.ONLY_CACHE == 'false'
run: |
filePath="out/MinSizeRel/Forkgram"
if test -f "$filePath"; then
echo "Build successfully done! :)"
size=$(stat -c %s "$filePath")
echo "File size of ${filePath}: ${size} Bytes."
else
echo "Build error, output file does not exist."
exit 1
fi
- name: Compress.
if: (github.event_name == 'release')
run: tar -cJvf Forkgram.tar.xz -C out/MinSizeRel Forkgram Updater
- name: Pack updater files.
if: (github.event_name == 'release') || (github.event_name == 'workflow_dispatch') || (github.event_name == 'repository_dispatch')
run: |
verPacker=$(awk '$1 == "AppVersion" { print $2 }' Telegram/build/version)
cd out/MinSizeRel
BEFORE=$(mktemp)
AFTER=$(mktemp)
ls -1 tlinuxupd* 2>/dev/null | sort > "$BEFORE" || true
./Packer -path Forkgram -path Updater -version "$verPacker"
ls -1 tlinuxupd* 2>/dev/null | sort > "$AFTER" || true
UPDATE_FILE=$(comm -13 "$BEFORE" "$AFTER" | tail -n 1)
if [ -z "$UPDATE_FILE" ]; then
UPDATE_FILE=$(ls -1t tlinuxupd* | head -n 1)
fi
if [ -z "$UPDATE_FILE" ] || [ ! -f "$UPDATE_FILE" ]; then
echo "Packed update file was not generated."
exit 1
fi
echo "PACKED_UPDATE_FILE=$GITHUB_WORKSPACE/out/MinSizeRel/$UPDATE_FILE" >> $GITHUB_ENV
echo "PACKED_UPDATE_BASENAME=$UPDATE_FILE" >> $GITHUB_ENV
echo "VER_PACKER=$verPacker" >> $GITHUB_ENV
- name: Upload packed updater to Telegram channel.
if: (github.event_name == 'release') || (github.event_name == 'workflow_dispatch') || (github.event_name == 'repository_dispatch')
env:
UPDATER_UPLOAD_BASE64: ${{ secrets.UPDATER_UPLOAD_BASE64 }}
UPDATER_UPLOAD_BASE64_PART1: ${{ secrets.UPDATER_UPLOAD_BASE64_PART1 }}
UPDATER_UPLOAD_BASE64_PART2: ${{ secrets.UPDATER_UPLOAD_BASE64_PART2 }}
UPDATER_UPLOAD_BASE64_PART3: ${{ secrets.UPDATER_UPLOAD_BASE64_PART3 }}
run: |
MERGED_UPLOAD_BASE64="${UPDATER_UPLOAD_BASE64_PART1}${UPDATER_UPLOAD_BASE64_PART2}${UPDATER_UPLOAD_BASE64_PART3}"
if [ -z "${MERGED_UPLOAD_BASE64}" ]; then
MERGED_UPLOAD_BASE64="${UPDATER_UPLOAD_BASE64}"
fi
if [ -z "${MERGED_UPLOAD_BASE64}" ]; then
echo "UPDATER_UPLOAD_BASE64(_PART1/_PART2/_PART3) is empty, skip channel upload."
exit 0
fi
python3 -m pip install --upgrade pip
python3 -m pip install requests tgcrypto-pyrofork Kurigram
rm -rf updater_channel_upload
mkdir -p updater_channel_upload
printf "%s" "${MERGED_UPLOAD_BASE64}" | base64 --decode > updater_upload.raw
if unzip -tqq updater_upload.raw >/dev/null 2>&1; then
unzip -oq updater_upload.raw -d updater_channel_upload
elif tar -tzf updater_upload.raw >/dev/null 2>&1; then
tar -xzf updater_upload.raw -C updater_channel_upload
elif tar -tf updater_upload.raw >/dev/null 2>&1; then
tar -xf updater_upload.raw -C updater_channel_upload
else
echo "Unsupported upload bundle format: $(file -b updater_upload.raw)"
exit 1
fi
(
cd updater_channel_upload
7za a -tzip -mx=0 ../updater_upload.zip . >/dev/null
)
SCRIPT_PATH=$(find updater_channel_upload -type f -name linux_pack_upl.py | head -n 1)
if [ -z "$SCRIPT_PATH" ]; then
echo "linux_pack_upl.py not found in UPDATER_UPLOAD_BASE64 bundle."
exit 1
fi
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
cp "$PACKED_UPDATE_FILE" "$SCRIPT_DIR/"
cp updater_upload.zip "$SCRIPT_DIR/"
cd "$SCRIPT_DIR"
if [ -f requirements.txt ]; then
python3 -m pip install -r requirements.txt
fi
python3 linux_pack_upl.py "tlinuxupd${VER_PACKER}"
- name: Upload.
if: (github.event_name == 'release')
uses: svenstaro/upload-release-action@2.11.4
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ./Forkgram.tar.xz
tag: ${{ github.event.release.tag_name }}
asset_name: Forkgram.tar.xz
================================================
FILE: .github/workflows/mac.yml
================================================
name: MacOS.
on:
push:
paths-ignore:
- 'docs/**'
- '**.md'
- 'changelog.txt'
- 'LEGAL'
- 'LICENSE'
- '.github/**'
- '!.github/workflows/mac.yml'
- 'lib/xdg/**'
- 'snap/**'
- 'Telegram/build/docker/**'
- 'Telegram/Resources/uwp/**'
- 'Telegram/Resources/winrc/**'
- 'Telegram/SourceFiles/platform/win/**'
- 'Telegram/SourceFiles/platform/linux/**'
- 'Telegram/configure.bat'
pull_request:
paths-ignore:
- 'docs/**'
- '**.md'
- 'changelog.txt'
- 'LEGAL'
- 'LICENSE'
- '.github/**'
- '!.github/workflows/mac.yml'
- 'lib/xdg/**'
- 'snap/**'
- 'Telegram/build/docker/**'
- 'Telegram/Resources/uwp/**'
- 'Telegram/Resources/winrc/**'
- 'Telegram/SourceFiles/platform/win/**'
- 'Telegram/SourceFiles/platform/linux/**'
- 'Telegram/configure.bat'
jobs:
macos:
name: MacOS
runs-on: macos-latest
strategy:
matrix:
defines:
- ""
env:
UPLOAD_ARTIFACT: "true"
ONLY_CACHE: "false"
PREPARE_PATH: "Telegram/build/prepare/prepare.py"
steps:
- name: Get repository name.
run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
- name: Clone.
uses: actions/checkout@v6
with:
submodules: recursive
path: ${{ env.REPO_NAME }}
- name: First set up.
run: |
sudo chown -R `whoami`:admin /usr/local/share
brew update
brew upgrade || true
brew install automake meson nasm ninja pkg-config
# Disable spotlight.
sudo mdutil -a -i off
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo sed -i '' '/CMAKE_${lang}_FLAGS_DEBUG_INIT/s/ -g//' /opt/homebrew/share/cmake/Modules/Compiler/GNU.cmake
- name: Libraries cache.
id: cache-libs
uses: actions/cache@v5
with:
path: |
Libraries
ThirdParty
key: ${{ runner.OS }}-libs-${{ hashFiles(format('{0}/{1}', env.REPO_NAME, env.PREPARE_PATH)) }}
restore-keys: ${{ runner.OS }}-libs-
- name: Libraries.
run: |
./$REPO_NAME/Telegram/build/prepare/mac.sh skip-release silent
- name: Free up some disk space.
run: find Libraries '(' '(' ! '(' -name '*.a' -o -name '*.h' -o -name '*.hpp' -o -name '*.inc' -o -name '*.cmake' -o -path '*/include/*' -o -path '*/objects-*' -o -path '*/cache_keys/*' -o -path '*/patches/*' -o -perm +111 ')' -type f ')' -o -empty ')' -delete
- name: Telegram Desktop build.
if: env.ONLY_CACHE == 'false'
run: |
cd $REPO_NAME/Telegram
DEFINE=""
if [ -n "${{ matrix.defines }}" ]; then
DEFINE="-D ${{ matrix.defines }}=ON"
echo Define from matrix: $DEFINE
echo "ARTIFACT_NAME=Telegram ${{ matrix.defines }}" >> $GITHUB_ENV
else
echo "ARTIFACT_NAME=Telegram" >> $GITHUB_ENV
fi
./configure.sh \
-D CMAKE_CONFIGURATION_TYPES=Debug \
-D CMAKE_COMPILE_WARNING_AS_ERROR=ON \
-D CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=NO \
-D TDESKTOP_API_TEST=ON \
-D DESKTOP_APP_DISABLE_AUTOUPDATE=OFF \
-D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF \
$DEFINE
cmake --build ../out --config Debug --parallel
- name: Move artifact.
if: env.UPLOAD_ARTIFACT == 'true'
run: |
cd $REPO_NAME/out/Debug
mkdir artifact
mv Telegram.app artifact/
mv Updater artifact/
- uses: actions/upload-artifact@v7
if: env.UPLOAD_ARTIFACT == 'true'
name: Upload artifact.
with:
name: ${{ env.ARTIFACT_NAME }}
path: ${{ env.REPO_NAME }}/out/Debug/artifact/
================================================
FILE: .github/workflows/mac_packaged.yml
================================================
name: MacOS Packaged.
on:
push:
paths-ignore:
- 'docs/**'
- '**.md'
- 'changelog.txt'
- 'LEGAL'
- 'LICENSE'
- '.github/**'
- '!.github/workflows/mac_packaged.yml'
- 'lib/xdg/**'
- 'snap/**'
- 'Telegram/build/**'
- 'Telegram/Resources/uwp/**'
- 'Telegram/Resources/winrc/**'
- 'Telegram/SourceFiles/platform/win/**'
- 'Telegram/SourceFiles/platform/linux/**'
- 'Telegram/configure.bat'
pull_request:
paths-ignore:
- 'docs/**'
- '**.md'
- 'changelog.txt'
- 'LEGAL'
- 'LICENSE'
- '.github/**'
- '!.github/workflows/mac_packaged.yml'
- 'lib/xdg/**'
- 'snap/**'
- 'Telegram/build/**'
- 'Telegram/Resources/uwp/**'
- 'Telegram/Resources/winrc/**'
- 'Telegram/SourceFiles/platform/win/**'
- 'Telegram/SourceFiles/platform/linux/**'
- 'Telegram/configure.bat'
jobs:
macos:
name: MacOS
runs-on: macos-latest
strategy:
matrix:
defines:
- ""
env:
GIT: "https://github.com"
CMAKE_GENERATOR: "Ninja"
CMAKE_BUILD_TYPE: "Debug"
CMAKE_BUILD_PARALLEL_LEVEL: ""
CMAKE_PREFIX_PATH: "/opt/homebrew/opt/ffmpeg@6:/opt/homebrew/opt/openal-soft"
TDE2E: "51743dfd01dff6179e2d8f7095729caa4e2222e9"
UPLOAD_ARTIFACT: "true"
ONLY_CACHE: "false"
MANUAL_CACHING: "1"
AUTO_CACHING: "1"
steps:
- name: Get repository name.
run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
- name: Clone.
uses: actions/checkout@v6
with:
submodules: recursive
path: ${{ env.REPO_NAME }}
- name: First set up.
run: |
brew update
brew upgrade || true
brew install ada-url autoconf automake boost cmake ffmpeg@6 jpeg-xl libavif libheif libtool openal-soft openh264 openssl opus ninja pkg-config python qtbase qtimageformats qtsvg xz || true
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo sed -i '' '/CMAKE_${lang}_FLAGS_DEBUG_INIT/s/ -g//' /opt/homebrew/share/cmake/Modules/Compiler/GNU.cmake
xcodebuild -version > CACHE_KEY.txt
brew list --versions >> CACHE_KEY.txt
echo $MANUAL_CACHING >> CACHE_KEY.txt
echo "$GITHUB_WORKSPACE" >> CACHE_KEY.txt
if [ "$AUTO_CACHING" = "1" ]; then
thisFile=$REPO_NAME/.github/workflows/mac_packaged.yml
echo `md5 -q $thisFile` >> CACHE_KEY.txt
fi
echo "CACHE_KEY=`md5 -q CACHE_KEY.txt`" >> $GITHUB_ENV
echo "MACOSX_DEPLOYMENT_TARGET=$(grep 'set(QT_SUPPORTED_MIN_MACOS_VERSION' /opt/homebrew/Cellar/qtbase/*/lib/cmake/Qt6/Qt6ConfigExtras.cmake | sed -E 's/^.*"(.*)"\)$/\1/')" >> $GITHUB_ENV
echo "LibrariesPath=`pwd`" >> $GITHUB_ENV
echo "RNNOISE=`curl -sSL --header 'Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' https://api.github.com/repos/xiph/rnnoise/git/refs/heads/master | jq -r .object.sha`" >> $GITHUB_ENV
echo "WEBRTC=`curl -sSL --header 'Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' https://api.github.com/repos/desktop-app/tg_owt/git/refs/heads/master | jq -r .object.sha`" >> $GITHUB_ENV
- name: RNNoise cache.
id: cache-rnnoise
uses: actions/cache@v5
with:
path: ${{ env.LibrariesPath }}/local/rnnoise
key: ${{ runner.OS }}-rnnoise-${{ env.RNNOISE }}-${{ env.CACHE_KEY }}
- name: RNNoise.
if: steps.cache-rnnoise.outputs.cache-hit != 'true'
run: |
cd $LibrariesPath
git clone --depth=1 $GIT/xiph/rnnoise.git
cd rnnoise
./autogen.sh
./configure --prefix=$LibrariesPath/local/rnnoise --disable-examples --disable-doc
make -j$(sysctl -n hw.logicalcpu)
make install
- name: WebRTC cache.
id: cache-webrtc
uses: actions/cache@v5
with:
path: ${{ env.LibrariesPath }}/local/tg_owt
key: ${{ runner.OS }}-webrtc-${{ env.WEBRTC }}-${{ env.CACHE_KEY }}
- name: WebRTC.
if: steps.cache-webrtc.outputs.cache-hit != 'true'
run: |
cd $LibrariesPath
git clone --depth=1 --recursive --shallow-submodules $GIT/desktop-app/tg_owt.git
cd tg_owt
cmake -Bbuild . -DCMAKE_INSTALL_PREFIX=$LibrariesPath/local/tg_owt
cmake --build build
cmake --install build
- name: TDE2E cache.
id: cache-tde2e
uses: actions/cache@v5
with:
path: ${{ env.LibrariesPath }}/local/tde2e
key: ${{ runner.OS }}-tde2e-${{ env.TDE2E }}-${{ env.CACHE_KEY }}
- name: TDE2E.
if: steps.cache-tde2e.outputs.cache-hit != 'true'
run: |
cd $LibrariesPath
git init tde2e
cd tde2e
git remote add origin $GIT/tdlib/td.git
git fetch --depth=1 origin $TDE2E
git reset --hard FETCH_HEAD
cmake -Bbuild . -DCMAKE_INSTALL_PREFIX=$LibrariesPath/local/tde2e -DTD_E2E_ONLY=ON
cmake --build build
cmake --install build
- name: Telegram Desktop build.
if: env.ONLY_CACHE == 'false'
run: |
cd $REPO_NAME
export CMAKE_PREFIX_PATH="$CMAKE_PREFIX_PATH$(find $LibrariesPath/local -mindepth 1 -maxdepth 1 -type d -exec printf ':%s' {} +)"
DEFINE=""
if [ -n "${{ matrix.defines }}" ]; then
DEFINE="-D ${{ matrix.defines }}=ON"
echo Define from matrix: $DEFINE
echo "ARTIFACT_NAME=Telegram ${{ matrix.defines }}" >> $GITHUB_ENV
else
echo "ARTIFACT_NAME=Telegram" >> $GITHUB_ENV
fi
cmake -Bbuild . -DTDESKTOP_API_TEST=ON $DEFINE
cmake --build build
macdeployqt build/Telegram.app
codesign --remove-signature build/Telegram.app
- name: Move artifact.
if: env.UPLOAD_ARTIFACT == 'true'
run: |
cd $REPO_NAME/build
mkdir artifact
mv Telegram.app artifact/
- uses: actions/upload-artifact@v7
if: env.UPLOAD_ARTIFACT == 'true'
name: Upload artifact.
with:
name: ${{ env.ARTIFACT_NAME }}
path: ${{ env.REPO_NAME }}/build/artifact/
================================================
FILE: .github/workflows/needs-user-action.yml
================================================
name: Needs user action.
on:
issue_comment:
types: [created]
schedule:
- cron: '0 2 * * *'
jobs:
needs-user-action:
runs-on: ubuntu-slim
steps:
- uses: lee-dohm/no-response@v0.5.0
with:
token: ${{ github.token }}
responseRequiredLabel: needs user action
================================================
FILE: .github/workflows/snap.yml
================================================
name: Snap
on:
release:
types: [published]
workflow_dispatch:
jobs:
snap:
name: Build and publish snap
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: Setup LXD
run: |
sudo iptables -P FORWARD ACCEPT
sudo snap install --classic snapcraft
sudo usermod -aG lxd $USER
sudo lxd init --auto
sudo lxd waitready
- name: Free up disk space
uses: samueldr/more-space-action@97048bd0df83fb05b5257887bdbaffc848887673
with:
enable-remove-default-apt-patterns: false
enable-lvm-span: true
lvm-span-mountpoint: /var/snap/lxd/common/lxd/storage-pools/default/containers
- name: Build snap
run: sudo -u $USER snap run snapcraft --verbosity=debug
- name: Find snap artifact
run: |
SNAP_FILE=$(echo forkgram_*.snap)
echo "SNAP_FILE=$SNAP_FILE" >> "$GITHUB_ENV"
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: ${{ env.SNAP_FILE }}
path: ${{ env.SNAP_FILE }}
- name: Publish to Snap Store
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }}
run: snapcraft upload "$SNAP_FILE" --release=stable
================================================
FILE: .github/workflows/waiting-for-answer.yml
================================================
name: Waiting for answer.
on:
issue_comment:
types: [created]
schedule:
- cron: '30 0 * * *'
jobs:
waiting-for-answer:
runs-on: ubuntu-slim
steps:
- uses: lee-dohm/no-response@v0.5.0
with:
token: ${{ github.token }}
responseRequiredLabel: waiting for answer
================================================
FILE: .github/workflows/win.yml
================================================
name: Windows.
on:
push:
paths-ignore:
- 'docs/**'
- '**.md'
- '!docs/building-win*.md'
- 'changelog.txt'
- 'LEGAL'
- 'LICENSE'
- '.github/**'
- '!.github/workflows/win.yml'
- 'lib/xdg/**'
- 'snap/**'
- 'Telegram/build/docker/**'
- 'Telegram/Resources/uwp/**'
- 'Telegram/SourceFiles/platform/linux/**'
- 'Telegram/SourceFiles/platform/mac/**'
- 'Telegram/Telegram/**'
- 'Telegram/configure.sh'
- 'Telegram/Telegram.plist'
pull_request:
paths-ignore:
- 'docs/**'
- '**.md'
- '!docs/building-win*.md'
- 'changelog.txt'
- 'LEGAL'
- 'LICENSE'
- '.github/**'
- '!.github/workflows/win.yml'
- 'lib/xdg/**'
- 'snap/**'
- 'Telegram/build/docker/**'
- 'Telegram/Resources/uwp/**'
- 'Telegram/SourceFiles/platform/linux/**'
- 'Telegram/SourceFiles/platform/mac/**'
- 'Telegram/Telegram/**'
- 'Telegram/configure.sh'
- 'Telegram/Telegram.plist'
jobs:
windows:
name: Windows
runs-on: ${{ matrix.arch == 'arm64' && 'windows-11-arm' || 'windows-latest' }}
strategy:
matrix:
arch: [x64_x86, x64, arm64]
qt: ["", qt6]
generator: ["", "Ninja Multi-Config"]
exclude:
- arch: arm64
qt: ""
- arch: x64_x86
qt: qt6
env:
UPLOAD_ARTIFACT: "true"
ONLY_CACHE: "false"
PREPARE_PATH: "Telegram/build/prepare/prepare.py"
defaults:
run:
shell: cmd
steps:
- name: Prepare directories.
run: |
mkdir %userprofile%\TBuild\Libraries
mklink /d %GITHUB_WORKSPACE%\TBuild %userprofile%\TBuild
echo TBUILD=%GITHUB_WORKSPACE%\TBuild>>%GITHUB_ENV%
echo LibrariesPath=%GITHUB_WORKSPACE%\TBuild\Libraries${{ matrix.arch == 'x64' && '\win64' || '' }}>>%GITHUB_ENV%
- name: Get repository name.
shell: bash
run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
- name: Clone.
uses: actions/checkout@v6
with:
submodules: recursive
path: ${{ env.TBUILD }}\${{ env.REPO_NAME }}
- name: First set up.
shell: bash
run: |
DOCPATH=$TBUILD/$REPO_NAME/docs/building-win.md
SDK="$(grep "SDK version" $DOCPATH | sed -r 's/.*\*\*(.*)\*\* SDK version.*/\1/')"
echo "SDK=$SDK" >> $GITHUB_ENV
sed -i '/CMAKE_${lang}_FLAGS_DEBUG_INIT/s/${_Zi}//' "$PROGRAMFILES"/CMake/share/cmake*/Modules/Platform/Windows-MSVC.cmake
echo "$(sha256sum $TBUILD/$REPO_NAME/$PREPARE_PATH | awk '{ print $1 }')" >> CACHE_KEY.txt
echo "$SDK" >> CACHE_KEY.txt
echo "CACHE_KEY=$(sha256sum CACHE_KEY.txt | awk '{ print $1 }')" >> $GITHUB_ENV
echo "Configurate git for cherry-picks."
git config --global user.email "you@example.com"
git config --global user.name "Sample"
- uses: ilammy/msvc-dev-cmd@v1.13.0
name: Native Tools Command Prompt.
with:
arch: ${{ matrix.arch }}
sdk: ${{ env.SDK }}
- name: NuGet sources.
run: |
nuget sources Disable -Name "Microsoft Visual Studio Offline Packages"
nuget sources Add -Source https://api.nuget.org/v3/index.json & exit 0
- name: ThirdParty cache.
id: cache-third-party
uses: actions/cache@v5
with:
path: ${{ env.TBUILD }}\ThirdParty
key: ${{ runner.OS }}-${{ runner.arch }}-third-party-${{ env.CACHE_KEY }}
restore-keys: ${{ runner.OS }}-${{ runner.arch }}-third-party-
- name: Libraries cache.
id: cache-libs
uses: actions/cache@v5
with:
path: |
${{ env.LibrariesPath }}\*
!${{ env.LibrariesPath }}\cache_keys
!${{ env.LibrariesPath }}\[qQ]t[_-]*
${{ env.LibrariesPath }}\cache_keys\*
!${{ env.LibrariesPath }}\cache_keys\[qQ]t[_-]*
key: ${{ runner.OS }}-${{ matrix.arch }}-libs-${{ env.CACHE_KEY }}
restore-keys: ${{ runner.OS }}-${{ matrix.arch }}-libs-
- name: Qt cache.
id: cache-qt
uses: actions/cache@v5
with:
path: |
${{ env.LibrariesPath }}\[qQ]t[_-]*
${{ env.LibrariesPath }}\cache_keys\[qQ]t[_-]*
key: ${{ runner.OS }}-${{ matrix.arch }}-${{ matrix.qt || 'qt' }}-${{ env.CACHE_KEY }}
restore-keys: ${{ runner.OS }}-${{ matrix.arch }}-${{ matrix.qt || 'qt' }}-
- name: Libraries.
env:
GYP_MSVS_OVERRIDE_PATH: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\'
GYP_MSVS_VERSION: 2022
run: |
%TBUILD%\%REPO_NAME%\Telegram\build\prepare\win.bat skip-release silent ${{ matrix.qt }}
- name: Read configuration matrix.
shell: bash
run: |
ARTIFACT_NAME="Telegram"
ARCH=""
if [ -n "${{ matrix.arch }}" ]; then
case "${{ matrix.arch }}" in
x64_x86) ARCH="x86";;
arm64) ARCH="arm";;
*) ARCH="${{ matrix.arch }}";;
esac
echo "Architecture from matrix: $ARCH"
ARTIFACT_NAME="${ARTIFACT_NAME} ${{ matrix.arch }}"
fi
if [ -n "${{ matrix.qt }}" ]; then
ARTIFACT_NAME="${ARTIFACT_NAME} ${{ matrix.qt }}"
fi
GENERATOR=""
if [ -n "${{ matrix.generator }}" ]; then
GENERATOR="-G \"${{ matrix.generator }}\""
echo "Generator from matrix: $GENERATOR"
ARTIFACT_NAME="${ARTIFACT_NAME} ${{ matrix.generator }}"
fi
echo "TDESKTOP_BUILD_GENERATOR=$GENERATOR" >> $GITHUB_ENV
[ -n "$GENERATOR" ] && ARCH=""
echo "TDESKTOP_BUILD_ARCH=$ARCH" >> $GITHUB_ENV
DEFINE=""
if [ -n "${{ matrix.defines }}" ]; then
DEFINE="-D ${{ matrix.defines }}=ON"
echo "Define from matrix: $DEFINE"
gitextract_khvlzyi6/
├── .agents/
│ └── skills/
│ └── task-think/
│ ├── PROMPTS.md
│ └── SKILL.md
├── .claude/
│ ├── commands/
│ │ ├── icon.md
│ │ ├── planner.md
│ │ ├── reflect.md
│ │ ├── release.md
│ │ ├── task.md
│ │ └── withtest.md
│ ├── grab_clipboard.ps1
│ ├── grab_clipboard.sh
│ └── iterate.ps1
├── .cursorignore
├── .devcontainer.json
├── .gitattributes
├── .github/
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE/
│ │ ├── BUG_REPORT.yml
│ │ ├── FEATURE_REQUEST.yml
│ │ └── config.yml
│ ├── dependabot.yml
│ ├── scripts/
│ │ └── generate_changelog.py
│ └── workflows/
│ ├── changelog.yml
│ ├── docker.yml
│ ├── full_source.yml
│ ├── inno.yml
│ ├── jekyll-gh-pages.yml
│ ├── linux.yml
│ ├── mac.yml
│ ├── mac_packaged.yml
│ ├── needs-user-action.yml
│ ├── snap.yml
│ ├── waiting-for-answer.yml
│ └── win.yml
├── .gitignore
├── .gitmodules
├── AGENTS.md
├── CLAUDE.md
├── CMakeLists.txt
├── LEGAL
├── LICENSE
├── README.md
├── REVIEW.md
├── Telegram/
│ ├── CMakeLists.txt
│ ├── Resources/
│ │ ├── animations/
│ │ │ ├── ban.tgs
│ │ │ ├── blocked_peers_empty.tgs
│ │ │ ├── cake.tgs
│ │ │ ├── camera_outline.tgs
│ │ │ ├── change_number.tgs
│ │ │ ├── chat/
│ │ │ │ ├── sparkles_emoji.tgs
│ │ │ │ ├── video_to_voice.tgs
│ │ │ │ ├── voice_to_video.tgs
│ │ │ │ └── white_flag_emoji.tgs
│ │ │ ├── chat_link.tgs
│ │ │ ├── cloud_filters.tgs
│ │ │ ├── cloud_password/
│ │ │ │ ├── email.tgs
│ │ │ │ ├── hint.tgs
│ │ │ │ ├── intro.tgs
│ │ │ │ ├── password_input.tgs
│ │ │ │ └── validate.tgs
│ │ │ ├── cocoon.tgs
│ │ │ ├── collectible_phone.tgs
│ │ │ ├── collectible_username.tgs
│ │ │ ├── craft_failed.tgs
│ │ │ ├── craft_progress.tgs
│ │ │ ├── diamond.tgs
│ │ │ ├── dice/
│ │ │ │ ├── bball_idle.tgs
│ │ │ │ ├── dart_idle.tgs
│ │ │ │ ├── dice_6.tgs
│ │ │ │ ├── dice_idle.tgs
│ │ │ │ ├── fball_idle.tgs
│ │ │ │ ├── slot_0_idle.tgs
│ │ │ │ ├── slot_1_idle.tgs
│ │ │ │ ├── slot_2_idle.tgs
│ │ │ │ ├── slot_back.tgs
│ │ │ │ ├── slot_pull.tgs
│ │ │ │ └── winners.tgs
│ │ │ ├── discussion.tgs
│ │ │ ├── edit_peers/
│ │ │ │ ├── direct_messages.tgs
│ │ │ │ ├── topics.tgs
│ │ │ │ ├── topics_list.tgs
│ │ │ │ └── topics_tabs.tgs
│ │ │ ├── filters.tgs
│ │ │ ├── greeting.tgs
│ │ │ ├── hello_status.tgs
│ │ │ ├── hours.tgs
│ │ │ ├── local_passcode_enter.tgs
│ │ │ ├── location.tgs
│ │ │ ├── media_forbidden.tgs
│ │ │ ├── my_gifts_empty.tgs
│ │ │ ├── no_chats.tgs
│ │ │ ├── noresults.tgs
│ │ │ ├── palette.tgs
│ │ │ ├── passkeys.tgs
│ │ │ ├── phone.tgs
│ │ │ ├── photo_editor/
│ │ │ │ ├── arrow.tgs
│ │ │ │ ├── blur.tgs
│ │ │ │ ├── eraser.tgs
│ │ │ │ ├── marker.tgs
│ │ │ │ └── pen.tgs
│ │ │ ├── photo_suggest_icon.tgs
│ │ │ ├── profile/
│ │ │ │ ├── profile_muting.tgs
│ │ │ │ └── profile_unmuting.tgs
│ │ │ ├── robot.tgs
│ │ │ ├── rtmp.tgs
│ │ │ ├── search.tgs
│ │ │ ├── show_or_premium_lastseen.tgs
│ │ │ ├── show_or_premium_readtime.tgs
│ │ │ ├── sleep.tgs
│ │ │ ├── star_reaction/
│ │ │ │ ├── appear.tgs
│ │ │ │ ├── center.tgs
│ │ │ │ ├── effect1.tgs
│ │ │ │ ├── effect2.tgs
│ │ │ │ ├── effect3.tgs
│ │ │ │ ├── select.tgs
│ │ │ │ └── toast.tgs
│ │ │ ├── starref_link.tgs
│ │ │ ├── stats.tgs
│ │ │ ├── stats_boosts.tgs
│ │ │ ├── stats_earn.tgs
│ │ │ ├── stop.tgs
│ │ │ ├── swipe_action/
│ │ │ │ ├── archive.tgs
│ │ │ │ ├── delete.tgs
│ │ │ │ ├── disabled.tgs
│ │ │ │ ├── mute.tgs
│ │ │ │ ├── pin.tgs
│ │ │ │ ├── read.tgs
│ │ │ │ ├── unarchive.tgs
│ │ │ │ ├── unmute.tgs
│ │ │ │ ├── unpin.tgs
│ │ │ │ └── unread.tgs
│ │ │ ├── toast/
│ │ │ │ ├── chats_filter_in.tgs
│ │ │ │ ├── saved_messages.tgs
│ │ │ │ └── tagged.tgs
│ │ │ ├── transcribe_loading.tgs
│ │ │ ├── ttl.tgs
│ │ │ ├── voice_ttl_idle.tgs
│ │ │ ├── voice_ttl_start.tgs
│ │ │ └── writing.tgs
│ │ ├── art/
│ │ │ ├── background.tgv
│ │ │ └── mac_setup.tiff
│ │ ├── day-blue.tdesktop-theme
│ │ ├── day-custom-base.tdesktop-theme
│ │ ├── default_shortcuts-custom.json
│ │ ├── export_html/
│ │ │ ├── css/
│ │ │ │ └── style.css
│ │ │ └── js/
│ │ │ └── script.js
│ │ ├── icons/
│ │ │ ├── calls/
│ │ │ │ ├── hands.lottie
│ │ │ │ └── voice.lottie
│ │ │ ├── poll/
│ │ │ │ ├── toast_hide_results.tgs
│ │ │ │ └── uploading.tgs
│ │ │ └── settings/
│ │ │ └── devices/
│ │ │ ├── device_desktop_mac.lottie
│ │ │ ├── device_desktop_win.lottie
│ │ │ ├── device_linux.lottie
│ │ │ ├── device_linux_ubuntu.lottie
│ │ │ ├── device_phone_android.lottie
│ │ │ ├── device_phone_ios.lottie
│ │ │ ├── device_tablet_ios.lottie
│ │ │ ├── device_web_chrome.lottie
│ │ │ ├── device_web_edge.lottie
│ │ │ ├── device_web_firefox.lottie
│ │ │ └── device_web_safari.lottie
│ │ ├── iv_html/
│ │ │ ├── highlight.9.12.0.css
│ │ │ ├── highlight.9.12.0.js
│ │ │ ├── morphdom-umd.min.2.7.2.js
│ │ │ ├── page.css
│ │ │ └── page.js
│ │ ├── langs/
│ │ │ ├── cloud_lang.strings
│ │ │ ├── de.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── en.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── es.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── it.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── ko.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── lang.strings
│ │ │ ├── nl.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── pt-BR.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── refresh.py
│ │ │ ├── refresh.sh
│ │ │ └── stale.py
│ │ ├── night-custom-base.tdesktop-theme
│ │ ├── night-green.tdesktop-theme
│ │ ├── night.tdesktop-theme
│ │ ├── numbers.txt
│ │ ├── picker_html/
│ │ │ ├── picker.css
│ │ │ └── picker.js
│ │ ├── qrc/
│ │ │ ├── emoji_1.qrc
│ │ │ ├── emoji_2.qrc
│ │ │ ├── emoji_3.qrc
│ │ │ ├── emoji_4.qrc
│ │ │ ├── emoji_5.qrc
│ │ │ ├── emoji_6.qrc
│ │ │ ├── emoji_7.qrc
│ │ │ ├── emoji_8.qrc
│ │ │ ├── emoji_preview.qrc
│ │ │ ├── telegram/
│ │ │ │ ├── animations.qrc
│ │ │ │ ├── export.qrc
│ │ │ │ ├── iv.qrc
│ │ │ │ ├── mac_icons.qrc
│ │ │ │ ├── picker.qrc
│ │ │ │ ├── sounds.qrc
│ │ │ │ └── telegram.qrc
│ │ │ └── telegram.qrc
│ │ ├── uwp/
│ │ │ ├── AppX/
│ │ │ │ └── AppxManifest.xml
│ │ │ └── priconfig.xml
│ │ └── winrc/
│ │ ├── Telegram.manifest
│ │ ├── Telegram.rc
│ │ └── Updater.rc
│ ├── SourceFiles/
│ │ ├── _other/
│ │ │ ├── packer.cpp
│ │ │ ├── packer.h
│ │ │ ├── startup_task_win.cpp
│ │ │ ├── updater.h
│ │ │ ├── updater_linux.cpp
│ │ │ ├── updater_osx.m
│ │ │ └── updater_win.cpp
│ │ ├── api/
│ │ │ ├── api_as_copy.cpp
│ │ │ ├── api_as_copy.h
│ │ │ ├── api_attached_stickers.cpp
│ │ │ ├── api_attached_stickers.h
│ │ │ ├── api_authorizations.cpp
│ │ │ ├── api_authorizations.h
│ │ │ ├── api_blocked_peers.cpp
│ │ │ ├── api_blocked_peers.h
│ │ │ ├── api_bot.cpp
│ │ │ ├── api_bot.h
│ │ │ ├── api_chat_filters.cpp
│ │ │ ├── api_chat_filters.h
│ │ │ ├── api_chat_filters_remove_manager.cpp
│ │ │ ├── api_chat_filters_remove_manager.h
│ │ │ ├── api_chat_invite.cpp
│ │ │ ├── api_chat_invite.h
│ │ │ ├── api_chat_links.cpp
│ │ │ ├── api_chat_links.h
│ │ │ ├── api_chat_participants.cpp
│ │ │ ├── api_chat_participants.h
│ │ │ ├── api_cloud_password.cpp
│ │ │ ├── api_cloud_password.h
│ │ │ ├── api_common.cpp
│ │ │ ├── api_common.h
│ │ │ ├── api_compose_with_ai.cpp
│ │ │ ├── api_compose_with_ai.h
│ │ │ ├── api_confirm_phone.cpp
│ │ │ ├── api_confirm_phone.h
│ │ │ ├── api_credits.cpp
│ │ │ ├── api_credits.h
│ │ │ ├── api_credits_history_entry.cpp
│ │ │ ├── api_credits_history_entry.h
│ │ │ ├── api_earn.cpp
│ │ │ ├── api_earn.h
│ │ │ ├── api_editing.cpp
│ │ │ ├── api_editing.h
│ │ │ ├── api_filter_updates.h
│ │ │ ├── api_global_privacy.cpp
│ │ │ ├── api_global_privacy.h
│ │ │ ├── api_hash.cpp
│ │ │ ├── api_hash.h
│ │ │ ├── api_invite_links.cpp
│ │ │ ├── api_invite_links.h
│ │ │ ├── api_media.cpp
│ │ │ ├── api_media.h
│ │ │ ├── api_messages_search.cpp
│ │ │ ├── api_messages_search.h
│ │ │ ├── api_messages_search_merged.cpp
│ │ │ ├── api_messages_search_merged.h
│ │ │ ├── api_peer_colors.cpp
│ │ │ ├── api_peer_colors.h
│ │ │ ├── api_peer_photo.cpp
│ │ │ ├── api_peer_photo.h
│ │ │ ├── api_peer_search.cpp
│ │ │ ├── api_peer_search.h
│ │ │ ├── api_polls.cpp
│ │ │ ├── api_polls.h
│ │ │ ├── api_premium.cpp
│ │ │ ├── api_premium.h
│ │ │ ├── api_premium_option.cpp
│ │ │ ├── api_premium_option.h
│ │ │ ├── api_reactions_notify_settings.cpp
│ │ │ ├── api_reactions_notify_settings.h
│ │ │ ├── api_read_metrics.cpp
│ │ │ ├── api_read_metrics.h
│ │ │ ├── api_report.cpp
│ │ │ ├── api_report.h
│ │ │ ├── api_ringtones.cpp
│ │ │ ├── api_ringtones.h
│ │ │ ├── api_self_destruct.cpp
│ │ │ ├── api_self_destruct.h
│ │ │ ├── api_send_progress.cpp
│ │ │ ├── api_send_progress.h
│ │ │ ├── api_sending.cpp
│ │ │ ├── api_sending.h
│ │ │ ├── api_sensitive_content.cpp
│ │ │ ├── api_sensitive_content.h
│ │ │ ├── api_single_message_search.cpp
│ │ │ ├── api_single_message_search.h
│ │ │ ├── api_statistics.cpp
│ │ │ ├── api_statistics.h
│ │ │ ├── api_statistics_data_deserialize.cpp
│ │ │ ├── api_statistics_data_deserialize.h
│ │ │ ├── api_statistics_sender.cpp
│ │ │ ├── api_statistics_sender.h
│ │ │ ├── api_suggest_post.cpp
│ │ │ ├── api_suggest_post.h
│ │ │ ├── api_text_entities.cpp
│ │ │ ├── api_text_entities.h
│ │ │ ├── api_todo_lists.cpp
│ │ │ ├── api_todo_lists.h
│ │ │ ├── api_toggling_media.cpp
│ │ │ ├── api_toggling_media.h
│ │ │ ├── api_transcribes.cpp
│ │ │ ├── api_transcribes.h
│ │ │ ├── api_unread_things.cpp
│ │ │ ├── api_unread_things.h
│ │ │ ├── api_updates.cpp
│ │ │ ├── api_updates.h
│ │ │ ├── api_user_names.cpp
│ │ │ ├── api_user_names.h
│ │ │ ├── api_user_privacy.cpp
│ │ │ ├── api_user_privacy.h
│ │ │ ├── api_views.cpp
│ │ │ ├── api_views.h
│ │ │ ├── api_websites.cpp
│ │ │ ├── api_websites.h
│ │ │ ├── api_who_reacted.cpp
│ │ │ └── api_who_reacted.h
│ │ ├── apiwrap.cpp
│ │ ├── apiwrap.h
│ │ ├── boxes/
│ │ │ ├── about_box.cpp
│ │ │ ├── about_box.h
│ │ │ ├── about_sponsored_box.cpp
│ │ │ ├── about_sponsored_box.h
│ │ │ ├── abstract_box.cpp
│ │ │ ├── abstract_box.h
│ │ │ ├── add_contact_box.cpp
│ │ │ ├── add_contact_box.h
│ │ │ ├── auto_download_box.cpp
│ │ │ ├── auto_download_box.h
│ │ │ ├── auto_lock_box.cpp
│ │ │ ├── auto_lock_box.h
│ │ │ ├── background_box.cpp
│ │ │ ├── background_box.h
│ │ │ ├── background_preview_box.cpp
│ │ │ ├── background_preview_box.h
│ │ │ ├── boxes.style
│ │ │ ├── choose_filter_box.cpp
│ │ │ ├── choose_filter_box.h
│ │ │ ├── compose_ai_box.cpp
│ │ │ ├── compose_ai_box.h
│ │ │ ├── confirm_box.cpp
│ │ │ ├── connection_box.cpp
│ │ │ ├── connection_box.h
│ │ │ ├── contacts_box.cpp
│ │ │ ├── create_poll_box.cpp
│ │ │ ├── create_poll_box.h
│ │ │ ├── delete_messages_box.cpp
│ │ │ ├── delete_messages_box.h
│ │ │ ├── dictionaries_manager.cpp
│ │ │ ├── dictionaries_manager.h
│ │ │ ├── download_path_box.cpp
│ │ │ ├── download_path_box.h
│ │ │ ├── edit_caption_box.cpp
│ │ │ ├── edit_caption_box.h
│ │ │ ├── edit_privacy_box.cpp
│ │ │ ├── edit_privacy_box.h
│ │ │ ├── edit_todo_list_box.cpp
│ │ │ ├── edit_todo_list_box.h
│ │ │ ├── filters/
│ │ │ │ ├── edit_filter_box.cpp
│ │ │ │ ├── edit_filter_box.h
│ │ │ │ ├── edit_filter_chats_list.cpp
│ │ │ │ ├── edit_filter_chats_list.h
│ │ │ │ ├── edit_filter_chats_preview.cpp
│ │ │ │ ├── edit_filter_chats_preview.h
│ │ │ │ ├── edit_filter_links.cpp
│ │ │ │ └── edit_filter_links.h
│ │ │ ├── gift_credits_box.cpp
│ │ │ ├── gift_credits_box.h
│ │ │ ├── gift_premium_box.cpp
│ │ │ ├── gift_premium_box.h
│ │ │ ├── language_box.cpp
│ │ │ ├── language_box.h
│ │ │ ├── local_storage_box.cpp
│ │ │ ├── local_storage_box.h
│ │ │ ├── max_invite_box.cpp
│ │ │ ├── max_invite_box.h
│ │ │ ├── moderate_messages_box.cpp
│ │ │ ├── moderate_messages_box.h
│ │ │ ├── passcode_box.cpp
│ │ │ ├── passcode_box.h
│ │ │ ├── peer_list_box.cpp
│ │ │ ├── peer_list_box.h
│ │ │ ├── peer_list_controllers.cpp
│ │ │ ├── peer_list_controllers.h
│ │ │ ├── peer_list_widgets.cpp
│ │ │ ├── peer_list_widgets.h
│ │ │ ├── peer_lists_box.cpp
│ │ │ ├── peer_lists_box.h
│ │ │ ├── peers/
│ │ │ │ ├── add_bot_to_chat_box.cpp
│ │ │ │ ├── add_bot_to_chat_box.h
│ │ │ │ ├── add_participants_box.cpp
│ │ │ │ ├── add_participants_box.h
│ │ │ │ ├── channel_ownership_transfer.cpp
│ │ │ │ ├── channel_ownership_transfer.h
│ │ │ │ ├── choose_peer_box.cpp
│ │ │ │ ├── choose_peer_box.h
│ │ │ │ ├── create_managed_bot_box.cpp
│ │ │ │ ├── create_managed_bot_box.h
│ │ │ │ ├── edit_contact_box.cpp
│ │ │ │ ├── edit_contact_box.h
│ │ │ │ ├── edit_discussion_link_box.cpp
│ │ │ │ ├── edit_discussion_link_box.h
│ │ │ │ ├── edit_forum_topic_box.cpp
│ │ │ │ ├── edit_forum_topic_box.h
│ │ │ │ ├── edit_members_visible.cpp
│ │ │ │ ├── edit_members_visible.h
│ │ │ │ ├── edit_participant_box.cpp
│ │ │ │ ├── edit_participant_box.h
│ │ │ │ ├── edit_participants_box.cpp
│ │ │ │ ├── edit_participants_box.h
│ │ │ │ ├── edit_peer_color_box.cpp
│ │ │ │ ├── edit_peer_color_box.h
│ │ │ │ ├── edit_peer_common.h
│ │ │ │ ├── edit_peer_history_visibility_box.cpp
│ │ │ │ ├── edit_peer_history_visibility_box.h
│ │ │ │ ├── edit_peer_info_box.cpp
│ │ │ │ ├── edit_peer_info_box.h
│ │ │ │ ├── edit_peer_invite_link.cpp
│ │ │ │ ├── edit_peer_invite_link.h
│ │ │ │ ├── edit_peer_invite_links.cpp
│ │ │ │ ├── edit_peer_invite_links.h
│ │ │ │ ├── edit_peer_permissions_box.cpp
│ │ │ │ ├── edit_peer_permissions_box.h
│ │ │ │ ├── edit_peer_reactions.cpp
│ │ │ │ ├── edit_peer_reactions.h
│ │ │ │ ├── edit_peer_requests_box.cpp
│ │ │ │ ├── edit_peer_requests_box.h
│ │ │ │ ├── edit_peer_type_box.cpp
│ │ │ │ ├── edit_peer_type_box.h
│ │ │ │ ├── edit_peer_usernames_list.cpp
│ │ │ │ ├── edit_peer_usernames_list.h
│ │ │ │ ├── edit_tag_control.cpp
│ │ │ │ ├── edit_tag_control.h
│ │ │ │ ├── peer_short_info_box.cpp
│ │ │ │ ├── peer_short_info_box.h
│ │ │ │ ├── prepare_short_info_box.cpp
│ │ │ │ ├── prepare_short_info_box.h
│ │ │ │ ├── replace_boost_box.cpp
│ │ │ │ ├── replace_boost_box.h
│ │ │ │ ├── tag_info_box.cpp
│ │ │ │ ├── tag_info_box.h
│ │ │ │ ├── toggle_topics_box.cpp
│ │ │ │ ├── toggle_topics_box.h
│ │ │ │ ├── verify_peers_box.cpp
│ │ │ │ └── verify_peers_box.h
│ │ │ ├── phone_banned_box.cpp
│ │ │ ├── phone_banned_box.h
│ │ │ ├── pin_messages_box.cpp
│ │ │ ├── pin_messages_box.h
│ │ │ ├── polls.style
│ │ │ ├── premium_limits_box.cpp
│ │ │ ├── premium_limits_box.h
│ │ │ ├── premium_preview_box.cpp
│ │ │ ├── premium_preview_box.h
│ │ │ ├── reactions_settings_box.cpp
│ │ │ ├── reactions_settings_box.h
│ │ │ ├── report_messages_box.cpp
│ │ │ ├── report_messages_box.h
│ │ │ ├── ringtones_box.cpp
│ │ │ ├── ringtones_box.h
│ │ │ ├── select_future_owner_box.cpp
│ │ │ ├── select_future_owner_box.h
│ │ │ ├── self_destruction_box.cpp
│ │ │ ├── self_destruction_box.h
│ │ │ ├── send_credits_box.cpp
│ │ │ ├── send_credits_box.h
│ │ │ ├── send_files_box.cpp
│ │ │ ├── send_files_box.h
│ │ │ ├── send_gif_with_caption_box.cpp
│ │ │ ├── send_gif_with_caption_box.h
│ │ │ ├── share_box.cpp
│ │ │ ├── share_box.h
│ │ │ ├── star_gift_auction_box.cpp
│ │ │ ├── star_gift_auction_box.h
│ │ │ ├── star_gift_box.cpp
│ │ │ ├── star_gift_box.h
│ │ │ ├── star_gift_cover_box.cpp
│ │ │ ├── star_gift_cover_box.h
│ │ │ ├── star_gift_craft_animation.cpp
│ │ │ ├── star_gift_craft_animation.h
│ │ │ ├── star_gift_craft_box.cpp
│ │ │ ├── star_gift_craft_box.h
│ │ │ ├── star_gift_preview_box.cpp
│ │ │ ├── star_gift_preview_box.h
│ │ │ ├── star_gift_resale_box.cpp
│ │ │ ├── star_gift_resale_box.h
│ │ │ ├── sticker_set_box.cpp
│ │ │ ├── sticker_set_box.h
│ │ │ ├── stickers_box.cpp
│ │ │ ├── stickers_box.h
│ │ │ ├── transfer_gift_box.cpp
│ │ │ ├── transfer_gift_box.h
│ │ │ ├── translate_box.cpp
│ │ │ ├── translate_box.h
│ │ │ ├── translate_box_content.cpp
│ │ │ ├── translate_box_content.h
│ │ │ ├── url_auth_box.cpp
│ │ │ ├── url_auth_box.h
│ │ │ ├── url_auth_box_content.cpp
│ │ │ ├── url_auth_box_content.h
│ │ │ ├── username_box.cpp
│ │ │ └── username_box.h
│ │ ├── calls/
│ │ │ ├── calls.style
│ │ │ ├── calls_box_controller.cpp
│ │ │ ├── calls_box_controller.h
│ │ │ ├── calls_call.cpp
│ │ │ ├── calls_call.h
│ │ │ ├── calls_controller.cpp
│ │ │ ├── calls_controller.h
│ │ │ ├── calls_controller_tgvoip.h
│ │ │ ├── calls_controller_webrtc.cpp
│ │ │ ├── calls_controller_webrtc.h
│ │ │ ├── calls_emoji_fingerprint.cpp
│ │ │ ├── calls_emoji_fingerprint.h
│ │ │ ├── calls_instance.cpp
│ │ │ ├── calls_instance.h
│ │ │ ├── calls_panel.cpp
│ │ │ ├── calls_panel.h
│ │ │ ├── calls_panel_background.cpp
│ │ │ ├── calls_panel_background.h
│ │ │ ├── calls_signal_bars.cpp
│ │ │ ├── calls_signal_bars.h
│ │ │ ├── calls_top_bar.cpp
│ │ │ ├── calls_top_bar.h
│ │ │ ├── calls_userpic.cpp
│ │ │ ├── calls_userpic.h
│ │ │ ├── calls_video_bubble.cpp
│ │ │ ├── calls_video_bubble.h
│ │ │ ├── calls_video_incoming.cpp
│ │ │ ├── calls_video_incoming.h
│ │ │ ├── calls_window.cpp
│ │ │ ├── calls_window.h
│ │ │ ├── group/
│ │ │ │ ├── calls_choose_join_as.cpp
│ │ │ │ ├── calls_choose_join_as.h
│ │ │ │ ├── calls_cover_item.cpp
│ │ │ │ ├── calls_cover_item.h
│ │ │ │ ├── calls_group_call.cpp
│ │ │ │ ├── calls_group_call.h
│ │ │ │ ├── calls_group_common.cpp
│ │ │ │ ├── calls_group_common.h
│ │ │ │ ├── calls_group_invite_controller.cpp
│ │ │ │ ├── calls_group_invite_controller.h
│ │ │ │ ├── calls_group_members.cpp
│ │ │ │ ├── calls_group_members.h
│ │ │ │ ├── calls_group_members_row.cpp
│ │ │ │ ├── calls_group_members_row.h
│ │ │ │ ├── calls_group_menu.cpp
│ │ │ │ ├── calls_group_menu.h
│ │ │ │ ├── calls_group_message_encryption.cpp
│ │ │ │ ├── calls_group_message_encryption.h
│ │ │ │ ├── calls_group_message_field.cpp
│ │ │ │ ├── calls_group_message_field.h
│ │ │ │ ├── calls_group_messages.cpp
│ │ │ │ ├── calls_group_messages.h
│ │ │ │ ├── calls_group_messages_ui.cpp
│ │ │ │ ├── calls_group_messages_ui.h
│ │ │ │ ├── calls_group_panel.cpp
│ │ │ │ ├── calls_group_panel.h
│ │ │ │ ├── calls_group_rtmp.cpp
│ │ │ │ ├── calls_group_rtmp.h
│ │ │ │ ├── calls_group_settings.cpp
│ │ │ │ ├── calls_group_settings.h
│ │ │ │ ├── calls_group_stars_box.cpp
│ │ │ │ ├── calls_group_stars_box.h
│ │ │ │ ├── calls_group_toasts.cpp
│ │ │ │ ├── calls_group_toasts.h
│ │ │ │ ├── calls_group_viewport.cpp
│ │ │ │ ├── calls_group_viewport.h
│ │ │ │ ├── calls_group_viewport_opengl.cpp
│ │ │ │ ├── calls_group_viewport_opengl.h
│ │ │ │ ├── calls_group_viewport_raster.cpp
│ │ │ │ ├── calls_group_viewport_raster.h
│ │ │ │ ├── calls_group_viewport_rhi.cpp
│ │ │ │ ├── calls_group_viewport_rhi.h
│ │ │ │ ├── calls_group_viewport_tile.cpp
│ │ │ │ ├── calls_group_viewport_tile.h
│ │ │ │ ├── calls_volume_item.cpp
│ │ │ │ ├── calls_volume_item.h
│ │ │ │ └── ui/
│ │ │ │ ├── calls_group_recording_box.cpp
│ │ │ │ ├── calls_group_recording_box.h
│ │ │ │ ├── calls_group_scheduled_labels.cpp
│ │ │ │ ├── calls_group_scheduled_labels.h
│ │ │ │ ├── calls_group_stars_coloring.cpp
│ │ │ │ ├── calls_group_stars_coloring.h
│ │ │ │ ├── desktop_capture_choose_source.cpp
│ │ │ │ └── desktop_capture_choose_source.h
│ │ │ └── ui/
│ │ │ ├── calls_device_menu.cpp
│ │ │ └── calls_device_menu.h
│ │ ├── chat_helpers/
│ │ │ ├── bot_command.cpp
│ │ │ ├── bot_command.h
│ │ │ ├── bot_keyboard.cpp
│ │ │ ├── bot_keyboard.h
│ │ │ ├── chat_helpers.style
│ │ │ ├── compose/
│ │ │ │ ├── compose_features.h
│ │ │ │ ├── compose_show.cpp
│ │ │ │ └── compose_show.h
│ │ │ ├── emoji_interactions.cpp
│ │ │ ├── emoji_interactions.h
│ │ │ ├── emoji_keywords.cpp
│ │ │ ├── emoji_keywords.h
│ │ │ ├── emoji_list_widget.cpp
│ │ │ ├── emoji_list_widget.h
│ │ │ ├── emoji_sets_manager.cpp
│ │ │ ├── emoji_sets_manager.h
│ │ │ ├── emoji_suggestions_widget.cpp
│ │ │ ├── emoji_suggestions_widget.h
│ │ │ ├── field_autocomplete.cpp
│ │ │ ├── field_autocomplete.h
│ │ │ ├── field_characters_count_manager.cpp
│ │ │ ├── field_characters_count_manager.h
│ │ │ ├── gifs_list_widget.cpp
│ │ │ ├── gifs_list_widget.h
│ │ │ ├── message_field.cpp
│ │ │ ├── message_field.h
│ │ │ ├── share_message_phrase_factory.cpp
│ │ │ ├── share_message_phrase_factory.h
│ │ │ ├── spellchecker_common.cpp
│ │ │ ├── spellchecker_common.h
│ │ │ ├── stickers_dice_pack.cpp
│ │ │ ├── stickers_dice_pack.h
│ │ │ ├── stickers_emoji_image_loader.cpp
│ │ │ ├── stickers_emoji_image_loader.h
│ │ │ ├── stickers_emoji_pack.cpp
│ │ │ ├── stickers_emoji_pack.h
│ │ │ ├── stickers_gift_box_pack.cpp
│ │ │ ├── stickers_gift_box_pack.h
│ │ │ ├── stickers_list_footer.cpp
│ │ │ ├── stickers_list_footer.h
│ │ │ ├── stickers_list_widget.cpp
│ │ │ ├── stickers_list_widget.h
│ │ │ ├── stickers_lottie.cpp
│ │ │ ├── stickers_lottie.h
│ │ │ ├── tabbed_panel.cpp
│ │ │ ├── tabbed_panel.h
│ │ │ ├── tabbed_section.cpp
│ │ │ ├── tabbed_section.h
│ │ │ ├── tabbed_selector.cpp
│ │ │ ├── tabbed_selector.h
│ │ │ ├── ttl_media_layer_widget.cpp
│ │ │ └── ttl_media_layer_widget.h
│ │ ├── codegen/
│ │ │ └── scheme/
│ │ │ └── codegen_scheme.py
│ │ ├── config.h
│ │ ├── core/
│ │ │ ├── application.cpp
│ │ │ ├── application.h
│ │ │ ├── bank_card_click_handler.cpp
│ │ │ ├── bank_card_click_handler.h
│ │ │ ├── base_integration.cpp
│ │ │ ├── base_integration.h
│ │ │ ├── cached_webview_availability.h
│ │ │ ├── changelogs.cpp
│ │ │ ├── changelogs.h
│ │ │ ├── click_handler_types.cpp
│ │ │ ├── click_handler_types.h
│ │ │ ├── core_cloud_password.cpp
│ │ │ ├── core_cloud_password.h
│ │ │ ├── core_settings.cpp
│ │ │ ├── core_settings.h
│ │ │ ├── core_settings_proxy.cpp
│ │ │ ├── core_settings_proxy.h
│ │ │ ├── crash_report_window.cpp
│ │ │ ├── crash_report_window.h
│ │ │ ├── crash_reports.cpp
│ │ │ ├── crash_reports.h
│ │ │ ├── credits_amount.h
│ │ │ ├── current_geo_location.cpp
│ │ │ ├── current_geo_location.h
│ │ │ ├── deadlock_detector.h
│ │ │ ├── deep_links/
│ │ │ │ ├── deep_links_chats.cpp
│ │ │ │ ├── deep_links_chats.h
│ │ │ │ ├── deep_links_contacts.cpp
│ │ │ │ ├── deep_links_contacts.h
│ │ │ │ ├── deep_links_new.cpp
│ │ │ │ ├── deep_links_new.h
│ │ │ │ ├── deep_links_router.cpp
│ │ │ │ ├── deep_links_router.h
│ │ │ │ ├── deep_links_settings.cpp
│ │ │ │ ├── deep_links_settings.h
│ │ │ │ └── deep_links_types.h
│ │ │ ├── file_location.cpp
│ │ │ ├── file_location.h
│ │ │ ├── file_utilities.cpp
│ │ │ ├── file_utilities.h
│ │ │ ├── fork_settings.cpp
│ │ │ ├── fork_settings.h
│ │ │ ├── launcher.cpp
│ │ │ ├── launcher.h
│ │ │ ├── local_url_handlers.cpp
│ │ │ ├── local_url_handlers.h
│ │ │ ├── mime_type.cpp
│ │ │ ├── mime_type.h
│ │ │ ├── phone_click_handler.cpp
│ │ │ ├── phone_click_handler.h
│ │ │ ├── sandbox.cpp
│ │ │ ├── sandbox.h
│ │ │ ├── shortcuts.cpp
│ │ │ ├── shortcuts.h
│ │ │ ├── ui_integration.cpp
│ │ │ ├── ui_integration.h
│ │ │ ├── update_checker.cpp
│ │ │ ├── update_checker.h
│ │ │ ├── utils.cpp
│ │ │ ├── utils.h
│ │ │ └── version.h
│ │ ├── countries/
│ │ │ ├── countries_instance.cpp
│ │ │ ├── countries_instance.h
│ │ │ ├── countries_manager.cpp
│ │ │ └── countries_manager.h
│ │ ├── data/
│ │ │ ├── business/
│ │ │ │ ├── data_business_chatbots.cpp
│ │ │ │ ├── data_business_chatbots.h
│ │ │ │ ├── data_business_common.cpp
│ │ │ │ ├── data_business_common.h
│ │ │ │ ├── data_business_info.cpp
│ │ │ │ ├── data_business_info.h
│ │ │ │ ├── data_shortcut_messages.cpp
│ │ │ │ └── data_shortcut_messages.h
│ │ │ ├── components/
│ │ │ │ ├── credits.cpp
│ │ │ │ ├── credits.h
│ │ │ │ ├── factchecks.cpp
│ │ │ │ ├── factchecks.h
│ │ │ │ ├── gift_auctions.cpp
│ │ │ │ ├── gift_auctions.h
│ │ │ │ ├── location_pickers.cpp
│ │ │ │ ├── location_pickers.h
│ │ │ │ ├── passkeys.cpp
│ │ │ │ ├── passkeys.h
│ │ │ │ ├── promo_suggestions.cpp
│ │ │ │ ├── promo_suggestions.h
│ │ │ │ ├── recent_peers.cpp
│ │ │ │ ├── recent_peers.h
│ │ │ │ ├── recent_shared_media_gifts.cpp
│ │ │ │ ├── recent_shared_media_gifts.h
│ │ │ │ ├── scheduled_messages.cpp
│ │ │ │ ├── scheduled_messages.h
│ │ │ │ ├── sponsored_messages.cpp
│ │ │ │ ├── sponsored_messages.h
│ │ │ │ ├── top_peers.cpp
│ │ │ │ └── top_peers.h
│ │ │ ├── data_abstract_sparse_ids.h
│ │ │ ├── data_abstract_structure.cpp
│ │ │ ├── data_abstract_structure.h
│ │ │ ├── data_audio_msg_id.cpp
│ │ │ ├── data_audio_msg_id.h
│ │ │ ├── data_authorization.h
│ │ │ ├── data_auto_download.cpp
│ │ │ ├── data_auto_download.h
│ │ │ ├── data_birthday.cpp
│ │ │ ├── data_birthday.h
│ │ │ ├── data_boosts.h
│ │ │ ├── data_bot_app.cpp
│ │ │ ├── data_bot_app.h
│ │ │ ├── data_changes.cpp
│ │ │ ├── data_changes.h
│ │ │ ├── data_channel.cpp
│ │ │ ├── data_channel.h
│ │ │ ├── data_channel_admins.cpp
│ │ │ ├── data_channel_admins.h
│ │ │ ├── data_channel_earn.h
│ │ │ ├── data_chat.cpp
│ │ │ ├── data_chat.h
│ │ │ ├── data_chat_filters.cpp
│ │ │ ├── data_chat_filters.h
│ │ │ ├── data_chat_participant_status.cpp
│ │ │ ├── data_chat_participant_status.h
│ │ │ ├── data_cloud_file.cpp
│ │ │ ├── data_cloud_file.h
│ │ │ ├── data_cloud_themes.cpp
│ │ │ ├── data_cloud_themes.h
│ │ │ ├── data_credits.h
│ │ │ ├── data_credits_earn.h
│ │ │ ├── data_document.cpp
│ │ │ ├── data_document.h
│ │ │ ├── data_document_media.cpp
│ │ │ ├── data_document_media.h
│ │ │ ├── data_document_resolver.cpp
│ │ │ ├── data_document_resolver.h
│ │ │ ├── data_download_manager.cpp
│ │ │ ├── data_download_manager.h
│ │ │ ├── data_drafts.cpp
│ │ │ ├── data_drafts.h
│ │ │ ├── data_emoji_statuses.cpp
│ │ │ ├── data_emoji_statuses.h
│ │ │ ├── data_file_click_handler.cpp
│ │ │ ├── data_file_click_handler.h
│ │ │ ├── data_file_origin.cpp
│ │ │ ├── data_file_origin.h
│ │ │ ├── data_flags.h
│ │ │ ├── data_folder.cpp
│ │ │ ├── data_folder.h
│ │ │ ├── data_forum.cpp
│ │ │ ├── data_forum.h
│ │ │ ├── data_forum_icons.cpp
│ │ │ ├── data_forum_icons.h
│ │ │ ├── data_forum_topic.cpp
│ │ │ ├── data_forum_topic.h
│ │ │ ├── data_game.cpp
│ │ │ ├── data_game.h
│ │ │ ├── data_group_call.cpp
│ │ │ ├── data_group_call.h
│ │ │ ├── data_groups.cpp
│ │ │ ├── data_groups.h
│ │ │ ├── data_histories.cpp
│ │ │ ├── data_histories.h
│ │ │ ├── data_history_messages.cpp
│ │ │ ├── data_history_messages.h
│ │ │ ├── data_lastseen_status.h
│ │ │ ├── data_location.cpp
│ │ │ ├── data_location.h
│ │ │ ├── data_media_preload.cpp
│ │ │ ├── data_media_preload.h
│ │ │ ├── data_media_rotation.cpp
│ │ │ ├── data_media_rotation.h
│ │ │ ├── data_media_types.cpp
│ │ │ ├── data_media_types.h
│ │ │ ├── data_message_reaction_id.cpp
│ │ │ ├── data_message_reaction_id.h
│ │ │ ├── data_message_reactions.cpp
│ │ │ ├── data_message_reactions.h
│ │ │ ├── data_messages.cpp
│ │ │ ├── data_messages.h
│ │ │ ├── data_msg_id.h
│ │ │ ├── data_passkey_deserialize.cpp
│ │ │ ├── data_passkey_deserialize.h
│ │ │ ├── data_peer.cpp
│ │ │ ├── data_peer.h
│ │ │ ├── data_peer_bot_command.cpp
│ │ │ ├── data_peer_bot_command.h
│ │ │ ├── data_peer_bot_commands.cpp
│ │ │ ├── data_peer_bot_commands.h
│ │ │ ├── data_peer_colors.h
│ │ │ ├── data_peer_common.h
│ │ │ ├── data_peer_id.cpp
│ │ │ ├── data_peer_id.h
│ │ │ ├── data_peer_values.cpp
│ │ │ ├── data_peer_values.h
│ │ │ ├── data_photo.cpp
│ │ │ ├── data_photo.h
│ │ │ ├── data_photo_media.cpp
│ │ │ ├── data_photo_media.h
│ │ │ ├── data_poll.cpp
│ │ │ ├── data_poll.h
│ │ │ ├── data_poll_messages.cpp
│ │ │ ├── data_poll_messages.h
│ │ │ ├── data_premium_limits.cpp
│ │ │ ├── data_premium_limits.h
│ │ │ ├── data_premium_subscription_option.h
│ │ │ ├── data_pts_waiter.cpp
│ │ │ ├── data_pts_waiter.h
│ │ │ ├── data_replies_list.cpp
│ │ │ ├── data_replies_list.h
│ │ │ ├── data_reply_preview.cpp
│ │ │ ├── data_reply_preview.h
│ │ │ ├── data_report.h
│ │ │ ├── data_saved_messages.cpp
│ │ │ ├── data_saved_messages.h
│ │ │ ├── data_saved_music.cpp
│ │ │ ├── data_saved_music.h
│ │ │ ├── data_saved_sublist.cpp
│ │ │ ├── data_saved_sublist.h
│ │ │ ├── data_search_calendar.cpp
│ │ │ ├── data_search_calendar.h
│ │ │ ├── data_search_controller.cpp
│ │ │ ├── data_search_controller.h
│ │ │ ├── data_send_action.cpp
│ │ │ ├── data_send_action.h
│ │ │ ├── data_session.cpp
│ │ │ ├── data_session.h
│ │ │ ├── data_shared_media.cpp
│ │ │ ├── data_shared_media.h
│ │ │ ├── data_sparse_ids.cpp
│ │ │ ├── data_sparse_ids.h
│ │ │ ├── data_star_gift.cpp
│ │ │ ├── data_star_gift.h
│ │ │ ├── data_statistics.h
│ │ │ ├── data_statistics_chart.cpp
│ │ │ ├── data_statistics_chart.h
│ │ │ ├── data_stories.cpp
│ │ │ ├── data_stories.h
│ │ │ ├── data_stories_ids.cpp
│ │ │ ├── data_stories_ids.h
│ │ │ ├── data_story.cpp
│ │ │ ├── data_story.h
│ │ │ ├── data_streaming.cpp
│ │ │ ├── data_streaming.h
│ │ │ ├── data_subscriptions.h
│ │ │ ├── data_thread.cpp
│ │ │ ├── data_thread.h
│ │ │ ├── data_todo_list.cpp
│ │ │ ├── data_todo_list.h
│ │ │ ├── data_types.cpp
│ │ │ ├── data_types.h
│ │ │ ├── data_unread_value.cpp
│ │ │ ├── data_unread_value.h
│ │ │ ├── data_user.cpp
│ │ │ ├── data_user.h
│ │ │ ├── data_user_names.cpp
│ │ │ ├── data_user_names.h
│ │ │ ├── data_user_photos.cpp
│ │ │ ├── data_user_photos.h
│ │ │ ├── data_wall_paper.cpp
│ │ │ ├── data_wall_paper.h
│ │ │ ├── data_web_page.cpp
│ │ │ ├── data_web_page.h
│ │ │ ├── notify/
│ │ │ │ ├── data_notify_settings.cpp
│ │ │ │ ├── data_notify_settings.h
│ │ │ │ ├── data_peer_notify_settings.cpp
│ │ │ │ ├── data_peer_notify_settings.h
│ │ │ │ ├── data_peer_notify_volume.cpp
│ │ │ │ └── data_peer_notify_volume.h
│ │ │ ├── raw/
│ │ │ │ ├── raw_countries_bounds.cpp
│ │ │ │ └── raw_countries_bounds.h
│ │ │ └── stickers/
│ │ │ ├── data_custom_emoji.cpp
│ │ │ ├── data_custom_emoji.h
│ │ │ ├── data_stickers.cpp
│ │ │ ├── data_stickers.h
│ │ │ ├── data_stickers_set.cpp
│ │ │ └── data_stickers_set.h
│ │ ├── dialogs/
│ │ │ ├── dialogs.style
│ │ │ ├── dialogs_common.h
│ │ │ ├── dialogs_entry.cpp
│ │ │ ├── dialogs_entry.h
│ │ │ ├── dialogs_indexed_list.cpp
│ │ │ ├── dialogs_indexed_list.h
│ │ │ ├── dialogs_inner_widget.cpp
│ │ │ ├── dialogs_inner_widget.h
│ │ │ ├── dialogs_key.cpp
│ │ │ ├── dialogs_key.h
│ │ │ ├── dialogs_list.cpp
│ │ │ ├── dialogs_list.h
│ │ │ ├── dialogs_main_list.cpp
│ │ │ ├── dialogs_main_list.h
│ │ │ ├── dialogs_pinned_list.cpp
│ │ │ ├── dialogs_pinned_list.h
│ │ │ ├── dialogs_quick_action.cpp
│ │ │ ├── dialogs_quick_action.h
│ │ │ ├── dialogs_row.cpp
│ │ │ ├── dialogs_row.h
│ │ │ ├── dialogs_search_from_controllers.cpp
│ │ │ ├── dialogs_search_from_controllers.h
│ │ │ ├── dialogs_search_posts.cpp
│ │ │ ├── dialogs_search_posts.h
│ │ │ ├── dialogs_search_tags.cpp
│ │ │ ├── dialogs_search_tags.h
│ │ │ ├── dialogs_three_state_icon.h
│ │ │ ├── dialogs_top_bar_suggestion.cpp
│ │ │ ├── dialogs_top_bar_suggestion.h
│ │ │ ├── dialogs_widget.cpp
│ │ │ ├── dialogs_widget.h
│ │ │ └── ui/
│ │ │ ├── chat_search_empty.cpp
│ │ │ ├── chat_search_empty.h
│ │ │ ├── chat_search_in.cpp
│ │ │ ├── chat_search_in.h
│ │ │ ├── dialogs_layout.cpp
│ │ │ ├── dialogs_layout.h
│ │ │ ├── dialogs_message_view.cpp
│ │ │ ├── dialogs_message_view.h
│ │ │ ├── dialogs_quick_action.h
│ │ │ ├── dialogs_quick_action_context.h
│ │ │ ├── dialogs_stories_content.cpp
│ │ │ ├── dialogs_stories_content.h
│ │ │ ├── dialogs_stories_list.cpp
│ │ │ ├── dialogs_stories_list.h
│ │ │ ├── dialogs_suggestions.cpp
│ │ │ ├── dialogs_suggestions.h
│ │ │ ├── dialogs_top_bar_suggestion_content.cpp
│ │ │ ├── dialogs_top_bar_suggestion_content.h
│ │ │ ├── dialogs_topics_view.cpp
│ │ │ ├── dialogs_topics_view.h
│ │ │ ├── dialogs_video_userpic.cpp
│ │ │ ├── dialogs_video_userpic.h
│ │ │ ├── posts_search_intro.cpp
│ │ │ ├── posts_search_intro.h
│ │ │ ├── top_peers_strip.cpp
│ │ │ └── top_peers_strip.h
│ │ ├── editor/
│ │ │ ├── color_picker.cpp
│ │ │ ├── color_picker.h
│ │ │ ├── controllers/
│ │ │ │ ├── controllers.h
│ │ │ │ ├── stickers_panel_controller.cpp
│ │ │ │ ├── stickers_panel_controller.h
│ │ │ │ ├── undo_controller.cpp
│ │ │ │ └── undo_controller.h
│ │ │ ├── editor.style
│ │ │ ├── editor_crop.cpp
│ │ │ ├── editor_crop.h
│ │ │ ├── editor_layer_widget.cpp
│ │ │ ├── editor_layer_widget.h
│ │ │ ├── editor_paint.cpp
│ │ │ ├── editor_paint.h
│ │ │ ├── photo_editor.cpp
│ │ │ ├── photo_editor.h
│ │ │ ├── photo_editor_common.cpp
│ │ │ ├── photo_editor_common.h
│ │ │ ├── photo_editor_content.cpp
│ │ │ ├── photo_editor_content.h
│ │ │ ├── photo_editor_controls.cpp
│ │ │ ├── photo_editor_controls.h
│ │ │ ├── photo_editor_inner_common.h
│ │ │ ├── photo_editor_layer_widget.cpp
│ │ │ ├── photo_editor_layer_widget.h
│ │ │ └── scene/
│ │ │ ├── scene.cpp
│ │ │ ├── scene.h
│ │ │ ├── scene_item_base.cpp
│ │ │ ├── scene_item_base.h
│ │ │ ├── scene_item_canvas.cpp
│ │ │ ├── scene_item_canvas.h
│ │ │ ├── scene_item_image.cpp
│ │ │ ├── scene_item_image.h
│ │ │ ├── scene_item_line.cpp
│ │ │ ├── scene_item_line.h
│ │ │ ├── scene_item_sticker.cpp
│ │ │ └── scene_item_sticker.h
│ │ ├── export/
│ │ │ ├── data/
│ │ │ │ ├── export_data_types.cpp
│ │ │ │ └── export_data_types.h
│ │ │ ├── export_api_wrap.cpp
│ │ │ ├── export_api_wrap.h
│ │ │ ├── export_controller.cpp
│ │ │ ├── export_controller.h
│ │ │ ├── export_manager.cpp
│ │ │ ├── export_manager.h
│ │ │ ├── export_pch.h
│ │ │ ├── export_settings.cpp
│ │ │ ├── export_settings.h
│ │ │ ├── output/
│ │ │ │ ├── export_output_abstract.cpp
│ │ │ │ ├── export_output_abstract.h
│ │ │ │ ├── export_output_file.cpp
│ │ │ │ ├── export_output_file.h
│ │ │ │ ├── export_output_html.cpp
│ │ │ │ ├── export_output_html.h
│ │ │ │ ├── export_output_html_and_json.cpp
│ │ │ │ ├── export_output_html_and_json.h
│ │ │ │ ├── export_output_json.cpp
│ │ │ │ ├── export_output_json.h
│ │ │ │ ├── export_output_result.h
│ │ │ │ ├── export_output_stats.cpp
│ │ │ │ └── export_output_stats.h
│ │ │ └── view/
│ │ │ ├── export.style
│ │ │ ├── export_view_content.cpp
│ │ │ ├── export_view_content.h
│ │ │ ├── export_view_panel_controller.cpp
│ │ │ ├── export_view_panel_controller.h
│ │ │ ├── export_view_progress.cpp
│ │ │ ├── export_view_progress.h
│ │ │ ├── export_view_settings.cpp
│ │ │ ├── export_view_settings.h
│ │ │ ├── export_view_top_bar.cpp
│ │ │ └── export_view_top_bar.h
│ │ ├── ffmpeg/
│ │ │ ├── ffmpeg_bytes_io_wrap.h
│ │ │ ├── ffmpeg_frame_generator.cpp
│ │ │ ├── ffmpeg_frame_generator.h
│ │ │ ├── ffmpeg_utility.cpp
│ │ │ └── ffmpeg_utility.h
│ │ ├── forkgram/
│ │ │ ├── gpu_demo_renderer.cpp
│ │ │ ├── gpu_demo_renderer.h
│ │ │ ├── uri_menu.cpp
│ │ │ ├── uri_menu.h
│ │ │ ├── uri_open.cpp
│ │ │ └── uri_open.h
│ │ ├── history/
│ │ │ ├── admin_log/
│ │ │ │ ├── history_admin_log_filter.cpp
│ │ │ │ ├── history_admin_log_filter.h
│ │ │ │ ├── history_admin_log_filter_value.h
│ │ │ │ ├── history_admin_log_inner.cpp
│ │ │ │ ├── history_admin_log_inner.h
│ │ │ │ ├── history_admin_log_item.cpp
│ │ │ │ ├── history_admin_log_item.h
│ │ │ │ ├── history_admin_log_section.cpp
│ │ │ │ └── history_admin_log_section.h
│ │ │ ├── history.cpp
│ │ │ ├── history.h
│ │ │ ├── history_drag_area.cpp
│ │ │ ├── history_drag_area.h
│ │ │ ├── history_inner_widget.cpp
│ │ │ ├── history_inner_widget.h
│ │ │ ├── history_item.cpp
│ │ │ ├── history_item.h
│ │ │ ├── history_item_components.cpp
│ │ │ ├── history_item_components.h
│ │ │ ├── history_item_edition.cpp
│ │ │ ├── history_item_edition.h
│ │ │ ├── history_item_helpers.cpp
│ │ │ ├── history_item_helpers.h
│ │ │ ├── history_item_reply_markup.cpp
│ │ │ ├── history_item_reply_markup.h
│ │ │ ├── history_item_text.cpp
│ │ │ ├── history_item_text.h
│ │ │ ├── history_location_manager.cpp
│ │ │ ├── history_location_manager.h
│ │ │ ├── history_message.cpp
│ │ │ ├── history_streamed_drafts.cpp
│ │ │ ├── history_streamed_drafts.h
│ │ │ ├── history_translation.cpp
│ │ │ ├── history_translation.h
│ │ │ ├── history_unread_things.cpp
│ │ │ ├── history_unread_things.h
│ │ │ ├── history_view_highlight_manager.cpp
│ │ │ ├── history_view_highlight_manager.h
│ │ │ ├── history_view_swipe_back_session.cpp
│ │ │ ├── history_view_swipe_back_session.h
│ │ │ ├── history_view_top_toast.cpp
│ │ │ ├── history_view_top_toast.h
│ │ │ ├── history_widget.cpp
│ │ │ ├── history_widget.h
│ │ │ └── view/
│ │ │ ├── controls/
│ │ │ │ ├── compose_controls_common.h
│ │ │ │ ├── history_view_characters_limit.cpp
│ │ │ │ ├── history_view_characters_limit.h
│ │ │ │ ├── history_view_compose_ai_button.cpp
│ │ │ │ ├── history_view_compose_ai_button.h
│ │ │ │ ├── history_view_compose_ai_tooltip.cpp
│ │ │ │ ├── history_view_compose_ai_tooltip.h
│ │ │ │ ├── history_view_compose_controls.cpp
│ │ │ │ ├── history_view_compose_controls.h
│ │ │ │ ├── history_view_compose_media_edit_manager.cpp
│ │ │ │ ├── history_view_compose_media_edit_manager.h
│ │ │ │ ├── history_view_compose_search.cpp
│ │ │ │ ├── history_view_compose_search.h
│ │ │ │ ├── history_view_draft_options.cpp
│ │ │ │ ├── history_view_draft_options.h
│ │ │ │ ├── history_view_forward_panel.cpp
│ │ │ │ ├── history_view_forward_panel.h
│ │ │ │ ├── history_view_suggest_options.cpp
│ │ │ │ ├── history_view_suggest_options.h
│ │ │ │ ├── history_view_ttl_button.cpp
│ │ │ │ ├── history_view_ttl_button.h
│ │ │ │ ├── history_view_voice_record_bar.cpp
│ │ │ │ ├── history_view_voice_record_bar.h
│ │ │ │ ├── history_view_voice_record_button.cpp
│ │ │ │ ├── history_view_voice_record_button.h
│ │ │ │ ├── history_view_webpage_processor.cpp
│ │ │ │ └── history_view_webpage_processor.h
│ │ │ ├── history_view_about_view.cpp
│ │ │ ├── history_view_about_view.h
│ │ │ ├── history_view_add_poll_option.cpp
│ │ │ ├── history_view_add_poll_option.h
│ │ │ ├── history_view_bottom_info.cpp
│ │ │ ├── history_view_bottom_info.h
│ │ │ ├── history_view_chat_preview.cpp
│ │ │ ├── history_view_chat_preview.h
│ │ │ ├── history_view_chat_section.cpp
│ │ │ ├── history_view_chat_section.h
│ │ │ ├── history_view_contact_status.cpp
│ │ │ ├── history_view_contact_status.h
│ │ │ ├── history_view_context_menu.cpp
│ │ │ ├── history_view_context_menu.h
│ │ │ ├── history_view_context_menu_fork.cpp
│ │ │ ├── history_view_context_menu_fork.h
│ │ │ ├── history_view_corner_buttons.cpp
│ │ │ ├── history_view_corner_buttons.h
│ │ │ ├── history_view_cursor_state.cpp
│ │ │ ├── history_view_cursor_state.h
│ │ │ ├── history_view_draw_to_reply.cpp
│ │ │ ├── history_view_draw_to_reply.h
│ │ │ ├── history_view_element.cpp
│ │ │ ├── history_view_element.h
│ │ │ ├── history_view_element_overlay.cpp
│ │ │ ├── history_view_element_overlay.h
│ │ │ ├── history_view_emoji_interactions.cpp
│ │ │ ├── history_view_emoji_interactions.h
│ │ │ ├── history_view_empty_list_bubble.cpp
│ │ │ ├── history_view_empty_list_bubble.h
│ │ │ ├── history_view_fake_items.cpp
│ │ │ ├── history_view_fake_items.h
│ │ │ ├── history_view_group_call_bar.cpp
│ │ │ ├── history_view_group_call_bar.h
│ │ │ ├── history_view_group_members_widget.cpp
│ │ │ ├── history_view_group_members_widget.h
│ │ │ ├── history_view_item_preview.h
│ │ │ ├── history_view_list_widget.cpp
│ │ │ ├── history_view_list_widget.h
│ │ │ ├── history_view_message.cpp
│ │ │ ├── history_view_message.h
│ │ │ ├── history_view_object.h
│ │ │ ├── history_view_paid_reaction_toast.cpp
│ │ │ ├── history_view_paid_reaction_toast.h
│ │ │ ├── history_view_pinned_bar.cpp
│ │ │ ├── history_view_pinned_bar.h
│ │ │ ├── history_view_pinned_section.cpp
│ │ │ ├── history_view_pinned_section.h
│ │ │ ├── history_view_pinned_tracker.cpp
│ │ │ ├── history_view_pinned_tracker.h
│ │ │ ├── history_view_quick_action.cpp
│ │ │ ├── history_view_quick_action.h
│ │ │ ├── history_view_reaction_preview.cpp
│ │ │ ├── history_view_reaction_preview.h
│ │ │ ├── history_view_read_metrics_tracker.cpp
│ │ │ ├── history_view_read_metrics_tracker.h
│ │ │ ├── history_view_reply.cpp
│ │ │ ├── history_view_reply.h
│ │ │ ├── history_view_reply_button.cpp
│ │ │ ├── history_view_reply_button.h
│ │ │ ├── history_view_requests_bar.cpp
│ │ │ ├── history_view_requests_bar.h
│ │ │ ├── history_view_schedule_box.cpp
│ │ │ ├── history_view_schedule_box.h
│ │ │ ├── history_view_scheduled_section.cpp
│ │ │ ├── history_view_scheduled_section.h
│ │ │ ├── history_view_self_forwards_tagger.cpp
│ │ │ ├── history_view_self_forwards_tagger.h
│ │ │ ├── history_view_send_action.cpp
│ │ │ ├── history_view_send_action.h
│ │ │ ├── history_view_service_message.cpp
│ │ │ ├── history_view_service_message.h
│ │ │ ├── history_view_sponsored_click_handler.cpp
│ │ │ ├── history_view_sponsored_click_handler.h
│ │ │ ├── history_view_sticker_toast.cpp
│ │ │ ├── history_view_sticker_toast.h
│ │ │ ├── history_view_subsection_tabs.cpp
│ │ │ ├── history_view_subsection_tabs.h
│ │ │ ├── history_view_summary_header.cpp
│ │ │ ├── history_view_summary_header.h
│ │ │ ├── history_view_text_helper.cpp
│ │ │ ├── history_view_text_helper.h
│ │ │ ├── history_view_top_bar_widget.cpp
│ │ │ ├── history_view_top_bar_widget.h
│ │ │ ├── history_view_top_peers_selector.cpp
│ │ │ ├── history_view_top_peers_selector.h
│ │ │ ├── history_view_transcribe_button.cpp
│ │ │ ├── history_view_transcribe_button.h
│ │ │ ├── history_view_translate_bar.cpp
│ │ │ ├── history_view_translate_bar.h
│ │ │ ├── history_view_translate_tracker.cpp
│ │ │ ├── history_view_translate_tracker.h
│ │ │ ├── history_view_view_button.cpp
│ │ │ ├── history_view_view_button.h
│ │ │ ├── history_view_webpage_preview.cpp
│ │ │ ├── history_view_webpage_preview.h
│ │ │ ├── media/
│ │ │ │ ├── history_view_birthday_suggestion.cpp
│ │ │ │ ├── history_view_birthday_suggestion.h
│ │ │ │ ├── history_view_call.cpp
│ │ │ │ ├── history_view_call.h
│ │ │ │ ├── history_view_contact.cpp
│ │ │ │ ├── history_view_contact.h
│ │ │ │ ├── history_view_custom_emoji.cpp
│ │ │ │ ├── history_view_custom_emoji.h
│ │ │ │ ├── history_view_dice.cpp
│ │ │ │ ├── history_view_dice.h
│ │ │ │ ├── history_view_document.cpp
│ │ │ │ ├── history_view_document.h
│ │ │ │ ├── history_view_file.cpp
│ │ │ │ ├── history_view_file.h
│ │ │ │ ├── history_view_game.cpp
│ │ │ │ ├── history_view_game.h
│ │ │ │ ├── history_view_gif.cpp
│ │ │ │ ├── history_view_gif.h
│ │ │ │ ├── history_view_giveaway.cpp
│ │ │ │ ├── history_view_giveaway.h
│ │ │ │ ├── history_view_invoice.cpp
│ │ │ │ ├── history_view_invoice.h
│ │ │ │ ├── history_view_large_emoji.cpp
│ │ │ │ ├── history_view_large_emoji.h
│ │ │ │ ├── history_view_location.cpp
│ │ │ │ ├── history_view_location.h
│ │ │ │ ├── history_view_media.cpp
│ │ │ │ ├── history_view_media.h
│ │ │ │ ├── history_view_media_common.cpp
│ │ │ │ ├── history_view_media_common.h
│ │ │ │ ├── history_view_media_generic.cpp
│ │ │ │ ├── history_view_media_generic.h
│ │ │ │ ├── history_view_media_grouped.cpp
│ │ │ │ ├── history_view_media_grouped.h
│ │ │ │ ├── history_view_media_spoiler.cpp
│ │ │ │ ├── history_view_media_spoiler.h
│ │ │ │ ├── history_view_media_unwrapped.cpp
│ │ │ │ ├── history_view_media_unwrapped.h
│ │ │ │ ├── history_view_no_forwards_request.cpp
│ │ │ │ ├── history_view_no_forwards_request.h
│ │ │ │ ├── history_view_photo.cpp
│ │ │ │ ├── history_view_photo.h
│ │ │ │ ├── history_view_poll.cpp
│ │ │ │ ├── history_view_poll.h
│ │ │ │ ├── history_view_premium_gift.cpp
│ │ │ │ ├── history_view_premium_gift.h
│ │ │ │ ├── history_view_save_document_action.cpp
│ │ │ │ ├── history_view_save_document_action.h
│ │ │ │ ├── history_view_service_box.cpp
│ │ │ │ ├── history_view_service_box.h
│ │ │ │ ├── history_view_similar_channels.cpp
│ │ │ │ ├── history_view_similar_channels.h
│ │ │ │ ├── history_view_slot_machine.cpp
│ │ │ │ ├── history_view_slot_machine.h
│ │ │ │ ├── history_view_sticker.cpp
│ │ │ │ ├── history_view_sticker.h
│ │ │ │ ├── history_view_sticker_player.cpp
│ │ │ │ ├── history_view_sticker_player.h
│ │ │ │ ├── history_view_sticker_player_abstract.h
│ │ │ │ ├── history_view_story_mention.cpp
│ │ │ │ ├── history_view_story_mention.h
│ │ │ │ ├── history_view_suggest_decision.cpp
│ │ │ │ ├── history_view_suggest_decision.h
│ │ │ │ ├── history_view_theme_document.cpp
│ │ │ │ ├── history_view_theme_document.h
│ │ │ │ ├── history_view_todo_list.cpp
│ │ │ │ ├── history_view_todo_list.h
│ │ │ │ ├── history_view_unique_gift.cpp
│ │ │ │ ├── history_view_unique_gift.h
│ │ │ │ ├── history_view_userpic_suggestion.cpp
│ │ │ │ ├── history_view_userpic_suggestion.h
│ │ │ │ ├── history_view_web_page.cpp
│ │ │ │ ├── history_view_web_page.h
│ │ │ │ └── menu/
│ │ │ │ ├── history_view_poll_menu.cpp
│ │ │ │ └── history_view_poll_menu.h
│ │ │ └── reactions/
│ │ │ ├── history_view_reactions.cpp
│ │ │ ├── history_view_reactions.h
│ │ │ ├── history_view_reactions_button.cpp
│ │ │ ├── history_view_reactions_button.h
│ │ │ ├── history_view_reactions_list.cpp
│ │ │ ├── history_view_reactions_list.h
│ │ │ ├── history_view_reactions_selector.cpp
│ │ │ ├── history_view_reactions_selector.h
│ │ │ ├── history_view_reactions_strip.cpp
│ │ │ ├── history_view_reactions_strip.h
│ │ │ ├── history_view_reactions_tabs.cpp
│ │ │ └── history_view_reactions_tabs.h
│ │ ├── info/
│ │ │ ├── bot/
│ │ │ │ ├── earn/
│ │ │ │ │ ├── info_bot_earn_list.cpp
│ │ │ │ │ ├── info_bot_earn_list.h
│ │ │ │ │ ├── info_bot_earn_widget.cpp
│ │ │ │ │ └── info_bot_earn_widget.h
│ │ │ │ └── starref/
│ │ │ │ ├── info_bot_starref_common.cpp
│ │ │ │ ├── info_bot_starref_common.h
│ │ │ │ ├── info_bot_starref_join_widget.cpp
│ │ │ │ ├── info_bot_starref_join_widget.h
│ │ │ │ ├── info_bot_starref_setup_widget.cpp
│ │ │ │ └── info_bot_starref_setup_widget.h
│ │ │ ├── channel_statistics/
│ │ │ │ ├── boosts/
│ │ │ │ │ ├── create_giveaway_box.cpp
│ │ │ │ │ ├── create_giveaway_box.h
│ │ │ │ │ ├── giveaway/
│ │ │ │ │ │ ├── boost_badge.cpp
│ │ │ │ │ │ ├── boost_badge.h
│ │ │ │ │ │ ├── giveaway.style
│ │ │ │ │ │ ├── giveaway_list_controllers.cpp
│ │ │ │ │ │ ├── giveaway_list_controllers.h
│ │ │ │ │ │ ├── giveaway_type_row.cpp
│ │ │ │ │ │ ├── giveaway_type_row.h
│ │ │ │ │ │ ├── select_countries_box.cpp
│ │ │ │ │ │ └── select_countries_box.h
│ │ │ │ │ ├── info_boosts_inner_widget.cpp
│ │ │ │ │ ├── info_boosts_inner_widget.h
│ │ │ │ │ ├── info_boosts_widget.cpp
│ │ │ │ │ └── info_boosts_widget.h
│ │ │ │ └── earn/
│ │ │ │ ├── channel_earn.style
│ │ │ │ ├── earn_format.cpp
│ │ │ │ ├── earn_format.h
│ │ │ │ ├── earn_icons.cpp
│ │ │ │ ├── earn_icons.h
│ │ │ │ ├── info_channel_earn_list.cpp
│ │ │ │ ├── info_channel_earn_list.h
│ │ │ │ ├── info_channel_earn_widget.cpp
│ │ │ │ └── info_channel_earn_widget.h
│ │ │ ├── common_groups/
│ │ │ │ ├── info_common_groups_inner_widget.cpp
│ │ │ │ ├── info_common_groups_inner_widget.h
│ │ │ │ ├── info_common_groups_widget.cpp
│ │ │ │ └── info_common_groups_widget.h
│ │ │ ├── downloads/
│ │ │ │ ├── info_downloads_inner_widget.cpp
│ │ │ │ ├── info_downloads_inner_widget.h
│ │ │ │ ├── info_downloads_provider.cpp
│ │ │ │ ├── info_downloads_provider.h
│ │ │ │ ├── info_downloads_widget.cpp
│ │ │ │ └── info_downloads_widget.h
│ │ │ ├── global_media/
│ │ │ │ ├── info_global_media_inner_widget.cpp
│ │ │ │ ├── info_global_media_inner_widget.h
│ │ │ │ ├── info_global_media_provider.cpp
│ │ │ │ ├── info_global_media_provider.h
│ │ │ │ ├── info_global_media_widget.cpp
│ │ │ │ └── info_global_media_widget.h
│ │ │ ├── info.style
│ │ │ ├── info_content_widget.cpp
│ │ │ ├── info_content_widget.h
│ │ │ ├── info_controller.cpp
│ │ │ ├── info_controller.h
│ │ │ ├── info_flexible_scroll.cpp
│ │ │ ├── info_flexible_scroll.h
│ │ │ ├── info_layer_widget.cpp
│ │ │ ├── info_layer_widget.h
│ │ │ ├── info_memento.cpp
│ │ │ ├── info_memento.h
│ │ │ ├── info_section_widget.cpp
│ │ │ ├── info_section_widget.h
│ │ │ ├── info_top_bar.cpp
│ │ │ ├── info_top_bar.h
│ │ │ ├── info_wrap_widget.cpp
│ │ │ ├── info_wrap_widget.h
│ │ │ ├── media/
│ │ │ │ ├── info_media_buttons.cpp
│ │ │ │ ├── info_media_buttons.h
│ │ │ │ ├── info_media_common.cpp
│ │ │ │ ├── info_media_common.h
│ │ │ │ ├── info_media_empty_widget.cpp
│ │ │ │ ├── info_media_empty_widget.h
│ │ │ │ ├── info_media_inner_widget.cpp
│ │ │ │ ├── info_media_inner_widget.h
│ │ │ │ ├── info_media_list_section.cpp
│ │ │ │ ├── info_media_list_section.h
│ │ │ │ ├── info_media_list_widget.cpp
│ │ │ │ ├── info_media_list_widget.h
│ │ │ │ ├── info_media_provider.cpp
│ │ │ │ ├── info_media_provider.h
│ │ │ │ ├── info_media_widget.cpp
│ │ │ │ └── info_media_widget.h
│ │ │ ├── members/
│ │ │ │ ├── info_members_widget.cpp
│ │ │ │ └── info_members_widget.h
│ │ │ ├── peer_gifts/
│ │ │ │ ├── info_peer_gifts_collections.cpp
│ │ │ │ ├── info_peer_gifts_collections.h
│ │ │ │ ├── info_peer_gifts_common.cpp
│ │ │ │ ├── info_peer_gifts_common.h
│ │ │ │ ├── info_peer_gifts_widget.cpp
│ │ │ │ └── info_peer_gifts_widget.h
│ │ │ ├── polls/
│ │ │ │ ├── info_polls_list_widget.cpp
│ │ │ │ ├── info_polls_list_widget.h
│ │ │ │ ├── info_polls_results_inner_widget.cpp
│ │ │ │ ├── info_polls_results_inner_widget.h
│ │ │ │ ├── info_polls_results_widget.cpp
│ │ │ │ └── info_polls_results_widget.h
│ │ │ ├── profile/
│ │ │ │ ├── info_levels.style
│ │ │ │ ├── info_profile_actions.cpp
│ │ │ │ ├── info_profile_actions.h
│ │ │ │ ├── info_profile_badge.cpp
│ │ │ │ ├── info_profile_badge.h
│ │ │ │ ├── info_profile_badge_tooltip.cpp
│ │ │ │ ├── info_profile_badge_tooltip.h
│ │ │ │ ├── info_profile_cover.cpp
│ │ │ │ ├── info_profile_cover.h
│ │ │ │ ├── info_profile_emoji_status_panel.cpp
│ │ │ │ ├── info_profile_emoji_status_panel.h
│ │ │ │ ├── info_profile_icon.cpp
│ │ │ │ ├── info_profile_icon.h
│ │ │ │ ├── info_profile_inner_widget.cpp
│ │ │ │ ├── info_profile_inner_widget.h
│ │ │ │ ├── info_profile_members.cpp
│ │ │ │ ├── info_profile_members.h
│ │ │ │ ├── info_profile_members_controllers.cpp
│ │ │ │ ├── info_profile_members_controllers.h
│ │ │ │ ├── info_profile_music_button.cpp
│ │ │ │ ├── info_profile_music_button.h
│ │ │ │ ├── info_profile_phone_menu.cpp
│ │ │ │ ├── info_profile_phone_menu.h
│ │ │ │ ├── info_profile_status_label.cpp
│ │ │ │ ├── info_profile_status_label.h
│ │ │ │ ├── info_profile_text.cpp
│ │ │ │ ├── info_profile_text.h
│ │ │ │ ├── info_profile_top_bar.cpp
│ │ │ │ ├── info_profile_top_bar.h
│ │ │ │ ├── info_profile_top_bar_action_button.cpp
│ │ │ │ ├── info_profile_top_bar_action_button.h
│ │ │ │ ├── info_profile_values.cpp
│ │ │ │ ├── info_profile_values.h
│ │ │ │ ├── info_profile_widget.cpp
│ │ │ │ └── info_profile_widget.h
│ │ │ ├── reactions_list/
│ │ │ │ ├── info_reactions_list_widget.cpp
│ │ │ │ └── info_reactions_list_widget.h
│ │ │ ├── requests_list/
│ │ │ │ ├── info_requests_list_widget.cpp
│ │ │ │ └── info_requests_list_widget.h
│ │ │ ├── saved/
│ │ │ │ ├── info_saved_music_common.cpp
│ │ │ │ ├── info_saved_music_common.h
│ │ │ │ ├── info_saved_music_provider.cpp
│ │ │ │ ├── info_saved_music_provider.h
│ │ │ │ ├── info_saved_music_widget.cpp
│ │ │ │ ├── info_saved_music_widget.h
│ │ │ │ ├── info_saved_sublists_widget.cpp
│ │ │ │ └── info_saved_sublists_widget.h
│ │ │ ├── settings/
│ │ │ │ ├── info_settings_widget.cpp
│ │ │ │ └── info_settings_widget.h
│ │ │ ├── similar_peers/
│ │ │ │ ├── info_similar_peers_widget.cpp
│ │ │ │ └── info_similar_peers_widget.h
│ │ │ ├── statistics/
│ │ │ │ ├── info_statistics_common.h
│ │ │ │ ├── info_statistics_inner_widget.cpp
│ │ │ │ ├── info_statistics_inner_widget.h
│ │ │ │ ├── info_statistics_list_controllers.cpp
│ │ │ │ ├── info_statistics_list_controllers.h
│ │ │ │ ├── info_statistics_recent_message.cpp
│ │ │ │ ├── info_statistics_recent_message.h
│ │ │ │ ├── info_statistics_tag.h
│ │ │ │ ├── info_statistics_widget.cpp
│ │ │ │ └── info_statistics_widget.h
│ │ │ ├── stories/
│ │ │ │ ├── info_stories_albums.cpp
│ │ │ │ ├── info_stories_albums.h
│ │ │ │ ├── info_stories_common.h
│ │ │ │ ├── info_stories_inner_widget.cpp
│ │ │ │ ├── info_stories_inner_widget.h
│ │ │ │ ├── info_stories_provider.cpp
│ │ │ │ ├── info_stories_provider.h
│ │ │ │ ├── info_stories_widget.cpp
│ │ │ │ └── info_stories_widget.h
│ │ │ └── userpic/
│ │ │ ├── info_userpic_bubble_wrap.cpp
│ │ │ ├── info_userpic_bubble_wrap.h
│ │ │ ├── info_userpic_builder.style
│ │ │ ├── info_userpic_color_circle_button.cpp
│ │ │ ├── info_userpic_color_circle_button.h
│ │ │ ├── info_userpic_colors_editor.cpp
│ │ │ ├── info_userpic_colors_editor.h
│ │ │ ├── info_userpic_emoji_builder.cpp
│ │ │ ├── info_userpic_emoji_builder.h
│ │ │ ├── info_userpic_emoji_builder_common.cpp
│ │ │ ├── info_userpic_emoji_builder_common.h
│ │ │ ├── info_userpic_emoji_builder_layer.cpp
│ │ │ ├── info_userpic_emoji_builder_layer.h
│ │ │ ├── info_userpic_emoji_builder_menu_item.cpp
│ │ │ ├── info_userpic_emoji_builder_menu_item.h
│ │ │ ├── info_userpic_emoji_builder_preview.cpp
│ │ │ ├── info_userpic_emoji_builder_preview.h
│ │ │ ├── info_userpic_emoji_builder_widget.cpp
│ │ │ └── info_userpic_emoji_builder_widget.h
│ │ ├── inline_bots/
│ │ │ ├── bot_attach_web_view.cpp
│ │ │ ├── bot_attach_web_view.h
│ │ │ ├── inline_bot_confirm_prepared.cpp
│ │ │ ├── inline_bot_confirm_prepared.h
│ │ │ ├── inline_bot_downloads.cpp
│ │ │ ├── inline_bot_downloads.h
│ │ │ ├── inline_bot_layout_internal.cpp
│ │ │ ├── inline_bot_layout_internal.h
│ │ │ ├── inline_bot_layout_item.cpp
│ │ │ ├── inline_bot_layout_item.h
│ │ │ ├── inline_bot_result.cpp
│ │ │ ├── inline_bot_result.h
│ │ │ ├── inline_bot_send_data.cpp
│ │ │ ├── inline_bot_send_data.h
│ │ │ ├── inline_bot_storage.cpp
│ │ │ ├── inline_bot_storage.h
│ │ │ ├── inline_results_inner.cpp
│ │ │ ├── inline_results_inner.h
│ │ │ ├── inline_results_widget.cpp
│ │ │ └── inline_results_widget.h
│ │ ├── intro/
│ │ │ ├── intro.style
│ │ │ ├── intro_code.cpp
│ │ │ ├── intro_code.h
│ │ │ ├── intro_code_input.cpp
│ │ │ ├── intro_code_input.h
│ │ │ ├── intro_email.cpp
│ │ │ ├── intro_email.h
│ │ │ ├── intro_password_check.cpp
│ │ │ ├── intro_password_check.h
│ │ │ ├── intro_phone.cpp
│ │ │ ├── intro_phone.h
│ │ │ ├── intro_qr.cpp
│ │ │ ├── intro_qr.h
│ │ │ ├── intro_signup.cpp
│ │ │ ├── intro_signup.h
│ │ │ ├── intro_start.cpp
│ │ │ ├── intro_start.h
│ │ │ ├── intro_step.cpp
│ │ │ ├── intro_step.h
│ │ │ ├── intro_widget.cpp
│ │ │ └── intro_widget.h
│ │ ├── iv/
│ │ │ ├── iv.style
│ │ │ ├── iv_controller.cpp
│ │ │ ├── iv_controller.h
│ │ │ ├── iv_data.cpp
│ │ │ ├── iv_data.h
│ │ │ ├── iv_delegate.h
│ │ │ ├── iv_delegate_impl.cpp
│ │ │ ├── iv_delegate_impl.h
│ │ │ ├── iv_instance.cpp
│ │ │ ├── iv_instance.h
│ │ │ ├── iv_pch.h
│ │ │ ├── iv_prepare.cpp
│ │ │ └── iv_prepare.h
│ │ ├── lang/
│ │ │ ├── lang_cloud_manager.cpp
│ │ │ ├── lang_cloud_manager.h
│ │ │ ├── lang_file_parser.cpp
│ │ │ ├── lang_file_parser.h
│ │ │ ├── lang_hardcoded.h
│ │ │ ├── lang_instance.cpp
│ │ │ ├── lang_instance.h
│ │ │ ├── lang_keys.cpp
│ │ │ ├── lang_keys.h
│ │ │ ├── lang_numbers_animation.cpp
│ │ │ ├── lang_numbers_animation.h
│ │ │ ├── lang_pch.h
│ │ │ ├── lang_tag.cpp
│ │ │ ├── lang_tag.h
│ │ │ ├── lang_text_entity.cpp
│ │ │ ├── lang_text_entity.h
│ │ │ ├── lang_translator.cpp
│ │ │ ├── lang_translator.h
│ │ │ ├── lang_values.h
│ │ │ ├── translate_mtproto_provider.cpp
│ │ │ ├── translate_mtproto_provider.h
│ │ │ ├── translate_provider.cpp
│ │ │ ├── translate_provider.h
│ │ │ ├── translate_url_provider.cpp
│ │ │ └── translate_url_provider.h
│ │ ├── languages.h
│ │ ├── layout/
│ │ │ ├── abstract_layout_item.cpp
│ │ │ ├── abstract_layout_item.h
│ │ │ ├── layout_document_generic_preview.cpp
│ │ │ ├── layout_document_generic_preview.h
│ │ │ ├── layout_item_base.cpp
│ │ │ ├── layout_item_base.h
│ │ │ ├── layout_mosaic.cpp
│ │ │ ├── layout_mosaic.h
│ │ │ ├── layout_position.cpp
│ │ │ ├── layout_position.h
│ │ │ ├── layout_selection.cpp
│ │ │ └── layout_selection.h
│ │ ├── logs.cpp
│ │ ├── logs.h
│ │ ├── main/
│ │ │ ├── main_account.cpp
│ │ │ ├── main_account.h
│ │ │ ├── main_app_config.cpp
│ │ │ ├── main_app_config.h
│ │ │ ├── main_app_config_values.cpp
│ │ │ ├── main_app_config_values.h
│ │ │ ├── main_domain.cpp
│ │ │ ├── main_domain.h
│ │ │ ├── main_session.cpp
│ │ │ ├── main_session.h
│ │ │ ├── main_session_settings.cpp
│ │ │ ├── main_session_settings.h
│ │ │ └── session/
│ │ │ ├── send_as_peers.cpp
│ │ │ ├── send_as_peers.h
│ │ │ ├── session_show.cpp
│ │ │ └── session_show.h
│ │ ├── main.cpp
│ │ ├── mainwidget.cpp
│ │ ├── mainwidget.h
│ │ ├── mainwindow.cpp
│ │ ├── mainwindow.h
│ │ ├── media/
│ │ │ ├── audio/
│ │ │ │ ├── media_audio.cpp
│ │ │ │ ├── media_audio.h
│ │ │ │ ├── media_audio_capture.cpp
│ │ │ │ ├── media_audio_capture.h
│ │ │ │ ├── media_audio_capture_common.h
│ │ │ │ ├── media_audio_edit.cpp
│ │ │ │ ├── media_audio_edit.h
│ │ │ │ ├── media_audio_ffmpeg_loader.cpp
│ │ │ │ ├── media_audio_ffmpeg_loader.h
│ │ │ │ ├── media_audio_loader.cpp
│ │ │ │ ├── media_audio_loader.h
│ │ │ │ ├── media_audio_loaders.cpp
│ │ │ │ ├── media_audio_loaders.h
│ │ │ │ ├── media_audio_local_cache.cpp
│ │ │ │ ├── media_audio_local_cache.h
│ │ │ │ ├── media_audio_track.cpp
│ │ │ │ ├── media_audio_track.h
│ │ │ │ ├── media_child_ffmpeg_loader.cpp
│ │ │ │ └── media_child_ffmpeg_loader.h
│ │ │ ├── clip/
│ │ │ │ ├── media_clip_check_streaming.cpp
│ │ │ │ ├── media_clip_check_streaming.h
│ │ │ │ ├── media_clip_ffmpeg.cpp
│ │ │ │ ├── media_clip_ffmpeg.h
│ │ │ │ ├── media_clip_implementation.cpp
│ │ │ │ ├── media_clip_implementation.h
│ │ │ │ ├── media_clip_reader.cpp
│ │ │ │ └── media_clip_reader.h
│ │ │ ├── media_common.h
│ │ │ ├── player/
│ │ │ │ ├── media_player.style
│ │ │ │ ├── media_player_button.cpp
│ │ │ │ ├── media_player_button.h
│ │ │ │ ├── media_player_dropdown.cpp
│ │ │ │ ├── media_player_dropdown.h
│ │ │ │ ├── media_player_float.cpp
│ │ │ │ ├── media_player_float.h
│ │ │ │ ├── media_player_instance.cpp
│ │ │ │ ├── media_player_instance.h
│ │ │ │ ├── media_player_listen_tracker.cpp
│ │ │ │ ├── media_player_listen_tracker.h
│ │ │ │ ├── media_player_panel.cpp
│ │ │ │ ├── media_player_panel.h
│ │ │ │ ├── media_player_volume_controller.cpp
│ │ │ │ ├── media_player_volume_controller.h
│ │ │ │ ├── media_player_widget.cpp
│ │ │ │ └── media_player_widget.h
│ │ │ ├── stories/
│ │ │ │ ├── media_stories.style
│ │ │ │ ├── media_stories_caption_full_view.cpp
│ │ │ │ ├── media_stories_caption_full_view.h
│ │ │ │ ├── media_stories_controller.cpp
│ │ │ │ ├── media_stories_controller.h
│ │ │ │ ├── media_stories_delegate.cpp
│ │ │ │ ├── media_stories_delegate.h
│ │ │ │ ├── media_stories_header.cpp
│ │ │ │ ├── media_stories_header.h
│ │ │ │ ├── media_stories_reactions.cpp
│ │ │ │ ├── media_stories_reactions.h
│ │ │ │ ├── media_stories_recent_views.cpp
│ │ │ │ ├── media_stories_recent_views.h
│ │ │ │ ├── media_stories_reply.cpp
│ │ │ │ ├── media_stories_reply.h
│ │ │ │ ├── media_stories_repost_view.cpp
│ │ │ │ ├── media_stories_repost_view.h
│ │ │ │ ├── media_stories_share.cpp
│ │ │ │ ├── media_stories_share.h
│ │ │ │ ├── media_stories_sibling.cpp
│ │ │ │ ├── media_stories_sibling.h
│ │ │ │ ├── media_stories_slider.cpp
│ │ │ │ ├── media_stories_slider.h
│ │ │ │ ├── media_stories_stealth.cpp
│ │ │ │ ├── media_stories_stealth.h
│ │ │ │ ├── media_stories_view.cpp
│ │ │ │ └── media_stories_view.h
│ │ │ ├── streaming/
│ │ │ │ ├── media_streaming_audio_track.cpp
│ │ │ │ ├── media_streaming_audio_track.h
│ │ │ │ ├── media_streaming_common.h
│ │ │ │ ├── media_streaming_document.cpp
│ │ │ │ ├── media_streaming_document.h
│ │ │ │ ├── media_streaming_file.cpp
│ │ │ │ ├── media_streaming_file.h
│ │ │ │ ├── media_streaming_file_delegate.h
│ │ │ │ ├── media_streaming_instance.cpp
│ │ │ │ ├── media_streaming_instance.h
│ │ │ │ ├── media_streaming_loader.cpp
│ │ │ │ ├── media_streaming_loader.h
│ │ │ │ ├── media_streaming_loader_local.cpp
│ │ │ │ ├── media_streaming_loader_local.h
│ │ │ │ ├── media_streaming_loader_mtproto.cpp
│ │ │ │ ├── media_streaming_loader_mtproto.h
│ │ │ │ ├── media_streaming_player.cpp
│ │ │ │ ├── media_streaming_player.h
│ │ │ │ ├── media_streaming_reader.cpp
│ │ │ │ ├── media_streaming_reader.h
│ │ │ │ ├── media_streaming_round_preview.cpp
│ │ │ │ ├── media_streaming_round_preview.h
│ │ │ │ ├── media_streaming_utility.cpp
│ │ │ │ ├── media_streaming_utility.h
│ │ │ │ ├── media_streaming_video_track.cpp
│ │ │ │ └── media_streaming_video_track.h
│ │ │ ├── system_media_controls_manager.cpp
│ │ │ ├── system_media_controls_manager.h
│ │ │ └── view/
│ │ │ ├── media_view.style
│ │ │ ├── media_view_group_thumbs.cpp
│ │ │ ├── media_view_group_thumbs.h
│ │ │ ├── media_view_metal_texture.h
│ │ │ ├── media_view_metal_texture.mm
│ │ │ ├── media_view_open_common.cpp
│ │ │ ├── media_view_open_common.h
│ │ │ ├── media_view_overlay_opengl.cpp
│ │ │ ├── media_view_overlay_opengl.h
│ │ │ ├── media_view_overlay_raster.cpp
│ │ │ ├── media_view_overlay_raster.h
│ │ │ ├── media_view_overlay_renderer.h
│ │ │ ├── media_view_overlay_rhi.cpp
│ │ │ ├── media_view_overlay_rhi.h
│ │ │ ├── media_view_overlay_widget.cpp
│ │ │ ├── media_view_overlay_widget.h
│ │ │ ├── media_view_pip.cpp
│ │ │ ├── media_view_pip.h
│ │ │ ├── media_view_pip_opengl.cpp
│ │ │ ├── media_view_pip_opengl.h
│ │ │ ├── media_view_pip_raster.cpp
│ │ │ ├── media_view_pip_raster.h
│ │ │ ├── media_view_pip_renderer.h
│ │ │ ├── media_view_pip_rhi.cpp
│ │ │ ├── media_view_pip_rhi.h
│ │ │ ├── media_view_playback_controls.cpp
│ │ │ ├── media_view_playback_controls.h
│ │ │ ├── media_view_playback_progress.cpp
│ │ │ ├── media_view_playback_progress.h
│ │ │ ├── media_view_playback_sponsored.cpp
│ │ │ ├── media_view_playback_sponsored.h
│ │ │ ├── media_view_video_stream.cpp
│ │ │ └── media_view_video_stream.h
│ │ ├── menu/
│ │ │ ├── gift_resale_filter.cpp
│ │ │ ├── gift_resale_filter.h
│ │ │ ├── menu_antispam_validator.cpp
│ │ │ ├── menu_antispam_validator.h
│ │ │ ├── menu_check_item.cpp
│ │ │ ├── menu_check_item.h
│ │ │ ├── menu_checked_action.cpp
│ │ │ ├── menu_checked_action.h
│ │ │ ├── menu_dock.cpp
│ │ │ ├── menu_dock.h
│ │ │ ├── menu_item_download_files.cpp
│ │ │ ├── menu_item_download_files.h
│ │ │ ├── menu_item_rate_transcribe.cpp
│ │ │ ├── menu_item_rate_transcribe.h
│ │ │ ├── menu_item_rate_transcribe_session.cpp
│ │ │ ├── menu_item_rate_transcribe_session.h
│ │ │ ├── menu_mute.cpp
│ │ │ ├── menu_mute.h
│ │ │ ├── menu_send.cpp
│ │ │ ├── menu_send.h
│ │ │ ├── menu_sponsored.cpp
│ │ │ ├── menu_sponsored.h
│ │ │ ├── menu_timecode_action.cpp
│ │ │ ├── menu_timecode_action.h
│ │ │ ├── menu_ttl.cpp
│ │ │ ├── menu_ttl.h
│ │ │ ├── menu_ttl_validator.cpp
│ │ │ └── menu_ttl_validator.h
│ │ ├── mtproto/
│ │ │ ├── config_loader.cpp
│ │ │ ├── config_loader.h
│ │ │ ├── connection_abstract.cpp
│ │ │ ├── connection_abstract.h
│ │ │ ├── connection_http.cpp
│ │ │ ├── connection_http.h
│ │ │ ├── connection_resolving.cpp
│ │ │ ├── connection_resolving.h
│ │ │ ├── connection_tcp.cpp
│ │ │ ├── connection_tcp.h
│ │ │ ├── core_types.h
│ │ │ ├── dedicated_file_loader.cpp
│ │ │ ├── dedicated_file_loader.h
│ │ │ ├── details/
│ │ │ │ ├── mtproto_abstract_socket.cpp
│ │ │ │ ├── mtproto_abstract_socket.h
│ │ │ │ ├── mtproto_bound_key_creator.cpp
│ │ │ │ ├── mtproto_bound_key_creator.h
│ │ │ │ ├── mtproto_dc_key_binder.cpp
│ │ │ │ ├── mtproto_dc_key_binder.h
│ │ │ │ ├── mtproto_dc_key_creator.cpp
│ │ │ │ ├── mtproto_dc_key_creator.h
│ │ │ │ ├── mtproto_dcenter.cpp
│ │ │ │ ├── mtproto_dcenter.h
│ │ │ │ ├── mtproto_domain_resolver.cpp
│ │ │ │ ├── mtproto_domain_resolver.h
│ │ │ │ ├── mtproto_dump_to_text.cpp
│ │ │ │ ├── mtproto_dump_to_text.h
│ │ │ │ ├── mtproto_received_ids_manager.cpp
│ │ │ │ ├── mtproto_received_ids_manager.h
│ │ │ │ ├── mtproto_rsa_public_key.cpp
│ │ │ │ ├── mtproto_rsa_public_key.h
│ │ │ │ ├── mtproto_serialized_request.cpp
│ │ │ │ ├── mtproto_serialized_request.h
│ │ │ │ ├── mtproto_tcp_socket.cpp
│ │ │ │ ├── mtproto_tcp_socket.h
│ │ │ │ ├── mtproto_tls_socket.cpp
│ │ │ │ └── mtproto_tls_socket.h
│ │ │ ├── facade.cpp
│ │ │ ├── facade.h
│ │ │ ├── mtp_instance.cpp
│ │ │ ├── mtp_instance.h
│ │ │ ├── mtproto_auth_key.cpp
│ │ │ ├── mtproto_auth_key.h
│ │ │ ├── mtproto_concurrent_sender.cpp
│ │ │ ├── mtproto_concurrent_sender.h
│ │ │ ├── mtproto_config.cpp
│ │ │ ├── mtproto_config.h
│ │ │ ├── mtproto_dc_options.cpp
│ │ │ ├── mtproto_dc_options.h
│ │ │ ├── mtproto_dh_utils.cpp
│ │ │ ├── mtproto_dh_utils.h
│ │ │ ├── mtproto_pch.h
│ │ │ ├── mtproto_proxy_data.cpp
│ │ │ ├── mtproto_proxy_data.h
│ │ │ ├── mtproto_response.cpp
│ │ │ ├── mtproto_response.h
│ │ │ ├── scheme/
│ │ │ │ ├── api.tl
│ │ │ │ └── mtproto.tl
│ │ │ ├── sender.h
│ │ │ ├── session.cpp
│ │ │ ├── session.h
│ │ │ ├── session_private.cpp
│ │ │ ├── session_private.h
│ │ │ ├── special_config_request.cpp
│ │ │ ├── special_config_request.h
│ │ │ └── type_utils.h
│ │ ├── old_settings/
│ │ │ ├── settings_chat_settings_widget.cpp
│ │ │ └── settings_chat_settings_widget.h
│ │ ├── overview/
│ │ │ ├── overview.style
│ │ │ ├── overview_checkbox.cpp
│ │ │ ├── overview_checkbox.h
│ │ │ ├── overview_layout.cpp
│ │ │ ├── overview_layout.h
│ │ │ └── overview_layout_delegate.h
│ │ ├── passport/
│ │ │ ├── passport.style
│ │ │ ├── passport_edit_identity_box.cpp
│ │ │ ├── passport_edit_identity_box.h
│ │ │ ├── passport_encryption.cpp
│ │ │ ├── passport_encryption.h
│ │ │ ├── passport_form_controller.cpp
│ │ │ ├── passport_form_controller.h
│ │ │ ├── passport_form_row.cpp
│ │ │ ├── passport_form_row.h
│ │ │ ├── passport_form_view_controller.cpp
│ │ │ ├── passport_form_view_controller.h
│ │ │ ├── passport_panel.cpp
│ │ │ ├── passport_panel.h
│ │ │ ├── passport_panel_controller.cpp
│ │ │ ├── passport_panel_controller.h
│ │ │ ├── passport_panel_edit_contact.cpp
│ │ │ ├── passport_panel_edit_contact.h
│ │ │ ├── passport_panel_edit_document.cpp
│ │ │ ├── passport_panel_edit_document.h
│ │ │ ├── passport_panel_edit_scans.cpp
│ │ │ ├── passport_panel_edit_scans.h
│ │ │ ├── passport_panel_form.cpp
│ │ │ ├── passport_panel_form.h
│ │ │ ├── passport_panel_password.cpp
│ │ │ ├── passport_panel_password.h
│ │ │ └── ui/
│ │ │ ├── passport_details_row.cpp
│ │ │ ├── passport_details_row.h
│ │ │ ├── passport_form_row.cpp
│ │ │ └── passport_form_row.h
│ │ ├── payments/
│ │ │ ├── payments_checkout_process.cpp
│ │ │ ├── payments_checkout_process.h
│ │ │ ├── payments_form.cpp
│ │ │ ├── payments_form.h
│ │ │ ├── payments_non_panel_process.cpp
│ │ │ ├── payments_non_panel_process.h
│ │ │ ├── payments_reaction_process.cpp
│ │ │ ├── payments_reaction_process.h
│ │ │ ├── smartglocal/
│ │ │ │ ├── smartglocal_api_client.cpp
│ │ │ │ ├── smartglocal_api_client.h
│ │ │ │ ├── smartglocal_callbacks.h
│ │ │ │ ├── smartglocal_card.cpp
│ │ │ │ ├── smartglocal_card.h
│ │ │ │ ├── smartglocal_error.cpp
│ │ │ │ ├── smartglocal_error.h
│ │ │ │ ├── smartglocal_token.cpp
│ │ │ │ └── smartglocal_token.h
│ │ │ ├── stripe/
│ │ │ │ ├── stripe_address.h
│ │ │ │ ├── stripe_api_client.cpp
│ │ │ │ ├── stripe_api_client.h
│ │ │ │ ├── stripe_callbacks.h
│ │ │ │ ├── stripe_card.cpp
│ │ │ │ ├── stripe_card.h
│ │ │ │ ├── stripe_card_params.cpp
│ │ │ │ ├── stripe_card_params.h
│ │ │ │ ├── stripe_card_validator.cpp
│ │ │ │ ├── stripe_card_validator.h
│ │ │ │ ├── stripe_decode.cpp
│ │ │ │ ├── stripe_decode.h
│ │ │ │ ├── stripe_error.cpp
│ │ │ │ ├── stripe_error.h
│ │ │ │ ├── stripe_form_encodable.h
│ │ │ │ ├── stripe_form_encoder.cpp
│ │ │ │ ├── stripe_form_encoder.h
│ │ │ │ ├── stripe_payment_configuration.h
│ │ │ │ ├── stripe_pch.h
│ │ │ │ ├── stripe_token.cpp
│ │ │ │ └── stripe_token.h
│ │ │ └── ui/
│ │ │ ├── payments.style
│ │ │ ├── payments_edit_card.cpp
│ │ │ ├── payments_edit_card.h
│ │ │ ├── payments_edit_information.cpp
│ │ │ ├── payments_edit_information.h
│ │ │ ├── payments_field.cpp
│ │ │ ├── payments_field.h
│ │ │ ├── payments_form_summary.cpp
│ │ │ ├── payments_form_summary.h
│ │ │ ├── payments_panel.cpp
│ │ │ ├── payments_panel.h
│ │ │ ├── payments_panel_data.h
│ │ │ ├── payments_panel_delegate.h
│ │ │ ├── payments_reaction_box.cpp
│ │ │ └── payments_reaction_box.h
│ │ ├── platform/
│ │ │ ├── linux/
│ │ │ │ ├── current_geo_location_linux.cpp
│ │ │ │ ├── current_geo_location_linux.h
│ │ │ │ ├── file_utilities_linux.cpp
│ │ │ │ ├── file_utilities_linux.h
│ │ │ │ ├── integration_linux.cpp
│ │ │ │ ├── integration_linux.h
│ │ │ │ ├── launcher_linux.cpp
│ │ │ │ ├── launcher_linux.h
│ │ │ │ ├── main_window_linux.cpp
│ │ │ │ ├── main_window_linux.h
│ │ │ │ ├── notifications_manager_linux.cpp
│ │ │ │ ├── notifications_manager_linux.h
│ │ │ │ ├── org.freedesktop.Notifications.xml
│ │ │ │ ├── overlay_widget_linux.h
│ │ │ │ ├── specific_linux.cpp
│ │ │ │ ├── specific_linux.h
│ │ │ │ ├── text_recognition_linux.h
│ │ │ │ ├── translate_provider_linux.cpp
│ │ │ │ ├── translate_provider_linux.h
│ │ │ │ ├── tray_linux.cpp
│ │ │ │ ├── tray_linux.h
│ │ │ │ └── webauthn_linux.cpp
│ │ │ ├── mac/
│ │ │ │ ├── current_geo_location_mac.h
│ │ │ │ ├── current_geo_location_mac.mm
│ │ │ │ ├── file_bookmark_mac.h
│ │ │ │ ├── file_bookmark_mac.mm
│ │ │ │ ├── file_utilities_mac.h
│ │ │ │ ├── file_utilities_mac.mm
│ │ │ │ ├── integration_mac.h
│ │ │ │ ├── integration_mac.mm
│ │ │ │ ├── launcher_mac.h
│ │ │ │ ├── launcher_mac.mm
│ │ │ │ ├── mac_iconv_helper.c
│ │ │ │ ├── main_window_mac.h
│ │ │ │ ├── main_window_mac.mm
│ │ │ │ ├── notifications_manager_mac.h
│ │ │ │ ├── notifications_manager_mac.mm
│ │ │ │ ├── overlay_widget_mac.h
│ │ │ │ ├── overlay_widget_mac.mm
│ │ │ │ ├── specific_mac.h
│ │ │ │ ├── specific_mac.mm
│ │ │ │ ├── specific_mac_p.h
│ │ │ │ ├── specific_mac_p.mm
│ │ │ │ ├── text_recognition_mac.h
│ │ │ │ ├── text_recognition_mac.mm
│ │ │ │ ├── touchbar/
│ │ │ │ │ ├── items/
│ │ │ │ │ │ ├── mac_formatter_item.h
│ │ │ │ │ │ ├── mac_formatter_item.mm
│ │ │ │ │ │ ├── mac_pinned_chats_item.h
│ │ │ │ │ │ ├── mac_pinned_chats_item.mm
│ │ │ │ │ │ ├── mac_scrubber_item.h
│ │ │ │ │ │ └── mac_scrubber_item.mm
│ │ │ │ │ ├── mac_touchbar_audio.h
│ │ │ │ │ ├── mac_touchbar_audio.mm
│ │ │ │ │ ├── mac_touchbar_common.h
│ │ │ │ │ ├── mac_touchbar_common.mm
│ │ │ │ │ ├── mac_touchbar_controls.h
│ │ │ │ │ ├── mac_touchbar_controls.mm
│ │ │ │ │ ├── mac_touchbar_main.h
│ │ │ │ │ ├── mac_touchbar_main.mm
│ │ │ │ │ ├── mac_touchbar_manager.h
│ │ │ │ │ ├── mac_touchbar_manager.mm
│ │ │ │ │ ├── mac_touchbar_media_view.h
│ │ │ │ │ └── mac_touchbar_media_view.mm
│ │ │ │ ├── translate_provider_mac.h
│ │ │ │ ├── translate_provider_mac.mm
│ │ │ │ ├── tray_mac.h
│ │ │ │ ├── tray_mac.mm
│ │ │ │ ├── webauthn_mac.mm
│ │ │ │ └── window_title_mac.mm
│ │ │ ├── platform_current_geo_location.h
│ │ │ ├── platform_file_bookmark.h
│ │ │ ├── platform_file_utilities.h
│ │ │ ├── platform_integration.cpp
│ │ │ ├── platform_integration.h
│ │ │ ├── platform_launcher.h
│ │ │ ├── platform_main_window.h
│ │ │ ├── platform_notifications_manager.h
│ │ │ ├── platform_overlay_widget.cpp
│ │ │ ├── platform_overlay_widget.h
│ │ │ ├── platform_specific.h
│ │ │ ├── platform_text_recognition.h
│ │ │ ├── platform_translate_provider.h
│ │ │ ├── platform_tray.h
│ │ │ ├── platform_webauthn.h
│ │ │ ├── platform_window_title.h
│ │ │ └── win/
│ │ │ ├── current_geo_location_win.cpp
│ │ │ ├── current_geo_location_win.h
│ │ │ ├── file_utilities_win.cpp
│ │ │ ├── file_utilities_win.h
│ │ │ ├── integration_win.cpp
│ │ │ ├── integration_win.h
│ │ │ ├── launcher_win.cpp
│ │ │ ├── launcher_win.h
│ │ │ ├── main_window_win.cpp
│ │ │ ├── main_window_win.h
│ │ │ ├── notifications_manager_win.cpp
│ │ │ ├── notifications_manager_win.h
│ │ │ ├── overlay_widget_win.h
│ │ │ ├── specific_win.cpp
│ │ │ ├── specific_win.h
│ │ │ ├── text_recognition_win.h
│ │ │ ├── translate_provider_win.h
│ │ │ ├── tray_win.cpp
│ │ │ ├── tray_win.h
│ │ │ ├── webauthn_win.cpp
│ │ │ ├── windows_app_user_model_id.cpp
│ │ │ ├── windows_app_user_model_id.h
│ │ │ ├── windows_autostart_task.cpp
│ │ │ ├── windows_autostart_task.h
│ │ │ ├── windows_dlls.cpp
│ │ │ ├── windows_dlls.h
│ │ │ ├── windows_quiethours.idl
│ │ │ ├── windows_toast_activator.cpp
│ │ │ ├── windows_toast_activator.h
│ │ │ └── windows_toastactivator.idl
│ │ ├── poll/
│ │ │ ├── poll_media_upload.cpp
│ │ │ └── poll_media_upload.h
│ │ ├── profile/
│ │ │ ├── profile.style
│ │ │ ├── profile_back_button.cpp
│ │ │ ├── profile_back_button.h
│ │ │ ├── profile_block_widget.cpp
│ │ │ ├── profile_block_widget.h
│ │ │ ├── profile_cover_drop_area.cpp
│ │ │ └── profile_cover_drop_area.h
│ │ ├── settings/
│ │ │ ├── business/
│ │ │ │ ├── settings_away_message.cpp
│ │ │ │ ├── settings_away_message.h
│ │ │ │ ├── settings_chat_intro.cpp
│ │ │ │ ├── settings_chat_intro.h
│ │ │ │ ├── settings_chat_links.cpp
│ │ │ │ ├── settings_chat_links.h
│ │ │ │ ├── settings_chatbots.cpp
│ │ │ │ ├── settings_chatbots.h
│ │ │ │ ├── settings_greeting.cpp
│ │ │ │ ├── settings_greeting.h
│ │ │ │ ├── settings_location.cpp
│ │ │ │ ├── settings_location.h
│ │ │ │ ├── settings_quick_replies.cpp
│ │ │ │ ├── settings_quick_replies.h
│ │ │ │ ├── settings_recipients_helper.cpp
│ │ │ │ ├── settings_recipients_helper.h
│ │ │ │ ├── settings_shortcut_messages.cpp
│ │ │ │ ├── settings_shortcut_messages.h
│ │ │ │ ├── settings_working_hours.cpp
│ │ │ │ └── settings_working_hours.h
│ │ │ ├── cloud_password/
│ │ │ │ ├── settings_cloud_password_common.cpp
│ │ │ │ ├── settings_cloud_password_common.h
│ │ │ │ ├── settings_cloud_password_email.cpp
│ │ │ │ ├── settings_cloud_password_email.h
│ │ │ │ ├── settings_cloud_password_email_confirm.cpp
│ │ │ │ ├── settings_cloud_password_email_confirm.h
│ │ │ │ ├── settings_cloud_password_hint.cpp
│ │ │ │ ├── settings_cloud_password_hint.h
│ │ │ │ ├── settings_cloud_password_input.cpp
│ │ │ │ ├── settings_cloud_password_input.h
│ │ │ │ ├── settings_cloud_password_login_email.cpp
│ │ │ │ ├── settings_cloud_password_login_email.h
│ │ │ │ ├── settings_cloud_password_login_email_confirm.cpp
│ │ │ │ ├── settings_cloud_password_login_email_confirm.h
│ │ │ │ ├── settings_cloud_password_manage.cpp
│ │ │ │ ├── settings_cloud_password_manage.h
│ │ │ │ ├── settings_cloud_password_start.cpp
│ │ │ │ ├── settings_cloud_password_start.h
│ │ │ │ ├── settings_cloud_password_step.cpp
│ │ │ │ ├── settings_cloud_password_step.h
│ │ │ │ ├── settings_cloud_password_validate_icon.cpp
│ │ │ │ └── settings_cloud_password_validate_icon.h
│ │ │ ├── detailed_settings_button.cpp
│ │ │ ├── detailed_settings_button.h
│ │ │ ├── sections/
│ │ │ │ ├── settings_active_sessions.cpp
│ │ │ │ ├── settings_active_sessions.h
│ │ │ │ ├── settings_advanced.cpp
│ │ │ │ ├── settings_advanced.h
│ │ │ │ ├── settings_blocked_peers.cpp
│ │ │ │ ├── settings_blocked_peers.h
│ │ │ │ ├── settings_business.cpp
│ │ │ │ ├── settings_business.h
│ │ │ │ ├── settings_calls.cpp
│ │ │ │ ├── settings_calls.h
│ │ │ │ ├── settings_chat.cpp
│ │ │ │ ├── settings_chat.h
│ │ │ │ ├── settings_credits.cpp
│ │ │ │ ├── settings_credits.h
│ │ │ │ ├── settings_folders.cpp
│ │ │ │ ├── settings_folders.h
│ │ │ │ ├── settings_fork.cpp
│ │ │ │ ├── settings_fork.h
│ │ │ │ ├── settings_global_ttl.cpp
│ │ │ │ ├── settings_global_ttl.h
│ │ │ │ ├── settings_information.cpp
│ │ │ │ ├── settings_information.h
│ │ │ │ ├── settings_link_device.cpp
│ │ │ │ ├── settings_link_device.h
│ │ │ │ ├── settings_local_passcode.cpp
│ │ │ │ ├── settings_local_passcode.h
│ │ │ │ ├── settings_main.cpp
│ │ │ │ ├── settings_main.h
│ │ │ │ ├── settings_notifications.cpp
│ │ │ │ ├── settings_notifications.h
│ │ │ │ ├── settings_notifications_reactions.cpp
│ │ │ │ ├── settings_notifications_reactions.h
│ │ │ │ ├── settings_notifications_type.cpp
│ │ │ │ ├── settings_notifications_type.h
│ │ │ │ ├── settings_passkeys.cpp
│ │ │ │ ├── settings_passkeys.h
│ │ │ │ ├── settings_premium.cpp
│ │ │ │ ├── settings_premium.h
│ │ │ │ ├── settings_privacy_security.cpp
│ │ │ │ ├── settings_privacy_security.h
│ │ │ │ ├── settings_shortcuts.cpp
│ │ │ │ ├── settings_shortcuts.h
│ │ │ │ ├── settings_websites.cpp
│ │ │ │ └── settings_websites.h
│ │ │ ├── settings.style
│ │ │ ├── settings_builder.cpp
│ │ │ ├── settings_builder.h
│ │ │ ├── settings_codes.cpp
│ │ │ ├── settings_codes.h
│ │ │ ├── settings_common.cpp
│ │ │ ├── settings_common.h
│ │ │ ├── settings_common_session.cpp
│ │ │ ├── settings_common_session.h
│ │ │ ├── settings_credits_graphics.cpp
│ │ │ ├── settings_credits_graphics.h
│ │ │ ├── settings_experimental.cpp
│ │ │ ├── settings_experimental.h
│ │ │ ├── settings_faq_suggestions.cpp
│ │ │ ├── settings_faq_suggestions.h
│ │ │ ├── settings_intro.cpp
│ │ │ ├── settings_intro.h
│ │ │ ├── settings_notifications_common.h
│ │ │ ├── settings_power_saving.cpp
│ │ │ ├── settings_power_saving.h
│ │ │ ├── settings_privacy_controllers.cpp
│ │ │ ├── settings_privacy_controllers.h
│ │ │ ├── settings_recent_searches.cpp
│ │ │ ├── settings_recent_searches.h
│ │ │ ├── settings_scale_preview.cpp
│ │ │ ├── settings_scale_preview.h
│ │ │ ├── settings_search.cpp
│ │ │ ├── settings_search.h
│ │ │ └── settings_type.h
│ │ ├── settings.cpp
│ │ ├── settings.h
│ │ ├── statistics/
│ │ │ ├── chart_lines_filter_controller.cpp
│ │ │ ├── chart_lines_filter_controller.h
│ │ │ ├── chart_rulers_data.cpp
│ │ │ ├── chart_rulers_data.h
│ │ │ ├── chart_widget.cpp
│ │ │ ├── chart_widget.h
│ │ │ ├── segment_tree.cpp
│ │ │ ├── segment_tree.h
│ │ │ ├── statistics.style
│ │ │ ├── statistics_common.h
│ │ │ ├── statistics_data_deserialize.cpp
│ │ │ ├── statistics_data_deserialize.h
│ │ │ ├── statistics_format_values.cpp
│ │ │ ├── statistics_format_values.h
│ │ │ ├── statistics_graphics.cpp
│ │ │ ├── statistics_graphics.h
│ │ │ ├── statistics_types.h
│ │ │ ├── view/
│ │ │ │ ├── abstract_chart_view.cpp
│ │ │ │ ├── abstract_chart_view.h
│ │ │ │ ├── bar_chart_view.cpp
│ │ │ │ ├── bar_chart_view.h
│ │ │ │ ├── chart_rulers_view.cpp
│ │ │ │ ├── chart_rulers_view.h
│ │ │ │ ├── chart_view_factory.cpp
│ │ │ │ ├── chart_view_factory.h
│ │ │ │ ├── linear_chart_view.cpp
│ │ │ │ ├── linear_chart_view.h
│ │ │ │ ├── stack_chart_common.cpp
│ │ │ │ ├── stack_chart_common.h
│ │ │ │ ├── stack_linear_chart_common.cpp
│ │ │ │ ├── stack_linear_chart_common.h
│ │ │ │ ├── stack_linear_chart_view.cpp
│ │ │ │ └── stack_linear_chart_view.h
│ │ │ └── widgets/
│ │ │ ├── chart_header_widget.cpp
│ │ │ ├── chart_header_widget.h
│ │ │ ├── chart_lines_filter_widget.cpp
│ │ │ ├── chart_lines_filter_widget.h
│ │ │ ├── point_details_widget.cpp
│ │ │ └── point_details_widget.h
│ │ ├── stdafx.h
│ │ ├── storage/
│ │ │ ├── details/
│ │ │ │ ├── storage_file_utilities.cpp
│ │ │ │ ├── storage_file_utilities.h
│ │ │ │ ├── storage_settings_scheme.cpp
│ │ │ │ └── storage_settings_scheme.h
│ │ │ ├── download_manager_mtproto.cpp
│ │ │ ├── download_manager_mtproto.h
│ │ │ ├── file_download.cpp
│ │ │ ├── file_download.h
│ │ │ ├── file_download_mtproto.cpp
│ │ │ ├── file_download_mtproto.h
│ │ │ ├── file_download_web.cpp
│ │ │ ├── file_download_web.h
│ │ │ ├── file_upload.cpp
│ │ │ ├── file_upload.h
│ │ │ ├── localimageloader.cpp
│ │ │ ├── localimageloader.h
│ │ │ ├── localstorage.cpp
│ │ │ ├── localstorage.h
│ │ │ ├── serialize_common.cpp
│ │ │ ├── serialize_common.h
│ │ │ ├── serialize_document.cpp
│ │ │ ├── serialize_document.h
│ │ │ ├── serialize_peer.cpp
│ │ │ ├── serialize_peer.h
│ │ │ ├── storage_account.cpp
│ │ │ ├── storage_account.h
│ │ │ ├── storage_cloud_blob.cpp
│ │ │ ├── storage_cloud_blob.h
│ │ │ ├── storage_domain.cpp
│ │ │ ├── storage_domain.h
│ │ │ ├── storage_facade.cpp
│ │ │ ├── storage_facade.h
│ │ │ ├── storage_file_lock.h
│ │ │ ├── storage_file_lock_posix.cpp
│ │ │ ├── storage_file_lock_win.cpp
│ │ │ ├── storage_media_prepare.cpp
│ │ │ ├── storage_media_prepare.h
│ │ │ ├── storage_shared_media.cpp
│ │ │ ├── storage_shared_media.h
│ │ │ ├── storage_sparse_ids_list.cpp
│ │ │ ├── storage_sparse_ids_list.h
│ │ │ ├── storage_user_photos.cpp
│ │ │ ├── storage_user_photos.h
│ │ │ ├── streamed_file_downloader.cpp
│ │ │ └── streamed_file_downloader.h
│ │ ├── support/
│ │ │ ├── support_autocomplete.cpp
│ │ │ ├── support_autocomplete.h
│ │ │ ├── support_common.cpp
│ │ │ ├── support_common.h
│ │ │ ├── support_helper.cpp
│ │ │ ├── support_helper.h
│ │ │ ├── support_preload.cpp
│ │ │ ├── support_preload.h
│ │ │ ├── support_templates.cpp
│ │ │ └── support_templates.h
│ │ ├── tde2e/
│ │ │ ├── tde2e_api.cpp
│ │ │ ├── tde2e_api.h
│ │ │ ├── tde2e_integration.cpp
│ │ │ └── tde2e_integration.h
│ │ ├── tests/
│ │ │ ├── test_main.cpp
│ │ │ ├── test_main.h
│ │ │ └── test_text.cpp
│ │ ├── tray.cpp
│ │ ├── tray.h
│ │ ├── tray_accounts_menu.cpp
│ │ ├── tray_accounts_menu.h
│ │ ├── tray_accounts_menu_dummy.cpp
│ │ ├── ui/
│ │ │ ├── boxes/
│ │ │ │ ├── about_cocoon_box.cpp
│ │ │ │ ├── about_cocoon_box.h
│ │ │ │ ├── auto_delete_settings.cpp
│ │ │ │ ├── auto_delete_settings.h
│ │ │ │ ├── boost_box.cpp
│ │ │ │ ├── boost_box.h
│ │ │ │ ├── calendar_box.cpp
│ │ │ │ ├── calendar_box.h
│ │ │ │ ├── choose_date_time.cpp
│ │ │ │ ├── choose_date_time.h
│ │ │ │ ├── choose_font_box.cpp
│ │ │ │ ├── choose_font_box.h
│ │ │ │ ├── choose_language_box.cpp
│ │ │ │ ├── choose_language_box.h
│ │ │ │ ├── choose_time.cpp
│ │ │ │ ├── choose_time.h
│ │ │ │ ├── collectible_info_box.cpp
│ │ │ │ ├── collectible_info_box.h
│ │ │ │ ├── confirm_box.cpp
│ │ │ │ ├── confirm_box.h
│ │ │ │ ├── confirm_phone_box.cpp
│ │ │ │ ├── confirm_phone_box.h
│ │ │ │ ├── country_select_box.cpp
│ │ │ │ ├── country_select_box.h
│ │ │ │ ├── edit_birthday_box.cpp
│ │ │ │ ├── edit_birthday_box.h
│ │ │ │ ├── edit_factcheck_box.cpp
│ │ │ │ ├── edit_factcheck_box.h
│ │ │ │ ├── edit_invite_link.cpp
│ │ │ │ ├── edit_invite_link.h
│ │ │ │ ├── edit_invite_link_session.cpp
│ │ │ │ ├── edit_invite_link_session.h
│ │ │ │ ├── emoji_stake_box.cpp
│ │ │ │ ├── emoji_stake_box.h
│ │ │ │ ├── peer_qr_box.cpp
│ │ │ │ ├── peer_qr_box.h
│ │ │ │ ├── rate_call_box.cpp
│ │ │ │ ├── rate_call_box.h
│ │ │ │ ├── report_box_graphics.cpp
│ │ │ │ ├── report_box_graphics.h
│ │ │ │ ├── show_or_premium_box.cpp
│ │ │ │ ├── show_or_premium_box.h
│ │ │ │ ├── single_choice_box.cpp
│ │ │ │ ├── single_choice_box.h
│ │ │ │ ├── time_picker_box.cpp
│ │ │ │ └── time_picker_box.h
│ │ │ ├── cached_round_corners.cpp
│ │ │ ├── cached_round_corners.h
│ │ │ ├── chat/
│ │ │ │ ├── attach/
│ │ │ │ │ ├── attach_abstract_single_file_preview.cpp
│ │ │ │ │ ├── attach_abstract_single_file_preview.h
│ │ │ │ │ ├── attach_abstract_single_media_preview.cpp
│ │ │ │ │ ├── attach_abstract_single_media_preview.h
│ │ │ │ │ ├── attach_abstract_single_preview.h
│ │ │ │ │ ├── attach_album_preview.cpp
│ │ │ │ │ ├── attach_album_preview.h
│ │ │ │ │ ├── attach_album_thumbnail.cpp
│ │ │ │ │ ├── attach_album_thumbnail.h
│ │ │ │ │ ├── attach_bot_downloads.cpp
│ │ │ │ │ ├── attach_bot_downloads.h
│ │ │ │ │ ├── attach_bot_webview.cpp
│ │ │ │ │ ├── attach_bot_webview.h
│ │ │ │ │ ├── attach_controls.cpp
│ │ │ │ │ ├── attach_controls.h
│ │ │ │ │ ├── attach_extensions.cpp
│ │ │ │ │ ├── attach_extensions.h
│ │ │ │ │ ├── attach_item_single_file_preview.cpp
│ │ │ │ │ ├── attach_item_single_file_preview.h
│ │ │ │ │ ├── attach_item_single_media_preview.cpp
│ │ │ │ │ ├── attach_item_single_media_preview.h
│ │ │ │ │ ├── attach_prepare.cpp
│ │ │ │ │ ├── attach_prepare.h
│ │ │ │ │ ├── attach_send_files_way.cpp
│ │ │ │ │ ├── attach_send_files_way.h
│ │ │ │ │ ├── attach_single_file_preview.cpp
│ │ │ │ │ ├── attach_single_file_preview.h
│ │ │ │ │ ├── attach_single_media_preview.cpp
│ │ │ │ │ └── attach_single_media_preview.h
│ │ │ │ ├── chat.style
│ │ │ │ ├── chat_style.cpp
│ │ │ │ ├── chat_style.h
│ │ │ │ ├── chat_style_radius.cpp
│ │ │ │ ├── chat_style_radius.h
│ │ │ │ ├── chat_theme.cpp
│ │ │ │ ├── chat_theme.h
│ │ │ │ ├── chats_filter_tag.cpp
│ │ │ │ ├── chats_filter_tag.h
│ │ │ │ ├── choose_send_as.cpp
│ │ │ │ ├── choose_send_as.h
│ │ │ │ ├── choose_theme_controller.cpp
│ │ │ │ ├── choose_theme_controller.h
│ │ │ │ ├── continuous_scroll.cpp
│ │ │ │ ├── continuous_scroll.h
│ │ │ │ ├── forward_options_box.cpp
│ │ │ │ ├── forward_options_box.h
│ │ │ │ ├── group_call_bar.cpp
│ │ │ │ ├── group_call_bar.h
│ │ │ │ ├── group_call_userpics.cpp
│ │ │ │ ├── group_call_userpics.h
│ │ │ │ ├── message_bar.cpp
│ │ │ │ ├── message_bar.h
│ │ │ │ ├── message_bubble.cpp
│ │ │ │ ├── message_bubble.h
│ │ │ │ ├── more_chats_bar.cpp
│ │ │ │ ├── more_chats_bar.h
│ │ │ │ ├── pinned_bar.cpp
│ │ │ │ ├── pinned_bar.h
│ │ │ │ ├── requests_bar.cpp
│ │ │ │ ├── requests_bar.h
│ │ │ │ ├── sponsored_message_bar.cpp
│ │ │ │ └── sponsored_message_bar.h
│ │ │ ├── color_contrast.cpp
│ │ │ ├── color_contrast.h
│ │ │ ├── color_indices.style
│ │ │ ├── color_int_conversion.cpp
│ │ │ ├── color_int_conversion.h
│ │ │ ├── controls/
│ │ │ │ ├── button_labels.cpp
│ │ │ │ ├── button_labels.h
│ │ │ │ ├── call_mute_button.cpp
│ │ │ │ ├── call_mute_button.h
│ │ │ │ ├── chat_service_checkbox.cpp
│ │ │ │ ├── chat_service_checkbox.h
│ │ │ │ ├── compose_ai_button_factory.cpp
│ │ │ │ ├── compose_ai_button_factory.h
│ │ │ │ ├── delete_message_context_action.cpp
│ │ │ │ ├── delete_message_context_action.h
│ │ │ │ ├── download_bar.cpp
│ │ │ │ ├── download_bar.h
│ │ │ │ ├── dynamic_images_strip.cpp
│ │ │ │ ├── dynamic_images_strip.h
│ │ │ │ ├── emoji_button.cpp
│ │ │ │ ├── emoji_button.h
│ │ │ │ ├── emoji_button_factory.cpp
│ │ │ │ ├── emoji_button_factory.h
│ │ │ │ ├── feature_list.cpp
│ │ │ │ ├── feature_list.h
│ │ │ │ ├── filter_link_header.cpp
│ │ │ │ ├── filter_link_header.h
│ │ │ │ ├── invite_link_buttons.cpp
│ │ │ │ ├── invite_link_buttons.h
│ │ │ │ ├── invite_link_label.cpp
│ │ │ │ ├── invite_link_label.h
│ │ │ │ ├── jump_down_button.cpp
│ │ │ │ ├── jump_down_button.h
│ │ │ │ ├── labeled_emoji_tabs.cpp
│ │ │ │ ├── labeled_emoji_tabs.h
│ │ │ │ ├── location_picker.cpp
│ │ │ │ ├── location_picker.h
│ │ │ │ ├── peer_list_dummy.cpp
│ │ │ │ ├── peer_list_dummy.h
│ │ │ │ ├── popup_selector.cpp
│ │ │ │ ├── popup_selector.h
│ │ │ │ ├── round_video_recorder.cpp
│ │ │ │ ├── round_video_recorder.h
│ │ │ │ ├── round_video_recorder_data.h
│ │ │ │ ├── send_as_button.cpp
│ │ │ │ ├── send_as_button.h
│ │ │ │ ├── send_button.cpp
│ │ │ │ ├── send_button.h
│ │ │ │ ├── silent_toggle.cpp
│ │ │ │ ├── silent_toggle.h
│ │ │ │ ├── stars_rating.cpp
│ │ │ │ ├── stars_rating.h
│ │ │ │ ├── sub_tabs.cpp
│ │ │ │ ├── sub_tabs.h
│ │ │ │ ├── subsection_tabs_slider.cpp
│ │ │ │ ├── subsection_tabs_slider.h
│ │ │ │ ├── subsection_tabs_slider_reorder.cpp
│ │ │ │ ├── subsection_tabs_slider_reorder.h
│ │ │ │ ├── swipe_handler.cpp
│ │ │ │ ├── swipe_handler.h
│ │ │ │ ├── swipe_handler_data.h
│ │ │ │ ├── tabbed_search.cpp
│ │ │ │ ├── tabbed_search.h
│ │ │ │ ├── table_rows.cpp
│ │ │ │ ├── table_rows.h
│ │ │ │ ├── ton_common.cpp
│ │ │ │ ├── ton_common.h
│ │ │ │ ├── userpic_button.cpp
│ │ │ │ ├── userpic_button.h
│ │ │ │ ├── who_reacted_context_action.cpp
│ │ │ │ ├── who_reacted_context_action.h
│ │ │ │ ├── window_outdated_bar.cpp
│ │ │ │ ├── window_outdated_bar.h
│ │ │ │ ├── window_outdated_bar_dummy.cpp
│ │ │ │ ├── window_screen_reader_bar.cpp
│ │ │ │ └── window_screen_reader_bar.h
│ │ │ ├── countryinput.cpp
│ │ │ ├── countryinput.h
│ │ │ ├── dynamic_thumbnails.cpp
│ │ │ ├── dynamic_thumbnails.h
│ │ │ ├── effects/
│ │ │ │ ├── credits.style
│ │ │ │ ├── credits_graphics.cpp
│ │ │ │ ├── credits_graphics.h
│ │ │ │ ├── emoji_fly_animation.cpp
│ │ │ │ ├── emoji_fly_animation.h
│ │ │ │ ├── fireworks_animation.cpp
│ │ │ │ ├── fireworks_animation.h
│ │ │ │ ├── glare.cpp
│ │ │ │ ├── glare.h
│ │ │ │ ├── loading_element.cpp
│ │ │ │ ├── loading_element.h
│ │ │ │ ├── message_sending_animation_common.h
│ │ │ │ ├── message_sending_animation_controller.cpp
│ │ │ │ ├── message_sending_animation_controller.h
│ │ │ │ ├── ministar_particles.cpp
│ │ │ │ ├── ministar_particles.h
│ │ │ │ ├── outline_segments.cpp
│ │ │ │ ├── outline_segments.h
│ │ │ │ ├── premium.style
│ │ │ │ ├── premium_bubble.cpp
│ │ │ │ ├── premium_bubble.h
│ │ │ │ ├── premium_graphics.cpp
│ │ │ │ ├── premium_graphics.h
│ │ │ │ ├── premium_stars.cpp
│ │ │ │ ├── premium_stars.h
│ │ │ │ ├── premium_stars_colored.cpp
│ │ │ │ ├── premium_stars_colored.h
│ │ │ │ ├── premium_top_bar.cpp
│ │ │ │ ├── premium_top_bar.h
│ │ │ │ ├── reaction_fly_animation.cpp
│ │ │ │ ├── reaction_fly_animation.h
│ │ │ │ ├── round_checkbox.cpp
│ │ │ │ ├── round_checkbox.h
│ │ │ │ ├── scroll_content_shadow.cpp
│ │ │ │ ├── scroll_content_shadow.h
│ │ │ │ ├── send_action_animations.cpp
│ │ │ │ ├── send_action_animations.h
│ │ │ │ ├── shake_animation.cpp
│ │ │ │ ├── shake_animation.h
│ │ │ │ ├── skeleton_animation.cpp
│ │ │ │ ├── skeleton_animation.h
│ │ │ │ ├── snowflakes.cpp
│ │ │ │ ├── snowflakes.h
│ │ │ │ ├── thanos_effect.cpp
│ │ │ │ ├── thanos_effect.h
│ │ │ │ ├── thanos_effect_controller.cpp
│ │ │ │ ├── thanos_effect_controller.h
│ │ │ │ ├── thanos_effect_renderer.cpp
│ │ │ │ ├── thanos_effect_renderer.h
│ │ │ │ ├── thanos_effect_session.cpp
│ │ │ │ ├── thanos_effect_session.h
│ │ │ │ ├── toggle_arrow.cpp
│ │ │ │ ├── toggle_arrow.h
│ │ │ │ ├── ttl_icon.cpp
│ │ │ │ ├── ttl_icon.h
│ │ │ │ ├── upload_progress_overlay.cpp
│ │ │ │ └── upload_progress_overlay.h
│ │ │ ├── empty_userpic.cpp
│ │ │ ├── empty_userpic.h
│ │ │ ├── filter_icon_panel.cpp
│ │ │ ├── filter_icon_panel.h
│ │ │ ├── filter_icons.cpp
│ │ │ ├── filter_icons.h
│ │ │ ├── filter_icons.style
│ │ │ ├── grouped_layout.cpp
│ │ │ ├── grouped_layout.h
│ │ │ ├── image/
│ │ │ │ ├── image.cpp
│ │ │ │ ├── image.h
│ │ │ │ ├── image_location.cpp
│ │ │ │ ├── image_location.h
│ │ │ │ ├── image_location_factory.cpp
│ │ │ │ ├── image_location_factory.h
│ │ │ │ ├── image_source.cpp
│ │ │ │ ├── svg_preview.cpp
│ │ │ │ └── svg_preview.h
│ │ │ ├── item_text_options.cpp
│ │ │ ├── item_text_options.h
│ │ │ ├── menu_icons.style
│ │ │ ├── new_badges.cpp
│ │ │ ├── new_badges.h
│ │ │ ├── peer/
│ │ │ │ ├── color_sample.cpp
│ │ │ │ ├── color_sample.h
│ │ │ │ ├── video_userpic_player.cpp
│ │ │ │ └── video_userpic_player.h
│ │ │ ├── power_saving.cpp
│ │ │ ├── power_saving.h
│ │ │ ├── resize_area.h
│ │ │ ├── search_field_controller.cpp
│ │ │ ├── search_field_controller.h
│ │ │ ├── td_common.style
│ │ │ ├── text/
│ │ │ │ ├── format_song_document_name.cpp
│ │ │ │ ├── format_song_document_name.h
│ │ │ │ ├── format_song_name.cpp
│ │ │ │ ├── format_song_name.h
│ │ │ │ ├── format_values.cpp
│ │ │ │ ├── format_values.h
│ │ │ │ ├── text_lottie_custom_emoji.cpp
│ │ │ │ ├── text_lottie_custom_emoji.h
│ │ │ │ ├── text_options.cpp
│ │ │ │ └── text_options.h
│ │ │ ├── top_background_gradient.cpp
│ │ │ ├── top_background_gradient.h
│ │ │ ├── ui_pch.h
│ │ │ ├── unread_badge.cpp
│ │ │ ├── unread_badge.h
│ │ │ ├── unread_badge_paint.cpp
│ │ │ ├── unread_badge_paint.h
│ │ │ ├── unread_counter_format.cpp
│ │ │ ├── unread_counter_format.h
│ │ │ ├── userpic_view.cpp
│ │ │ ├── userpic_view.h
│ │ │ ├── vertical_list.cpp
│ │ │ ├── vertical_list.h
│ │ │ ├── webview_helpers.cpp
│ │ │ ├── webview_helpers.h
│ │ │ └── widgets/
│ │ │ ├── chat_filters_tabs_slider.cpp
│ │ │ ├── chat_filters_tabs_slider.h
│ │ │ ├── chat_filters_tabs_slider_reorder.cpp
│ │ │ ├── chat_filters_tabs_slider_reorder.h
│ │ │ ├── chat_filters_tabs_strip.cpp
│ │ │ ├── chat_filters_tabs_strip.h
│ │ │ ├── color_editor.cpp
│ │ │ ├── color_editor.h
│ │ │ ├── continuous_sliders.cpp
│ │ │ ├── continuous_sliders.h
│ │ │ ├── cross_fade_label.cpp
│ │ │ ├── cross_fade_label.h
│ │ │ ├── discrete_sliders.cpp
│ │ │ ├── discrete_sliders.h
│ │ │ ├── expandable_peer_list.cpp
│ │ │ ├── expandable_peer_list.h
│ │ │ ├── fields/
│ │ │ │ ├── special_fields.cpp
│ │ │ │ ├── special_fields.h
│ │ │ │ ├── time_part_input_with_placeholder.cpp
│ │ │ │ └── time_part_input_with_placeholder.h
│ │ │ ├── gradient_round_button.cpp
│ │ │ ├── gradient_round_button.h
│ │ │ ├── horizontal_fit_container.cpp
│ │ │ ├── horizontal_fit_container.h
│ │ │ ├── level_meter.cpp
│ │ │ ├── level_meter.h
│ │ │ ├── middle_click_autoscroll.cpp
│ │ │ ├── middle_click_autoscroll.h
│ │ │ ├── multi_select.cpp
│ │ │ ├── multi_select.h
│ │ │ ├── participants_check_view.cpp
│ │ │ ├── participants_check_view.h
│ │ │ ├── peer_bubble.cpp
│ │ │ ├── peer_bubble.h
│ │ │ ├── sent_code_field.cpp
│ │ │ ├── sent_code_field.h
│ │ │ ├── slider_natural_width.h
│ │ │ ├── vertical_drum_picker.cpp
│ │ │ └── vertical_drum_picker.h
│ │ └── window/
│ │ ├── main_window.cpp
│ │ ├── main_window.h
│ │ ├── notifications_manager.cpp
│ │ ├── notifications_manager.h
│ │ ├── notifications_manager_default.cpp
│ │ ├── notifications_manager_default.h
│ │ ├── notifications_utilities.cpp
│ │ ├── notifications_utilities.h
│ │ ├── section_memento.h
│ │ ├── section_widget.cpp
│ │ ├── section_widget.h
│ │ ├── session/
│ │ │ └── window_session_media.cpp
│ │ ├── themes/
│ │ │ ├── window_theme.cpp
│ │ │ ├── window_theme.h
│ │ │ ├── window_theme_editor.cpp
│ │ │ ├── window_theme_editor.h
│ │ │ ├── window_theme_editor_block.cpp
│ │ │ ├── window_theme_editor_block.h
│ │ │ ├── window_theme_editor_box.cpp
│ │ │ ├── window_theme_editor_box.h
│ │ │ ├── window_theme_preview.cpp
│ │ │ ├── window_theme_preview.h
│ │ │ ├── window_theme_warning.cpp
│ │ │ ├── window_theme_warning.h
│ │ │ ├── window_themes_cloud_list.cpp
│ │ │ ├── window_themes_cloud_list.h
│ │ │ ├── window_themes_embedded.cpp
│ │ │ ├── window_themes_embedded.h
│ │ │ ├── window_themes_generate_name.cpp
│ │ │ └── window_themes_generate_name.h
│ │ ├── window.style
│ │ ├── window_adaptive.cpp
│ │ ├── window_adaptive.h
│ │ ├── window_chat_preview.cpp
│ │ ├── window_chat_preview.h
│ │ ├── window_chat_switch_process.cpp
│ │ ├── window_chat_switch_process.h
│ │ ├── window_connecting_widget.cpp
│ │ ├── window_connecting_widget.h
│ │ ├── window_controller.cpp
│ │ ├── window_controller.h
│ │ ├── window_filters_menu.cpp
│ │ ├── window_filters_menu.h
│ │ ├── window_history_hider.cpp
│ │ ├── window_history_hider.h
│ │ ├── window_lock_widgets.cpp
│ │ ├── window_lock_widgets.h
│ │ ├── window_main_menu.cpp
│ │ ├── window_main_menu.h
│ │ ├── window_main_menu_helpers.cpp
│ │ ├── window_main_menu_helpers.h
│ │ ├── window_media_preview.cpp
│ │ ├── window_media_preview.h
│ │ ├── window_peer_menu.cpp
│ │ ├── window_peer_menu.h
│ │ ├── window_section_common.h
│ │ ├── window_separate_id.cpp
│ │ ├── window_separate_id.h
│ │ ├── window_session_controller.cpp
│ │ ├── window_session_controller.h
│ │ ├── window_session_controller_link_info.h
│ │ ├── window_setup_email.cpp
│ │ ├── window_setup_email.h
│ │ ├── window_slide_animation.cpp
│ │ ├── window_slide_animation.h
│ │ └── window_top_bar_wrap.h
│ ├── Telegram/
│ │ ├── Breakpad.entitlements
│ │ ├── Images.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Telegram Lite.entitlements
│ │ └── Telegram.entitlements
│ ├── Telegram.plist
│ ├── ThirdParty/
│ │ └── minizip/
│ │ ├── crypt.h
│ │ ├── ioapi.c
│ │ ├── ioapi.h
│ │ ├── unzip.c
│ │ ├── unzip.h
│ │ ├── zip.c
│ │ └── zip.h
│ ├── build/
│ │ ├── build.bat
│ │ ├── build.sh
│ │ ├── changelog2appstream.py
│ │ ├── deploy.sh
│ │ ├── docker/
│ │ │ ├── build.sh
│ │ │ └── centos_env/
│ │ │ ├── .gitignore
│ │ │ ├── Dockerfile
│ │ │ ├── build.sh
│ │ │ ├── centos_env/
│ │ │ │ └── __init__.py
│ │ │ ├── gen_dockerfile.py
│ │ │ ├── pyproject.toml
│ │ │ └── run.sh
│ │ ├── mac_store_upload.sh
│ │ ├── prepare/
│ │ │ ├── linux.sh
│ │ │ ├── mac.sh
│ │ │ ├── prepare.py
│ │ │ └── win.bat
│ │ ├── qt_version.py
│ │ ├── release.py
│ │ ├── release.sh
│ │ ├── replace.vbs
│ │ ├── set_version.bat
│ │ ├── set_version.py
│ │ ├── set_version.sh
│ │ ├── setup.iss
│ │ ├── test_package.bat
│ │ ├── updates.py
│ │ ├── updates.sh
│ │ └── version
│ ├── cmake/
│ │ ├── generate_appstream_changelog.cmake
│ │ ├── generate_lang.cmake
│ │ ├── generate_midl.cmake
│ │ ├── generate_numbers.cmake
│ │ ├── generate_scheme.cmake
│ │ ├── lib_ffmpeg.cmake
│ │ ├── lib_prisma.cmake
│ │ ├── lib_stripe.cmake
│ │ ├── lib_tgcalls.cmake
│ │ ├── qrhi_shaders.cmake
│ │ ├── td_export.cmake
│ │ ├── td_forkgram.cmake
│ │ ├── td_iv.cmake
│ │ ├── td_lang.cmake
│ │ ├── td_mtproto.cmake
│ │ ├── td_scheme.cmake
│ │ ├── td_tde2e.cmake
│ │ ├── td_ui.cmake
│ │ ├── telegram_apple_swift_runtime.cmake
│ │ ├── telegram_options.cmake
│ │ └── tests.cmake
│ ├── configure.bat
│ ├── configure.py
│ ├── configure.sh
│ ├── create.bat
│ ├── gyp/
│ │ └── telegram/
│ │ └── sources.txt
│ └── shaders/
│ ├── argb32.frag
│ ├── argb32.vert
│ ├── blur_h.frag
│ ├── blur_v.frag
│ ├── controls.frag
│ ├── demo.frag
│ ├── demo.vert
│ ├── fill.frag
│ ├── fill.vert
│ ├── group_frame.frag
│ ├── group_frame.vert
│ ├── incoming_shadow.frag
│ ├── incoming_yuv420.frag
│ ├── noise.frag
│ ├── nv12.frag
│ ├── nv12_content.frag
│ ├── passthrough.vert
│ ├── pip_argb32.frag
│ ├── pip_controls.frag
│ ├── pip_controls.vert
│ ├── pip_nv12.frag
│ ├── pip_yuv420.frag
│ ├── rounded_corners.frag
│ ├── static_content.frag
│ ├── thanos.frag
│ ├── thanos.vert
│ ├── thanos_init.comp
│ ├── thanos_update.comp
│ ├── transparent_content.frag
│ ├── yuv420.frag
│ └── yuv420_content.frag
├── _config_github_pages.yml
├── changelog.txt
├── docs/
│ ├── api_credentials.md
│ ├── building-linux.md
│ ├── building-mac.md
│ ├── building-mas.md
│ ├── building-win.md
│ └── misc.txt
├── index.html
├── lib/
│ └── xdg/
│ ├── org.telegram.desktop.desktop
│ ├── org.telegram.desktop.metainfo.xml
│ └── org.telegram.desktop.service
├── patches/
│ ├── cmake_qt611.patch
│ └── cmake_zbar.patch
└── snap/
└── snapcraft.yaml
Showing preview only (1,321K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (15763 symbols across 2401 files)
FILE: .github/scripts/generate_changelog.py
function parse_date (line 22) | def parse_date(day: str, month: str, year: str) -> tuple[str, str, str]:
function parse_changelog (line 35) | def parse_changelog(text: str) -> list[dict]:
function render_entry (line 75) | def render_entry(entry: dict) -> str:
function build_html (line 116) | def build_html(entries: list[dict]) -> str:
function main (line 300) | def main():
FILE: Telegram/Resources/export_html/js/script.js
function CheckLocation (line 4) | function CheckLocation() {
function ShowToast (line 17) | function ShowToast(text) {
function ShowHashtag (line 35) | function ShowHashtag(tag) {
function ShowCashtag (line 40) | function ShowCashtag(tag) {
function ShowBotCommand (line 45) | function ShowBotCommand(command) {
function ShowMentionName (line 50) | function ShowMentionName() {
function ShowNotLoadedEmoji (line 55) | function ShowNotLoadedEmoji() {
function ShowNotAvailableEmoji (line 60) | function ShowNotAvailableEmoji() {
function ShowTextCopied (line 65) | function ShowTextCopied(content) {
function ShowSpoiler (line 71) | function ShowSpoiler(target) {
function AddClass (line 77) | function AddClass(element, name) {
function RemoveClass (line 86) | function RemoveClass(element, name) {
function EaseOutQuad (line 102) | function EaseOutQuad(t) {
function EaseInOutQuad (line 106) | function EaseInOutQuad(t) {
function ScrollHeight (line 110) | function ScrollHeight() {
function ScrollTo (line 119) | function ScrollTo(top, callback) {
function ScrollToElement (line 160) | function ScrollToElement(element, callback) {
function GoToMessage (line 176) | function GoToMessage(messageId) {
function GoBack (line 195) | function GoBack(anchor) {
FILE: Telegram/Resources/iv_html/highlight.9.12.0.js
function t (line 2) | function t(e){return e.replace(/&/g,"&").replace(/</g,"<").replac...
function r (line 2) | function r(e){return e.nodeName.toLowerCase()}
function a (line 2) | function a(e,t){var r=e&&e.exec(t);return r&&0===r.index}
function n (line 2) | function n(e){return E.test(e)}
function i (line 2) | function i(e){var t,r,a,i,s=e.className+" ";if(s+=e.parentNode?e.parentN...
function s (line 2) | function s(e){var t,r={},a=Array.prototype.slice.call(arguments,1);for(t...
function c (line 2) | function c(e){var t=[];return function a(e,n){for(var i=e.firstChild;i;i...
function o (line 2) | function o(e,a,n){function i(){return e.length&&a.length?e[0].offset!==a...
function l (line 2) | function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map...
function u (line 2) | function u(e){function t(e){return e&&e.source||e}function r(r,a){return...
function d (line 2) | function d(e,r,n,i){function s(e,t){var r,n;for(r=0,n=t.c.length;n>r;r++...
function b (line 2) | function b(e,r){r=r||L.languages||k(x);var a={r:0,value:t(e)},n=a;return...
function p (line 2) | function p(e){return L.tabReplace||L.useBR?e.replace(B,function(e,t){ret...
function m (line 2) | function m(e,t,r){var a=t?C[t]:r,n=[e.trim()];return e.match(/\bhljs\b/)...
function f (line 2) | function f(e){var t,r,a,s,l,u=i(e);n(u)||(L.useBR?(t=document.createElem...
function g (line 2) | function g(e){L=s(L,e)}
function _ (line 2) | function _(){if(!_.called){_.called=!0;var e=document.querySelectorAll("...
function h (line 2) | function h(){addEventListener("DOMContentLoaded",_,!1),addEventListener(...
function v (line 2) | function v(t,r){var a=x[t]=r(e);a.aliases&&a.aliases.forEach(function(e)...
function y (line 2) | function y(){return k(x)}
function w (line 2) | function w(e){return e=(e||"").toLowerCase(),x[e]||x[C[e]]}
FILE: Telegram/Resources/iv_html/morphdom-umd.min.2.7.2.js
function morphAttrs (line 1) | function morphAttrs(fromNode,toNode){var toNodeAttrs=toNode.attributes;v...
function createFragmentFromTemplate (line 1) | function createFragmentFromTemplate(str){var template=doc.createElement(...
function createFragmentFromRange (line 1) | function createFragmentFromRange(str){if(!range){range=doc.createRange()...
function createFragmentFromWrap (line 1) | function createFragmentFromWrap(str){var fragment=doc.createElement("bod...
function toElement (line 1) | function toElement(str){str=str.trim();if(HAS_TEMPLATE_SUPPORT){return c...
function compareNodeNames (line 1) | function compareNodeNames(fromEl,toEl){var fromNodeName=fromEl.nodeName;...
function createElementNS (line 1) | function createElementNS(name,namespaceURI){return!namespaceURI||namespa...
function moveChildren (line 1) | function moveChildren(fromEl,toEl){var curChild=fromEl.firstChild;while(...
function syncBooleanAttrProp (line 1) | function syncBooleanAttrProp(fromEl,toEl,name){if(fromEl[name]!==toEl[na...
function noop (line 1) | function noop(){}
function defaultGetNodeKey (line 1) | function defaultGetNodeKey(node){if(node){return node.getAttribute&&node...
function morphdomFactory (line 1) | function morphdomFactory(morphAttrs){return function morphdom(fromNode,t...
FILE: Telegram/SourceFiles/_other/packer.cpp
type BIODeleter (line 44) | struct BIODeleter {
function makeBIO (line 50) | inline auto makeBIO(const void *buf, int len) {
function uint32 (line 56) | inline uint32 sha1Shift(uint32 v, uint32 shift) {
function sha1PartHash (line 60) | void sha1PartHash(uint32 *sha, uint32 *temp) {
function int32 (line 96) | int32 *hashSha1(const void *data, uint32 len, void *dest) {
function writeAlphaKey (line 136) | int writeAlphaKey() {
function main (line 151) | int main(int argc, char *argv[])
function QString (line 521) | QString countAlphaVersionSignature(quint64 version) { // duplicated in a...
FILE: Telegram/SourceFiles/_other/startup_task_win.cpp
function ExecutableDirectory (line 18) | [[nodiscard]] std::wstring ExecutableDirectory() {
function wWinMain (line 39) | int APIENTRY wWinMain(
FILE: Telegram/SourceFiles/_other/updater_linux.cpp
function do_mkdir (line 31) | bool do_mkdir(const char *path) { // from http://stackoverflow.com/quest...
function openLog (line 54) | void openLog() {
function closeLog (line 73) | void closeLog() {
function writeLog (line 80) | void writeLog(const char *format, ...) {
function copyFile (line 93) | bool copyFile(const char *from, const char *to) {
function remove_directory (line 135) | bool remove_directory(const string &path) { // from http://stackoverflow...
function mkpath (line 175) | bool mkpath(const char *path) {
function equal (line 197) | bool equal(string a, string b) {
function delFolder (line 203) | void delFolder() {
function update (line 216) | bool update() {
function string (line 348) | string CurrentExecutablePath(int argc, char *argv[]) {
function main (line 360) | int main(int argc, char *argv[]) {
FILE: Telegram/SourceFiles/_other/updater_win.cpp
function equal (line 16) | bool equal(const wstring &a, const wstring &b) {
function updateError (line 20) | void updateError(const WCHAR *msg, DWORD errorCode) {
function openLog (line 45) | void openLog() {
function closeLog (line 73) | void closeLog() {
function writeLog (line 80) | void writeLog(const wstring &msg) {
function fullClearPath (line 99) | void fullClearPath(const wstring &dir) {
function delFolder (line 120) | void delFolder() {
function update (line 130) | bool update() {
function updateRegistry (line 278) | void updateRegistry() {
function wWinMain (line 333) | int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE prevInstance, LPWSTR...
function HANDLE (line 510) | HANDLE _generateDumpFileAtPath(const WCHAR *path) {
function _generateDump (line 549) | void _generateDump(EXCEPTION_POINTERS* pExceptionPointers) {
function LONG (line 593) | LONG CALLBACK _exceptionFilter(EXCEPTION_POINTERS* pExceptionPointers) {
function LPTOP_LEVEL_EXCEPTION_FILTER (line 599) | LPTOP_LEVEL_EXCEPTION_FILTER WINAPI RedirectedSetUnhandledExceptionFilte...
FILE: Telegram/SourceFiles/api/api_as_copy.cpp
type Api::AsCopy (line 27) | namespace Api::AsCopy {
function MTPInputSingleMedia (line 30) | MTPInputSingleMedia PrepareAlbumItemMedia(
function MTPinputMedia (line 59) | MTPinputMedia InputMediaFromItem(not_null<HistoryItem*> i) {
function FullReplyTo (line 81) | FullReplyTo ReplyToIdFromDraft(not_null<PeerData*> peer) {
function SendAlbumFromItems (line 112) | void SendAlbumFromItems(
function GuardedSendExistingAlbumFromItem (line 167) | void GuardedSendExistingAlbumFromItem(
function SendExistingMediaFromItem (line 180) | void SendExistingMediaFromItem(
function UpdateFileRef (line 208) | void UpdateFileRef(
FILE: Telegram/SourceFiles/api/api_as_copy.h
type TextWithTags (line 12) | struct TextWithTags
function namespace (line 14) | namespace Api::AsCopy {
FILE: Telegram/SourceFiles/api/api_attached_stickers.cpp
type Api (line 19) | namespace Api {
FILE: Telegram/SourceFiles/api/api_attached_stickers.h
function namespace (line 16) | namespace Window {
function namespace (line 20) | namespace Api {
FILE: Telegram/SourceFiles/api/api_authorizations.cpp
type Api (line 20) | namespace Api {
function ParseEntry (line 27) | Authorizations::Entry ParseEntry(const MTPDauthorization &data) {
function QString (line 257) | QString Authorizations::ActiveDateString(TimeId active) {
FILE: Telegram/SourceFiles/api/api_authorizations.h
function namespace (line 15) | namespace Api {
FILE: Telegram/SourceFiles/api/api_blocked_peers.cpp
type Api (line 18) | namespace Api {
function TLToSlice (line 24) | BlockedPeers::Slice TLToSlice(
FILE: Telegram/SourceFiles/api/api_blocked_peers.h
function namespace (line 14) | namespace Main {
function namespace (line 18) | namespace Api {
FILE: Telegram/SourceFiles/api/api_bot.cpp
type Api (line 49) | namespace Api {
function SendBotCallbackData (line 52) | void SendBotCallbackData(
function HideSingleUseKeyboard (line 174) | void HideSingleUseKeyboard(
function SendBotCallbackData (line 182) | void SendBotCallbackData(
function SendBotCallbackDataWithPassword (line 190) | void SendBotCallbackDataWithPassword(
function SwitchInlineBotButtonReceived (line 282) | bool SwitchInlineBotButtonReceived(
function ActivateBotCommand (line 293) | void ActivateBotCommand(ClickHandlerContext context, int row, int colu...
FILE: Telegram/SourceFiles/api/api_bot.h
type ClickHandlerContext (line 10) | struct ClickHandlerContext
function namespace (line 13) | namespace Window {
function namespace (line 17) | namespace Api {
FILE: Telegram/SourceFiles/api/api_chat_filters.cpp
type Api (line 40) | namespace Api {
type ToggleAction (line 43) | enum class ToggleAction {
class ToggleChatsController (line 48) | class ToggleChatsController final
function TitleText (line 98) | [[nodiscard]] tr::phrase<> TitleText(Ui::FilterLinkHeaderType type) {
function TextWithEntities (line 109) | [[nodiscard]] TextWithEntities AboutText(
function InitFilterLinkHeader (line 139) | void InitFilterLinkHeader(
function ImportInvite (line 219) | void ImportInvite(
function ShowImportError (line 511) | void ShowImportError(
function ShowImportToast (line 536) | void ShowImportToast(
function HandleEnterInBox (line 568) | void HandleEnterInBox(not_null<Ui::BoxContent*> box) {
function ProcessFilterInvite (line 588) | void ProcessFilterInvite(
function ProcessFilterInvite (line 690) | void ProcessFilterInvite(
function SaveNewFilterPinned (line 719) | void SaveNewFilterPinned(
function CheckFilterInvite (line 732) | void CheckFilterInvite(
function ProcessFilterUpdate (line 815) | void ProcessFilterUpdate(
function ProcessFilterRemove (line 826) | void ProcessFilterRemove(
function ExtractSuggestRemoving (line 901) | [[nodiscard]] std::vector<not_null<PeerData*>> ExtractSuggestRemoving(
FILE: Telegram/SourceFiles/api/api_chat_filters.h
function namespace (line 10) | namespace Main {
function namespace (line 14) | namespace Window {
function namespace (line 18) | namespace Data {
function namespace (line 23) | namespace Api {
FILE: Telegram/SourceFiles/api/api_chat_filters_remove_manager.cpp
type Api (line 23) | namespace Api {
function RemoveChatFilter (line 26) | void RemoveChatFilter(
FILE: Telegram/SourceFiles/api/api_chat_filters_remove_manager.h
function namespace (line 10) | namespace Window {
function namespace (line 14) | namespace Ui {
function namespace (line 18) | namespace Api {
FILE: Telegram/SourceFiles/api/api_chat_invite.cpp
type Api (line 47) | namespace Api {
type InviteParticipant (line 51) | struct InviteParticipant {
type ChatInvite (line 56) | struct ChatInvite {
function ChatInvite (line 72) | [[nodiscard]] ChatInvite ParseInvite(
function BadgeForInvite (line 102) | [[nodiscard]] Info::Profile::BadgeType BadgeForInvite(
function SubmitChatInvite (line 114) | void SubmitChatInvite(
function ConfirmSubscriptionBox (line 182) | void ConfirmSubscriptionBox(
function ConfirmInviteBox (line 422) | void ConfirmInviteBox(
function CheckChatInvite (line 625) | void CheckChatInvite(
FILE: Telegram/SourceFiles/api/api_chat_invite.h
function namespace (line 12) | namespace Main {
function namespace (line 16) | namespace Window {
function namespace (line 20) | namespace Api {
FILE: Telegram/SourceFiles/api/api_chat_links.cpp
type Api (line 15) | namespace Api {
function ChatLink (line 18) | [[nodiscard]] ChatLink FromMTP(
function MTPInputBusinessChatLink (line 35) | [[nodiscard]] MTPInputBusinessChatLink ToMTP(
FILE: Telegram/SourceFiles/api/api_chat_links.h
function namespace (line 12) | namespace Api {
FILE: Telegram/SourceFiles/api/api_chat_participants.cpp
type Api (line 24) | namespace Api {
function ParseList (line 41) | std::vector<ChatParticipant> ParseList(
function ApplyMegagroupAdmins (line 51) | void ApplyMegagroupAdmins(not_null<ChannelData*> channel, Members list) {
function RefreshChannelAdmins (line 99) | void RefreshChannelAdmins(
function ApplyLastList (line 115) | void ApplyLastList(
function ApplyBotsList (line 185) | void ApplyBotsList(
function ParseSimilarChannels (line 224) | [[nodiscard]] ChatParticipants::Peers ParseSimilarChannels(
function ParseSimilarChannels (line 246) | [[nodiscard]] ChatParticipants::Peers ParseSimilarChannels(
function ParseSimilarBots (line 252) | [[nodiscard]] ChatParticipants::Peers ParseSimilarBots(
function UserId (line 376) | UserId ChatParticipant::by() const {
function PeerId (line 380) | PeerId ChatParticipant::id() const {
function UserId (line 384) | UserId ChatParticipant::userId() const {
function ChatRestrictionsInfo (line 388) | ChatRestrictionsInfo ChatParticipant::restrictions() const {
function ChatAdminRightsInfo (line 392) | ChatAdminRightsInfo ChatParticipant::rights() const {
function TimeId (line 396) | TimeId ChatParticipant::subscriptionDate() const {
function TimeId (line 400) | TimeId ChatParticipant::promotedSince() const {
function TimeId (line 404) | TimeId ChatParticipant::restrictedSince() const {
function TimeId (line 410) | TimeId ChatParticipant::memberSince() const {
function QString (line 418) | QString ChatParticipant::rank() const {
FILE: Telegram/SourceFiles/api/api_chat_participants.h
function namespace (line 17) | namespace Main {
function namespace (line 21) | namespace Ui {
function namespace (line 25) | namespace Api {
FILE: Telegram/SourceFiles/api/api_cloud_password.cpp
type Api (line 18) | namespace Api {
function ProcessMtpState (line 21) | [[nodiscard]] Core::CloudPasswordState ProcessMtpState(
function RequestLoginEmailCode (line 547) | void RequestLoginEmailCode(
function VerifyLoginEmail (line 562) | void VerifyLoginEmail(
FILE: Telegram/SourceFiles/api/api_cloud_password.h
function namespace (line 12) | namespace Core {
function namespace (line 18) | namespace Main {
function namespace (line 22) | namespace Api {
FILE: Telegram/SourceFiles/api/api_common.cpp
type Api (line 15) | namespace Api {
function MTPSuggestedPost (line 17) | MTPSuggestedPost SuggestToMTP(SuggestOptions suggest) {
function SendOptions (line 37) | SendOptions DefaultSendWhenOnlineOptions() {
function MTPInputReplyTo (line 44) | MTPInputReplyTo SendAction::mtpReplyTo() const {
FILE: Telegram/SourceFiles/api/api_common.h
function namespace (line 14) | namespace Data {
function namespace (line 18) | namespace Api {
FILE: Telegram/SourceFiles/api/api_compose_with_ai.cpp
type Api (line 13) | namespace Api {
function MTPTextWithEntities (line 16) | [[nodiscard]] MTPTextWithEntities Serialize(
function mtpRequestId (line 31) | mtpRequestId ComposeWithAi::request(
FILE: Telegram/SourceFiles/api/api_compose_with_ai.h
function namespace (line 18) | namespace Main {
function namespace (line 22) | namespace Api {
FILE: Telegram/SourceFiles/api/api_confirm_phone.cpp
type Api (line 19) | namespace Api {
FILE: Telegram/SourceFiles/api/api_confirm_phone.h
function namespace (line 14) | namespace Window {
function namespace (line 18) | namespace Api {
FILE: Telegram/SourceFiles/api/api_credits.cpp
type Api (line 26) | namespace Api {
function SubscriptionFromTL (line 31) | [[nodiscard]] Data::SubscriptionEntry SubscriptionFromTL(
function StatusFromTL (line 57) | [[nodiscard]] Data::CreditsStatusSlice StatusFromTL(
function PremiumPeerBot (line 241) | rpl::producer<not_null<PeerData*>> PremiumPeerBot(
function EditCreditsSubscription (line 387) | void EditCreditsSubscription(
function MTPInputSavedStarGift (line 403) | MTPInputSavedStarGift InputSavedStarGiftId(
FILE: Telegram/SourceFiles/api/api_credits.h
function namespace (line 15) | namespace Data {
function namespace (line 19) | namespace Main {
function namespace (line 25) | namespace Api {
FILE: Telegram/SourceFiles/api/api_credits_history_entry.cpp
type Api (line 21) | namespace Api {
function CreditsHistoryEntryFromTL (line 23) | Data::CreditsHistoryEntry CreditsHistoryEntryFromTL(
FILE: Telegram/SourceFiles/api/api_credits_history_entry.h
function namespace (line 12) | namespace Data {
function namespace (line 16) | namespace Api {
FILE: Telegram/SourceFiles/api/api_earn.cpp
type Api (line 21) | namespace Api {
function RestrictSponsored (line 23) | void RestrictSponsored(
function HandleWithdrawalButton (line 37) | void HandleWithdrawalButton(
FILE: Telegram/SourceFiles/api/api_earn.h
function namespace (line 12) | namespace Ui {
function namespace (line 17) | namespace Api {
FILE: Telegram/SourceFiles/api/api_editing.cpp
type Api (line 31) | namespace Api {
function mtpRequestId (line 53) | mtpRequestId SuggestMessage(
function mtpRequestId (line 102) | mtpRequestId SuggestMedia(
function mtpRequestId (line 196) | mtpRequestId SuggestMessageOrMedia(
function mtpRequestId (line 242) | mtpRequestId EditMessage(
function mtpRequestId (line 356) | mtpRequestId EditMessage(
function EditMessageWithUploadedMedia (line 376) | void EditMessageWithUploadedMedia(
function RescheduleMessage (line 411) | void RescheduleMessage(
function EditMessageWithUploadedDocument (line 419) | void EditMessageWithUploadedDocument(
function EditMessageWithUploadedPhoto (line 432) | void EditMessageWithUploadedPhoto(
function mtpRequestId (line 445) | mtpRequestId EditCaption(
function mtpRequestId (line 460) | mtpRequestId EditTextMessage(
function EditTodoList (line 571) | void EditTodoList(
type Fork (line 589) | namespace Fork {
function EditMessageMedia (line 591) | void EditMessageMedia(
FILE: Telegram/SourceFiles/api/api_editing.h
function namespace (line 12) | namespace Data {
function namespace (line 16) | namespace MTP {
function namespace (line 20) | namespace Api {
FILE: Telegram/SourceFiles/api/api_filter_updates.h
function namespace (line 10) | namespace Api {
FILE: Telegram/SourceFiles/api/api_global_privacy.cpp
type Api (line 16) | namespace Api {
function PeerId (line 18) | PeerId ParsePaidReactionShownPeer(
function UnarchiveOnNewMessage (line 86) | UnarchiveOnNewMessage GlobalPrivacy::unarchiveOnNewMessageCurrent() co...
function DisallowedGiftTypes (line 158) | DisallowedGiftTypes GlobalPrivacy::disallowedGiftTypesCurrent() const {
function PeerId (line 192) | PeerId GlobalPrivacy::paidReactionShownPeerCurrent() const {
FILE: Telegram/SourceFiles/api/api_global_privacy.h
function namespace (line 15) | namespace Main {
type class (line 21) | enum class
type class (line 27) | enum class
function is_flag_type (line 35) | inline constexpr bool is_flag_type(DisallowedGiftType) { return true; }
FILE: Telegram/SourceFiles/api/api_hash.cpp
type Api (line 15) | namespace Api {
function uint64 (line 18) | [[nodiscard]] uint64 CountDocumentVectorHash(
function uint64 (line 27) | [[nodiscard]] uint64 CountSpecialStickerSetHash(
function uint64 (line 38) | [[nodiscard]] uint64 CountStickersOrderHash(
function uint64 (line 63) | [[nodiscard]] uint64 CountFeaturedHash(
function uint64 (line 82) | uint64 CountStickersHash(
function uint64 (line 91) | uint64 CountMasksHash(
function uint64 (line 100) | uint64 CountCustomEmojiHash(
function uint64 (line 109) | uint64 CountRecentStickersHash(
function uint64 (line 119) | uint64 CountFavedStickersHash(not_null<Main::Session*> session) {
function uint64 (line 123) | uint64 CountFeaturedStickersHash(not_null<Main::Session*> session) {
function uint64 (line 129) | uint64 CountFeaturedEmojiHash(not_null<Main::Session*> session) {
function uint64 (line 135) | uint64 CountSavedGifsHash(not_null<Main::Session*> session) {
FILE: Telegram/SourceFiles/api/api_hash.h
function namespace (line 10) | namespace Main {
function namespace (line 14) | namespace Api {
FILE: Telegram/SourceFiles/api/api_invite_links.cpp
type Api (line 21) | namespace Api {
function BringPermanentToFront (line 28) | void BringPermanentToFront(PeerInviteLinks &links) {
function RemovePermanent (line 38) | void RemovePermanent(PeerInviteLinks &links) {
function JoinedByLinkSlice (line 47) | JoinedByLinkSlice ParseJoinedByLinkSlice(
FILE: Telegram/SourceFiles/api/api_invite_links.h
function namespace (line 14) | namespace Api {
type ProcessRequest (line 166) | struct ProcessRequest {
type AllRevokedDestroyed (line 237) | struct AllRevokedDestroyed {
FILE: Telegram/SourceFiles/api/api_media.cpp
type Api (line 15) | namespace Api {
function ComposeSendingDocumentAttributes (line 18) | MTPVector<MTPDocumentAttribute> ComposeSendingDocumentAttributes(
function MTPInputMedia (line 80) | MTPInputMedia PrepareUploadedPhoto(
function MTPInputMedia (line 100) | MTPInputMedia PrepareUploadedDocument(
function HasAttachedStickers (line 132) | bool HasAttachedStickers(MTPInputMedia media) {
FILE: Telegram/SourceFiles/api/api_media.h
function namespace (line 12) | namespace Api {
FILE: Telegram/SourceFiles/api/api_messages_search.cpp
type Api (line 20) | namespace Api {
function MessageIdsList (line 25) | [[nodiscard]] MessageIdsList HistoryItemsFromTL(
function QString (line 47) | [[nodiscard]] QString RequestToToken(
function MTPMessagesFilter (line 68) | [[nodiscard]] MTPMessagesFilter PrepareFilter(SearchFilter filter) {
FILE: Telegram/SourceFiles/api/api_messages_search.h
function namespace (line 17) | namespace Data {
function namespace (line 21) | namespace Api {
FILE: Telegram/SourceFiles/api/api_messages_search_merged.cpp
type Api (line 12) | namespace Api {
function FoundMessages (line 79) | const FoundMessages &MessagesSearchMerged::messages() const {
FILE: Telegram/SourceFiles/api/api_messages_search_merged.h
function namespace (line 15) | namespace Data {
function namespace (line 19) | namespace Api {
FILE: Telegram/SourceFiles/api/api_peer_colors.cpp
type Api (line 16) | namespace Api {
FILE: Telegram/SourceFiles/api/api_peer_colors.h
function namespace (line 16) | namespace Ui {
function namespace (line 20) | namespace Api {
FILE: Telegram/SourceFiles/api/api_peer_photo.cpp
type Api (line 32) | namespace Api {
function PreparePeerPhoto (line 37) | [[nodiscard]] std::shared_ptr<FilePrepareResult> PreparePeerPhoto(
function PrepareMtpMarkup (line 96) | [[nodiscard]] std::optional<MTPVideoSize> PrepareMtpMarkup(
function PhotoData (line 677) | PhotoData *PeerPhoto::nonPersonalPhoto(
FILE: Telegram/SourceFiles/api/api_peer_photo.h
function namespace (line 16) | namespace Data {
function namespace (line 20) | namespace Main {
function namespace (line 24) | namespace Api {
FILE: Telegram/SourceFiles/api/api_peer_search.cpp
type Api (line 16) | namespace Api {
FILE: Telegram/SourceFiles/api/api_peer_search.h
function namespace (line 10) | namespace Main {
function namespace (line 14) | namespace Api {
FILE: Telegram/SourceFiles/api/api_polls.cpp
type Api (line 25) | namespace Api {
FILE: Telegram/SourceFiles/api/api_polls.h
type PollData (line 15) | struct PollData
type PollMedia (line 16) | struct PollMedia
function namespace (line 18) | namespace Main {
function namespace (line 22) | namespace Api {
FILE: Telegram/SourceFiles/api/api_premium.cpp
type Api (line 29) | namespace Api {
function GiftCode (line 32) | [[nodiscard]] GiftCode Parse(const MTPDpayments_checkedGiftCode &data) {
function GiftCodesFromTL (line 44) | [[nodiscard]] Data::PremiumSubscriptionOptions GiftCodesFromTL(
function FindStarsForResale (line 67) | [[nodiscard]] int FindStarsForResale(const MTPVector<MTPStarsAmount> *...
function int64 (line 79) | [[nodiscard]] int64 FindTonForResale(const MTPVector<MTPStarsAmount> *...
function int64 (line 154) | int64 Premium::monthlyAmount() const {
function QString (line 158) | QString Premium::monthlyCurrency() const {
function GiftCode (line 323) | GiftCode Premium::updateGiftCode(
function MessageMoneyRestriction (line 758) | MessageMoneyRestriction ResolveMessageMoneyRestrictions(
function RandomHelloStickerValue (line 816) | rpl::producer<DocumentData*> RandomHelloStickerValue(
function FromTL (line 836) | std::optional<Data::StarGift> FromTL(
function FromTL (line 996) | std::optional<Data::SavedStarGift> FromTL(
function ParseRarity (line 1049) | int ParseRarity(const MTPStarGiftAttributeRarity &rarity) {
function FromTL (line 1063) | Data::UniqueGiftModel FromTL(
function FromTL (line 1074) | Data::UniqueGiftPattern FromTL(
function FromTL (line 1086) | Data::UniqueGiftBackdrop FromTL(const MTPDstarGiftAttributeBackdrop &d...
function FromTL (line 1101) | Data::UniqueGiftOriginalDetails FromTL(
FILE: Telegram/SourceFiles/api/api_premium.h
function namespace (line 17) | namespace Main {
function namespace (line 21) | namespace Payments {
function namespace (line 25) | namespace Api {
function GiveawayState (line 45) | enum class GiveawayState {
FILE: Telegram/SourceFiles/api/api_premium_option.cpp
type Api (line 12) | namespace Api {
function CreateSubscriptionOption (line 16) | Data::PremiumSubscriptionOption CreateSubscriptionOption(
FILE: Telegram/SourceFiles/api/api_premium_option.h
function namespace (line 12) | namespace Api {
FILE: Telegram/SourceFiles/api/api_reactions_notify_settings.cpp
type Api (line 13) | namespace Api {
function ReactionsNotifyFrom (line 16) | [[nodiscard]] ReactionsNotifyFrom ParseFrom(
function MTPReactionNotificationsFrom (line 25) | [[nodiscard]] MTPReactionNotificationsFrom SerializeFrom(
function ReactionsNotifyFrom (line 87) | ReactionsNotifyFrom ReactionsNotifySettings::messagesFromCurrent() con...
function ReactionsNotifyFrom (line 95) | ReactionsNotifyFrom ReactionsNotifySettings::pollVotesFromCurrent() co...
FILE: Telegram/SourceFiles/api/api_reactions_notify_settings.h
function namespace (line 14) | namespace Main {
function namespace (line 18) | namespace Api {
FILE: Telegram/SourceFiles/api/api_read_metrics.cpp
type Api (line 13) | namespace Api {
FILE: Telegram/SourceFiles/api/api_read_metrics.h
function namespace (line 16) | namespace Api {
FILE: Telegram/SourceFiles/api/api_report.cpp
type Api (line 22) | namespace Api {
function MTPreportReason (line 26) | MTPreportReason ReasonToTL(const Ui::ReportReason &reason) {
function SendPhotoReport (line 45) | void SendPhotoReport(
function CreateReportMessagesOrStoriesCallback (line 61) | auto CreateReportMessagesOrStoriesCallback(
function ReportSpam (line 147) | void ReportSpam(
FILE: Telegram/SourceFiles/api/api_report.h
function namespace (line 14) | namespace Ui {
function namespace (line 19) | namespace Data {
function namespace (line 23) | namespace Api {
FILE: Telegram/SourceFiles/api/api_ringtones.cpp
type Api (line 24) | namespace Api {
function PrepareRingtoneDocument (line 27) | std::shared_ptr<FilePrepareResult> PrepareRingtoneDocument(
function int64 (line 187) | int64 Ringtones::maxSize() const {
FILE: Telegram/SourceFiles/api/api_ringtones.h
function namespace (line 15) | namespace Main {
function namespace (line 19) | namespace Api {
FILE: Telegram/SourceFiles/api/api_self_destruct.cpp
type Api (line 12) | namespace Api {
function TimeId (line 48) | TimeId SelfDestruct::periodDefaultHistoryTTLCurrent() const {
FILE: Telegram/SourceFiles/api/api_self_destruct.h
function namespace (line 14) | namespace Api {
FILE: Telegram/SourceFiles/api/api_send_progress.cpp
type Api (line 18) | namespace Api {
FILE: Telegram/SourceFiles/api/api_send_progress.h
function namespace (line 15) | namespace Main {
function namespace (line 19) | namespace Api {
FILE: Telegram/SourceFiles/api/api_sending.cpp
type Api (line 37) | namespace Api {
function InnerFillMessagePostFlags (line 40) | void InnerFillMessagePostFlags(
function SendSimpleMedia (line 68) | void SendSimpleMedia(SendAction action, MTPInputMedia inputMedia) {
function SendExistingMedia (line 157) | void SendExistingMedia(
function SendExistingDocument (line 300) | void SendExistingDocument(
function SendExistingPhoto (line 327) | void SendExistingPhoto(
function SendExistingDocument (line 346) | void SendExistingDocument(
function SendExistingPhoto (line 373) | void SendExistingPhoto(
function SendDice (line 392) | bool SendDice(MessageToSend &message) {
function SendLocation (line 539) | void SendLocation(SendAction action, float64 lat, float64 lon) {
function SendVenue (line 550) | void SendVenue(SendAction action, Data::InputVenue venue) {
function FillMessagePostFlags (line 566) | void FillMessagePostFlags(
function SendConfirmedFile (line 573) | void SendConfirmedFile(
FILE: Telegram/SourceFiles/api/api_sending.h
type FilePrepareResult (line 15) | struct FilePrepareResult
function namespace (line 17) | namespace Data {
function namespace (line 21) | namespace Main {
function namespace (line 25) | namespace Api {
FILE: Telegram/SourceFiles/api/api_sensitive_content.cpp
type Api (line 14) | namespace Api {
FILE: Telegram/SourceFiles/api/api_sensitive_content.h
function namespace (line 15) | namespace Main {
function namespace (line 19) | namespace Api {
FILE: Telegram/SourceFiles/api/api_single_message_search.cpp
type Api (line 19) | namespace Api {
function Key (line 24) | Key ExtractKey(const QString &query) {
function QString (line 221) | QString ConvertPeerSearchQuery(const QString &query) {
FILE: Telegram/SourceFiles/api/api_single_message_search.h
function namespace (line 10) | namespace Main {
function namespace (line 14) | namespace Api {
function class (line 40) | class SingleMessageSearch {
FILE: Telegram/SourceFiles/api/api_statistics.cpp
type Api (line 22) | namespace Api {
function StatisticalValueFromTL (line 25) | [[nodiscard]] Data::StatisticalValue StatisticalValueFromTL(
function ChannelStatisticsFromTL (line 38) | [[nodiscard]] Data::ChannelStatistics ChannelStatisticsFromTL(
function SupergroupStatisticsFromTL (line 127) | [[nodiscard]] Data::SupergroupStatistics SupergroupStatisticsFromTL(
FILE: Telegram/SourceFiles/api/api_statistics.h
function namespace (line 18) | namespace Api {
FILE: Telegram/SourceFiles/api/api_statistics_data_deserialize.cpp
type Api (line 13) | namespace Api {
function StatisticalGraphFromTL (line 15) | Data::StatisticalGraph StatisticalGraphFromTL(const MTPStatsGraph &tl) {
FILE: Telegram/SourceFiles/api/api_statistics_data_deserialize.h
function namespace (line 10) | namespace Data {
function namespace (line 14) | namespace Api {
FILE: Telegram/SourceFiles/api/api_statistics_sender.cpp
type Api (line 15) | namespace Api {
FILE: Telegram/SourceFiles/api/api_statistics_sender.h
function namespace (line 17) | namespace Api {
FILE: Telegram/SourceFiles/api/api_suggest_post.cpp
type Api (line 41) | namespace Api {
function SendApproval (line 44) | void SendApproval(
function ConfirmApproval (line 83) | void ConfirmApproval(
function SendDecline (line 244) | void SendDecline(
function RequestApprovalDate (line 284) | void RequestApprovalDate(
function RequestDeclineComment (line 311) | void RequestDeclineComment(
type SendSuggestState (line 363) | struct SendSuggestState {
function SendSuggest (line 366) | void SendSuggest(
function SuggestApprovalDate (line 418) | void SuggestApprovalDate(
function SuggestOfferForMessage (line 456) | void SuggestOfferForMessage(
function SuggestApprovalPrice (line 492) | void SuggestApprovalPrice(
function ConfirmGiftSaleAccept (line 509) | void ConfirmGiftSaleAccept(
function ConfirmGiftSaleDecline (line 516) | void ConfirmGiftSaleDecline(
function RespondToNoForwardsRequest (line 523) | void RespondToNoForwardsRequest(
function AcceptClickHandler (line 559) | std::shared_ptr<ClickHandler> AcceptClickHandler(
function DeclineClickHandler (line 591) | std::shared_ptr<ClickHandler> DeclineClickHandler(
function SuggestChangesClickHandler (line 619) | std::shared_ptr<ClickHandler> SuggestChangesClickHandler(
function AddOfferToMessage (line 693) | void AddOfferToMessage(
FILE: Telegram/SourceFiles/api/api_suggest_post.h
function namespace (line 12) | namespace Main {
function namespace (line 16) | namespace Api {
FILE: Telegram/SourceFiles/api/api_text_entities.cpp
type Api (line 19) | namespace Api {
function QString (line 24) | [[nodiscard]] QString CustomEmojiEntityData(
function CustomEmojiEntity (line 29) | [[nodiscard]] std::optional<MTPMessageEntity> CustomEmojiEntity(
function MentionNameEntity (line 43) | [[nodiscard]] std::optional<MTPMessageEntity> MentionNameEntity(
function EntitiesInText (line 73) | EntitiesInText EntitiesFromMTP(
function EntitiesToMTP (line 275) | MTPVector<MTPMessageEntity> EntitiesToMTP(
function TextWithEntities (line 427) | TextWithEntities ParseTextWithEntities(
FILE: Telegram/SourceFiles/api/api_text_entities.h
function namespace (line 12) | namespace Main {
function namespace (line 16) | namespace Api {
FILE: Telegram/SourceFiles/api/api_todo_lists.cpp
type Api (line 23) | namespace Api {
FILE: Telegram/SourceFiles/api/api_todo_lists.h
type TodoListItem (line 15) | struct TodoListItem
type TodoListData (line 16) | struct TodoListData
function namespace (line 18) | namespace Main {
function namespace (line 22) | namespace Api {
FILE: Telegram/SourceFiles/api/api_toggling_media.cpp
type Api (line 18) | namespace Api {
function ToggleExistingMedia (line 22) | void ToggleExistingMedia(
function ToggleFavedSticker (line 50) | void ToggleFavedSticker(
function ToggleFavedSticker (line 61) | void ToggleFavedSticker(
function ToggleRecentSticker (line 81) | void ToggleRecentSticker(
function ToggleSavedGif (line 105) | void ToggleSavedGif(
function ToggleSavedRingtone (line 127) | void ToggleSavedRingtone(
FILE: Telegram/SourceFiles/api/api_toggling_media.h
function namespace (line 10) | namespace ChatHelpers {
function namespace (line 14) | namespace Api {
FILE: Telegram/SourceFiles/api/api_transcribes.cpp
type Api (line 25) | namespace Api {
function TimeId (line 79) | TimeId Transcribes::trialsRefreshAt() {
function SummaryEntry (line 145) | const SummaryEntry &Transcribes::summary(
FILE: Telegram/SourceFiles/api/api_transcribes.h
function namespace (line 15) | namespace Main {
function namespace (line 19) | namespace Api {
FILE: Telegram/SourceFiles/api/api_unread_things.cpp
type Api (line 21) | namespace Api {
FILE: Telegram/SourceFiles/api/api_unread_things.h
function namespace (line 14) | namespace Data {
function namespace (line 18) | namespace Api {
FILE: Telegram/SourceFiles/api/api_updates.cpp
type Api (line 73) | namespace Api {
type DataIsLoadedResult (line 87) | enum class DataIsLoadedResult {
function PeerDataIsLoaded (line 94) | [[nodiscard]] bool PeerDataIsLoaded(
function MentionUsersDataIsLoaded (line 100) | [[nodiscard]] bool MentionUsersDataIsLoaded(
function ForwardedInfoDataIsLoaded (line 121) | [[nodiscard]] bool ForwardedInfoDataIsLoaded(
function ReplyDataIsLoaded (line 134) | [[nodiscard]] bool ReplyDataIsLoaded(
function DataIsLoaded (line 149) | [[nodiscard]] bool DataIsLoaded(
function DataIsLoaded (line 163) | [[nodiscard]] bool DataIsLoaded(
function ProcessScheduledMessageWithElapsedTime (line 178) | void ProcessScheduledMessageWithElapsedTime(
function IsForceLogoutNotification (line 194) | bool IsForceLogoutNotification(const MTPDupdateServiceNotification &da...
function HasForceLogoutNotification (line 198) | bool HasForceLogoutNotification(const MTPUpdates &updates) {
function ApiWrap (line 281) | ApiWrap &Updates::api() const {
function int32 (line 967) | int32 Updates::pts() const {
function IsWithdrawalNotification (line 2827) | bool IsWithdrawalNotification(const MTPDupdateServiceNotification &dat...
FILE: Telegram/SourceFiles/api/api_updates.h
function namespace (line 16) | namespace MTP {
function namespace (line 20) | namespace Main {
function namespace (line 24) | namespace ChatHelpers {
function namespace (line 28) | namespace Api {
FILE: Telegram/SourceFiles/api/api_user_names.cpp
type Api (line 16) | namespace Api {
function UsernameFromTL (line 19) | [[nodiscard]] Data::Username UsernameFromTL(const MTPUsername &usernam...
function BotUserInput (line 27) | [[nodiscard]] std::optional<MTPInputUser> BotUserInput(
FILE: Telegram/SourceFiles/api/api_user_names.h
function namespace (line 16) | namespace Main {
function namespace (line 20) | namespace Api {
FILE: Telegram/SourceFiles/api/api_user_privacy.cpp
type Api (line 20) | namespace Api {
function TLInputRules (line 28) | TLInputRules RulesToTL(const UserPrivacy::Rule &rule) {
function TLToRules (line 108) | UserPrivacy::Rule TLToRules(const TLRules &rules, Data::Session &owner) {
function MTPInputPrivacyKey (line 198) | MTPInputPrivacyKey KeyToTL(UserPrivacy::Key key) {
function TLToKey (line 219) | std::optional<UserPrivacy::Key> TLToKey(mtpTypeId type) {
FILE: Telegram/SourceFiles/api/api_user_privacy.h
function namespace (line 14) | namespace Main {
function namespace (line 18) | namespace Api {
FILE: Telegram/SourceFiles/api/api_views.cpp
type Api (line 18) | namespace Api {
FILE: Telegram/SourceFiles/api/api_views.h
function namespace (line 16) | namespace Main {
function namespace (line 20) | namespace Api {
FILE: Telegram/SourceFiles/api/api_websites.cpp
type Api (line 17) | namespace Api {
function ParseEntry (line 20) | [[nodiscard]] Websites::Entry ParseEntry(
FILE: Telegram/SourceFiles/api/api_websites.h
function namespace (line 14) | namespace Main {
function namespace (line 18) | namespace Api {
FILE: Telegram/SourceFiles/api/api_who_reacted.cpp
type Api (line 34) | namespace Api {
type Peers (line 42) | struct Peers {
type PeerWithReaction (line 51) | struct PeerWithReaction {
type PeersWithReactions (line 60) | struct PeersWithReactions {
type CachedRead (line 71) | struct CachedRead {
method CachedRead (line 72) | CachedRead()
type CachedReacted (line 79) | struct CachedReacted {
method CachedReacted (line 80) | CachedReacted()
type Context (line 87) | struct Context {
method CachedRead (line 94) | [[nodiscard]] CachedRead &cacheRead(not_null<HistoryItem*> item) {
method CachedReacted (line 102) | [[nodiscard]] CachedReacted &cacheReacted(
type Userpic (line 114) | struct Userpic {
type State (line 123) | struct State {
function Contexts (line 131) | [[nodiscard]] auto Contexts()
function ContextAt (line 139) | [[nodiscard]] not_null<Context*> ContextAt(not_null<QWidget*> key) {
function PreparedContextAt (line 168) | [[nodiscard]] not_null<Context*> PreparedContextAt(
function QImage (line 215) | [[nodiscard]] QImage GenerateUserpic(Userpic &userpic, int size) {
function DetectSeenType (line 225) | [[nodiscard]] Ui::WhoReadType DetectSeenType(not_null<HistoryItem*> it...
function WhoReadIds (line 240) | [[nodiscard]] rpl::producer<Peers> WhoReadIds(
function PeersWithReactions (line 312) | [[nodiscard]] PeersWithReactions WithEmptyReactions(
function WhoReactedIds (line 324) | [[nodiscard]] rpl::producer<PeersWithReactions> WhoReactedIds(
function WhoReadOrReactedIds (line 390) | [[nodiscard]] auto WhoReadOrReactedIds(
function UpdateUserpics (line 421) | bool UpdateUserpics(
function RegenerateUserpics (line 482) | void RegenerateUserpics(not_null<State*> state, int small, int large) {
function RegenerateParticipants (line 506) | void RegenerateParticipants(not_null<State*> state, int small, int lar...
function WhoReacted (line 539) | rpl::producer<Ui::WhoReadContent> WhoReacted(
function QString (line 648) | QString FormatReadDate(TimeId date, const QDateTime &now) {
function WhoReadExists (line 674) | bool WhoReadExists(not_null<HistoryItem*> item) {
function WhoReactedExists (line 731) | bool WhoReactedExists(
function WhoReacted (line 740) | rpl::producer<Ui::WhoReadContent> WhoReacted(
function WhoReacted (line 748) | rpl::producer<Ui::WhoReadContent> WhoReacted(
function WhenDate (line 756) | [[nodiscard]] rpl::producer<Ui::WhoReadContent> WhenDate(
function WhenEdited (line 771) | rpl::producer<Ui::WhoReadContent> WhenEdited(
function WhenOriginal (line 777) | rpl::producer<Ui::WhoReadContent> WhenOriginal(
FILE: Telegram/SourceFiles/api/api_who_reacted.h
function namespace (line 12) | namespace style {
function namespace (line 16) | namespace Ui {
function namespace (line 21) | namespace Data {
function namespace (line 25) | namespace Api {
FILE: Telegram/SourceFiles/apiwrap.cpp
function ShowForPeer (line 113) | [[nodiscard]] std::shared_ptr<ChatHelpers::Show> ShowForPeer(
function ShowChannelsLimitBox (line 125) | void ShowChannelsLimitBox(not_null<PeerData*> peer) {
function FileLoadTo (line 136) | [[nodiscard]] FileLoadTo FileLoadTaskOptions(const Api::SendAction &acti...
function QString (line 145) | [[nodiscard]] QString FormatVideoTimestamp(TimeId seconds) {
type Api (line 157) | namespace Api {
function TimeId (line 159) | TimeId UnixtimeFromMsgId(mtpMsgId msgId) {
function QString (line 710) | QString ApiWrap::exportDirectMessageLink(
function QString (line 797) | QString ApiWrap::exportDirectStoryLink(not_null<Data::Story*> story) {
function mtpRequestId (line 3361) | mtpRequestId ApiWrap::requestGlobalMedia(
type SharedCallback (line 3466) | struct SharedCallback {
FILE: Telegram/SourceFiles/apiwrap.h
type MessageGroupId (line 17) | struct MessageGroupId
type SendingAlbum (line 18) | struct SendingAlbum
type class (line 19) | enum class
type FileLoadTo (line 20) | struct FileLoadTo
type ChatRestrictionsInfo (line 21) | struct ChatRestrictionsInfo
function namespace (line 23) | namespace Main {
function namespace (line 27) | namespace Data {
function namespace (line 40) | namespace InlineBots {
function namespace (line 44) | namespace Storage {
function namespace (line 50) | namespace Dialogs {
function namespace (line 54) | namespace Ui {
function namespace (line 59) | namespace Api {
function rememberToDeleteAfterForward (line 409) | void rememberToDeleteAfterForward(MessageIdsList ids) {
type MessageDataRequest (line 451) | struct MessageDataRequest {
type StickersByEmoji (line 460) | struct StickersByEmoji {
type DialogsLoadState (line 466) | struct DialogsLoadState {
type StickerSetRequest (line 638) | struct StickerSetRequest {
type NotifySettingsKey (line 648) | struct NotifySettingsKey {
type SharedMediaRequest (line 690) | struct SharedMediaRequest {
type HistoryRequest (line 704) | struct HistoryRequest {
type GlobalMediaRequest (line 715) | struct GlobalMediaRequest {
type MigrateCallbacks (line 758) | struct MigrateCallbacks {
FILE: Telegram/SourceFiles/boxes/about_box.cpp
function Text1 (line 36) | rpl::producer<TextWithEntities> Text1() {
function Text2 (line 45) | rpl::producer<TextWithEntities> Text2() {
function Text3 (line 58) | rpl::producer<TextWithEntities> Text3() {
function AboutBox (line 67) | void AboutBox(not_null<Ui::GenericBox*> box) {
function QString (line 136) | QString telegramFaqLink() {
function QString (line 153) | QString currentVersionText() {
function ArchiveHintBox (line 171) | void ArchiveHintBox(
FILE: Telegram/SourceFiles/boxes/about_sponsored_box.cpp
type Ui (line 19) | namespace Ui {
function AboutSponsoredBox (line 26) | void AboutSponsoredBox(not_null<Ui::GenericBox*> box) {
FILE: Telegram/SourceFiles/boxes/about_sponsored_box.h
function namespace (line 10) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/abstract_box.cpp
type Ui (line 15) | namespace Ui {
type internal (line 16) | namespace internal {
function showBox (line 18) | void showBox(
function hideLayer (line 32) | void hideLayer(anim::type animated) {
function isLayerShown (line 41) | bool isLayerShown() {
FILE: Telegram/SourceFiles/boxes/abstract_box.h
function namespace (line 14) | namespace style {
function namespace (line 20) | namespace Ui {
function namespace (line 29) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/add_contact_box.cpp
function IsValidPhone (line 54) | bool IsValidPhone(QString phone) {
function ChatCreateDone (line 65) | void ChatCreateDone(
function MustBePublicDestroy (line 126) | void MustBePublicDestroy(not_null<ChannelData*> channel) {
function MustBePublicFailed (line 135) | void MustBePublicFailed(
function WrapPeerDoneFromChannelDone (line 145) | [[nodiscard]] Fn<void(not_null<PeerData*>)> WrapPeerDoneFromChannelDone(
function TextWithEntities (line 160) | TextWithEntities PeerFloodErrorText(
function ShowAddParticipantsError (line 175) | void ShowAddParticipantsError(
function ShowAddParticipantsError (line 187) | void ShowAddParticipantsError(
function TimeId (line 719) | TimeId GroupInfoBox::ttlPeriod() const {
FILE: Telegram/SourceFiles/boxes/add_contact_box.h
type RequestPeerQuery (line 15) | struct RequestPeerQuery
function namespace (line 17) | namespace Window {
function namespace (line 21) | namespace Main {
function namespace (line 25) | namespace Ui {
type class (line 40) | enum class
type ForbiddenInvites (line 46) | struct ForbiddenInvites
function class (line 62) | class AddContactBox : public Ui::BoxContent {
type class (line 104) | enum class
type class (line 189) | enum class
function UsernameResult (line 193) | enum class UsernameResult {
function class (line 247) | class EditNameBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/auto_download_box.cpp
function AddSizeLimitSlider (line 35) | not_null<int64*> AddSizeLimitSlider(
FILE: Telegram/SourceFiles/boxes/auto_download_box.h
function namespace (line 12) | namespace Main {
function namespace (line 16) | namespace Data {
function class (line 22) | class AutoDownloadBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/auto_lock_box.cpp
function TimeString (line 25) | auto TimeString(int seconds) {
FILE: Telegram/SourceFiles/boxes/auto_lock_box.h
function namespace (line 12) | namespace Ui {
function class (line 16) | class AutoLockBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/background_box.cpp
function QImage (line 42) | QImage TakeMiddleSample(QImage original, QSize size) {
class BackgroundBox::Inner (line 67) | class BackgroundBox::Inner final : public Ui::RpWidget {
type Paper (line 93) | struct Paper {
type Selected (line 98) | struct Selected {
type DeleteSelected (line 107) | struct DeleteSelected {
FILE: Telegram/SourceFiles/boxes/background_box.h
function namespace (line 14) | namespace Window {
function namespace (line 18) | namespace Data {
function class (line 22) | class BackgroundBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/background_preview_box.cpp
function IsValidWallPaperSlug (line 60) | [[nodiscard]] bool IsValidWallPaperSlug(const QString &slug) {
function GenerateServiceItem (line 74) | [[nodiscard]] AdminLog::OwnedItem GenerateServiceItem(
function GenerateTextItem (line 92) | [[nodiscard]] AdminLog::OwnedItem GenerateTextItem(
function QImage (line 112) | [[nodiscard]] QImage PrepareScaledNonPattern(
function QImage (line 131) | [[nodiscard]] QImage PrepareScaledFromFull(
function QImage (line 150) | [[nodiscard]] QImage BlackImage(QSize size) {
function Resolve (line 156) | [[nodiscard]] Data::WallPaper Resolve(
type BackgroundPreviewBox::OverridenStyle (line 177) | struct BackgroundPreviewBox::OverridenStyle {
function QRect (line 942) | QRect BackgroundPreviewBox::radialRect() const {
FILE: Telegram/SourceFiles/boxes/background_preview_box.h
function namespace (line 18) | namespace Data {
function namespace (line 22) | namespace Window {
function namespace (line 26) | namespace Ui {
type BackgroundPreviewArgs (line 36) | struct BackgroundPreviewArgs {
type OverridenStyle (line 63) | struct OverridenStyle
FILE: Telegram/SourceFiles/boxes/choose_filter_box.cpp
function QImage (line 42) | [[nodiscard]] QImage Icon(const Data::ChatFilter &f) {
class FilterAction (line 88) | class FilterAction : public Ui::Menu::Action {
method setIcon (line 92) | void setIcon(QImage &&image) {
method paintEvent (line 97) | void paintEvent(QPaintEvent *event) override {
function ChangedFilter (line 116) | Data::ChatFilter ChangedFilter(
function ChangeFilterById (line 158) | void ChangeFilterById(
function FillChooseFilterMenu (line 266) | void FillChooseFilterMenu(
function FillChooseFilterWithAdminedGroupsMenu (line 366) | bool FillChooseFilterWithAdminedGroupsMenu(
function History (line 473) | History *HistoryFromMimeData(
function SetupFilterDragAndDrop (line 504) | void SetupFilterDragAndDrop(
FILE: Telegram/SourceFiles/boxes/choose_filter_box.h
function namespace (line 10) | namespace Main {
function namespace (line 14) | namespace Ui {
function namespace (line 19) | namespace Window {
type LimitData (line 28) | struct LimitData {
FILE: Telegram/SourceFiles/boxes/compose_ai_box.cpp
type HistoryView::Controls (line 59) | namespace HistoryView::Controls {
type ComposeAiMode (line 64) | enum class ComposeAiMode {
type CardState (line 70) | enum class CardState {
function QColor (line 77) | [[nodiscard]] QColor ComposeAiColorWithAlpha(
function TextWithEntities (line 85) | [[nodiscard]] TextWithEntities HighlightDiff(TextWithEntities text) {
function TextWithEntities (line 90) | [[nodiscard]] TextWithEntities StrikeOutDiff(TextWithEntities text) {
function TextWithEntities (line 95) | [[nodiscard]] TextWithEntities BuildDiffDisplay(
function QString (line 138) | [[nodiscard]] QString FromTitle(LanguageId id) {
function TextWithEntities (line 142) | [[nodiscard]] TextWithEntities ToTitle(
function LanguageId (line 161) | [[nodiscard]] LanguageId DefaultAiTranslateTo(LanguageId offeredFrom) {
function qreal (line 197) | [[nodiscard]] qreal ComposeAiPillRadius(int height) {
function QColor (line 201) | [[nodiscard]] QColor ComposeAiActiveBackgroundColor(
function QColor (line 208) | [[nodiscard]] QColor ComposeAiRippleColor(
function ResolveStyleDescriptor (line 216) | [[nodiscard]] Ui::LabeledEmojiTab ResolveStyleDescriptor(
function ResolveStyleDescriptors (line 225) | [[nodiscard]] std::vector<Ui::LabeledEmojiTab> ResolveStyleDescriptors(
function ResolveTranslateStyleDescriptors (line 235) | [[nodiscard]] std::vector<Ui::LabeledEmojiTab> ResolveTranslateStyleDe...
function TextWithEntities (line 252) | [[nodiscard]] TextWithEntities LoadingTitleSparkle(
class ComposeAiModeButton (line 261) | class ComposeAiModeButton final : public Ui::RippleButton {
class ComposeAiModeTabs (line 282) | class ComposeAiModeTabs final : public Ui::RpWidget {
class ComposeAiPreviewCard (line 302) | class ComposeAiPreviewCard final : public Ui::RpWidget {
class ComposeAiContent (line 356) | class ComposeAiContent final : public Ui::RpWidget {
function ComposeAiMode (line 445) | ComposeAiMode ComposeAiModeButton::mode() const {
function QImage (line 490) | QImage ComposeAiModeButton::prepareRippleMask() const {
function TextWithEntities (line 966) | const TextWithEntities &ComposeAiContent::result() const {
function QString (line 1294) | QString ComposeAiContent::currentTranslateStyle() const {
function QString (line 1301) | QString ComposeAiContent::currentTranslateStyleLabel() const {
function ComposeAiMode (line 1311) | ComposeAiMode ComposeAiContent::mode() const {
function SetupStyleTooltip (line 1319) | [[nodiscard]] Fn<void(bool)> SetupStyleTooltip(
function ComposeAiBox (line 1397) | void ComposeAiBox(not_null<Ui::GenericBox*> box, ComposeAiBoxArgs &&ar...
function ShowComposeAiBox (line 1627) | void ShowComposeAiBox(
FILE: Telegram/SourceFiles/boxes/compose_ai_box.h
function namespace (line 14) | namespace Main {
function namespace (line 18) | namespace Ui {
function namespace (line 25) | namespace HistoryView::Controls {
FILE: Telegram/SourceFiles/boxes/connection_box.cpp
function ExtractUrlsSimple (line 65) | [[nodiscard]] std::vector<QString> ExtractUrlsSimple(const QString &inpu...
function QString (line 77) | [[nodiscard]] QString ProxyDataToString(const ProxyData &proxy) {
function ProxyData (line 90) | [[nodiscard]] ProxyData ProxyDataFromFields(
function AddProxyFromClipboard (line 106) | void AddProxyFromClipboard(
class HostInput (line 212) | class HostInput : public Ui::MaskedInputField {
class Base64UrlInput (line 254) | class Base64UrlInput : public Ui::MaskedInputField {
class ProxyRow (line 306) | class ProxyRow : public Ui::RippleButton {
class ProxiesBox (line 355) | class ProxiesBox : public Ui::BoxContent {
class ProxyBox (line 399) | class ProxyBox final : public Ui::BoxContent {
method setInnerFocus (line 411) | void setInnerFocus() override {
function ProxyData (line 1177) | ProxyData ProxyBox::collectData() {
function ResetProxyCheckers (line 1364) | void ResetProxyCheckers(Checker &v4, Checker &v6) {
function DropProxyChecker (line 1369) | void DropProxyChecker(Checker &v4, Checker &v6, not_null<Connection*> ra...
function HasProxyCheckers (line 1377) | [[nodiscard]] bool HasProxyCheckers(const Checker &v4, const Checker &v6) {
function StartProxyCheck (line 1381) | void StartProxyCheck(
type ProxyCheckStatusState (line 1570) | struct ProxyCheckStatusState {
FILE: Telegram/SourceFiles/boxes/connection_box.h
function namespace (line 16) | namespace Ui {
function namespace (line 29) | namespace Main {
function namespace (line 33) | namespace Window {
function class (line 37) | class ProxiesBoxController {
FILE: Telegram/SourceFiles/boxes/contacts_box.cpp
function QString (line 49) | QString PeerFloodErrorText(PeerFloodType type) {
function for_const (line 417) | for_const (auto user, curadmins) {
function for_const (line 420) | for_const (auto user, appoint) {
function _sortByName (line 556) | bool _sortByName(UserData *a, UserData *b) {
function for_const (line 585) | for_const (auto row, *v) {
function for_const (line 631) | for_const (auto row, _contacts->all()) {
function for_const (line 651) | for_const (auto data, _contactsData) {
function for_const (line 656) | for_const (auto data, _byUsernameDatas) {
function for_const (line 661) | for_const (auto data, d_byUsername) {
function for_const (line 695) | for_const (auto user, admins) {
function for_const (line 698) | for_const (auto user, others) {
function for_const (line 792) | for_const (auto row, _contacts->all()) {
function for_const (line 809) | for_const (auto row, _contacts->all()) {
function PeerData (line 1379) | PeerData *ContactsBox::Inner::selectedPeer() const {
function for_const (line 1670) | for_const (auto row, *toFilter) {
function ChatData (line 1866) | ChatData *ContactsBox::Inner::chat() const {
function ChannelData (line 1870) | ChannelData *ContactsBox::Inner::channel() const {
function MembersFilter (line 1874) | MembersFilter ContactsBox::Inner::membersFilter() const {
function UserData (line 1878) | UserData *ContactsBox::Inner::bot() const {
function CreatingGroupType (line 1886) | CreatingGroupType ContactsBox::Inner::creating() const {
function for_const (line 2051) | for_const (auto row, *_contacts) {
function for_const (line 2080) | for_const (auto row, *_contacts) {
FILE: Telegram/SourceFiles/boxes/create_poll_box.cpp
class Options (line 124) | class Options {
class Option (line 163) | class Option {
method Option (line 175) | Option(const Option &other) = delete;
method Option (line 176) | Option &operator=(const Option &other) = delete;
function InitField (line 273) | void InitField(
function CreateWarningLabel (line 294) | not_null<Ui::FlatLabel*> CreateWarningLabel(
function FocusAtEnd (line 324) | void FocusAtEnd(not_null<Ui::InputField*> field) {
function AddPollToggleButton (line 330) | not_null<DetailedSettingsButton*> AddPollToggleButton(
function PollAnswer (line 696) | PollAnswer Options::Option::toPollAnswer(int index) const {
class DurationIconAction (line 1132) | class DurationIconAction final : public Ui::Menu::Action {
function ShowMediaUploadingToast (line 1177) | void ShowMediaUploadingToast() {
type UploadContext (line 1440) | struct UploadContext {
type State (line 1451) | struct State final {
type UploadedMedia (line 1510) | struct UploadedMedia final {
FILE: Telegram/SourceFiles/boxes/create_poll_box.h
type PollData (line 15) | struct PollData
function namespace (line 17) | namespace ChatHelpers {
function namespace (line 21) | namespace Ui {
function namespace (line 25) | namespace Window {
function namespace (line 29) | namespace SendMenu {
function class (line 35) | class CreatePollBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/delete_messages_box.cpp
function PeerData (line 384) | PeerData *DeleteMessagesBox::checkFromSinglePeer() const {
function PaidPostType (line 529) | PaidPostType DeleteMessagesBox::paidPostType() const {
FILE: Telegram/SourceFiles/boxes/delete_messages_box.h
type class (line 12) | enum class
function namespace (line 14) | namespace Main {
function namespace (line 18) | namespace Ui {
function setDeleteConfirmedCallback (line 43) | void setDeleteConfirmedCallback(Fn<void()> callback) {
type RevokeConfig (line 55) | struct RevokeConfig {
FILE: Telegram/SourceFiles/boxes/dictionaries_manager.cpp
type Ui (line 34) | namespace Ui {
class Inner (line 45) | class Inner : public Ui::RpWidget {
function DictExists (line 65) | inline auto DictExists(int langId) {
function FilterEnabledDict (line 69) | inline auto FilterEnabledDict(Dictionaries dicts) {
function DictState (line 75) | DictState ComputeState(int id, bool enabled) {
function QString (line 83) | QString StateDescription(const DictState &state) {
function CreateMultiSelect (line 89) | auto CreateMultiSelect(QWidget *parent) {
function QueryCallback (line 108) | QueryCallback Inner::queryCallback() const {
function Dictionaries (line 112) | Dictionaries Inner::enabledRows() const {
function AddButtonWithLoader (line 116) | auto AddButtonWithLoader(
FILE: Telegram/SourceFiles/boxes/dictionaries_manager.h
function namespace (line 14) | namespace Main {
function namespace (line 18) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/download_path_box.h
function namespace (line 12) | namespace Ui {
function namespace (line 20) | namespace Window {
function class (line 24) | class DownloadPathBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/edit_caption_box.cpp
function ListFromMimeData (line 80) | [[nodiscard]] Ui::PreparedList ListFromMimeData(
function ComputeAlbumType (line 102) | [[nodiscard]] Ui::AlbumType ComputeAlbumType(not_null<HistoryItem*> item) {
function CanToggleCompressed (line 122) | [[nodiscard]] bool CanToggleCompressed(Ui::AlbumType type) {
function AlbumTypeCompressed (line 126) | [[nodiscard]] bool AlbumTypeCompressed(Ui::AlbumType type) {
function ChooseReplacement (line 131) | void ChooseReplacement(
function EditPhotoImage (line 186) | void EditPhotoImage(
FILE: Telegram/SourceFiles/boxes/edit_caption_box.h
function namespace (line 14) | namespace ChatHelpers {
function namespace (line 19) | namespace Window {
function namespace (line 23) | namespace Data {
function namespace (line 27) | namespace HistoryView::Controls {
function namespace (line 31) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/edit_privacy_box.cpp
type SpecialRowType (line 58) | enum class SpecialRowType {
function PaintRoundImageCallback (line 63) | [[nodiscard]] PaintRoundImageCallback GeneratePremiumsUserpicCallback(
function PaintRoundImageCallback (line 84) | [[nodiscard]] PaintRoundImageCallback GenerateMiniAppsUserpicCallback(
function CreateRadiobuttonLock (line 106) | void CreateRadiobuttonLock(
function AddPremiumRequiredRow (line 133) | void AddPremiumRequiredRow(
class PrivacyExceptionsBoxController (line 159) | class PrivacyExceptionsBoxController : public ChatsListBoxController {
type RowSelectionChange (line 193) | struct RowSelectionChange {
class SpecialRow (line 198) | class SpecialRow final : public PeerListRow {
class TypesController (line 210) | class TypesController final : public PeerListController {
function QString (line 241) | QString SpecialRow::generateName() {
function QString (line 247) | QString SpecialRow::generateShortName() {
function PaintRoundImageCallback (line 251) | PaintRoundImageCallback SpecialRow::generatePaintUserpicCallback(
function MakeChargeStarsSlider (line 465) | [[nodiscard]] object_ptr<Ui::RpWidget> MakeChargeStarsSlider(
function EditNoPaidMessagesExceptions (line 571) | void EditNoPaidMessagesExceptions(
function QString (line 610) | QString EditPrivacyController::optionLabel(Option option) const {
function EditMessagesPrivacyBox (line 964) | void EditMessagesPrivacyBox(
function SetupChargeSlider (line 1198) | rpl::producer<int> SetupChargeSlider(
function EditDirectMessagesPriceBox (line 1291) | void EditDirectMessagesPriceBox(
FILE: Telegram/SourceFiles/boxes/edit_privacy_box.h
function namespace (line 14) | namespace Ui {
function namespace (line 27) | namespace Window {
function class (line 33) | class EditPrivacyController {
FILE: Telegram/SourceFiles/boxes/edit_todo_list_box.cpp
class Tasks (line 61) | class Tasks {
class Task (line 82) | class Task {
method Task (line 92) | Task(const Task &other) = delete;
method Task (line 93) | Task &operator=(const Task &other) = delete;
function InitField (line 183) | void InitField(
function QStringList (line 200) | [[nodiscard]] QStringList ParsePastedList(const QString &text) {
function CreateWarningLabel (line 221) | not_null<Ui::FlatLabel*> CreateWarningLabel(
function FocusAtEnd (line 251) | void FocusAtEnd(not_null<Ui::InputField*> field) {
function MakeEmojiPanel (line 257) | [[nodiscard]] base::unique_qptr<ChatHelpers::TabbedPanel> MakeEmojiPanel(
function TodoListItem (line 480) | TodoListItem Tasks::Task::toTodoListItem(int nextId) const {
FILE: Telegram/SourceFiles/boxes/edit_todo_list_box.h
type TodoListData (line 15) | struct TodoListData
function namespace (line 17) | namespace ChatHelpers {
function namespace (line 21) | namespace Ui {
function namespace (line 25) | namespace Window {
function namespace (line 29) | namespace SendMenu {
function class (line 33) | class EditTodoListBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp
type NameEditing (line 78) | struct NameEditing {
function SetupChatsPreview (line 84) | not_null<FilterChatsPreview*> SetupChatsPreview(
function EditExceptions (line 137) | void EditExceptions(
function CreateIconSelector (line 209) | void CreateIconSelector(
function QString (line 301) | [[nodiscard]] QString DefaultTitle(const Data::ChatFilter &filter) {
function AddToggledButton (line 323) | not_null<Ui::SettingsButton*> AddToggledButton(
function QString (line 341) | [[nodiscard]] QString TrimDefaultTitle(const QString &title) {
function EditFilterBox (line 347) | void EditFilterBox(
function EditExistingFilter (line 980) | void EditExistingFilter(
FILE: Telegram/SourceFiles/boxes/filters/edit_filter_box.h
function namespace (line 10) | namespace Window {
function namespace (line 14) | namespace Ui {
function namespace (line 18) | namespace Data {
FILE: Telegram/SourceFiles/boxes/filters/edit_filter_chats_list.cpp
type RowSelectionChange (line 46) | struct RowSelectionChange {
class TypeRow (line 51) | class TypeRow final : public PeerListRow {
class ExceptionRow (line 65) | class ExceptionRow final : public ChatsListBoxController::Row {
class TypeController (line 90) | class TypeController final : public PeerListController {
function uint64 (line 117) | [[nodiscard]] uint64 TypeId(Flag flag) {
function QString (line 124) | QString TypeRow::generateName() {
function QString (line 128) | QString TypeRow::generateShortName() {
function PaintRoundImageCallback (line 132) | PaintRoundImageCallback TypeRow::generatePaintUserpicCallback(
function Flag (line 140) | Flag TypeRow::flag() const {
function QString (line 175) | QString ExceptionRow::generateName() {
function QString (line 186) | QString ExceptionRow::generateShortName() {
function PaintRoundImageCallback (line 190) | PaintRoundImageCallback ExceptionRow::generatePaintUserpicCallback(
function Flags (line 263) | Flags TypeController::collectSelectedOptions() const {
function QString (line 299) | [[nodiscard]] QString FilterChatsTypeName(Flag flag) {
function PaintFilterChatsTypeIcon (line 316) | void PaintFilterChatsTypeIcon(
function CreatePeerListSectionSubtitle (line 378) | object_ptr<Ui::RpWidget> CreatePeerListSectionSubtitle(
FILE: Telegram/SourceFiles/boxes/filters/edit_filter_chats_list.h
function namespace (line 15) | namespace Ui {
function namespace (line 19) | namespace Window {
function namespace (line 23) | namespace Main {
FILE: Telegram/SourceFiles/boxes/filters/edit_filter_chats_preview.h
function namespace (line 16) | namespace Ui {
type FlagButton (line 41) | struct FlagButton {
type PeerButton (line 45) | struct PeerButton {
FILE: Telegram/SourceFiles/boxes/filters/edit_filter_links.cpp
class LinkRow (line 48) | class LinkRow
type Color (line 50) | enum class Color {
type InviteLinkAction (line 56) | struct InviteLinkAction {
type Type (line 57) | enum class Type {
type Errors (line 67) | struct Errors {
function ErrorForSharing (line 72) | [[nodiscard]] std::optional<Errors> ErrorForSharing(
function ShowSaveError (line 107) | void ShowSaveError(
function ShowEmptyLinkError (line 125) | void ShowEmptyLinkError(not_null<Window::SessionController*> window) {
function ChatFilterLinkBox (line 129) | void ChatFilterLinkBox(
class LinkRowDelegate (line 170) | class LinkRowDelegate {
class LinkRow (line 181) | class LinkRow final : public PeerListRow {
class ChatRow (line 212) | class ChatRow final : public PeerListRow {
function Color (line 227) | [[nodiscard]] Color ComputeColor(const InviteLinkData &link) {
function QString (line 231) | [[nodiscard]] QString ComputeStatus(const InviteLinkData &link) {
function InviteLinkData (line 253) | InviteLinkData LinkRow::data() const {
function QString (line 257) | QString LinkRow::generateName() {
function QString (line 274) | QString LinkRow::generateShortName() {
function PaintRoundImageCallback (line 278) | PaintRoundImageCallback LinkRow::generatePaintUserpicCallback(
function QSize (line 290) | QSize LinkRow::rightActionSize() const {
function QMargins (line 296) | QMargins LinkRow::rightActionMargins() const {
function PaintRoundImageCallback (line 327) | PaintRoundImageCallback ChatRow::generatePaintUserpicCallback(
class LinksController (line 413) | class LinksController final
class LinkController (line 458) | class LinkController final
function DeleteLinkBox (line 566) | object_ptr<Ui::BoxContent> DeleteLinkBox(
function CollectFilterLinkChats (line 989) | std::vector<not_null<PeerData*>> CollectFilterLinkChats(
function GoodForExportFilterLink (line 997) | bool GoodForExportFilterLink(
function ExportFilterLink (line 1008) | void ExportFilterLink(
function EditLinkChats (line 1039) | void EditLinkChats(
function ShowLinkBox (line 1067) | object_ptr<Ui::BoxContent> ShowLinkBox(
function QString (line 1117) | QString FilterChatStatusText(not_null<PeerData*> peer) {
function SetupFilterLinks (line 1135) | void SetupFilterLinks(
function AddFilterSubtitleWithToggles (line 1155) | void AddFilterSubtitleWithToggles(
function MakeFilterChatRow (line 1203) | std::unique_ptr<PeerListRow> MakeFilterChatRow(
FILE: Telegram/SourceFiles/boxes/filters/edit_filter_links.h
function namespace (line 14) | namespace Ui {
function namespace (line 20) | namespace Data {
function namespace (line 25) | namespace Window {
FILE: Telegram/SourceFiles/boxes/gift_credits_box.cpp
type Ui (line 36) | namespace Ui {
function GiftCreditsBox (line 38) | void GiftCreditsBox(
function ShowGiftCreditsBox (line 108) | void ShowGiftCreditsBox(
FILE: Telegram/SourceFiles/boxes/gift_credits_box.h
function namespace (line 10) | namespace Window {
function namespace (line 14) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/gift_premium_box.cpp
function QString (line 97) | [[nodiscard]] QString CreateMessageLink(
function QString (line 115) | [[nodiscard]] QString FixupTransactionId(QString origin) {
function MakeGiftCodeLink (line 119) | [[nodiscard]] Data::GiftCodeLink MakeGiftCodeLink(
function TextWithEntities (line 129) | [[nodiscard]] TextWithEntities FormatValuePrice(
function TextWithEntities (line 140) | [[nodiscard]] TextWithEntities FormatValueDate(TimeId date) {
function MakeLinkCopyIcon (line 156) | [[nodiscard]] object_ptr<Ui::RpWidget> MakeLinkCopyIcon(
function GiftDurationPhrase (line 178) | [[nodiscard]] tr::phrase<lngtag_count> GiftDurationPhrase(int days) {
function MakeMaybeMultilineTokenValue (line 186) | [[nodiscard]] object_ptr<Ui::FlatLabel> MakeMaybeMultilineTokenValue(
function MakePriceWithChangePercentValue (line 204) | [[nodiscard]] object_ptr<Ui::RpWidget> MakePriceWithChangePercentValue(
function MakeMinimumPriceValue (line 229) | [[nodiscard]] object_ptr<Ui::RpWidget> MakeMinimumPriceValue(
function MakeAveragePriceValue (line 248) | [[nodiscard]] object_ptr<Ui::RpWidget> MakeAveragePriceValue(
function MakeAttributeValue (line 267) | [[nodiscard]] object_ptr<Ui::RpWidget> MakeAttributeValue(
function MakeAttributeValue (line 298) | [[nodiscard]] object_ptr<Ui::RpWidget> MakeAttributeValue(
function AddUniqueGiftPropertyRows (line 466) | void AddUniqueGiftPropertyRows(
function MakeStarGiftStarsValue (line 594) | [[nodiscard]] object_ptr<Ui::RpWidget> MakeStarGiftStarsValue(
function MakeUniqueGiftValueValue (line 635) | [[nodiscard]] object_ptr<Ui::RpWidget> MakeUniqueGiftValueValue(
function AddTable (line 693) | void AddTable(
function ShareWithFriend (line 764) | void ShareWithFriend(
function ShowAlreadyPremiumToast (line 777) | void ShowAlreadyPremiumToast(
function GiftDurationValue (line 812) | rpl::producer<QString> GiftDurationValue(int days) {
function QString (line 822) | QString GiftDuration(int days) {
function GiftCodeBox (line 830) | void GiftCodeBox(
function GiftCodePendingBox (line 959) | void GiftCodePendingBox(
function ResolveGiftCode (line 1060) | void ResolveGiftCode(
function GiveawayInfoBox (line 1087) | void GiveawayInfoBox(
function ResolveGiveawayInfo (line 1358) | void ResolveGiveawayInfo(
function QString (line 1379) | QString TonAddressUrl(
type AddedUniqueDetails (line 1388) | struct AddedUniqueDetails {
function AddedUniqueDetails (line 1392) | [[nodiscard]] AddedUniqueDetails MakeUniqueDetails(
function AddStarGiftTable (line 1482) | void AddStarGiftTable(
function AddTransferGiftTable (line 1812) | void AddTransferGiftTable(
function AddCreditsHistoryEntryTable (line 1831) | void AddCreditsHistoryEntryTable(
function AddSubscriptionEntryTable (line 2100) | void AddSubscriptionEntryTable(
function AddSubscriberEntryTable (line 2154) | void AddSubscriberEntryTable(
function AddCreditsBoostTable (line 2178) | void AddCreditsBoostTable(
function AddChannelEarnTable (line 2236) | void AddChannelEarnTable(
function AddUniqueGiftValueTable (line 2261) | void AddUniqueGiftValueTable(
FILE: Telegram/SourceFiles/boxes/gift_premium_box.h
function namespace (line 12) | namespace Api {
function namespace (line 16) | namespace ChatHelpers {
function namespace (line 20) | namespace Data {
function namespace (line 30) | namespace Main {
function namespace (line 34) | namespace Settings {
function namespace (line 38) | namespace Ui {
function namespace (line 44) | namespace Window {
FILE: Telegram/SourceFiles/boxes/language_box.cpp
class Rows (line 62) | class Rows : public Ui::RpWidget {
type Row (line 96) | struct Row {
type RowSelection (line 111) | struct RowSelection {
type MenuSelection (line 118) | struct MenuSelection {
class Content (line 186) | class Content : public Ui::RpWidget {
function PrepareLists (line 212) | std::pair<Languages, Languages> PrepareLists() {
function QRect (line 352) | QRect Rows::menuToggleArea() const {
function QRect (line 362) | QRect Rows::menuToggleArea(not_null<const Row*> row) const {
FILE: Telegram/SourceFiles/boxes/language_box.h
type LanguageId (line 13) | struct LanguageId
function namespace (line 15) | namespace Ui {
function namespace (line 21) | namespace Window {
function class (line 25) | class LanguageBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/local_storage_box.cpp
function int64 (line 39) | int64 TotalSizeLimitInMB(int index) {
function int64 (line 46) | int64 TotalSizeLimit(int index) {
function int64 (line 50) | int64 MediaSizeLimitInMB(int index) {
function int64 (line 57) | int64 MediaSizeLimit(int index) {
function QString (line 61) | QString SizeLimitText(int64 limit) {
function size_type (line 69) | size_type TimeLimitInDays(int index) {
function size_type (line 96) | size_type TimeLimit(int index) {
function QString (line 103) | QString TimeLimitText(size_type limit) {
function size_type (line 114) | size_type LimitToValue(size_type timeLimit) {
function size_type (line 118) | size_type ValueToLimit(size_type timeLimit) {
class LocalStorageBox::Row (line 124) | class LocalStorageBox::Row : public Ui::RpWidget {
function QString (line 265) | QString LocalStorageBox::Row::titleText(const Database::TaggedSummary &d...
function QString (line 269) | QString LocalStorageBox::Row::sizeText(const Database::TaggedSummary &da...
FILE: Telegram/SourceFiles/boxes/local_storage_box.h
function namespace (line 13) | namespace Main {
function namespace (line 17) | namespace Window {
function namespace (line 21) | namespace Storage {
function namespace (line 27) | namespace Ui {
function class (line 35) | class LocalStorageBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/moderate_messages_box.cpp
type ModerateOptions (line 86) | struct ModerateOptions final {
function ModerateOptions (line 92) | ModerateOptions CalculateModerateOptions(const HistoryItemsList &items) {
function MessagesCountValue (line 133) | [[nodiscard]] rpl::producer<base::flat_map<PeerId, int>> MessagesCountVa...
function FillMenuModerateCommonGroups (line 170) | void FillMenuModerateCommonGroups(
function ProccessCommonGroups (line 310) | void ProccessCommonGroups(
function CreateModerateMessagesBox (line 352) | void CreateModerateMessagesBox(
function CanCreateModerateMessagesBox (line 924) | bool CanCreateModerateMessagesBox(const HistoryItemsList &items) {
function SafeSubmitOnEnter (line 930) | void SafeSubmitOnEnter(not_null<Ui::GenericBox*> box) {
function DeleteChatBox (line 952) | void DeleteChatBox(not_null<Ui::GenericBox*> box, not_null<PeerData*> pe...
function DeleteSublistBox (line 1126) | void DeleteSublistBox(
function ModerateMessagesBoxOptions (line 1177) | ModerateMessagesBoxOptions DefaultModerateMessagesBoxOptions() {
FILE: Telegram/SourceFiles/boxes/moderate_messages_box.h
function namespace (line 12) | namespace Data {
function namespace (line 16) | namespace Ui {
function final (line 22) | struct ModerateMessagesBoxOptions final {
FILE: Telegram/SourceFiles/boxes/passcode_box.cpp
type PasswordErrorType (line 40) | enum class PasswordErrorType {
function SetCloudPassword (line 46) | void SetCloudPassword(
function TransferPasswordError (line 65) | void TransferPasswordError(
function StartPendingReset (line 102) | void StartPendingReset(
function RecoveryEmailValidation (line 1396) | RecoveryEmailValidation ConfirmRecoveryEmail(
function PrePasswordErrorBox (line 1466) | [[nodiscard]] object_ptr<Ui::GenericBox> PrePasswordErrorBox(
FILE: Telegram/SourceFiles/boxes/passcode_box.h
function namespace (line 14) | namespace MTP {
function namespace (line 18) | namespace Main {
function namespace (line 22) | namespace Ui {
function namespace (line 28) | namespace Core {
type CloudFields (line 36) | struct CloudFields {
type RecoveryEmailValidation (line 244) | struct RecoveryEmailValidation {
FILE: Telegram/SourceFiles/boxes/peer_list_box.cpp
function PeerListRowId (line 42) | [[nodiscard]] PeerListRowId UniqueRowIdFromString(const QString &d) {
function PaintRoundImageCallback (line 46) | PaintRoundImageCallback PaintUserpicCallback(
function PaintRoundImageCallback (line 66) | PaintRoundImageCallback ForceRoundUserpicCallback(not_null<PeerData*> pe...
function QRect (line 682) | QRect PeerListRow::elementGeometry(int element, int outerWidth) const {
function QString (line 735) | QString PeerListRow::generateName() {
function QString (line 739) | QString PeerListRow::generateShortName() {
function PaintRoundImageCallback (line 756) | PaintRoundImageCallback PeerListRow::generatePaintUserpicCallback(
function float64 (line 964) | float64 PeerListRow::checkedRatio() {
function PeerListRow (line 1248) | PeerListRow *PeerListContent::findRow(PeerListRowId id) {
function PeerListRowId (line 2256) | PeerListRowId PeerListContent::updateFromParentDrag(QPoint globalPositio...
function QRect (line 2359) | QRect PeerListContent::getElementRect(
function PeerListRow (line 2433) | PeerListRow *PeerListContent::getRow(RowIndex index) {
FILE: Telegram/SourceFiles/boxes/peer_list_box.h
function namespace (line 17) | namespace style {
function namespace (line 23) | namespace Main {
function namespace (line 28) | namespace Ui {
type class (line 59) | enum class
function setDisabledState (line 70) | void setDisabledState(State state) {
function checked (line 78) | [[nodiscard]] bool checked() const;
function virtual (line 96) | [[nodiscard]] virtual auto generatePaintUserpicCallback(
function virtual (line 106) | [[nodiscard]] virtual auto generateNameFirstLetters() const
function virtual (line 147) | virtual void rightActionAddRipple(
function virtual (line 151) | virtual void rightActionStopLastRipple() {
function virtual (line 153) | [[nodiscard]] virtual float64 opacity() {
function virtual (line 158) | virtual int elementsCount() const;
type class (line 322) | enum class
type PeerListState (line 327) | struct PeerListState
function class (line 329) | class PeerListDelegate {
type SkipResult (line 647) | struct SkipResult {
function Mode (line 655) | enum class Mode {
type RowIndex (line 766) | struct RowIndex {
type Selected (line 780) | struct Selected {
type SelectedSaved (line 801) | struct SelectedSaved {
function addingToSearchIndex (line 843) | bool addingToSearchIndex() const;
function rowsTop (line 857) | int rowsTop() const;
function peerListSetHideEmpty (line 923) | void peerListSetHideEmpty(bool hide) override {
function peerListAppendRow (line 926) | void peerListAppendRow(
function peerListAppendSearchRow (line 930) | void peerListAppendSearchRow(
function peerListAppendFoundRow (line 934) | void peerListAppendFoundRow(
function peerListPrependRow (line 938) | void peerListPrependRow(
function peerListPrependRowFromSearchResult (line 942) | void peerListPrependRowFromSearchResult(
function PeerListRow (line 946) | PeerListRow *peerListFindRow(PeerListRowId id) override {
function peerListUpdateRow (line 952) | void peerListUpdateRow(not_null<PeerListRow*> row) override {
function peerListRemoveRow (line 955) | void peerListRemoveRow(not_null<PeerListRow*> row) override {
function peerListConvertRowToSearchResult (line 958) | void peerListConvertRowToSearchResult(
function peerListSetRowChecked (line 962) | void peerListSetRowChecked(
function peerListSetRowHidden (line 967) | void peerListSetRowHidden(
function peerListSetForeignRowChecked (line 972) | void peerListSetForeignRowChecked(
function peerListFullRowsCount (line 977) | int peerListFullRowsCount() override {
function peerListSearchRowsCount (line 983) | int peerListSearchRowsCount() override {
function peerListRefreshRows (line 989) | void peerListRefreshRows() override {
function peerListSetDescription (line 992) | void peerListSetDescription(object_ptr<Ui::FlatLabel> description) overr...
function peerListSetSearchNoResults (line 995) | void peerListSetSearchNoResults(object_ptr<Ui::FlatLabel> noResults) ove...
function peerListSetAboveWidget (line 998) | void peerListSetAboveWidget(object_ptr<Ui::RpWidget> aboveWidget) overri...
function peerListSetAboveSearchWidget (line 1001) | void peerListSetAboveSearchWidget(object_ptr<Ui::RpWidget> aboveWidget) ...
function peerListSetBelowWidget (line 1004) | void peerListSetBelowWidget(object_ptr<Ui::RpWidget> belowWidget) overri...
function peerListSetSearchMode (line 1007) | void peerListSetSearchMode(PeerListSearchMode mode) override {
function peerListMouseLeftGeometry (line 1010) | void peerListMouseLeftGeometry() override {
function peerListSortRows (line 1013) | void peerListSortRows(
function edge (line 1029) | auto edge = std::stable_partition(begin, end, [&](
function peerListRestoreState (line 1040) | void peerListRestoreState(
function peerListSelectSkip (line 1049) | void peerListSelectSkip(int direction) override {
function peerListPressLeftToContextMenu (line 1053) | void peerListPressLeftToContextMenu(bool shown) override {
function peerListTrackRowPressFromGlobal (line 1056) | bool peerListTrackRowPressFromGlobal(QPoint globalPosition) override {
function class (line 1070) | class PeerListContentDelegateSimple : public PeerListContentDelegate {
function class (line 1104) | class PeerListContentDelegateShow : public PeerListContentDelegateSimple {
function peerListSetTitle (line 1129) | void peerListSetTitle(rpl::producer<QString> title) override {
function peerListSetAdditionalTitle (line 1132) | void peerListSetAdditionalTitle(rpl::producer<QString> title) override {
function showFinished (line 1150) | void showFinished() override;
function peerListAddSelectedRowInBunch (line 1167) | void peerListAddSelectedRowInBunch(not_null<PeerListRow*> row) override {
FILE: Telegram/SourceFiles/boxes/peer_list_controllers.cpp
function PrepareContactsBox (line 66) | object_ptr<Ui::BoxContent> PrepareContactsBox(
function QBrush (line 136) | QBrush PeerListStoriesGradient(const style::PeerList &st) {
function PeerListStoriesSegments (line 143) | std::vector<Ui::OutlineSegment> PeerListStoriesSegments(
function QSize (line 193) | QSize PeerListRowWithLink::rightActionSize() const {
function QMargins (line 197) | QMargins PeerListRowWithLink::rightActionMargins() const {
type RecipientRow::Restriction (line 299) | struct RecipientRow::Restriction {
function TrackMessageMoneyRestrictionsChanges (line 390) | void TrackMessageMoneyRestrictionsChanges(
function QString (line 510) | QString ChatsListBoxController::emptyBoxText() const {
function RecipientMoneyRestrictionError (line 792) | RecipientMoneyRestrictionError WriteMoneyRestrictionError(
function QString (line 957) | QString ChooseRecipientBoxController::savedMessagesChatStatus() const {
function QString (line 1056) | QString ChooseTopicBoxController::Row::generateName() {
function QString (line 1060) | QString ChooseTopicBoxController::Row::generateShortName() {
function QString (line 1099) | QString ChooseTopicBoxController::AllMessagesRow::name() const {
function QString (line 1115) | QString ChooseTopicBoxController::AllMessagesRow::generateName() {
function QString (line 1119) | QString ChooseTopicBoxController::AllMessagesRow::generateShortName() {
function PaintRestrictionBadge (line 1372) | void PaintRestrictionBadge(
FILE: Telegram/SourceFiles/boxes/peer_list_controllers.h
function namespace (line 18) | namespace style {
function namespace (line 22) | namespace Api {
function namespace (line 26) | namespace Data {
function namespace (line 34) | namespace Ui {
function namespace (line 38) | namespace Window {
type PeerListStoriesCounts (line 46) | struct PeerListStoriesCounts {
function class (line 59) | class PeerListRowWithLink : public PeerListRow {
function class (line 86) | class PeerListGlobalSearchController : public PeerListSearchController {
type RecipientMoneyRestrictionError (line 111) | struct RecipientMoneyRestrictionError {
type RestrictionBadgeCache (line 118) | struct RestrictionBadgeCache {
function class (line 133) | class RecipientRow : public PeerListRow {
FILE: Telegram/SourceFiles/boxes/peer_list_widgets.cpp
function PeerListRow (line 144) | PeerListRow *PeerListWidgets::findRow(PeerListRowId id) {
function PeerListRow (line 215) | PeerListRow* PeerListWidgetsDelegate::peerListFindRow(PeerListRowId id) {
function State (line 319) | State PeerListWidgetsDelegate::peerListSaveState() const {
FILE: Telegram/SourceFiles/boxes/peer_list_widgets.h
function namespace (line 12) | namespace Ui {
function class (line 16) | class PeerListWidgets : public Ui::RpWidget {
function class (line 44) | class PeerListWidgetsDelegate : public PeerListDelegate {
FILE: Telegram/SourceFiles/boxes/peer_lists_box.h
function namespace (line 12) | namespace Ui {
function class (line 16) | class PeerListsBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/peers/add_bot_to_chat_box.cpp
class Controller (line 34) | class Controller final
function QString (line 309) | QString AddBotToGroupBoxController::emptyBoxText() const {
function QString (line 317) | QString AddBotToGroupBoxController::noResultsText() const {
function AddBotToGroup (line 411) | void AddBotToGroup(
FILE: Telegram/SourceFiles/boxes/peers/add_participants_box.cpp
class ForbiddenRow (line 56) | class ForbiddenRow final : public PeerListRow {
type Restriction (line 80) | struct Restriction {
class InviteForbiddenController (line 94) | class InviteForbiddenController final : public PeerListController {
method canInvite (line 104) | [[nodiscard]] bool canInvite() const {
method selectedValue (line 107) | [[nodiscard]] rpl::producer<int> selectedValue() const {
method starsToSend (line 110) | [[nodiscard]] rpl::producer<int> starsToSend() const {
function GetAlreadyInFromPeer (line 146) | base::flat_set<not_null<UserData*>> GetAlreadyInFromPeer(PeerData *peer) {
function FillUpgradeToPremiumCover (line 161) | void FillUpgradeToPremiumCover(
function SimpleForbiddenBox (line 240) | void SimpleForbiddenBox(
function PaintRoundImageCallback (line 313) | PaintRoundImageCallback ForbiddenRow::generatePaintUserpicCallback(
function ForbiddenInvites (line 1098) | ForbiddenInvites CollectForbiddenUsers(
function ChatInviteForbidden (line 1120) | bool ChatInviteForbidden(
FILE: Telegram/SourceFiles/boxes/peers/add_participants_box.h
type ChatAdminRightsInfo (line 13) | struct ChatAdminRightsInfo
type ChatRestrictionsInfo (line 14) | struct ChatRestrictionsInfo
function namespace (line 16) | namespace Window {
function class (line 20) | class AddParticipantsBoxController : public ContactsBoxController {
FILE: Telegram/SourceFiles/boxes/peers/channel_ownership_transfer.h
function namespace (line 12) | namespace Ui {
function namespace (line 16) | namespace Core {
function class (line 22) | class ChannelOwnershipTransfer {
FILE: Telegram/SourceFiles/boxes/peers/choose_peer_box.cpp
class ChoosePeerBoxController (line 36) | class ChoosePeerBoxController final
method QString (line 52) | QString savedMessagesChatStatus() const override {
function RightsMap (line 75) | [[nodiscard]] RightsMap GroupRights() {
function RightsMap (line 90) | [[nodiscard]] RightsMap BroadcastRights() {
function QString (line 105) | [[nodiscard]] QString RightsText(
function QString (line 129) | [[nodiscard]] QString GroupRightsText(ChatAdminRights rights) {
function QString (line 133) | [[nodiscard]] QString BroadcastRightsText(ChatAdminRights rights) {
function QStringList (line 137) | [[nodiscard]] QStringList RestrictionsList(RequestPeerQuery query) {
function MakeConfirmBox (line 196) | object_ptr<Ui::BoxContent> MakeConfirmBox(
function CreatePeerByQueryBox (line 246) | object_ptr<Ui::BoxContent> CreatePeerByQueryBox(
function FilterPeerByQuery (line 267) | [[nodiscard]] bool FilterPeerByQuery(
function QString (line 477) | QString ChoosePeerBoxController::emptyBoxText() const {
function ShowChoosePeerBox (line 502) | void ShowChoosePeerBox(
function ShowChoosePeerBox (line 516) | void ShowChoosePeerBox(
FILE: Telegram/SourceFiles/boxes/peers/choose_peer_box.h
type RequestPeerQuery (line 10) | struct RequestPeerQuery
function namespace (line 12) | namespace Main {
function namespace (line 17) | namespace Ui {
function namespace (line 21) | namespace Window {
FILE: Telegram/SourceFiles/boxes/peers/create_managed_bot_box.cpp
function CreateManagedBotBox (line 32) | void CreateManagedBotBox(
function ShowCreateManagedBotBox (line 430) | void ShowCreateManagedBotBox(CreateManagedBotDescriptor &&descriptor) {
FILE: Telegram/SourceFiles/boxes/peers/create_managed_bot_box.h
function namespace (line 12) | namespace Main {
function namespace (line 16) | namespace Ui {
type CreateManagedBotDescriptor (line 20) | struct CreateManagedBotDescriptor {
FILE: Telegram/SourceFiles/boxes/peers/edit_contact_box.cpp
function QString (line 75) | QString UserPhone(not_null<UserData*> user) {
function SendRequest (line 82) | void SendRequest(
class Cover (line 127) | class Cover final : public Ui::FixedHeightWidget {
class Controller (line 215) | class Controller {
type LimitState (line 516) | struct LimitState {
function EditContactBox (line 950) | void EditContactBox(
function EditContactNoteBox (line 958) | void EditContactNoteBox(
FILE: Telegram/SourceFiles/boxes/peers/edit_contact_box.h
function namespace (line 14) | namespace Window {
FILE: Telegram/SourceFiles/boxes/peers/edit_discussion_link_box.cpp
class Controller (line 36) | class Controller : public PeerListController, public base::has_weak_ptr {
function About (line 210) | [[nodiscard]] rpl::producer<TextWithEntities> About(
function EditDiscussionLinkBox (line 227) | [[nodiscard]] object_ptr<Ui::BoxContent> EditDiscussionLinkBox(
function EditDiscussionLinkBox (line 330) | object_ptr<Ui::BoxContent> EditDiscussionLinkBox(
function EditDiscussionLinkBox (line 344) | object_ptr<Ui::BoxContent> EditDiscussionLinkBox(
function ShowForumForDiscussionError (line 359) | void ShowForumForDiscussionError(
FILE: Telegram/SourceFiles/boxes/peers/edit_discussion_link_box.h
function namespace (line 12) | namespace Ui {
function namespace (line 16) | namespace Window {
FILE: Telegram/SourceFiles/boxes/peers/edit_forum_topic_box.cpp
class DefaultIconEmoji (line 47) | class DefaultIconEmoji final : public Ui::Text::CustomEmoji {
function QString (line 89) | QString DefaultIconEmoji::entityData() {
function EditIconSize (line 128) | [[nodiscard]] int EditIconSize() {
function int32 (line 133) | [[nodiscard]] int32 ChooseNextColorId(
function EditIconButton (line 148) | [[nodiscard]] not_null<Ui::AbstractButton*> EditIconButton(
function GeneralIconPreview (line 211) | [[nodiscard]] not_null<Ui::AbstractButton*> GeneralIconPreview(
type IconSelector (line 243) | struct IconSelector {
function IconSelector (line 248) | [[nodiscard]] IconSelector AddIconSelector(
function NewForumTopicBox (line 397) | void NewForumTopicBox(
function EditForumTopicBox (line 404) | void EditForumTopicBox(
function MakeTopicIconEmoji (line 601) | std::unique_ptr<Ui::Text::CustomEmoji> MakeTopicIconEmoji(
FILE: Telegram/SourceFiles/boxes/peers/edit_forum_topic_box.h
function namespace (line 14) | namespace Data {
function namespace (line 19) | namespace Ui::Text {
function namespace (line 23) | namespace Window {
FILE: Telegram/SourceFiles/boxes/peers/edit_members_visible.cpp
function EnableHideMembersMin (line 27) | [[nodiscard]] int EnableHideMembersMin(not_null<ChannelData*> channel) {
function CreateMembersVisibleButton (line 35) | [[nodiscard]] object_ptr<Ui::RpWidget> CreateMembersVisibleButton(
FILE: Telegram/SourceFiles/boxes/peers/edit_members_visible.h
function namespace (line 14) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/peers/edit_participant_box.cpp
class Cover (line 57) | class Cover final : public Ui::FixedHeightWidget {
class EditParticipantBox::Inner (line 117) | class EditParticipantBox::Inner : public Ui::RpWidget {
method verticalLayout (line 128) | [[nodiscard]] not_null<Ui::VerticalLayout*> verticalLayout() const {
function Widget (line 173) | Widget *EditParticipantBox::Inner::addControl(
function Widget (line 267) | Widget *EditParticipantBox::addControl(
function ChatAdminRightsInfo (line 311) | ChatAdminRightsInfo EditAdminBox::defaultRights() const {
function ChatRestrictionsInfo (line 975) | ChatRestrictionsInfo EditRestrictedBox::defaultRights() const {
function TimeId (line 1082) | TimeId EditRestrictedBox::getRealUntilValue() const {
FILE: Telegram/SourceFiles/boxes/peers/edit_participant_box.h
function namespace (line 14) | namespace Ui {
function class (line 28) | class EditParticipantBox : public Ui::BoxContent {
type EditAdminBotFields (line 68) | struct EditAdminBotFields {
function class (line 73) | class EditAdminBox : public EditParticipantBox {
function class (line 135) | class EditRestrictedBox : public EditParticipantBox {
FILE: Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp
function RemoveAdmin (line 59) | void RemoveAdmin(
function AddChatParticipant (line 90) | void AddChatParticipant(
function SaveChatAdmin (line 118) | void SaveChatAdmin(
function SaveChannelAdmin (line 161) | void SaveChannelAdmin(
function SaveChatParticipantKick (line 203) | void SaveChatParticipantKick(
function SaveMemberRank (line 230) | void SaveMemberRank(
function SaveAdminCallback (line 280) | Fn<void(
function SaveRestrictedCallback (line 329) | Fn<void(
function SubscribeToMigration (line 379) | void SubscribeToMigration(
function QString (line 483) | QString ParticipantsAdditionalData::memberRank(
function TimeId (line 489) | TimeId ParticipantsAdditionalData::adminPromotedSince(
function TimeId (line 495) | TimeId ParticipantsAdditionalData::restrictedSince(
function TimeId (line 501) | TimeId ParticipantsAdditionalData::memberSince(
function UserData (line 536) | UserData *ParticipantsAdditionalData::adminPromotedBy(
function UserData (line 545) | UserData *ParticipantsAdditionalData::restrictedBy(
function PeerData (line 720) | PeerData *ParticipantsAdditionalData::applyParticipant(
function PeerData (line 725) | PeerData *ParticipantsAdditionalData::applyParticipant(
function UserData (line 785) | UserData *ParticipantsAdditionalData::applyCreator(
function UserData (line 800) | UserData *ParticipantsAdditionalData::applyAdmin(
function UserData (line 840) | UserData *ParticipantsAdditionalData::applyRegular(UserId userId) {
function PeerData (line 860) | PeerData *ParticipantsAdditionalData::applyBanned(
function EditCustomRankBox (line 2716) | void EditCustomRankBox(
FILE: Telegram/SourceFiles/boxes/peers/edit_participants_box.h
type ChatAdminRightsInfo (line 17) | struct ChatAdminRightsInfo
type ChatRestrictionsInfo (line 18) | struct ChatRestrictionsInfo
function namespace (line 20) | namespace Ui {
function namespace (line 24) | namespace Window {
function namespace (line 28) | namespace Api {
function ParticipantsRole (line 75) | enum class ParticipantsRole {
function class (line 340) | class ParticipantsBoxSearchController : public PeerListSearchController {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_color_box.cpp
function CreateEmptyPlaceholder (line 88) | base::unique_qptr<Ui::RpWidget> CreateEmptyPlaceholder(
class PreviewDelegate (line 170) | class PreviewDelegate final : public HistoryView::DefaultElementDelegate {
class PreviewWrap (line 187) | class PreviewWrap final : public Ui::RpWidget {
class LevelBadge (line 222) | class LevelBadge final : public Ui::RpWidget {
type SetValues (line 487) | struct SetValues {
function Set (line 496) | void Set(
function ShowPremiumPreview (line 623) | bool ShowPremiumPreview(
function Apply (line 636) | void Apply(
function ButtonStyleWithAddedPadding (line 709) | [[nodiscard]] auto ButtonStyleWithAddedPadding(
function CreateEmojiIconButton (line 719) | [[nodiscard]] object_ptr<Ui::SettingsButton> CreateEmojiIconButton(
function CreateEmojiStatusButton (line 867) | [[nodiscard]] object_ptr<Ui::SettingsButton> CreateEmojiStatusButton(
function CreateEmojiPackButton (line 980) | [[nodiscard]] object_ptr<Ui::SettingsButton> CreateEmojiPackButton(
type ColorGiftTabsResult (line 1100) | struct ColorGiftTabsResult {
function ColorGiftTabsResult (line 1105) | ColorGiftTabsResult AddColorGiftTabs(
function AddGiftSelector (line 1186) | void AddGiftSelector(
function CreateTabsWidget (line 1495) | Fn<void(int)> CreateTabsWidget(
function CreateProfilePreview (line 1523) | not_null<Info::Profile::TopBar*> CreateProfilePreview(
function ProcessButton (line 1548) | void ProcessButton(not_null<Ui::RoundButton*> button) {
function CreateBoostLevelContainer (line 1553) | void CreateBoostLevelContainer(
function AddLevelBadge (line 1618) | void AddLevelBadge(
type ColorSectionHighlights (line 1651) | struct ColorSectionHighlights {
function EditPeerColorSection (line 1657) | void EditPeerColorSection(
function EditPeerProfileColorSection (line 2113) | void EditPeerProfileColorSection(
function EditPeerColorBox (line 2387) | void EditPeerColorBox(
function SetupPeerColorSample (line 2532) | void SetupPeerColorSample(
function AddPeerColorButton (line 2724) | not_null<Ui::SettingsButton*> AddPeerColorButton(
function CheckBoostLevel (line 2788) | void CheckBoostLevel(
function ButtonWithEmoji (line 2827) | ButtonWithEmoji ButtonStyleWithRightEmoji(
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_color_box.h
function namespace (line 10) | namespace style {
function namespace (line 14) | namespace st {
function namespace (line 18) | namespace ChatHelpers {
function namespace (line 22) | namespace Window {
function namespace (line 26) | namespace Ui {
function PeerColorTab (line 45) | enum class PeerColorTab {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_common.h
function namespace (line 10) | namespace Ui::EditPeer {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_history_visibility_box.cpp
function EditPeerHistoryVisibilityBox (line 18) | void EditPeerHistoryVisibilityBox(
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_history_visibility_box.h
function namespace (line 10) | namespace Ui {
function HistoryVisibility (line 14) | enum class HistoryVisibility {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp
function ToPositiveNumberString (line 98) | [[nodiscard]] auto ToPositiveNumberString() {
function EnableForumMinMembers (line 104) | [[nodiscard]] int EnableForumMinMembers(not_null<PeerData*> peer) {
function AddSkip (line 110) | void AddSkip(
function AddButtonWithCount (line 119) | void AddButtonWithCount(
function AddButtonWithText (line 134) | not_null<Ui::SettingsButton*> AddButtonWithText(
function AddButtonWithText (line 149) | not_null<Ui::SettingsButton*> AddButtonWithText(
function AddButtonDelete (line 163) | void AddButtonDelete(
function SaveDefaultRestrictions (line 176) | void SaveDefaultRestrictions(
function SaveSlowmodeSeconds (line 209) | void SaveSlowmodeSeconds(
function SaveStarsPerMessage (line 236) | void SaveStarsPerMessage(
function SaveBoostsUnrestrict (line 279) | void SaveBoostsUnrestrict(
function ShowEditPermissions (line 310) | void ShowEditPermissions(
function CurrentPricePerDirectMessage (line 365) | [[nodiscard]] int CurrentPricePerDirectMessage(
class Controller (line 373) | class Controller : public base::has_weak_ptr {
type Controls (line 385) | struct Controls {
type Saving (line 396) | struct Saving {
type PrivacyAndForwards (line 526) | struct PrivacyAndForwards {
type State (line 1233) | struct State {
type State (line 1848) | struct State final {
type State (line 1912) | struct State final {
function ShowEditChatPermissions (line 3031) | void ShowEditChatPermissions(
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_info_box.h
function namespace (line 12) | namespace Settings {
function namespace (line 16) | namespace style {
function namespace (line 20) | namespace Window {
function namespace (line 24) | namespace Ui {
function class (line 29) | class EditPeerInfoBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp
function ShowPeerInfoSync (line 80) | void ShowPeerInfoSync(not_null<PeerData*> peer) {
class SubscriptionRow (line 92) | class SubscriptionRow final : public PeerListRow {
function QSize (line 132) | QSize SubscriptionRow::rightActionSize() const {
function QMargins (line 136) | QMargins SubscriptionRow::rightActionMargins() const {
class RequestedRow (line 152) | class RequestedRow final : public PeerListRow {
function QSize (line 173) | QSize RequestedRow::rightActionSize() const {
function QMargins (line 179) | QMargins RequestedRow::rightActionMargins() const {
class Controller (line 199) | class Controller final
type Role (line 203) | enum class Role {
type Processed (line 222) | struct Processed {
method processed (line 226) | [[nodiscard]] rpl::producer<Processed> processed() const {
class SingleRowController (line 274) | class SingleRowController final : public PeerListController {
function ClosingLinkBox (line 295) | [[nodiscard]] bool ClosingLinkBox(const LinkData &updated, bool revoked) {
function QImage (line 301) | QImage QrExact(const Qr::Data &data, int pixel, QColor color) {
function QImage (line 328) | QImage Qr(const Qr::Data &data, int pixel, int max = 0) {
function QImage (line 337) | QImage Qr(const QString &text, int pixel, int max) {
function QImage (line 341) | QImage QrForShare(const QString &text) {
function QrBox (line 357) | void QrBox(
class Delegate (line 618) | class Delegate final : public PeerListContentDelegateSimple {
method Delegate (line 620) | explicit Delegate(std::shared_ptr<Main::SessionShow> show)
method peerListUiShow (line 624) | std::shared_ptr<Main::SessionShow> peerListUiShow() override {
function IsExpiredLink (line 1207) | bool IsExpiredLink(const Api::InviteLink &data, TimeId now) {
function AddSinglePeerRow (line 1212) | void AddSinglePeerRow(
function AddSinglePeerRow (line 1224) | void AddSinglePeerRow(
function AddPermanentLinkBlock (line 1245) | void AddPermanentLinkBlock(
function CopyInviteLink (line 1456) | void CopyInviteLink(std::shared_ptr<Ui::Show> show, const QString &link) {
function ShareInviteLinkBox (line 1461) | object_ptr<Ui::BoxContent> ShareInviteLinkBox(
function ShareInviteLinkBox (line 1468) | object_ptr<Ui::BoxContent> ShareInviteLinkBox(
function InviteLinkQrBox (line 1558) | object_ptr<Ui::BoxContent> InviteLinkQrBox(
function EditLinkBox (line 1570) | object_ptr<Ui::BoxContent> EditLinkBox(
function RevokeLinkBox (line 1652) | object_ptr<Ui::BoxContent> RevokeLinkBox(
function DeleteLinkBox (line 1674) | object_ptr<Ui::BoxContent> DeleteLinkBox(
function ShowInviteLinkBox (line 1688) | object_ptr<Ui::BoxContent> ShowInviteLinkBox(
function QString (line 1737) | QString PrepareRequestedRowStatus(TimeId date) {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.h
type InviteLink (line 16) | struct InviteLink
function namespace (line 19) | namespace Data {
function namespace (line 23) | namespace Main {
function namespace (line 27) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp
type Color (line 40) | enum class Color {
type InviteLinkAction (line 54) | struct InviteLinkAction {
type Type (line 55) | enum class Type {
class Row (line 66) | class Row
class RowDelegate (line 70) | class RowDelegate {
class Row (line 84) | class Row final : public PeerListRow {
function uint64 (line 123) | [[nodiscard]] uint64 ComputeRowId(const InviteLinkData &data) {
function float64 (line 127) | [[nodiscard]] float64 ComputeProgress(
function Color (line 148) | [[nodiscard]] Color ComputeColor(
function QString (line 164) | [[nodiscard]] QString ComputeStatus(const InviteLinkData &link, TimeId n...
function DeleteAllRevokedBox (line 215) | object_ptr<Ui::BoxContent> DeleteAllRevokedBox(
function AddCreateLinkButton (line 230) | [[nodiscard]] not_null<Ui::SettingsButton*> AddCreateLinkButton(
function InviteLinkData (line 274) | InviteLinkData Row::data() const {
function QString (line 290) | QString Row::generateName() {
function QString (line 307) | QString Row::generateShortName() {
function PaintRoundImageCallback (line 311) | PaintRoundImageCallback Row::generatePaintUserpicCallback(bool forceRoun...
function QSize (line 322) | QSize Row::rightActionSize() const {
function QMargins (line 335) | QMargins Row::rightActionMargins() const {
class LinksController (line 361) | class LinksController final
method fullCountValue (line 372) | [[nodiscard]] rpl::producer<int> fullCountValue() const {
method permanentFound (line 395) | [[nodiscard]] rpl::producer<InviteLinkData> permanentFound() const {
class AdminsController (line 760) | class AdminsController final
type LinksList (line 847) | struct LinksList {
function LinksList (line 852) | LinksList AddLinksList(
function AddAdminsList (line 877) | not_null<Ui::RpWidget*> AddAdminsList(
function ManageInviteLinksBox (line 898) | void ManageInviteLinksBox(
function MakeCreateLinkButton (line 1045) | object_ptr<Ui::SettingsButton> MakeCreateLinkButton(
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.h
function namespace (line 14) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_permissions_box.cpp
function Dependencies (line 58) | [[nodiscard]] auto Dependencies(PowerSaving::Flags)
function Dependencies (line 63) | [[nodiscard]] auto Dependencies(AdminLog::FilterValue::Flags) {
function Dependencies (line 68) | [[nodiscard]] auto Dependencies(Data::ChatbotsPermissions) {
function NestedRestrictionLabelsList (line 73) | [[nodiscard]] auto NestedRestrictionLabelsList(
function NestedAdminRightLabels (line 119) | [[nodiscard]] auto NestedAdminRightLabels(
function SlowmodeDelayByIndex (line 191) | int SlowmodeDelayByIndex(int index) {
function BoostsUnrestrictByIndex (line 207) | [[nodiscard]] int BoostsUnrestrictByIndex(int index) {
function ApplyDependencies (line 212) | void ApplyDependencies(
function Dependencies (line 264) | auto Dependencies(ChatRestrictions)
function ChatRestrictions (line 300) | ChatRestrictions NegateRestrictions(ChatRestrictions value) {
function Dependencies (line 326) | auto Dependencies(ChatAdminRights)
function ToPositiveNumberString (line 331) | auto ToPositiveNumberString() {
function ChatRestrictions (line 337) | ChatRestrictions DisabledByAdminRights(not_null<PeerData*> peer) {
function AddInnerToggle (line 366) | not_null<Ui::RpWidget*> AddInnerToggle(
function CreateEditFlags (line 549) | [[nodiscard]] EditFlagsControl<Flags> CreateEditFlags(
function AddSlowmodeLabels (line 776) | void AddSlowmodeLabels(
function AddSlowmodeSlider (line 817) | rpl::producer<int> AddSlowmodeSlider(
function AddBoostsUnrestrictLabels (line 904) | void AddBoostsUnrestrictLabels(not_null<Ui::VerticalLayout*> container) {
function AddBoostsUnrestrictSlider (line 940) | rpl::producer<int> AddBoostsUnrestrictSlider(
function AddBoostsUnrestrictWrapped (line 1011) | rpl::producer<int> AddBoostsUnrestrictWrapped(
function AddSuggestGigagroup (line 1038) | void AddSuggestGigagroup(
function AddBannedButtons (line 1066) | void AddBannedButtons(
function ShowEditPeerPermissionsBox (line 1109) | void ShowEditPeerPermissionsBox(
function AboutGigagroupCallback (line 1277) | Fn<void()> AboutGigagroupCallback(
function RestrictionLabels (line 1347) | std::vector<RestrictionLabel> RestrictionLabels(
function AdminRightLabels (line 1356) | std::vector<AdminRightLabel> AdminRightLabels(
function CreateEditRestrictions (line 1365) | EditFlagsControl<ChatRestrictions> CreateEditRestrictions(
function CreateEditAdminRights (line 1389) | EditFlagsControl<ChatAdminRights> CreateEditAdminRights(
function ChatAdminRights (line 1407) | ChatAdminRights DisabledByDefaultRestrictions(not_null<PeerData*> peer) {
function ChatRestrictions (line 1437) | ChatRestrictions FixDependentRestrictions(ChatRestrictions restrictions) {
function ChatAdminRights (line 1463) | ChatAdminRights AdminRightsForOwnershipTransfer(
function CreateEditPowerSaving (line 1474) | EditFlagsControl<PowerSaving::Flags> CreateEditPowerSaving(
function CreateEditAdminLogFilter (line 1492) | EditFlagsControl<AdminLog::FilterValue::Flags> CreateEditAdminLogFilter(
function CreateEditChatbotPermissions (line 1507) | EditFlagsControl<Data::ChatbotsPermissions> CreateEditChatbotPermissions(
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_permissions_box.h
function namespace (line 14) | namespace style {
function namespace (line 18) | namespace Ui {
function namespace (line 25) | namespace PowerSaving {
function namespace (line 30) | namespace Data {
function final (line 43) | struct EditPeerPermissionsBoxResult final {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_reactions.cpp
type UniqueCustomEmojiContext (line 49) | struct UniqueCustomEmojiContext {
class MaybeDisabledEmoji (line 57) | class MaybeDisabledEmoji final : public Ui::Text::CustomEmoji {
function QString (line 87) | QString MaybeDisabledEmoji::entityData() {
function QString (line 115) | [[nodiscard]] QString AllowOnlyCustomEmojiProcessor(QStringView mimeTag) {
function AllowOnlyCustomEmojiMimeDataHook (line 127) | [[nodiscard]] bool AllowOnlyCustomEmojiMimeDataHook(
function DefaultSelected (line 156) | [[nodiscard]] std::vector<Data::ReactionId> DefaultSelected() {
function CollectAvailableReactions (line 162) | [[nodiscard]] std::vector<Data::ReactionId> CollectAvailableReactions(
function RemoveNonCustomEmojiFragment (line 179) | [[nodiscard]] bool RemoveNonCustomEmojiFragment(
function RemoveNonCustomEmoji (line 229) | bool RemoveNonCustomEmoji(
function SetupOnlyCustomEmojiField (line 240) | void SetupOnlyCustomEmojiField(
function TextWithTags (line 287) | [[nodiscard]] TextWithTags ComposeEmojiList(
type ReactionsSelectorState (line 325) | enum class ReactionsSelectorState {
type ReactionsSelectorArgs (line 331) | struct ReactionsSelectorArgs {
function AddReactionsSelector (line 346) | object_ptr<Ui::RpWidget> AddReactionsSelector(
function AddReactionsText (line 576) | void AddReactionsText(
function EditAllowedReactionsBox (line 650) | void EditAllowedReactionsBox(
function SaveAllowedReactions (line 993) | void SaveAllowedReactions(
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_reactions.h
function namespace (line 12) | namespace Data {
function namespace (line 17) | namespace Ui {
function namespace (line 21) | namespace Window {
type EditAllowedReactionsArgs (line 25) | struct EditAllowedReactionsArgs {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_requests_box.cpp
class RowDelegate (line 44) | class RowDelegate {
class Row (line 62) | class Row final : public PeerListRow {
function QRect (line 104) | QRect Row::elementGeometry(int element, int outerWidth) const {
class RequestsBoxController::RowHelper (line 195) | class RequestsBoxController::RowHelper final : public RowDelegate {
function QSize (line 465) | QSize RequestsBoxController::RowHelper::rowAcceptButtonSize() {
function QSize (line 473) | QSize RequestsBoxController::RowHelper::rowRejectButtonSize() {
function TimeId (line 621) | TimeId RequestsBoxSearchController::dateForUser(not_null<UserData*> user) {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_requests_box.h
function namespace (line 14) | namespace Window {
function namespace (line 18) | namespace Ui {
function prepare (line 36) | void prepare() override;
type Item (line 115) | struct Item {
type CacheEntry (line 119) | struct CacheEntry {
type Query (line 123) | struct Query {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp
class Controller (line 52) | class Controller : public base::has_weak_ptr {
method getTitle (line 67) | [[nodiscard]] rpl::producer<QString> getTitle() const {
method goodUsername (line 75) | [[nodiscard]] bool goodUsername() const {
method Privacy (line 79) | [[nodiscard]] Privacy getPrivacy() const {
method noForwards (line 83) | [[nodiscard]] bool noForwards() const {
method joinToWrite (line 86) | [[nodiscard]] bool joinToWrite() const {
method requestToJoin (line 89) | [[nodiscard]] bool requestToJoin() const {
method scrollToRequests (line 93) | [[nodiscard]] rpl::producer<int> scrollToRequests() const {
method showError (line 97) | void showError(rpl::producer<QString> text) {
type Controls (line 103) | struct Controls {
function QString (line 398) | QString Controller::getUsernameInput() const {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_type_box.h
function namespace (line 12) | namespace style {
function namespace (line 16) | namespace Ui {
function namespace (line 21) | namespace Window {
type class (line 25) | enum class
type class (line 30) | enum class
type EditPeerTypeData (line 36) | struct EditPeerTypeData {
function class (line 46) | class EditPeerTypeBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_usernames_list.cpp
class RightAction (line 39) | class RightAction final : public Ui::RpWidget {
class UsernamesList::Row (line 66) | class UsernamesList::Row final : public Ui::SettingsButton {
FILE: Telegram/SourceFiles/boxes/peers/edit_peer_usernames_list.h
function namespace (line 15) | namespace Ui {
function namespace (line 21) | namespace Data {
FILE: Telegram/SourceFiles/boxes/peers/edit_tag_control.cpp
class TextLinesPart (line 42) | class TextLinesPart final : public MediaGenericPart {
function QSize (line 63) | QSize TextLinesPart::countOptimalSize() {
function QSize (line 71) | QSize TextLinesPart::countCurrentSize(int newWidth) {
class TagPreviewDelegate (line 102) | class TagPreviewDelegate final : public DefaultElementDelegate {
function QString (line 136) | const QString &TagPreviewDelegate::tagText() const {
function Context (line 149) | Context TagPreviewDelegate::elementContext() {
function QString (line 153) | QString TagPreviewDelegate::elementAuthorRank(
function LookupBadgeRole (line 160) | HistoryView::BadgeRole LookupBadgeRole(
class EditTagControl::PreviewWidget (line 182) | class EditTagControl::PreviewWidget final : public Ui::RpWidget {
function QString (line 410) | QString EditTagControl::currentRank() const {
FILE: Telegram/SourceFiles/boxes/peers/edit_tag_control.h
function namespace (line 12) | namespace Ui {
function namespace (line 16) | namespace Main {
function namespace (line 23) | namespace HistoryView {
FILE: Telegram/SourceFiles/boxes/peers/peer_short_info_box.cpp
type PeerShortInfoCover::CustomLabelStyle (line 45) | struct PeerShortInfoCover::CustomLabelStyle {
type PeerShortInfoCover::Radial (line 53) | struct PeerShortInfoCover::Radial {
function QImage (line 414) | QImage PeerShortInfoCover::currentVideoFrame() const {
function QRect (line 645) | QRect PeerShortInfoCover::radialRect() const {
FILE: Telegram/SourceFiles/boxes/peers/peer_short_info_box.h
function namespace (line 13) | namespace style {
function namespace (line 18) | namespace Ui::Menu {
function namespace (line 22) | namespace Media::Streaming {
function namespace (line 30) | namespace Ui {
type class (line 35) | enum class
type PeerShortInfoFields (line 42) | struct PeerShortInfoFields {
type PeerShortInfoUserpic (line 55) | struct PeerShortInfoUserpic {
type CustomLabelStyle (line 89) | struct CustomLabelStyle
type Radial (line 90) | struct Radial
function QImage (line 98) | [[nodiscard]] QImage currentVideoFrame() const;
FILE: Telegram/SourceFiles/boxes/peers/prepare_short_info_box.cpp
type UserpicState (line 39) | struct UserpicState {
function GenerateImage (line 54) | void GenerateImage(
function GenerateImage (line 71) | void GenerateImage(
function ProcessUserpic (line 78) | void ProcessUserpic(
function Preload (line 108) | void Preload(
function ProcessFullPhoto (line 147) | void ProcessFullPhoto(
function FieldsValue (line 203) | [[nodiscard]] rpl::producer<PeerShortInfoFields> FieldsValue(
function StatusValue (line 247) | [[nodiscard]] rpl::producer<QString> StatusValue(not_null<PeerData*> pee...
function ValidatePhotoId (line 291) | void ValidatePhotoId(
function ProcessCurrent (line 320) | bool ProcessCurrent(
function PreparedShortInfoUserpic (line 386) | [[nodiscard]] PreparedShortInfoUserpic UserpicValue(
function PrepareShortInfoBox (line 451) | object_ptr<Ui::BoxContent> PrepareShortInfoBox(
function PrepareShortInfoBox (line 489) | object_ptr<Ui::BoxContent> PrepareShortInfoBox(
function PrepareShortInfoBox (line 519) | object_ptr<Ui::BoxContent> PrepareShortInfoBox(
function PrepareShortInfoStatus (line 526) | rpl::producer<QString> PrepareShortInfoStatus(not_null<PeerData*> peer) {
function PreparedShortInfoUserpic (line 530) | PreparedShortInfoUserpic PrepareShortInfoUserpic(
function PreparedShortInfoUserpic (line 546) | PreparedShortInfoUserpic PrepareShortInfoFallbackUserpic(
FILE: Telegram/SourceFiles/boxes/peers/prepare_short_info_box.h
function namespace (line 14) | namespace style {
function namespace (line 19) | namespace ChatHelpers {
function namespace (line 23) | namespace Ui::Menu {
function namespace (line 27) | namespace Ui {
function namespace (line 31) | namespace Window {
type PeerShortInfoUserpic (line 35) | struct PeerShortInfoUserpic
type PreparedShortInfoUserpic (line 37) | struct PreparedShortInfoUserpic {
FILE: Telegram/SourceFiles/boxes/peers/replace_boost_box.cpp
class Row (line 47) | class Row final : public PeerListRow {
method TakenBoostSlot (line 56) | [[nodiscard]] TakenBoostSlot data() const {
method waiting (line 59) | [[nodiscard]] bool waiting() const {
class Controller (line 82) | class Controller final : public PeerListController {
method selectedValue (line 86) | [[nodiscard]] rpl::producer<std::vector<int>> selectedValue() const {
method trackSelectedList (line 93) | bool trackSelectedList() override {
function QString (line 150) | QString Row::generateName() {
function QString (line 154) | QString Row::generateShortName() {
function PaintRoundImageCallback (line 158) | PaintRoundImageCallback Row::generatePaintUserpicCallback(
function float64 (line 176) | float64 Row::opacity() {
function PaintRoundImageCallback (line 180) | PaintRoundImageCallback Row::peerPaintUserpicCallback() {
function ReassignBoostFloodBox (line 325) | object_ptr<Ui::BoxContent> ReassignBoostFloodBox(int seconds, bool group) {
function ReassignBoostSingleBox (line 346) | object_ptr<Ui::BoxContent> ReassignBoostSingleBox(
function ForChannelBoostSlots (line 392) | ForChannelBoostSlots ParseForChannelBoostSlots(
function ParseBoostCounters (line 420) | Ui::BoostCounters ParseBoostCounters(
function LookupBoostFeatures (line 433) | Ui::BoostFeatures LookupBoostFeatures(not_null<ChannelData*> channel) {
function BoostsForGift (line 502) | int BoostsForGift(not_null<Main::Session*> session) {
type Sources (line 506) | struct Sources {
function Sources (line 510) | [[nodiscard]] Sources SourcesCount(
function ReassignBoostsBox (line 533) | object_ptr<Ui::BoxContent> ReassignBoostsBox(
function CreateUserpicsTransfer (line 575) | object_ptr<Ui::RpWidget> CreateUserpicsTransfer(
function CreateUserpicsWithMoreBadge (line 744) | object_ptr<Ui::RpWidget> CreateUserpicsWithMoreBadge(
class UniqueGiftBackground (line 896) | class UniqueGiftBackground final : public Ui::DynamicImage {
method UniqueGiftBackground (line 898) | UniqueGiftBackground(
method clone (line 905) | std::shared_ptr<Ui::DynamicImage> clone() override {
method subscribeToUpdates (line 909) | void subscribeToUpdates(Fn<void()> callback) override {
method QImage (line 916) | QImage image(int size) override {
method ready (line 965) | void ready() {
function PaintRoundImageCallback (line 981) | [[nodiscard]] PaintRoundImageCallback GenerateGiftUniqueUserpicCallback(
function CreateGiftTransfer (line 1039) | object_ptr<Ui::RpWidget> CreateGiftTransfer(
FILE: Telegram/SourceFiles/boxes/peers/replace_boost_box.h
function namespace (line 12) | namespace style {
function namespace (line 18) | namespace Data {
function namespace (line 22) | namespace Main {
function namespace (line 26) | namespace Ui {
type TakenBoostSlot (line 33) | struct TakenBoostSlot {
type ForChannelBoostSlots (line 40) | struct ForChannelBoostSlots {
function UserpicsTransferType (line 64) | enum class UserpicsTransferType {
FILE: Telegram/SourceFiles/boxes/peers/tag_info_box.cpp
function QColor (line 43) | [[nodiscard]] QColor RoleColor(BadgeRole role) {
function MakeRoundColoredLogo (line 51) | [[nodiscard]] object_ptr<Ui::RpWidget> MakeRoundColoredLogo(
function MakeTagPillEmoji (line 77) | [[nodiscard]] Ui::Text::PaletteDependentEmoji MakeTagPillEmoji(
class TagPreviewsWidget (line 133) | class TagPreviewsWidget final : public Ui::RpWidget {
function QString (line 392) | [[nodiscard]] QString LookupCurrentRank(not_null<PeerData*> peer) {
function TagInfoBox (line 412) | void TagInfoBox(
FILE: Telegram/SourceFiles/boxes/peers/tag_info_box.h
function namespace (line 10) | namespace Ui {
function namespace (line 15) | namespace HistoryView {
FILE: Telegram/SourceFiles/boxes/peers/toggle_topics_box.cpp
type Ui (line 26) | namespace Ui {
type LayoutType (line 29) | enum class LayoutType {
class LayoutButton (line 34) | class LayoutButton final : public Ui::RippleButton {
function QImage (line 135) | QImage LayoutButton::prepareRippleMask() const {
function ToggleTopicsBox (line 141) | void ToggleTopicsBox(
FILE: Telegram/SourceFiles/boxes/peers/toggle_topics_box.h
function namespace (line 12) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/peers/verify_peers_box.cpp
class Controller (line 30) | class Controller final : public ChatsListBoxController {
method Controller (line 32) | Controller(not_null<Main::Session*> session, not_null<UserData*> bot)
function Setup (line 52) | void Setup(
function Remove (line 72) | void Remove(
type State (line 107) | struct State {
function MakeVerifyPeersBox (line 243) | object_ptr<Ui::BoxContent> MakeVerifyPeersBox(
function BotVerifyPhrases (line 257) | BotVerifyPhrases PeerVerifyPhrases(not_null<PeerData*> peer) {
FILE: Telegram/SourceFiles/boxes/peers/verify_peers_box.h
function namespace (line 16) | namespace Ui {
function namespace (line 20) | namespace Window {
type BotVerifyPhrases (line 28) | struct BotVerifyPhrases {
FILE: Telegram/SourceFiles/boxes/phone_banned_box.cpp
type Ui (line 17) | namespace Ui {
function SendToBannedHelp (line 21) | void SendToBannedHelp(const QString &phone) {
function ShowPhoneBannedError (line 49) | void ShowPhoneBannedError(
FILE: Telegram/SourceFiles/boxes/phone_banned_box.h
function namespace (line 10) | namespace Window {
function namespace (line 14) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/pin_messages_box.cpp
function IsOldForPin (line 24) | [[nodiscard]] bool IsOldForPin(
function PinMessageBox (line 49) | void PinMessageBox(
FILE: Telegram/SourceFiles/boxes/pin_messages_box.h
function namespace (line 10) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/premium_limits_box.cpp
type InfographicDescriptor (line 44) | struct InfographicDescriptor {
function AddSubtitle (line 53) | void AddSubtitle(
class InactiveController (line 63) | class InactiveController final : public PeerListController {
class PublicsController (line 86) | class PublicsController final : public PeerListController {
class InactiveDelegate (line 112) | class InactiveDelegate final : public PeerListContentDelegate {
function ChooseBubbleType (line 140) | [[nodiscard]] Ui::Premium::BubbleType ChooseBubbleType(bool premium) {
function SimpleLimitBox (line 403) | void SimpleLimitBox(
function SimpleLimitBox (line 479) | void SimpleLimitBox(
function PinsCount (line 500) | [[nodiscard]] int PinsCount(not_null<Dialogs::MainList*> list) {
function SimplePinsLimitBox (line 504) | void SimplePinsLimitBox(
function ChannelsLimitBox (line 544) | void ChannelsLimitBox(
function PublicLinksLimitBox (line 632) | void PublicLinksLimitBox(
function FilterChatsLimitBox (line 695) | void FilterChatsLimitBox(
function FilterLinksLimitBox (line 740) | void FilterLinksLimitBox(
function FiltersLimitBox (line 785) | void FiltersLimitBox(
function ShareableFiltersLimitBox (line 826) | void ShareableFiltersLimitBox(
function FilterPinsLimitBox (line 871) | void FilterPinsLimitBox(
function FolderPinsLimitBox (line 885) | void FolderPinsLimitBox(
function PinsLimitBox (line 898) | void PinsLimitBox(
function SublistsPinsLimitBox (line 911) | void SublistsPinsLimitBox(
function ForumPinsLimitBox (line 924) | void ForumPinsLimitBox(
function CaptionLimitBox (line 944) | void CaptionLimitBox(
function CaptionLimitReachedBox (line 988) | void CaptionLimitReachedBox(
function FileSizeLimitBox (line 1009) | void FileSizeLimitBox(
function AccountsLimitBox (line 1067) | void AccountsLimitBox(
function QString (line 1194) | QString LimitsPremiumRef(const QString &addition) {
FILE: Telegram/SourceFiles/boxes/premium_limits_box.h
function namespace (line 12) | namespace style {
function namespace (line 16) | namespace Data {
function namespace (line 20) | namespace Main {
function namespace (line 24) | namespace Window {
FILE: Telegram/SourceFiles/boxes/premium_preview_box.cpp
type Descriptor (line 67) | struct Descriptor {
type Preload (line 82) | struct Preload {
function PreloadSticker (line 93) | void PreloadSticker(const std::shared_ptr<Data::DocumentMedia> &media) {
function SectionTitle (line 99) | [[nodiscard]] rpl::producer<QString> SectionTitle(PremiumFeature section) {
function SectionAbout (line 174) | [[nodiscard]] rpl::producer<QString> SectionAbout(PremiumFeature section) {
function ChatBackPreview (line 249) | [[nodiscard]] object_ptr<Ui::RpWidget> ChatBackPreview(
function StickerPreview (line 265) | [[nodiscard]] not_null<Ui::RpWidget*> StickerPreview(
function StickersPreview (line 403) | [[nodiscard]] not_null<Ui::RpWidget*> StickersPreview(
type VideoPreviewDocument (line 533) | struct VideoPreviewDocument {
function VideoAlignToTop (line 538) | [[nodiscard]] bool VideoAlignToTop(PremiumFeature section) {
function DocumentData (line 544) | [[nodiscard]] DocumentData *LookupVideo(
function QPainterPath (line 589) | [[nodiscard]] QPainterPath GenerateFrame(
function VideoPreview (line 641) | [[nodiscard]] not_null<Ui::RpWidget*> VideoPreview(
function GenericPreview (line 804) | [[nodiscard]] not_null<Ui::RpWidget*> GenericPreview(
function GenerateDefaultPreview (line 845) | [[nodiscard]] not_null<Ui::RpWidget*> GenerateDefaultPreview(
function CreateGradientButton (line 862) | [[nodiscard]] object_ptr<Ui::GradientButton> CreateGradientButton(
function CreatePremiumButton (line 868) | [[nodiscard]] object_ptr<Ui::GradientButton> CreatePremiumButton(
function CreateSwitch (line 873) | [[nodiscard]] object_ptr<Ui::RpWidget> CreateSwitch(
function AddGiftsInfoRows (line 917) | void AddGiftsInfoRows(not_null<Ui::VerticalLayout*> container) {
function PreviewBox (line 942) | void PreviewBox(
function Show (line 1257) | void Show(
function Show (line 1270) | void Show(std::shared_ptr<ChatHelpers::Show> show, QImage back) {
function DecorateListPromoBox (line 1286) | void DecorateListPromoBox(
function Show (line 1338) | void Show(
function ShowStickerPreviewBox (line 1430) | void ShowStickerPreviewBox(
function ShowPremiumPreviewBox (line 1439) | void ShowPremiumPreviewBox(
function ShowPremiumPreviewBox (line 1446) | void ShowPremiumPreviewBox(
function ShowPremiumPreviewToBuy (line 1458) | void ShowPremiumPreviewToBuy(
function PremiumUnavailableBox (line 1469) | void PremiumUnavailableBox(not_null<Ui::GenericBox*> box) {
function DoubledLimitsPreviewBox (line 1478) | void DoubledLimitsPreviewBox(
function UpgradedStoriesPreviewBox (line 1621) | void UpgradedStoriesPreviewBox(
function TelegramBusinessPreviewBox (line 1675) | void TelegramBusinessPreviewBox(
function CreateUnlockButton (line 1749) | object_ptr<Ui::GradientButton> CreateUnlockButton(
FILE: Telegram/SourceFiles/boxes/premium_preview_box.h
function namespace (line 14) | namespace ChatHelpers {
function namespace (line 18) | namespace Data {
function namespace (line 22) | namespace Ui {
function namespace (line 28) | namespace Window {
function namespace (line 32) | namespace Main {
function PremiumFeature (line 52) | enum class PremiumFeature {
FILE: Telegram/SourceFiles/boxes/reactions_settings_box.cpp
function AddMessage (line 51) | void AddMessage(
function AddReactionIconWrap (line 233) | not_null<Ui::RpWidget*> AddReactionIconWrap(
function AddReactionAnimatedIcon (line 302) | void AddReactionAnimatedIcon(
function AddReactionCustomIcon (line 394) | void AddReactionCustomIcon(
function ReactionsSettingsBox (line 436) | void ReactionsSettingsBox(
FILE: Telegram/SourceFiles/boxes/reactions_settings_box.h
function namespace (line 10) | namespace Ui {
function namespace (line 15) | namespace Window {
function namespace (line 19) | namespace Data {
FILE: Telegram/SourceFiles/boxes/report_messages_box.cpp
function ReportPhoto (line 30) | [[nodiscard]] object_ptr<Ui::BoxContent> ReportPhoto(
function ReportProfilePhotoBox (line 63) | object_ptr<Ui::BoxContent> ReportProfilePhotoBox(
function ShowReportMessageBox (line 69) | void ShowReportMessageBox(
FILE: Telegram/SourceFiles/boxes/report_messages_box.h
function namespace (line 18) | namespace style {
FILE: Telegram/SourceFiles/boxes/ringtones_box.cpp
class AudioCreator (line 55) | class AudioCreator final {
function QString (line 93) | QString ExtractRingtoneName(not_null<DocumentData*> document) {
function RingtonesBox (line 116) | void RingtonesBox(
function ThreadRingtonesBox (line 386) | void ThreadRingtonesBox(
FILE: Telegram/SourceFiles/boxes/ringtones_box.h
function namespace (line 12) | namespace Data {
function namespace (line 19) | namespace Main {
function namespace (line 23) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/select_future_owner_box.cpp
type ParticipantType (line 43) | enum class ParticipantType {
class FutureOwnerController (line 48) | class FutureOwnerController : public PeerListController {
class ParticipantsController (line 89) | class ParticipantsController : public FutureOwnerController {
class LegacyParticipantsController (line 199) | class LegacyParticipantsController : public FutureOwnerController {
function SelectFutureOwnerbox (line 255) | void SelectFutureOwnerbox(
FILE: Telegram/SourceFiles/boxes/select_future_owner_box.h
function namespace (line 13) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/self_destruction_box.cpp
function AddDeleteAccount (line 34) | void AddDeleteAccount(
function Values (line 94) | [[nodiscard]] std::vector<int> Values(Type type) {
function QString (line 185) | QString SelfDestructionBox::DaysLabel(int days) {
FILE: Telegram/SourceFiles/boxes/self_destruction_box.h
function namespace (line 13) | namespace Ui {
function namespace (line 19) | namespace Main {
function class (line 23) | class SelfDestructionBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/send_credits_box.cpp
type Ui (line 50) | namespace Ui {
type PaidMediaData (line 53) | struct PaidMediaData {
function PaidMediaData (line 65) | [[nodiscard]] PaidMediaData LookupPaidMediaData(
function AddTerms (line 101) | void AddTerms(
function SendCreditsConfirmText (line 139) | [[nodiscard]] rpl::producer<TextWithEntities> SendCreditsConfirmText(
function SendCreditsThumbnail (line 219) | [[nodiscard]] object_ptr<Ui::RpWidget> SendCreditsThumbnail(
function SendCreditsBadge (line 249) | [[nodiscard]] not_null<Ui::RpWidget*> SendCreditsBadge(
function SendCreditsBox (line 302) | void SendCreditsBox(
function TextWithEntities (line 513) | TextWithEntities CreditsEmoji() {
function TextWithEntities (line 519) | TextWithEntities CreditsEmojiSmall() {
function SetButtonMarkedLabel (line 525) | not_null<FlatLabel*> SetButtonMarkedLabel(
function SetButtonMarkedLabel (line 564) | not_null<FlatLabel*> SetButtonMarkedLabel(
function SendStarsForm (line 575) | void SendStarsForm(
function SmallBalanceSourceFromForm (line 593) | Settings::SmallBalanceSource SmallBalanceSourceFromForm(
FILE: Telegram/SourceFiles/boxes/send_credits_box.h
function namespace (line 12) | namespace style {
function namespace (line 16) | namespace Main {
function namespace (line 20) | namespace Payments {
function namespace (line 24) | namespace Settings {
function namespace (line 29) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/send_files_box.cpp
function CanAddUrls (line 83) | [[nodiscard]] inline bool CanAddUrls(const QList<QUrl> &urls) {
function CanAddFiles (line 87) | [[nodiscard]] bool CanAddFiles(not_null<const QMimeData*> data) {
function FileDialogCallback (line 91) | void FileDialogCallback(
function RenameFileBox (line 115) | void RenameFileBox(
function EditFileCaptionBox (line 167) | void EditFileCaptionBox(
function EditPriceBox (line 247) | void EditPriceBox(
function SkipCaption (line 324) | [[nodiscard]] bool SkipCaption(
function SendFilesLimits (line 335) | SendFilesLimits DefaultLimitsForPeer(not_null<PeerData*> peer) {
function SendFilesCheck (line 355) | SendFilesCheck DefaultCheckForPeer(
function SendFilesCheck (line 361) | SendFilesCheck DefaultCheckForPeer(
function QImage (line 566) | QImage SendFilesBox::Block::generatePriceTagBackground() const {
function QImage (line 1063) | QImage SendFilesBox::preparePriceTagBg(QSize size) const {
type State (line 1244) | struct State {
function TextWithTags (line 1870) | TextWithTags SendFilesBox::fieldText() const {
FILE: Telegram/SourceFiles/boxes/send_files_box.h
function namespace (line 15) | namespace style {
function namespace (line 19) | namespace Ui::Text {
function namespace (line 23) | namespace Window {
function namespace (line 27) | namespace Api {
function namespace (line 32) | namespace ChatHelpers {
function namespace (line 38) | namespace Ui {
function namespace (line 51) | namespace Window {
function namespace (line 55) | namespace SendMenu {
function namespace (line 60) | namespace HistoryView::Controls {
function SendFilesAllow (line 65) | enum class SendFilesAllow {
function class (line 110) | class SendFilesBox : public Ui::BoxContent {
FILE: Telegram/SourceFiles/boxes/send_gif_with_caption_box.cpp
type Ui (line 58) | namespace Ui {
function SetupCaptionFieldInBox (line 60) | void SetupCaptionFieldInBox(
type State (line 144) | struct State final {
function AddGifWidget (line 154) | [[nodiscard]] not_null<State*> AddGifWidget(
function AddInputField (line 289) | [[nodiscard]] not_null<Ui::InputField*> AddInputField(
function CaptionBox (line 316) | void CaptionBox(
function SendGifWithCaptionBox (line 449) | void SendGifWithCaptionBox(
function EditCaptionBox (line 469) | void EditCaptionBox(
FILE: Telegram/SourceFiles/boxes/send_gif_with_caption_box.h
type class (line 12) | enum class
function namespace (line 14) | namespace Api {
function namespace (line 18) | namespace SendMenu {
function namespace (line 22) | namespace HistoryView {
function namespace (line 26) | namespace Window {
function namespace (line 30) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/share_box.cpp
class ShareBox::Inner (line 71) | class ShareBox::Inner final : public Ui::RpWidget {
type Chat (line 115) | struct Chat {
type ChangeStateWay (line 156) | enum class ChangeStateWay {
function CreateForwardedMessagePhraseArgs (line 1694) | ChatHelpers::ForwardedMessagePhraseArgs CreateForwardedMessagePhraseArgs(
type State (line 1720) | struct State final {
function ShareBoxStyleOverrides (line 1948) | ShareBoxStyleOverrides DarkShareBoxStyle() {
function FastShareMessage (line 1976) | void FastShareMessage(
function FastShareMessageToSelf (line 2096) | void FastShareMessageToSelf(
function FastShareMessage (line 2123) | void FastShareMessage(
function FastShareLink (line 2130) | void FastShareLink(
function FastShareLink (line 2137) | void FastShareLink(
function ShareMessageMoneyRestrictionError (line 2218) | auto ShareMessageMoneyRestrictionError()
FILE: Telegram/SourceFiles/boxes/share_box.h
function namespace (line 20) | namespace style {
function namespace (line 26) | namespace SendMenu {
function namespace (line 30) | namespace Window {
function namespace (line 34) | namespace Api {
function namespace (line 38) | namespace Main {
function namespace (line 43) | namespace Dialogs {
function namespace (line 48) | namespace Data {
function namespace (line 53) | namespace Ui {
type ShareBoxStyleOverrides (line 64) | struct ShareBoxStyleOverrides {
type RecipientMoneyRestrictionError (line 94) | struct RecipientMoneyRestrictionError
type Descriptor (line 124) | struct Descriptor {
FILE: Telegram/SourceFiles/boxes/star_gift_auction_box.cpp
type Ui (line 78) | namespace Ui {
type BidType (line 87) | enum class BidType {
type BidRowData (line 92) | struct BidRowData {
type BidSliderValues (line 105) | struct BidSliderValues {
function BidColorOverride (line 115) | [[nodiscard]] std::optional<QColor> BidColorOverride(int position, int...
function MinutesLeftTillValue (line 127) | [[nodiscard]] rpl::producer<int> MinutesLeftTillValue(TimeId endDate) {
function SecondsLeftTillValue (line 159) | [[nodiscard]] rpl::producer<int> SecondsLeftTillValue(TimeId endDate) {
function QString (line 194) | [[nodiscard]] QString NiceCountdownText(int seconds) {
function MakeBidRow (line 205) | [[nodiscard]] object_ptr<RpWidget> MakeBidRow(
function MakeAuctionFillMenuCallback (line 298) | Fn<void(not_null<Ui::PopupMenu*>)> MakeAuctionFillMenuCallback(
function MakeAuctionMenuCallback (line 321) | Fn<void()> MakeAuctionMenuCallback(
function PlaceAuctionBid (line 335) | void PlaceAuctionBid(
function MakeAuctionInfoBlocks (line 380) | object_ptr<RpWidget> MakeAuctionInfoBlocks(
function AddBidPlaces (line 461) | void AddBidPlaces(
function EditCustomBid (line 596) | void EditCustomBid(
function AuctionBidBox (line 636) | void AuctionBidBox(not_null<GenericBox*> box, AuctionBidBoxArgs &&args) {
function MakeAveragePriceValue (line 936) | [[nodiscard]] object_ptr<RpWidget> MakeAveragePriceValue(
function AuctionInfoTable (line 961) | [[nodiscard]] object_ptr<TableLayout> AuctionInfoTable(
function AuctionGotGiftsBox (line 1125) | void AuctionGotGiftsBox(
function MakePreviewAuctionStream (line 1214) | [[nodiscard]] rpl::producer<UniqueGiftCover> MakePreviewAuctionStream(
function AuctionInfoBox (line 1301) | void AuctionInfoBox(
function ChooseAndShowAuctionBox (line 1485) | base::weak_qptr<BoxContent> ChooseAndShowAuctionBox(
function ShowStarGiftAuction (line 1586) | rpl::lifetime ShowStarGiftAuction(
function MakeAuctionBidBox (line 1635) | object_ptr<BoxContent> MakeAuctionBidBox(AuctionBidBoxArgs &&args) {
function SetAuctionButtonCountdownText (line 1639) | void SetAuctionButtonCountdownText(
function AuctionAboutBox (line 1729) | void AuctionAboutBox(
function TextWithEntities (line 1820) | TextWithEntities ActiveAuctionsTitle(const Data::ActiveAuctions &aucti...
function ManyAuctionsState (line 1836) | ManyAuctionsState ActiveAuctionsState(const Data::ActiveAuctions &auct...
function ActiveAuctionsButton (line 1874) | rpl::producer<TextWithEntities> ActiveAuctionsButton(
type Single (line 1893) | struct Single {
function MakeActiveAuctionRow (line 1904) | object_ptr<Ui::RpWidget> MakeActiveAuctionRow(
function ActiveAuctionsCallback (line 2014) | Fn<void()> ActiveAuctionsCallback(
function RandomIndicesSubset (line 2096) | std::vector<int> RandomIndicesSubset(int total, int subset) {
FILE: Telegram/SourceFiles/boxes/star_gift_auction_box.h
function namespace (line 10) | namespace ChatHelpers {
function namespace (line 14) | namespace Data {
function namespace (line 20) | namespace Info::PeerGifts {
function namespace (line 24) | namespace Window {
function namespace (line 28) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/star_gift_box.cpp
type Ui (line 135) | namespace Ui {
type PickType (line 155) | enum class PickType {
type PremiumGiftsDescriptor (line 162) | struct PremiumGiftsDescriptor {
type SessionResalePrices (line 167) | struct SessionResalePrices {
method SessionResalePrices (line 168) | explicit SessionResalePrices(not_null<Main::Session*> session)
function ResalePrices (line 179) | [[nodiscard]] not_null<SessionResalePrices*> ResalePrices(
class PeerRow (line 194) | class PeerRow final : public PeerListRow {
function QSize (line 218) | QSize PeerRow::rightActionSize() const {
function QMargins (line 224) | QMargins PeerRow::rightActionMargins() const {
class PreviewDelegate (line 268) | class PreviewDelegate final : public DefaultElementDelegate {
class PreviewWrap (line 285) | class PreviewWrap final : public RpWidget {
class TextBubblePart (line 309) | class TextBubblePart final : public MediaGenericTextPart {
function SortForBirthday (line 372) | [[nodiscard]] bool SortForBirthday(not_null<PeerData*> peer) {
function IsSoldOut (line 389) | [[nodiscard]] bool IsSoldOut(const Data::StarGift &info) {
type UpgradePrice (line 393) | struct UpgradePrice {
function ParsePrices (line 398) | [[nodiscard]] std::vector<UpgradePrice> ParsePrices(
function Context (line 428) | Context PreviewDelegate::elementContext() {
function GenerateGiftMedia (line 432) | auto GenerateGiftMedia(
function ShowSentToast (line 599) | void ShowSentToast(
function GiftsPremium (line 795) | [[nodiscard]] rpl::producer<PremiumGiftsDescriptor> GiftsPremium(
function TabTextForPrice (line 877) | [[nodiscard]] Text::String TabTextForPrice(int price) {
type GiftPriceTabs (line 891) | struct GiftPriceTabs {
function GiftPriceTabs (line 895) | [[nodiscard]] GiftPriceTabs MakeGiftsPriceTabs(
function StarGiftMessageLimit (line 1138) | [[nodiscard]] int StarGiftMessageLimit(not_null<Main::Session*> sessio...
function AddPartInput (line 1144) | [[nodiscard]] not_null<InputField*> AddPartInput(
function SendGift (line 1230) | void SendGift(
function ShowGiftUpgradedToast (line 1278) | void ShowGiftUpgradedToast(
function ShowUpgradeGiftedToast (line 1295) | void ShowUpgradeGiftedToast(
function SendStarsFormRequest (line 1312) | void SendStarsFormRequest(
function UpgradeGift (line 1347) | void UpgradeGift(
function GiftUpgrade (line 1401) | void GiftUpgrade(
function SoldOutBox (line 1425) | void SoldOutBox(
function AddUpgradeButton (line 1446) | void AddUpgradeButton(
function AddSoldLeftSlider (line 1510) | void AddSoldLeftSlider(
function CheckMaybeGiftLocked (line 1580) | void CheckMaybeGiftLocked(
function FillBg (line 1601) | void FillBg(not_null<RpWidget*> box) {
type AddBlockArgs (line 1616) | struct AddBlockArgs {
function AddBlock (line 1623) | void AddBlock(
function MakePremiumGifts (line 1645) | [[nodiscard]] object_ptr<RpWidget> MakePremiumGifts(
function MakeStarsGifts (line 1671) | [[nodiscard]] object_ptr<RpWidget> MakeStarsGifts(
function GiftBox (line 1778) | void GiftBox(
function CreateRowContextMenu (line 1898) | [[nodiscard]] base::unique_qptr<Ui::PopupMenu> CreateRowContextMenu(
type CustomList (line 1916) | struct CustomList {
class Controller (line 1923) | class Controller final : public ContactsBoxController {
function CustomList (line 1957) | [[nodiscard]] CustomList MakeCustomList(
function ChooseStarGiftRecipient (line 2272) | void ChooseStarGiftRecipient(
function ShowStarGiftBox (line 2303) | void ShowStarGiftBox(
function AddWearGiftCover (line 2434) | void AddWearGiftCover(
function AttachGiftSenderBadge (line 2517) | void AttachGiftSenderBadge(
function ShowUniqueGiftWearBox (line 2621) | void ShowUniqueGiftWearBox(
function PreloadUniqueGiftResellPrices (line 2763) | void PreloadUniqueGiftResellPrices(not_null<Main::Session*> session) {
function InvokeWithUniqueGiftResellPrice (line 2791) | void InvokeWithUniqueGiftResellPrice(
function UpdateGiftSellPrice (line 2812) | void UpdateGiftSellPrice(
function UniqueGiftSellBox (line 2873) | void UniqueGiftSellBox(
function ShowUniqueGiftSellBox (line 3031) | void ShowUniqueGiftSellBox(
function SendOfferBuyGift (line 3046) | void SendOfferBuyGift(
function ConfirmOfferBuyGift (line 3077) | void ConfirmOfferBuyGift(
function ShowOfferBuyBox (line 3167) | void ShowOfferBuyBox(
type UpgradeArgs (line 3196) | struct UpgradeArgs : StarGiftUpgradeArgs {
function MakeUpgradeGiftStream (line 3205) | [[nodiscard]] rpl::producer<UniqueGiftCover> MakeUpgradeGiftStream(
function AddUpgradeGiftCover (line 3267) | void AddUpgradeGiftCover(
function EntryForUpgradedGift (line 3363) | Data::CreditsHistoryEntry EntryForUpgradedGift(
function SwitchToUpgradedAnimation (line 3405) | void SwitchToUpgradedAnimation(
class UpgradePriceValue (line 3509) | class UpgradePriceValue final {
function PricesBox (line 3619) | void PricesBox(
function UpgradeBox (line 3777) | void UpgradeBox(
function GetVariantsAndShowUpgradeBox (line 4120) | void GetVariantsAndShowUpgradeBox(UpgradeArgs &&args) {
function ShowStarGiftUpgradeBox (line 4146) | void ShowStarGiftUpgradeBox(StarGiftUpgradeArgs &&args) {
function SubmitStarsForm (line 4183) | void SubmitStarsForm(
function SubmitTonForm (line 4199) | void SubmitTonForm(
function RequestOurForm (line 4233) | void RequestOurForm(
function RequestStarsFormAndSubmit (line 4313) | void RequestStarsFormAndSubmit(
function ShowGiftTransferredToast (line 4331) | void ShowGiftTransferredToast(
function ShowGiftErrorToast (line 4348) | bool ShowGiftErrorToast(
function CreditsAmount (line 4358) | CreditsAmount StarsFromTon(
function CreditsAmount (line 4371) | CreditsAmount TonFromStars(
type DefaultGiftHandlerState (line 4389) | struct DefaultGiftHandlerState {
function DefaultGiftHandler (line 4400) | void DefaultGiftHandler(
function MakeGiftsList (line 4533) | object_ptr<RpWidget> MakeGiftsList(GiftsListArgs &&args) {
function SendGiftBox (line 4741) | void SendGiftBox(
function FindUniqueGift (line 5095) | std::shared_ptr<Data::GiftUpgradeResult> FindUniqueGift(
FILE: Telegram/SourceFiles/boxes/star_gift_box.h
function namespace (line 13) | namespace Api {
function namespace (line 17) | namespace ChatHelpers {
function namespace (line 21) | namespace Data {
function namespace (line 29) | namespace Info::PeerGifts {
function namespace (line 33) | namespace Main {
function namespace (line 38) | namespace Payments {
function namespace (line 42) | namespace MTP {
function namespace (line 46) | namespace Settings {
function namespace (line 51) | namespace Window {
function namespace (line 55) | namespace Ui::Text {
type StarGiftUpgradeArgs (line 109) | struct StarGiftUpgradeArgs {
FILE: Telegram/SourceFiles/boxes/star_gift_cover_box.cpp
type Ui (line 39) | namespace Ui {
type AttributeSpin (line 57) | struct AttributeSpin {
method AttributeSpin (line 58) | AttributeSpin(crl::time duration) : duration(duration) {
method float64 (line 67) | [[nodiscard]] float64 progress() const {
method startWithin (line 70) | void startWithin(int count, Fn<void()> update) {
method startToTarget (line 78) | void startToTarget(Fn<void()> update, int slowdown = 1) {
type Released (line 93) | struct Released {
method Released (line 94) | Released() : link(QColor(255, 255, 255)) {
type UniqueGiftCoverWidget::BackdropView (line 113) | struct UniqueGiftCoverWidget::BackdropView {
type UniqueGiftCoverWidget::PatternView (line 118) | struct UniqueGiftCoverWidget::PatternView {
type UniqueGiftCoverWidget::ModelView (line 124) | struct UniqueGiftCoverWidget::ModelView {
type UniqueGiftCoverWidget::GiftView (line 130) | struct UniqueGiftCoverWidget::GiftView {
type UniqueGiftCoverWidget::State (line 138) | struct UniqueGiftCoverWidget::State {
type AttributeState (line 659) | struct AttributeState {
type AttributesState (line 664) | struct AttributesState {
function QImage (line 869) | QImage UniqueGiftCoverWidget::prepareBackdrop(
function QRect (line 948) | QRect UniqueGiftCoverWidget::prepareCraftFrame(
function QColor (line 1057) | QColor UniqueGiftCoverWidget::backgroundColor() const {
function QColor (line 1061) | QColor UniqueGiftCoverWidget::foregroundColor() const {
function GiftReleasedByHandler (line 1312) | void GiftReleasedByHandler(not_null<PeerData*> peer) {
function MakeUniqueGiftCover (line 1330) | object_ptr<UniqueGiftCoverWidget> MakeUniqueGiftCover(
function AddUniqueGiftCover (line 1340) | void AddUniqueGiftCover(
FILE: Telegram/SourceFiles/boxes/star_gift_cover_box.h
function namespace (line 13) | namespace Data {
function namespace (line 18) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/star_gift_craft_animation.cpp
type Ui (line 43) | namespace Ui {
function QString (line 60) | [[nodiscard]] QString FormatPercent(int permille) {
type Rotation (line 65) | struct Rotation {
method Rotation (line 69) | Rotation operator+(Rotation other) const {
method Rotation (line 72) | Rotation operator*(float64 scale) const {
function Slowing (line 79) | [[nodiscard]] int Slowing() {
function RotationFn (line 83) | [[nodiscard]] RotationFn DecayingRotation(Rotation impulse, float64 de...
function RotationFn (line 91) | [[nodiscard]] RotationFn DecayingEndRotation(
type GiftAnimationConfig (line 111) | struct GiftAnimationConfig {
function QImage (line 163) | [[nodiscard]] QImage CreateBgGradient(
function ComputeCubeFaceCorners (line 188) | [[nodiscard]] std::optional<std::array<QPointF, 4>> ComputeCubeFaceCor...
function PaintCubeFace (line 312) | void PaintCubeFace(
function GetVisibleCubeFaces (line 373) | [[nodiscard]] std::vector<int> GetVisibleCubeFaces(
function PaintCubeFirstFlight (line 430) | void PaintCubeFirstFlight(
function SetupFailureAnimation (line 455) | std::unique_ptr<CraftFailAnimation> SetupFailureAnimation(
function FailureAnimationCheck (line 466) | void FailureAnimationCheck(
function FailureAnimationPrepareFrame (line 511) | void FailureAnimationPrepareFrame(
function QRect (line 558) | [[nodiscard]] QRect PrepareCraftFrame(
function PaintCube (line 593) | void PaintCube(
type GiftFlightPosition (line 688) | struct GiftFlightPosition {
function GiftFlightPosition (line 693) | [[nodiscard]] GiftFlightPosition ComputeGiftFlightPosition(
function FacePlacement (line 722) | [[nodiscard]] FacePlacement GetCameraFacingFreeFace(
function InterpolateQuadCorners (line 803) | [[nodiscard]] std::array<QPointF, 4> InterpolateQuadCorners(
function RectToCorners (line 815) | [[nodiscard]] std::array<QPointF, 4> RectToCorners(QRectF rect) {
function PaintFlyingGiftWithQuad (line 824) | void PaintFlyingGiftWithQuad(
function PaintFlyingGift (line 837) | void PaintFlyingGift(
function PaintSlideOutCorner (line 856) | void PaintSlideOutCorner(
function PaintSlideOutPhase (line 913) | void PaintSlideOutPhase(
function PaintFailureThumbnails (line 951) | void PaintFailureThumbnails(
function RotateCornersForFace (line 1026) | [[nodiscard]] std::array<QPointF, 4> RotateCornersForFace(
function StartGiftFlight (line 1041) | void StartGiftFlight(
function StartGiftFlightToFace (line 1075) | void StartGiftFlightToFace(
function LandCurrentGift (line 1140) | void LandCurrentGift(not_null<CraftAnimationState*> state, crl::time n...
function PaintLoadingAnimation (line 1168) | void PaintLoadingAnimation(
function QImage (line 1212) | QImage CraftState::CornerSnapshot::gift(float64 progress) const {
function SetupCraftProgressTitle (line 1359) | void SetupCraftProgressTitle(
function SetupProgressControls (line 1429) | void SetupProgressControls(
function SetupFailureControls (line 1496) | void SetupFailureControls(
function SetupCraftNewButton (line 1538) | void SetupCraftNewButton(
function StartCraftAnimation (line 1584) | void StartCraftAnimation(
FILE: Telegram/SourceFiles/boxes/star_gift_craft_animation.h
function namespace (line 18) | namespace ChatHelpers {
function namespace (line 22) | namespace Main {
function namespace (line 26) | namespace HistoryView {
function namespace (line 30) | namespace Info::PeerGifts {
function namespace (line 34) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/star_gift_craft_box.cpp
type Ui (line 55) | namespace Ui {
type ColorScheme (line 60) | struct ColorScheme {
function QColor (line 66) | [[nodiscard]] QColor ForgeBgOverlay() {
function QColor (line 70) | [[nodiscard]] QColor ForgeFailOverlay() {
function CraftBackdrops (line 74) | [[nodiscard]] std::array<ColorScheme, 5> CraftBackdrops() {
type GiftForCraft (line 106) | struct GiftForCraft {
method QString (line 110) | [[nodiscard]] QString slugId() const {
type CraftingView (line 122) | struct CraftingView {
function QString (line 134) | [[nodiscard]] QString FormatPercent(int permille) {
function MakeRadialPercent (line 139) | [[nodiscard]] not_null<RpWidget*> MakeRadialPercent(
function AbstractButton (line 206) | AbstractButton *MakeCornerButton(
function AbstractButton (line 268) | AbstractButton *MakePercentButton(
function AbstractButton (line 289) | AbstractButton *MakeRemoveButton(
function CraftingView (line 315) | [[nodiscard]] CraftingView MakeCraftingView(
function AddCraftGiftsList (line 573) | void AddCraftGiftsList(
function ShowSelectGiftBox (line 670) | void ShowSelectGiftBox(
function MakeRarityExpectancyPreview (line 774) | [[nodiscard]] object_ptr<RpWidget> MakeRarityExpectancyPreview(
function Craft (line 1125) | void Craft(
function AddPreviewNewModels (line 1219) | void AddPreviewNewModels(
function MakeCraftContent (line 1308) | void MakeCraftContent(
function ShowGiftCraftBox (line 1613) | void ShowGiftCraftBox(
function ShowGiftCraftInfoBox (line 1649) | void ShowGiftCraftInfoBox(
function ShowTestGiftCraftBox (line 1713) | void ShowTestGiftCraftBox(
function ShowCraftLaterError (line 1727) | bool ShowCraftLaterError(
function ShowCraftLaterError (line 1738) | void ShowCraftLaterError(
function ShowCraftAddressError (line 1756) | bool ShowCraftAddressError(
FILE: Telegram/SourceFiles/boxes/star_gift_craft_box.h
function namespace (line 12) | namespace Data {
function namespace (line 16) | namespace Window {
function namespace (line 20) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/star_gift_preview_box.cpp
type Ui (line 32) | namespace Ui {
type AttributeDescriptor (line 42) | struct AttributeDescriptor
function DocumentData (line 50) | [[nodiscard]] DocumentData *Sticker(const AttributeDescriptor &value) {
type BackdropPlayers (line 60) | struct BackdropPlayers {
type PatternEmoji (line 66) | struct PatternEmoji {
class AttributeDelegate (line 72) | class AttributeDelegate {
class AttributeButton (line 86) | class AttributeButton final : public Ui::AbstractButton {
type PatternCache (line 99) | struct PatternCache {
class Delegate (line 133) | class Delegate final : public AttributeDelegate {
method Delegate (line 137) | Delegate(Delegate &&other) = default;
type Sticker (line 157) | struct Sticker {
type Emoji (line 163) | struct Emoji {
type Selection (line 189) | struct Selection {
class AttributesList (line 197) | class AttributesList final : public Ui::BoxContentDivider {
type Entry (line 212) | struct Entry {
type Entries (line 216) | struct Entries {
type View (line 219) | struct View {
function QColor (line 271) | [[nodiscard]] QColor MakeOpaque(QColor color, QColor bg) {
function CacheBackdropBackground (line 280) | void CacheBackdropBackground(
function QSize (line 852) | QSize Delegate::buttonSize() {
function QMargins (line 865) | QMargins Delegate::buttonExtend() const {
function QImage (line 869) | QImage Delegate::background() {
function QImage (line 918) | QImage Delegate::cachePatternBackground(
function QColor (line 955) | QColor Delegate::patternColor() {
function BackdropPlayers (line 961) | BackdropPlayers Delegate::backdropPlayers() {
function PatternEmoji (line 969) | PatternEmoji Delegate::patternEmoji() {
function StarGiftPreviewBox (line 1336) | void StarGiftPreviewBox(
FILE: Telegram/SourceFiles/boxes/star_gift_preview_box.h
function namespace (line 10) | namespace Data {
function namespace (line 17) | namespace Window {
function namespace (line 21) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/star_gift_resale_box.cpp
type Ui (line 39) | namespace Ui {
function ResaleTabText (line 52) | [[nodiscard]] Text::String ResaleTabText(QString text) {
function SortModeText (line 61) | [[nodiscard]] Text::String SortModeText(ResaleGiftsSort mode) {
type ResaleTabs (line 81) | struct ResaleTabs {
function ResaleTabs (line 85) | [[nodiscard]] ResaleTabs MakeResaleTabs(
function GiftResaleBox (line 494) | void GiftResaleBox(
function AddResaleGiftsList (line 580) | void AddResaleGiftsList(
function ShowResaleGiftBoughtToast (line 784) | void ShowResaleGiftBoughtToast(
function ShowStarGiftResale (line 804) | rpl::lifetime ShowStarGiftResale(
FILE: Telegram/SourceFiles/boxes/star_gift_resale_box.h
function namespace (line 10) | namespace Data {
function namespace (line 15) | namespace Info::PeerGifts {
function namespace (line 19) | namespace Main {
function namespace (line 24) | namespace Window {
function namespace (line 28) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/sticker_set_box.cpp
function ComputeImageColor (line 84) | [[nodiscard]] std::optional<QColor> ComputeImageColor(
function QColor (line 140) | [[nodiscard]] QColor ComputeLockColor(
function ValidatePremiumLockBg (line 151) | void ValidatePremiumLockBg(
function ValidatePremiumStarFg (line 175) | void ValidatePremiumStarFg(const style::icon &lockIcon, QImage &image) {
function TextForMimeData (line 196) | [[nodiscard]] TextForMimeData PrepareTextFromEmoji(
class StickerSetBox::Inner (line 274) | class StickerSetBox::Inner final : public Ui::RpWidget {
method setReorderState (line 297) | void setReorderState(bool enabled) {
method reorderState (line 307) | [[nodiscard]] bool reorderState() const {
method setType (line 315) | [[nodiscard]] Data::StickersType setType() const {
method amSetCreator (line 323) | [[nodiscard]] bool amSetCreator() const {
type Element (line 340) | struct Element {
type ShiftAnimation (line 446) | struct ShiftAnimation final {
function ChangeSetNameBox (line 640) | void ChangeSetNameBox(
type State (line 1548) | struct State final {
function QPoint (line 1691) | QPoint StickerSetBox::Inner::posFromIndex(int index) const {
function int32 (line 1722) | int32 StickerSetBox::Inner::stickerFromGlobalPos(const QPoint &p) const {
function uint64 (line 1805) | uint64 StickerSetBox::Inner::setId() const {
function QSize (line 1809) | QSize StickerSetBox::Inner::boundingBoxSize() const {
function QString (line 2155) | QString StickerSetBox::Inner::shortName() const {
FILE: Telegram/SourceFiles/boxes/sticker_set_box.h
function namespace (line 15) | namespace Window {
function namespace (line 19) | namespace Ui {
function namespace (line 23) | namespace Data {
function namespace (line 27) | namespace ChatHelpers {
function class (line 32) | class StickerPremiumMark final {
type class (line 85) | enum class
FILE: Telegram/SourceFiles/boxes/stickers_box.cpp
function QString (line 60) | [[nodiscard]] QString FillSetTitle(
class StickersBox::CounterWidget (line 78) | class StickersBox::CounterWidget : public Ui::RpWidget {
class StickersBox::Inner (line 94) | class StickersBox::Inner : public Ui::RpWidget {
method scrollsToY (line 110) | rpl::producer<int> scrollsToY() const {
method setInstallSetCallback (line 131) | void setInstallSetCallback(Fn<void(uint64 setId)> callback) {
method setRemoveSetCallback (line 134) | void setRemoveSetCallback(Fn<void(uint64 setId)> callback) {
method setLoadMoreCallback (line 137) | void setLoadMoreCallback(Fn<void()> callback) {
method getVisibleTop (line 141) | int getVisibleTop() const {
method draggingScrollDelta (line 145) | [[nodiscard]] rpl::producer<int> draggingScrollDelta() const {
type Row (line 165) | struct Row {
type MegagroupSet (line 201) | struct MegagroupSet {
class AddressField (line 210) | class AddressField : public Ui::UsernameInput {
function QPixmap (line 908) | QPixmap StickersBox::grabContentCache() {
function QRect (line 1380) | QRect StickersBox::Inner::relativeButtonRect(
function float64 (line 1955) | float64 StickersBox::Inner::aboveShadowOpacity() const {
function StickersSetsOrder (line 2633) | StickersSetsOrder StickersBox::Inner::collectSets(Check check) const {
function StickersSetsOrder (line 2644) | StickersSetsOrder StickersBox::Inner::order() const {
function StickersSetsOrder (line 2650) | StickersSetsOrder StickersBox::Inner::fullOrder() const {
function StickersSetsOrder (line 2656) | StickersSetsOrder StickersBox::Inner::removedSets() const {
FILE: Telegram/SourceFiles/boxes/stickers_box.h
function namespace (line 16) | namespace style {
function namespace (line 21) | namespace Ui {
function namespace (line 30) | namespace ChatHelpers {
function namespace (line 34) | namespace Main {
function namespace (line 38) | namespace Data {
function namespace (line 43) | namespace Lottie {
function namespace (line 47) | namespace Stickers {
type class (line 53) | enum class
function class (line 93) | class Tab {
FILE: Telegram/SourceFiles/boxes/transfer_gift_box.cpp
type ExportOption (line 54) | struct ExportOption {
class Controller (line 60) | class Controller final : public ContactsBoxController {
function ConfirmExportBox (line 93) | void ConfirmExportBox(
function ExportOnBlockchain (line 117) | void ExportOnBlockchain(
function ExportOption (line 186) | [[nodiscard]] ExportOption MakeExportOption(
function TransferGift (line 436) | void TransferGift(
function ResolveGiftSaleOffer (line 502) | void ResolveGiftSaleOffer(
function BuyResaleGift (line 524) | void BuyResaleGift(
function ShowTransferToBox (line 610) | void ShowTransferToBox(
function ShowTransferGiftBox (line 692) | void ShowTransferGiftBox(
function ShowGiftSaleAcceptBox (line 721) | void ShowGiftSaleAcceptBox(
function ShowGiftSaleRejectBox (line 845) | void ShowGiftSaleRejectBox(
function SetThemeFromUniqueGift (line 879) | void SetThemeFromUniqueGift(
function SendPeerThemeChangeRequest (line 921) | void SendPeerThemeChangeRequest(
function SetPeerTheme (line 952) | void SetPeerTheme(
function ShowBuyResaleGiftBox (line 980) | void ShowBuyResaleGiftBox(
function ShowResaleGiftLater (line 1100) | bool ShowResaleGiftLater(
function ShowTransferGiftLater (line 1122) | bool ShowTransferGiftLater(
function ShowActionLocked (line 1143) | void ShowActionLocked(
FILE: Telegram/SourceFiles/boxes/transfer_gift_box.h
type HistoryMessageSuggestion (line 10) | struct HistoryMessageSuggestion
function namespace (line 12) | namespace Window {
function namespace (line 16) | namespace ChatHelpers {
function namespace (line 20) | namespace Data {
function namespace (line 25) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/translate_box.cpp
type Ui (line 27) | namespace Ui {
function TranslateBox (line 34) | void TranslateBox(
function SkipTranslate (line 90) | bool SkipTranslate(TextWithEntities textWithEntities) {
function EditSkipTranslationLanguages (line 121) | object_ptr<BoxContent> EditSkipTranslationLanguages() {
function ChooseTranslateToBox (line 153) | object_ptr<BoxContent> ChooseTranslateToBox(
function LanguageId (line 179) | LanguageId ChooseTranslateTo(not_null<History*> history) {
function LanguageId (line 183) | LanguageId ChooseTranslateTo(LanguageId offeredFrom) {
function LanguageId (line 191) | LanguageId ChooseTranslateTo(
function LanguageId (line 198) | LanguageId ChooseTranslateTo(
FILE: Telegram/SourceFiles/boxes/translate_box.h
type LanguageId (line 14) | struct LanguageId
function namespace (line 16) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/translate_box_content.cpp
type Ui (line 26) | namespace Ui {
class ShowButton (line 29) | class ShowButton final : public RpWidget {
function TranslateBoxContent (line 78) | void TranslateBoxContent(
FILE: Telegram/SourceFiles/boxes/translate_box_content.h
function namespace (line 12) | namespace Ui::Text {
function namespace (line 16) | namespace Ui {
FILE: Telegram/SourceFiles/boxes/url_auth_box.cpp
type UrlAuthBox (line 42) | namespace UrlAuthBox {
type SwitchAccountResult (line 48) | struct SwitchAccountResult {
function MakeMatchCodeImage (line 55) | [[nodiscard]] std::shared_ptr<Ui::DynamicImage> MakeMatchCodeImage(
function SwitchAccountResult (line 89) | [[nodiscard]] SwitchAccountResult AddAccountsMenu(
function ActivateButton (line 221) | void ActivateButton(
function ActivateUrl (line 285) | void ActivateUrl(
function RequestButton (line 322) | void RequestButton(
function RequestUrl (line 417) | void RequestUrl(
FILE: Telegram/SourceFiles/boxes/url_auth_box.h
type HistoryMessageMarkupButton (line 11) | struct HistoryMessageMarkupButton
function namespace (line 13) | namespace Main {
function namespace (line 17) | namespace Ui {
function namespace (line 22) | namespace UrlAuthBox {
FILE: Telegram/SourceFiles/boxes/url_auth_box_content.cpp
type UrlAuthBox (line 29) | namespace UrlAuthBox {
function PrepareFullWidthRoundButton (line 34) | void PrepareFullWidthRoundButton(
function ShowMatchCodesBox (line 47) | void ShowMatchCodesBox(
function QImage (line 265) | QImage SwitchableUserpicButton::prepareRippleMask() const {
function QPoint (line 271) | QPoint SwitchableUserpicButton::prepareRippleStartPosition() const {
function AddAuthInfoRow (line 275) | void AddAuthInfoRow(
function Show (line 352) | void Show(
function ShowDetails (line 425) | void ShowDetails(
FILE: Telegram/SourceFiles/boxes/url_auth_box_content.h
function namespace (line 12) | namespace Ui {
function namespace (line 18) | namespace UrlAuthBox {
FILE: Telegram/SourceFiles/boxes/username_box.cpp
class UsernameEditor (line 36) | class UsernameEditor final : public Ui::RpWidget {
function QString (line 153) | QString UsernameEditor::editableUsername() const {
function QString (line 309) | QString UsernameEditor::getName() const {
function FillUsernamesBox (line 315) | void FillUsernamesBox(
function UsernamesBox (line 395) | void UsernamesBox(
function UsernamesBoxWithCallback (line 401) | void UsernamesBoxWithCallback(
function AddUsernameCheckLabel (line 408) | void AddUsernameCheckLabel(
function UsernameCheckInfo (line 444) | UsernameCheckInfo UsernameCheckInfo::PurchaseAvailable(
FILE: Telegram/SourceFiles/boxes/username_box.h
function namespace (line 10) | namespace Ui {
function final (line 26) | struct UsernameCheckInfo final {
FILE: Telegram/SourceFiles/calls/calls_box_controller.cpp
type Calls (line 53) | namespace Calls {
class GroupCallRow (line 59) | class GroupCallRow final : public PeerListRow {
method paintNameIconGetWidth (line 68) | int paintNameIconGetWidth(
method QSize (line 80) | QSize rightActionSize() const override {
method QMargins (line 83) | QMargins rightActionMargins() const override {
type GroupCalls (line 164) | namespace GroupCalls {
class BoxController::Row (line 253) | class BoxController::Row : public PeerListRow {
type Type (line 257) | enum class Type {
type CallType (line 263) | enum class CallType {
method canAddItem (line 268) | bool canAddItem(not_null<const HistoryItem*> item) const {
method addItem (line 273) | void addItem(not_null<HistoryItem*> item) {
method itemRemoved (line 282) | void itemRemoved(not_null<const HistoryItem*> item) {
method hasItems (line 288) | [[nodiscard]] bool hasItems() const {
method MsgId (line 292) | [[nodiscard]] MsgId minItemId() const {
method MsgId (line 298) | [[nodiscard]] MsgId maxItemId() const {
method paintNameIconGetWidth (line 321) | int paintNameIconGetWidth(
method QSize (line 333) | QSize rightActionSize() const override {
method QMargins (line 336) | QMargins rightActionMargins() const override {
function ClearCallsBox (line 712) | void ClearCallsBox(
function AddCreateCallButton (line 772) | [[nodiscard]] not_null<Ui::SettingsButton*> AddCreateCallButton(
function ShowCallsBox (line 807) | void ShowCallsBox(
FILE: Telegram/SourceFiles/calls/calls_box_controller.h
function namespace (line 14) | namespace Window {
function namespace (line 18) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_call.cpp
type tgcalls (line 40) | namespace tgcalls {
class InstanceImpl (line 41) | class InstanceImpl
class InstanceV2Impl (line 42) | class InstanceV2Impl
class InstanceV2ReferenceImpl (line 43) | class InstanceV2ReferenceImpl
type Calls (line 46) | namespace Calls {
function CollectEndpointIds (line 59) | [[nodiscard]] base::flat_set<int64> CollectEndpointIds(
function AppendEndpoint (line 72) | void AppendEndpoint(
function AppendServer (line 96) | void AppendServer(
function uint64 (line 171) | uint64 ComputeFingerprint(bytes::const_span authKey) {
function WrapVersions (line 185) | [[nodiscard]] QVector<MTPstring> WrapVersions(
function CollectVersionsForApi (line 194) | [[nodiscard]] QVector<MTPstring> CollectVersionsForApi() {
function StartVideoState (line 198) | [[nodiscard]] Webrtc::VideoState StartVideoState(bool enabled) {
function StartConferenceInfo (line 427) | StartConferenceInfo Call::migrateConferenceInfo(StartConferenceInfo ex...
function QString (line 660) | QString Call::getDebugLog() const {
function float64 (line 694) | float64 Call::getWaitingSoundPeakValue() const {
function QString (line 1402) | QString Call::cameraSharingDeviceId() const {
function QString (line 1406) | QString Call::screenSharingDeviceId() const {
function UpdateConfig (line 1672) | void UpdateConfig(const std::string &data) {
FILE: Telegram/SourceFiles/calls/calls_call.h
function namespace (line 18) | namespace Data {
function namespace (line 22) | namespace Media {
function namespace (line 28) | namespace tgcalls {
function namespace (line 36) | namespace Webrtc {
type StartConferenceInfo (line 44) | struct StartConferenceInfo
type DhConfig (line 46) | struct DhConfig {
type class (line 52) | enum class
type Error (line 60) | struct Error {
type class (line 65) | enum class
function CallSound (line 81) | enum class CallSound {
type State (line 144) | enum State {
function RemoteAudioState (line 178) | enum class RemoteAudioState {
FILE: Telegram/SourceFiles/calls/calls_controller.cpp
type Calls (line 13) | namespace Calls {
function MakeController (line 15) | [[nodiscard]] std::unique_ptr<Controller> MakeController(
function CollectControllerVersions (line 45) | std::vector<std::string> CollectControllerVersions() {
function ControllerMaxLayer (line 49) | int ControllerMaxLayer() {
FILE: Telegram/SourceFiles/calls/calls_controller.h
function namespace (line 12) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_controller_tgvoip.h
function namespace (line 12) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_controller_webrtc.cpp
type Calls (line 12) | namespace Calls {
function CallConnectionDescription (line 17) | [[nodiscard]] CallConnectionDescription ConvertEndpoint(const TgVoipEn...
function MakeContextConfig (line 29) | [[nodiscard]] CallContext::Config MakeContextConfig(
function TgVoipTrafficStats (line 141) | TgVoipTrafficStats WebrtcController::getTrafficStats() {
function TgVoipPersistentState (line 145) | TgVoipPersistentState WebrtcController::getPersistentState() {
function TgVoipFinalState (line 170) | TgVoipFinalState WebrtcController::stop() {
FILE: Telegram/SourceFiles/calls/calls_controller_webrtc.h
function namespace (line 12) | namespace Webrtc {
function namespace (line 16) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_emoji_fingerprint.cpp
type Calls (line 25) | namespace Calls {
function uint64 (line 123) | uint64 ComputeEmojiIndex(bytes::const_span bytes) {
function EmojiPtr (line 136) | [[nodiscard]] EmojiPtr EmojiByIndex(int index) {
function ComputeEmojiFingerprint (line 149) | std::vector<EmojiPtr> ComputeEmojiFingerprint(not_null<Call*> call) {
function ComputeEmojiFingerprint (line 156) | std::vector<EmojiPtr> ComputeEmojiFingerprint(
function CreateFingerprintAndSignalBars (line 170) | base::unique_qptr<Ui::RpWidget> CreateFingerprintAndSignalBars(
function FingerprintBadge (line 311) | FingerprintBadge SetupFingerprintBadge(
function SetupFingerprintTooltip (line 552) | void SetupFingerprintTooltip(not_null<Ui::RpWidget*> widget) {
function QImage (line 641) | QImage MakeVerticalShadow(int height) {
function SetupFingerprintBadgeWidget (line 665) | void SetupFingerprintBadgeWidget(
function PaintFingerprintEntry (line 780) | void PaintFingerprintEntry(
FILE: Telegram/SourceFiles/calls/calls_emoji_fingerprint.h
function namespace (line 12) | namespace Ui {
function namespace (line 16) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_instance.cpp
type Calls (line 48) | namespace Calls {
class Instance::Delegate (line 58) | class Instance::Delegate final
function DhConfig (line 95) | DhConfig Instance::Delegate::getDhConfig() const {
type Performer (line 419) | struct Performer final {
method Performer (line 420) | explicit Performer(Fn<void(bool, bool, const Performer &)> callback)
function Call (line 935) | Call *Instance::currentCall() const {
function GroupCall (line 943) | GroupCall *Instance::currentGroupCall() const {
function ConferenceInvites (line 1020) | const ConferenceInvites &Instance::conferenceInvites(
FILE: Telegram/SourceFiles/calls/calls_instance.h
function namespace (line 12) | namespace crl {
function namespace (line 16) | namespace Data {
function namespace (line 20) | namespace Platform {
function namespace (line 24) | namespace Media::Audio {
function namespace (line 28) | namespace Main {
function namespace (line 32) | namespace Ui {
function namespace (line 36) | namespace Calls::Group {
function namespace (line 44) | namespace tgcalls {
function namespace (line 48) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_panel.cpp
type Calls (line 75) | namespace Calls {
function QByteArray (line 81) | [[nodiscard]] QByteArray BatterySvg(
function QRect (line 181) | QRect Panel::panelGeometry() const {
function ConferencePanelMigration (line 203) | ConferencePanelMigration Panel::migrationInfo() const {
function QWidget (line 572) | QWidget *Panel::chooseSourceParent() {
function QString (line 576) | QString Panel::chooseSourceActiveDeviceId() {
class Filter (line 702) | class Filter final : public QObject {
method Filter (line 704) | explicit Filter(Fn<void(QObject*)> moved) : _moved(moved) {
method eventFilter (line 708) | bool eventFilter(QObject *watched, QEvent *event) {
function QRect (line 1116) | QRect Panel::incomingFrameGeometry() const {
function QRect (line 1122) | QRect Panel::outgoingFrameGeometry() const {
FILE: Telegram/SourceFiles/calls/calls_panel.h
function namespace (line 17) | namespace base {
function namespace (line 21) | namespace Data {
function namespace (line 25) | namespace Main {
function namespace (line 29) | namespace Ui {
function namespace (line 47) | namespace Ui::Toast {
function namespace (line 52) | namespace Ui::Platform {
function namespace (line 56) | namespace style {
function namespace (line 61) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_panel_background.cpp
type Calls (line 23) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_panel_background.h
function namespace (line 14) | namespace Data {
function namespace (line 18) | namespace Ui {
function namespace (line 24) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_signal_bars.cpp
type Calls (line 14) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_signal_bars.h
function namespace (line 12) | namespace style {
function namespace (line 16) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_top_bar.cpp
type Calls (line 42) | namespace Calls {
type BarState (line 44) | enum class BarState {
function BarStateFromMuteState (line 61) | auto BarStateFromMuteState(
function LinearBlobs (line 76) | auto LinearBlobs() {
function Colors (line 105) | auto Colors() {
class DebugInfoBox (line 131) | class DebugInfoBox : public Ui::BoxContent {
type TopBar::User (line 175) | struct TopBar::User {
class Mute (line 179) | class Mute final : public Ui::IconButton {
method Mute (line 181) | Mute(QWidget *parent, const style::IconButton &st)
method setProgress (line 194) | void setProgress(float64 progress) {
method setRippleColorOverride (line 202) | void setRippleColorOverride(const style::color *colorOverride) {
method eventFilter (line 207) | bool eventFilter(QObject *object, QEvent *event) {
type State (line 452) | struct State {
FILE: Telegram/SourceFiles/calls/calls_top_bar.h
function namespace (line 18) | namespace Ui {
function namespace (line 28) | namespace Main {
function namespace (line 32) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_userpic.cpp
type Calls (line 23) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_userpic.h
function namespace (line 17) | namespace Data {
function namespace (line 21) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_video_bubble.cpp
type Calls (line 17) | namespace Calls {
function QRect (line 87) | QRect VideoBubble::geometry() const {
FILE: Telegram/SourceFiles/calls/calls_video_bubble.h
function namespace (line 13) | namespace Webrtc {
function namespace (line 18) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_video_incoming.cpp
type Calls (line 27) | namespace Calls {
function ShaderPart (line 34) | [[nodiscard]] ShaderPart FragmentBottomShadow() {
class Panel::Incoming::RendererGL (line 50) | class Panel::Incoming::RendererGL final : public Ui::GL::Renderer {
class Panel::Incoming::RendererSW (line 99) | class Panel::Incoming::RendererSW final : public Ui::GL::Renderer {
type IncomingShadowUniforms (line 543) | struct IncomingShadowUniforms {
class Panel::Incoming::RendererRhi (line 550) | class Panel::Incoming::RendererRhi final
method RendererRhi (line 554) | explicit RendererRhi(not_null<Incoming*> owner) : _owner(owner) {
method initialize (line 560) | void initialize(
method render (line 683) | void render(
method paintTitleShadow (line 872) | void paintTitleShadow(
method validateShadowImage (line 949) | void validateShadowImage() {
method ensureShadowUploaded (line 983) | void ensureShadowUploaded(QRhiResourceUpdateBatch *rub) {
method releaseResources (line 996) | void releaseResources() override {
method QColor (line 1014) | QColor rhiClearColor() override { return Qt::black; }
FILE: Telegram/SourceFiles/calls/calls_video_incoming.h
function namespace (line 12) | namespace Ui::GL {
function namespace (line 17) | namespace Calls {
FILE: Telegram/SourceFiles/calls/calls_window.cpp
type Calls (line 17) | namespace Calls {
class Show (line 20) | class Show final : public Ui::Show {
function QRect (line 139) | QRect Window::controlsGeometry() const {
FILE: Telegram/SourceFiles/calls/calls_window.h
function namespace (line 14) | namespace base {
function namespace (line 18) | namespace style {
function namespace (line 22) | namespace Ui {
function namespace (line 33) | namespace Ui::Platform {
function namespace (line 38) | namespace Ui::Toast {
function namespace (line 43) | namespace Calls {
FILE: Telegram/SourceFiles/calls/group/calls_choose_join_as.cpp
type Calls::Group (line 33) | namespace Calls::Group {
class ListController (line 40) | class ListController : public PeerListController {
function ScheduleGroupCallBox (line 120) | void ScheduleGroupCallBox(
function ChooseJoinAsBox (line 187) | void ChooseJoinAsBox(
function TextWithEntities (line 269) | [[nodiscard]] TextWithEntities CreateOrJoinConfirmation(
FILE: Telegram/SourceFiles/calls/group/calls_choose_join_as.h
function namespace (line 15) | namespace Ui {
function namespace (line 20) | namespace Calls::Group {
FILE: Telegram/SourceFiles/calls/group/calls_cover_item.cpp
type Calls (line 14) | namespace Calls {
FILE: Telegram/SourceFiles/calls/group/calls_cover_item.h
type PreparedShortInfoUserpic (line 14) | struct PreparedShortInfoUserpic
function namespace (line 16) | namespace style {
function namespace (line 20) | namespace Calls {
FILE: Telegram/SourceFiles/calls/group/calls_group_call.cpp
type Calls (line 50) | namespace Calls {
function TimestampFromMsgId (line 71) | [[nodiscard]] double TimestampFromMsgId(mtpMsgId msgId) {
function int64 (line 75) | [[nodiscard]] int64 TimestampInMsFromMsgId(mtpMsgId msgId) {
function uint64 (line 80) | [[nodiscard]] uint64 FindLocalRaisedHandRating(
type JoinVideoEndpoint (line 89) | struct JoinVideoEndpoint {
type JoinBroadcastStream (line 93) | struct JoinBroadcastStream {
function JoinClientFields (line 103) | [[nodiscard]] JoinClientFields ParseJoinResponse(const QByteArray &jso...
class GroupCall::LoadPartTask (line 138) | class GroupCall::LoadPartTask final : public tgcalls::BroadcastPartTask {
method int64 (line 154) | [[nodiscard]] int64 time() const {
method int32 (line 157) | [[nodiscard]] int32 scale() const {
method int32 (line 160) | [[nodiscard]] int32 videoChannel() const {
method Quality (line 163) | [[nodiscard]] Quality videoQuality() const {
class GroupCall::MediaChannelDescriptionsTask (line 181) | class GroupCall::MediaChannelDescriptionsTask final
class GroupCall::RequestCurrentTimeTask (line 209) | class GroupCall::RequestCurrentTimeTask final
type GroupCall::SinkPointer (line 226) | struct GroupCall::SinkPointer {
type GroupCall::VideoTrack (line 230) | struct GroupCall::VideoTrack {
function IsGroupCallAdmin (line 252) | [[nodiscard]] bool IsGroupCallAdmin(
type VideoParams (line 281) | struct VideoParams {
method empty (line 287) | [[nodiscard]] bool empty() const {
type ParticipantVideoParams (line 295) | struct ParticipantVideoParams {
function VideoParamsAreEqual (line 300) | [[nodiscard]] bool VideoParamsAreEqual(
function VideoParams (line 348) | [[nodiscard]] VideoParams ParseVideoParams(
method empty (line 287) | [[nodiscard]] bool empty() const {
function IsCameraPaused (line 389) | bool IsCameraPaused(const std::shared_ptr<ParticipantVideoParams> &par...
function IsScreenPaused (line 393) | bool IsScreenPaused(const std::shared_ptr<ParticipantVideoParams> &par...
function uint32 (line 397) | uint32 GetAdditionalAudioSsrc(
function ParseVideoParams (line 402) | std::shared_ptr<ParticipantVideoParams> ParseVideoParams(
function QString (line 888) | QString GroupCall::screenSharingDeviceId() const {
function int64 (line 3359) | int64 GroupCall::approximateServerTimeInMs() const {
function float64 (line 3569) | float64 GroupCall::singleSourceVolumeValue() const {
type State (line 4083) | struct State {
function MTPInputGroupCall (line 4225) | MTPInputGroupCall GroupCall::inputCall() const {
function MTPInputGroupCall (line 4231) | MTPInputGroupCall GroupCall::inputCallSafe() const {
function TextWithEntities (line 4274) | TextWithEntities ComposeInviteResultToast(
FILE: Telegram/SourceFiles/calls/group/calls_group_call.h
function namespace (line 20) | namespace tgcalls {
function namespace (line 29) | namespace base {
function namespace (line 34) | namespace Webrtc {
function namespace (line 40) | namespace Data {
function namespace (line 47) | namespace TdE2E {
function namespace (line 52) | namespace Calls::Group {
function namespace (line 65) | namespace Calls {
type VideoStateToggle (line 164) | struct VideoStateToggle {
type VideoQualityRequest (line 169) | struct VideoQualityRequest {
type ParticipantVideoParams (line 174) | struct ParticipantVideoParams
function GroupCallSound (line 205) | enum class GroupCallSound {
type VideoTrack (line 221) | struct VideoTrack
function showChooseJoinAs (line 253) | [[nodiscard]] bool showChooseJoinAs() const;
type State (line 342) | enum State {
function InstanceState (line 360) | enum class InstanceState {
FILE: Telegram/SourceFiles/calls/group/calls_group_common.cpp
type Calls::Group (line 46) | namespace Calls::Group {
function ScreenSharingPrivacyRequestBox (line 48) | object_ptr<Ui::GenericBox> ScreenSharingPrivacyRequestBox() {
function ShowUniqueCaptureOptions (line 81) | void ShowUniqueCaptureOptions(
function MakeRoundActiveLogo (line 103) | object_ptr<Ui::RpWidget> MakeRoundActiveLogo(
function MakeJoinCallLogo (line 128) | object_ptr<Ui::RpWidget> MakeJoinCallLogo(not_null<QWidget*> parent) {
function ConferenceCallJoinConfirm (line 135) | void ConferenceCallJoinConfirm(
function ConferenceCallLinkStyleOverrides (line 258) | ConferenceCallLinkStyleOverrides DarkConferenceCallLinkStyle() {
function ShowConferenceCallLinkBox (line 272) | void ShowConferenceCallLinkBox(
function MakeConferenceCall (line 473) | void MakeConferenceCall(ConferenceFactoryArgs &&args) {
function QString (line 514) | QString ExtractConferenceSlug(const QString &link) {
FILE: Telegram/SourceFiles/calls/group/calls_group_common.h
type ShareBoxStyleOverrides (line 14) | struct ShareBoxStyleOverrides
function namespace (line 16) | namespace style {
function namespace (line 24) | namespace Data {
function namespace (line 28) | namespace Main {
function namespace (line 32) | namespace Ui {
function namespace (line 38) | namespace TdE2E {
function namespace (line 42) | namespace tgcalls {
function namespace (line 46) | namespace Window {
function namespace (line 50) | namespace Calls {
type MuteRequest (line 92) | struct MuteRequest {
type VolumeRequest (line 98) | struct VolumeRequest {
type ParticipantState (line 105) | struct ParticipantState {
type RejoinEvent (line 112) | struct RejoinEvent {
type RtmpInfo (line 117) | struct RtmpInfo {
type JoinInfo (line 122) | struct JoinInfo {
type class (line 132) | enum class
type class (line 138) | enum class
type class (line 144) | enum class
function StickedTooltip (line 154) | enum class StickedTooltip {
FILE: Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp
type Calls::Group (line 42) | namespace Calls::Group {
function CreateSectionSubtitle (line 45) | [[nodiscard]] object_ptr<Ui::RpWidget> CreateSectionSubtitle(
type ConfInviteStyles (line 74) | struct ConfInviteStyles {
class ConfInviteRow (line 83) | class ConfInviteRow final : public PeerListRow {
type PrioritizedSelector (line 116) | struct PrioritizedSelector {
class ConfInviteController (line 125) | class ConfInviteController final : public ContactsBoxController {
function ConfInviteStyles (line 178) | [[nodiscard]] ConfInviteStyles ConfInviteDarkStyles() {
function ConfInviteStyles (line 189) | [[nodiscard]] ConfInviteStyles ConfInviteDefaultStyles() {
function QRect (line 224) | QRect ConfInviteRow::elementGeometry(int element, int outerWidth) const {
function PrioritizedSelector (line 321) | [[nodiscard]] PrioritizedSelector PrioritizedInviteSelector(
function PrepareInviteBox (line 806) | object_ptr<Ui::BoxContent> PrepareInviteBox(
function PrepareInviteBox (line 1004) | object_ptr<Ui::BoxContent> PrepareInviteBox(
function CreateReActivateHeader (line 1040) | not_null<Ui::RpWidget*> CreateReActivateHeader(not_null<QWidget*> pare...
function InitReActivate (line 1066) | void InitReActivate(not_null<PeerListBox*> box) {
function PrepareInviteToEmptyBox (line 1078) | object_ptr<Ui::BoxContent> PrepareInviteToEmptyBox(
function PrepareCreateCallBox (line 1127) | object_ptr<Ui::BoxContent> PrepareCreateCallBox(
FILE: Telegram/SourceFiles/calls/group/calls_group_invite_controller.h
function namespace (line 13) | namespace Calls {
function namespace (line 19) | namespace Data {
function namespace (line 23) | namespace Calls::Group {
FILE: Telegram/SourceFiles/calls/group/calls_group_members.cpp
type Calls::Group (line 46) | namespace Calls::Group {
class Members::Controller (line 55) | class Members::Controller final
method fullCountValue (line 78) | [[nodiscard]] rpl::producer<int> fullCountValue() const {
function Row (line 914) | Row *Members::Controller::findRow(
function Row (line 1922) | Row *Members::lookupRow(not_null<PeerData*> peer) const {
function QRect (line 1941) | QRect Members::getInnerGeometry() const {
FILE: Telegram/SourceFiles/calls/group/calls_group_members.h
function namespace (line 12) | namespace Ui {
function namespace (line 22) | namespace Data {
function namespace (line 26) | namespace Calls {
function namespace (line 31) | namespace Calls::Group {
FILE: Telegram/SourceFiles/calls/group/calls_group_members_row.cpp
type Calls::Group (line 23) | namespace Calls::Group {
function RowBlobs (line 39) | auto RowBlobs() -> std::array<Ui::Paint::Blobs::BlobData, 2> {
function QString (line 60) | [[nodiscard]] QString StatusPercentString(float volume) {
function StatusPercentWidth (line 64) | [[nodiscard]] int StatusPercentWidth(const QString &percent) {
type MembersRow::BlobsAnimation (line 70) | struct MembersRow::BlobsAnimation {
type MembersRow::StatusIcon (line 87) | struct MembersRow::StatusIcon {
function QString (line 464) | QString MembersRow::generateName() {
function QString (line 477) | QString MembersRow::generateShortName() {
function QSize (line 710) | QSize MembersRow::rightActionSize() const {
function QMargins (line 723) | QMargins MembersRow::rightActionMargins() const {
FILE: Telegram/SourceFiles/calls/group/calls_group_members_row.h
function namespace (line 16) | namespace Data {
function namespace (line 20) | namespace Ui {
type class (line 27) | enum class
function class (line 34) | class MembersRowDelegate {
type class (line 73) | enum class
type BlobsAnimation (line 171) | struct BlobsAnimation
type StatusIcon (line 172) | struct StatusIcon
FILE: Telegram/SourceFiles/calls/group/calls_group_menu.cpp
type Calls::Group (line 33) | namespace Calls::Group {
class JoinAsAction (line 36) | class JoinAsAction final : public Ui::Menu::ItemBase {
class RecordingAction (line 72) | class RecordingAction final : public Ui::Menu::ItemBase {
function QPoint (line 215) | QPoint JoinAsAction::prepareRippleStartPosition() const {
function QImage (line 219) | QImage JoinAsAction::prepareRippleMask() const {
function QPoint (line 363) | QPoint RecordingAction::prepareRippleStartPosition() const {
function QImage (line 367) | QImage RecordingAction::prepareRippleMask() const {
function MakeJoinAsAction (line 385) | base::unique_qptr<Ui::Menu::ItemBase> MakeJoinAsAction(
function MakeRecordingAction (line 396) | base::unique_qptr<Ui::Menu::ItemBase> MakeRecordingAction(
function LeaveBox (line 414) | void LeaveBox(
function ConfirmBox (line 482) | object_ptr<Ui::GenericBox> ConfirmBox(Ui::ConfirmBoxArgs &&args) {
function FillMenu (line 488) | void FillMenu(
function MakeAttentionAction (line 629) | base::unique_qptr<Ui::Menu::ItemBase> MakeAttentionAction(
FILE: Telegram/SourceFiles/calls/group/calls_group_menu.h
function namespace (line 14) | namespace style {
function namespace (line 18) | namespace Ui {
function namespace (line 24) | namespace Ui::Menu {
function namespace (line 29) | namespace Calls {
function namespace (line 33) | namespace Calls::Group {
FILE: Telegram/SourceFiles/calls/group/calls_group_message_encryption.cpp
type Calls::Group (line 15) | namespace Calls::Group {
function QJsonValue (line 100) | [[nodiscard]] QJsonValue String(const QByteArray &value) {
function QJsonValue (line 104) | [[nodiscard]] QJsonValue Int(int value) {
type JsonObjectValue (line 108) | struct JsonObjectValue {
function JsonObjectValue (line 113) | [[nodiscard]] JsonObjectValue Value(
function QJsonValue (line 119) | [[nodiscard]] QJsonValue Object(
function QJsonValue (line 130) | [[nodiscard]] QJsonValue Array(QVector<QJsonValue> &&values) {
function QJsonValue (line 139) | [[nodiscard]] QJsonValue SimpleEntity(
function QJsonValue (line 148) | [[nodiscard]] QJsonValue Entity(const MTPMessageEntity &entity) {
function Entities (line 172) | [[nodiscard]] QVector<QJsonValue> Entities(
function QByteArray (line 184) | [[nodiscard]] QByteArray Serialize(const QJsonValue &value) {
function GetValue (line 188) | [[nodiscard]] std::optional<QJsonValue> GetValue(
function GetInt (line 195) | [[nodiscard]] std::optional<int> GetInt(
function GetLong (line 210) | [[nodiscard]] std::optional<uint64> GetLong(
function GetString (line 229) | [[nodiscard]] std::optional<QString> GetString(
function GetCons (line 239) | [[nodiscard]] std::optional<QString> GetCons(const QJsonObject &object) {
function Unsupported (line 243) | [[nodiscard]] bool Unsupported(
function GetEntity (line 258) | [[nodiscard]] std::optional<MTPMessageEntity> GetEntity(
function GetEntities (line 297) | [[nodiscard]] QVector<MTPMessageEntity> GetEntities(
function QByteArray (line 312) | QByteArray SerializeMessage(const PreparedMessage &data) {
function DeserializeMessage (line 328) | std::optional<PreparedMessage> DeserializeMessage(
FILE: Telegram/SourceFiles/calls/group/cal
Copy disabled (too large)
Download .json
Condensed preview — 2804 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (30,653K chars).
[
{
"path": ".agents/skills/task-think/PROMPTS.md",
"chars": 26575,
"preview": "# Phase Prompts\n\nUse these templates as Codex subagent messages. Use them as same-session checklists only for Phase 0, i"
},
{
"path": ".agents/skills/task-think/SKILL.md",
"chars": 12015,
"preview": "---\nname: task-think\ndescription: Orchestrate a multi-phase implementation workflow for this repository with artifact fi"
},
{
"path": ".claude/commands/icon.md",
"chars": 15254,
"preview": "---\ndescription: Generate an SVG icon from a design mockup using vectosolve vectorization\nallowed-tools: Read, Write, Ed"
},
{
"path": ".claude/commands/planner.md",
"chars": 3269,
"preview": "---\ndescription: Plan and create a repetitive task automation (prompt.md + tasks.json pair)\nallowed-tools: Read, Write, "
},
{
"path": ".claude/commands/reflect.md",
"chars": 8941,
"preview": "---\ndescription: Learn from corrections — examine staged vs unstaged diffs and optionally distill insights into AGENTS.m"
},
{
"path": ".claude/commands/release.md",
"chars": 4967,
"preview": "---\ndescription: Prepare changelog, set version, and commit a new release\nallowed-tools: Read, Bash, Edit, Grep, AskUser"
},
{
"path": ".claude/commands/task.md",
"chars": 24928,
"preview": "---\ndescription: Implement a feature or fix using multi-agent workflow with fresh context at each phase\nallowed-tools: R"
},
{
"path": ".claude/commands/withtest.md",
"chars": 25042,
"preview": "---\ndescription: Implement a feature using multi-agent workflow, then iteratively test and fix it in-app\nallowed-tools: "
},
{
"path": ".claude/grab_clipboard.ps1",
"chars": 306,
"preview": "param([string]$outPath)\nAdd-Type -AssemblyName System.Windows.Forms\n$img = [System.Windows.Forms.Clipboard]::GetImage()\n"
},
{
"path": ".claude/grab_clipboard.sh",
"chars": 563,
"preview": "#!/bin/bash\n# Grab clipboard image on macOS and save as PNG.\noutPath=\"$1\"\nif [ -z \"$outPath\" ]; then\n echo \"Usage: gr"
},
{
"path": ".claude/iterate.ps1",
"chars": 13509,
"preview": "#!/usr/bin/env pwsh\n# Iterative Task Runner\n# Runs Claude Code in a loop to complete tasks from a taskplanner-created fo"
},
{
"path": ".cursorignore",
"chars": 103,
"preview": "# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv)\nTelegram/ThirdParty/\n"
},
{
"path": ".devcontainer.json",
"chars": 989,
"preview": "{\n \"name\": \"CentOS\",\n \"image\": \"tdesktop:centos_env\",\n \"customizations\": {\n \"vscode\": {\n \"set"
},
{
"path": ".gitattributes",
"chars": 228,
"preview": "# Set the default behavior, in case people don't have core.autocrlf set.\n* text=auto\n\n# Ensure diffs have LF endings\n*.d"
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 6074,
"preview": "# Contributing\n\nThis document describes how you can contribute to Telegram Desktop. Please read it carefully.\n\n**Table o"
},
{
"path": ".github/ISSUE_TEMPLATE/BUG_REPORT.yml",
"chars": 2399,
"preview": "name: Bug report\ndescription: Report errors or unexpected behavior.\nlabels: [bug]\nbody:\n - type: markdown\n attribute"
},
{
"path": ".github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml",
"chars": 920,
"preview": "---\nname: Feature request\ndescription: Suggest an idea.\nlabels: [enhancement]\nbody:\n - type: textarea\n attributes:\n "
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 424,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Platform-wide issue\n url: https://bugs.telegram.org\n about: A"
},
{
"path": ".github/dependabot.yml",
"chars": 118,
"preview": "version: 2\nupdates:\n - package-ecosystem: \"github-actions\"\n directory: \"/\"\n schedule:\n interval: \"weekly\"\n"
},
{
"path": ".github/scripts/generate_changelog.py",
"chars": 9036,
"preview": "#!/usr/bin/env python3\n\"\"\"Convert changelog.txt to a static HTML page for GitHub Pages.\"\"\"\n\nimport re\nimport shutil\nimpo"
},
{
"path": ".github/workflows/changelog.yml",
"chars": 881,
"preview": "name: Changelog\n\non:\n push:\n branches: [dev]\n paths: [changelog.txt]\n release:\n types: [published]\n workflow"
},
{
"path": ".github/workflows/docker.yml",
"chars": 1122,
"preview": "\nname: Docker.\n\non:\n push:\n paths:\n - '.github/workflows/docker.yml'\n - 'Telegram/build/docker/centos_env/"
},
{
"path": ".github/workflows/full_source.yml",
"chars": 1886,
"preview": "name: Upload full source to release.\n\non:\n release:\n types: released\n workflow_dispatch:\n inputs:\n release_"
},
{
"path": ".github/workflows/inno.yml",
"chars": 5396,
"preview": "name: Create Inno Setup Installers\n\non:\n release:\n types: [released]\n workflow_dispatch:\n inputs:\n version:"
},
{
"path": ".github/workflows/jekyll-gh-pages.yml",
"chars": 1458,
"preview": "# Sample workflow for building and deploying a Jekyll site to GitHub Pages\nname: Deploy Jekyll with GitHub Pages depende"
},
{
"path": ".github/workflows/linux.yml",
"chars": 10854,
"preview": "name: Linux.\n\non:\n workflow_dispatch:\n inputs:\n version:\n description: 'Version label (e.g., v5.15.3)'\n "
},
{
"path": ".github/workflows/mac.yml",
"chars": 3935,
"preview": "name: MacOS.\n\non:\n push:\n paths-ignore:\n - 'docs/**'\n - '**.md'\n - 'changelog.txt'\n - 'LEGAL'\n "
},
{
"path": ".github/workflows/mac_packaged.yml",
"chars": 6366,
"preview": "name: MacOS Packaged.\n\non:\n push:\n paths-ignore:\n - 'docs/**'\n - '**.md'\n - 'changelog.txt'\n - '"
},
{
"path": ".github/workflows/needs-user-action.yml",
"chars": 312,
"preview": "name: Needs user action.\n\non:\n issue_comment:\n types: [created]\n schedule:\n - cron: '0 2 * * *'\n\njobs:\n needs-u"
},
{
"path": ".github/workflows/snap.yml",
"chars": 1405,
"preview": "name: Snap\n\non:\n release:\n types: [published]\n workflow_dispatch:\n\njobs:\n snap:\n name: Build and publish snap\n "
},
{
"path": ".github/workflows/waiting-for-answer.yml",
"chars": 316,
"preview": "name: Waiting for answer.\n\non:\n issue_comment:\n types: [created]\n schedule:\n - cron: '30 0 * * *'\n\njobs:\n waiti"
},
{
"path": ".github/workflows/win.yml",
"chars": 8116,
"preview": "name: Windows.\n\non:\n push:\n paths-ignore:\n - 'docs/**'\n - '**.md'\n - '!docs/building-win*.md'\n -"
},
{
"path": ".gitignore",
"chars": 963,
"preview": "/out/\nDebug/\nRelease/\n/ThirdParty/\n/Telegram/build/target\n/Telegram/tests/\n/Telegram/gyp/tests/*.test\n/Telegram/out/\n/Te"
},
{
"path": ".gitmodules",
"chars": 3925,
"preview": "[submodule \"Telegram/ThirdParty/GSL\"]\n\tpath = Telegram/ThirdParty/GSL\n\turl = https://github.com/Microsoft/GSL.git\n[submo"
},
{
"path": "AGENTS.md",
"chars": 15123,
"preview": "# Agent Guide for Telegram Desktop\n\nThis guide defines repository-wide instructions for coding agents working with the T"
},
{
"path": "CLAUDE.md",
"chars": 100,
"preview": "# Claude Code Pointer\n\nRead `AGENTS.md` and treat it as the canonical repository-wide instructions.\n"
},
{
"path": "CMakeLists.txt",
"chars": 2961,
"preview": "# This file is part of Telegram Desktop,\n# the official desktop application for the Telegram messaging service.\n#\n# For "
},
{
"path": "LEGAL",
"chars": 925,
"preview": "This file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nCopyright ("
},
{
"path": "LICENSE",
"chars": 35850,
"preview": "Telegram Desktop is licensed under the GNU General Public License\nversion 3 with the addition of the following special e"
},
{
"path": "README.md",
"chars": 4722,
"preview": "# Forkgram — Unofficial Telegram Messenger\n {\n var start = \"#go_to_message\";\n var"
},
{
"path": "Telegram/Resources/icons/calls/hands.lottie",
"chars": 82433,
"preview": "{\"v\":\"5.5.7\",\"meta\":{\"g\":\"LottieFiles AE 0.1.20\",\"a\":\"\",\"k\":\"\",\"d\":\"\",\"tc\":\"\"},\"fr\":60,\"ip\":0,\"op\":540,\"w\":60,\"h\":60,\"nm"
},
{
"path": "Telegram/Resources/icons/calls/voice.lottie",
"chars": 213132,
"preview": "{\"v\":\"5.5.7\",\"meta\":{\"g\":\"LottieFiles AE 0.1.20\",\"a\":\"\",\"k\":\"\",\"d\":\"\",\"tc\":\"\"},\"fr\":60,\"ip\":0,\"op\":404,\"w\":60,\"h\":60,\"nm"
},
{
"path": "Telegram/Resources/icons/settings/devices/device_desktop_mac.lottie",
"chars": 7521,
"preview": "{\"v\":\"5.7.4\",\"fr\":60,\"ip\":0,\"op\":120,\"w\":30,\"h\":30,\"nm\":\"mac_30\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\""
},
{
"path": "Telegram/Resources/icons/settings/devices/device_desktop_win.lottie",
"chars": 3585,
"preview": "{\"v\":\"5.7.4\",\"fr\":60,\"ip\":0,\"op\":120,\"w\":30,\"h\":30,\"nm\":\"windows_30\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\""
},
{
"path": "Telegram/Resources/icons/settings/devices/device_linux.lottie",
"chars": 8808,
"preview": "{\"v\":\"5.7.4\",\"fr\":60,\"ip\":0,\"op\":120,\"w\":30,\"h\":30,\"nm\":\"linux_30\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4"
},
{
"path": "Telegram/Resources/icons/settings/devices/device_linux_ubuntu.lottie",
"chars": 7207,
"preview": "{\"v\":\"5.7.4\",\"fr\":60,\"ip\":0,\"op\":120,\"w\":30,\"h\":30,\"nm\":\"ubuntu_30\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":"
},
{
"path": "Telegram/Resources/icons/settings/devices/device_phone_android.lottie",
"chars": 7152,
"preview": "{\"v\":\"5.7.4\",\"fr\":60,\"ip\":0,\"op\":120,\"w\":30,\"h\":30,\"nm\":\"android_30\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\""
},
{
"path": "Telegram/Resources/icons/settings/devices/device_phone_ios.lottie",
"chars": 9484,
"preview": "{\"v\":\"5.7.4\",\"fr\":60,\"ip\":0,\"op\":120,\"w\":30,\"h\":30,\"nm\":\"iphone_30\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":"
},
{
"path": "Telegram/Resources/icons/settings/devices/device_tablet_ios.lottie",
"chars": 7284,
"preview": "{\"v\":\"5.7.4\",\"fr\":60,\"ip\":0,\"op\":120,\"w\":30,\"h\":30,\"nm\":\"ipad_30\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,"
},
{
"path": "Telegram/Resources/icons/settings/devices/device_web_chrome.lottie",
"chars": 6180,
"preview": "{\"v\":\"5.7.4\",\"fr\":60,\"ip\":0,\"op\":120,\"w\":30,\"h\":30,\"nm\":\"chrome_30\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":"
},
{
"path": "Telegram/Resources/icons/settings/devices/device_web_edge.lottie",
"chars": 7687,
"preview": "{\"v\":\"5.7.4\",\"fr\":60,\"ip\":0,\"op\":120,\"w\":30,\"h\":30,\"nm\":\"edge_30\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,"
},
{
"path": "Telegram/Resources/icons/settings/devices/device_web_firefox.lottie",
"chars": 22190,
"preview": "{\"v\":\"5.7.4\",\"fr\":60,\"ip\":0,\"op\":120,\"w\":30,\"h\":30,\"nm\":\"firefox_30\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\""
},
{
"path": "Telegram/Resources/icons/settings/devices/device_web_safari.lottie",
"chars": 2934,
"preview": "{\"v\":\"5.7.4\",\"fr\":60,\"ip\":0,\"op\":120,\"w\":30,\"h\":30,\"nm\":\"safari_30\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":"
},
{
"path": "Telegram/Resources/iv_html/highlight.9.12.0.css",
"chars": 776,
"preview": ".hljs{display:block;overflow-x:auto;padding:0.5em;background:#F0F0F0}.hljs,.hljs-subst{color:#444}.hljs-comment{color:#8"
},
{
"path": "Telegram/Resources/iv_html/highlight.9.12.0.js",
"chars": 45997,
"preview": "/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */\n!function(e){var t=\"object\"==typeof window&&window||\"obj"
},
{
"path": "Telegram/Resources/iv_html/morphdom-umd.min.2.7.2.js",
"chars": 12028,
"preview": "(function(global,factory){typeof exports===\"object\"&&typeof module!==\"undefined\"?module.exports=factory():typeof define="
},
{
"path": "Telegram/Resources/iv_html/page.css",
"chars": 22126,
"preview": ":root {\n\t--font-sans: -apple-system, BlinkMacSystemFont, avenir next, avenir, Segoe UI Variable Text, segoe ui, helvetic"
},
{
"path": "Telegram/Resources/iv_html/page.js",
"chars": 18510,
"preview": "var IV = {\n\tnotify: function(message) {\n\t\tif (window.external && window.external.invoke) {\n\t\t\twindow.external.invoke(JSO"
},
{
"path": "Telegram/Resources/langs/cloud_lang.strings",
"chars": 9270,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/Resources/langs/de.lproj/Localizable.strings",
"chars": 240,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/Resources/langs/en.lproj/Localizable.strings",
"chars": 240,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/Resources/langs/es.lproj/Localizable.strings",
"chars": 240,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/Resources/langs/it.lproj/Localizable.strings",
"chars": 240,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/Resources/langs/ko.lproj/Localizable.strings",
"chars": 240,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/Resources/langs/lang.strings",
"chars": 506420,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/Resources/langs/nl.lproj/Localizable.strings",
"chars": 240,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/Resources/langs/pt-BR.lproj/Localizable.strings",
"chars": 240,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/Resources/langs/refresh.py",
"chars": 758,
"preview": "import os, sys, requests, re\nfrom os.path import expanduser\n\nfilename = ''\nfor arg in sys.argv:\n if re.match(r'.*\\.stri"
},
{
"path": "Telegram/Resources/langs/refresh.sh",
"chars": 617,
"preview": "set -e\nFullExecPath=$PWD\npushd `dirname $0` > /dev/null\nFullScriptPath=`pwd`\npopd > /dev/null\n\nFileName=\"$1\"\n\nif [ ! -d "
},
{
"path": "Telegram/Resources/langs/stale.py",
"chars": 365,
"preview": "import os, sys, requests, re\n\nos.chdir()\n\nkeys = []\nwith open('lang.strings') as f:\n for line in f:\n m = re.ma"
},
{
"path": "Telegram/Resources/numbers.txt",
"chars": 6847,
"preview": "1876;JM;Jamaica;1876 XXX XXXX;11;\n1869;KN;Saint Kitts & Nevis;1869 XXX XXXX;11;\n1868;TT;Trinidad & Tobago;1868 XXX XXXX;"
},
{
"path": "Telegram/Resources/picker_html/picker.css",
"chars": 2596,
"preview": ":root {\n\t--font-sans: -apple-system, BlinkMacSystemFont, avenir next, avenir, Segoe UI Variable Text, segoe ui, helvetic"
},
{
"path": "Telegram/Resources/picker_html/picker.js",
"chars": 5940,
"preview": "var LocationPicker = {\n\tstartZoom: 14,\n\tflySpeed: 2.4,\n\tnotify: function(message) {\n\t\tif (window.external && window.exte"
},
{
"path": "Telegram/Resources/qrc/emoji_1.qrc",
"chars": 122,
"preview": "<RCC>\n <qresource prefix=\"/gui\">\n <file alias=\"emoji/emoji_1.webp\">../emoji/emoji_1.webp</file>\n </qresource>\n</RCC"
},
{
"path": "Telegram/Resources/qrc/emoji_2.qrc",
"chars": 122,
"preview": "<RCC>\n <qresource prefix=\"/gui\">\n <file alias=\"emoji/emoji_2.webp\">../emoji/emoji_2.webp</file>\n </qresource>\n</RCC"
},
{
"path": "Telegram/Resources/qrc/emoji_3.qrc",
"chars": 122,
"preview": "<RCC>\n <qresource prefix=\"/gui\">\n <file alias=\"emoji/emoji_3.webp\">../emoji/emoji_3.webp</file>\n </qresource>\n</RCC"
},
{
"path": "Telegram/Resources/qrc/emoji_4.qrc",
"chars": 122,
"preview": "<RCC>\n <qresource prefix=\"/gui\">\n <file alias=\"emoji/emoji_4.webp\">../emoji/emoji_4.webp</file>\n </qresource>\n</RCC"
},
{
"path": "Telegram/Resources/qrc/emoji_5.qrc",
"chars": 122,
"preview": "<RCC>\n <qresource prefix=\"/gui\">\n <file alias=\"emoji/emoji_5.webp\">../emoji/emoji_5.webp</file>\n </qresource>\n</RCC"
},
{
"path": "Telegram/Resources/qrc/emoji_6.qrc",
"chars": 122,
"preview": "<RCC>\n <qresource prefix=\"/gui\">\n <file alias=\"emoji/emoji_6.webp\">../emoji/emoji_6.webp</file>\n </qresource>\n</RCC"
},
{
"path": "Telegram/Resources/qrc/emoji_7.qrc",
"chars": 122,
"preview": "<RCC>\n <qresource prefix=\"/gui\">\n <file alias=\"emoji/emoji_7.webp\">../emoji/emoji_7.webp</file>\n </qresource>\n</RCC"
},
{
"path": "Telegram/Resources/qrc/emoji_8.qrc",
"chars": 122,
"preview": "<RCC>\n <qresource prefix=\"/gui\">\n <file alias=\"emoji/emoji_8.webp\">../emoji/emoji_8.webp</file>\n </qresource>\n</RCC"
},
{
"path": "Telegram/Resources/qrc/emoji_preview.qrc",
"chars": 360,
"preview": "<RCC>\n <qresource prefix=\"/gui\">\n <file alias=\"emoji/set0_preview.webp\">../emoji/set0_preview.webp</file>\n <file "
},
{
"path": "Telegram/Resources/qrc/telegram/animations.qrc",
"chars": 7829,
"preview": "<RCC>\n <qresource prefix=\"/animations\">\n <file alias=\"blocked_peers_empty.tgs\">../../animations/blocked_peers_empty."
},
{
"path": "Telegram/Resources/qrc/telegram/export.qrc",
"chars": 4159,
"preview": "<RCC>\n <qresource prefix=\"/export\">\n <file alias=\"css/style.css\">../../export_html/css/style.css</file>\n <file al"
},
{
"path": "Telegram/Resources/qrc/telegram/iv.qrc",
"chars": 390,
"preview": "<RCC>\n <qresource prefix=\"/iv\">\n <file alias=\"page.css\">../../iv_html/page.css</file>\n <file alias=\"page.js\">../."
},
{
"path": "Telegram/Resources/qrc/telegram/mac_icons.qrc",
"chars": 137,
"preview": "<RCC>\n <qresource prefix=\"/gui\">\n <file alias=\"art/icon_round512@2x.png\">../../art/icon_round512@2x.png</file>\n </q"
},
{
"path": "Telegram/Resources/qrc/telegram/picker.qrc",
"chars": 187,
"preview": "<RCC>\n <qresource prefix=\"/picker\">\n <file alias=\"picker.css\">../../picker_html/picker.css</file>\n <file alias=\"p"
},
{
"path": "Telegram/Resources/qrc/telegram/sounds.qrc",
"chars": 905,
"preview": "<RCC>\n <qresource prefix=\"/sounds\">\n <file alias=\"msg_incoming.mp3\">../../sounds/msg_incoming.mp3</file>\n <file a"
},
{
"path": "Telegram/Resources/qrc/telegram/telegram.qrc",
"chars": 5520,
"preview": "<RCC>\n <qresource prefix=\"/gui\">\n <file alias=\"art/background.tgv\">../../art/background.tgv</file>\n <file alias=\""
},
{
"path": "Telegram/Resources/qrc/telegram.qrc",
"chars": 0,
"preview": ""
},
{
"path": "Telegram/Resources/uwp/AppX/AppxManifest.xml",
"chars": 2428,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Package\n xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows1"
},
{
"path": "Telegram/Resources/uwp/priconfig.xml",
"chars": 1017,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<resources targetOsVersion=\"10.0.0\" majorVersion=\"1\">\n\t<index ro"
},
{
"path": "Telegram/Resources/winrc/Telegram.manifest",
"chars": 1155,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVers"
},
{
"path": "Telegram/Resources/winrc/Telegram.rc",
"chars": 2018,
"preview": "// Microsoft Visual C++ generated resource script.\n//\n\n#define APSTUDIO_READONLY_SYMBOLS\n///////////////////////////////"
},
{
"path": "Telegram/Resources/winrc/Updater.rc",
"chars": 1754,
"preview": "// Microsoft Visual C++ generated resource script.\n//\n\n#define APSTUDIO_READONLY_SYMBOLS\n///////////////////////////////"
},
{
"path": "Telegram/SourceFiles/_other/packer.cpp",
"chars": 18815,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/_other/packer.h",
"chars": 920,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/_other/startup_task_win.cpp",
"chars": 1324,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/_other/updater.h",
"chars": 928,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/_other/updater_linux.cpp",
"chars": 14386,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/_other/updater_osx.m",
"chars": 12204,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/_other/updater_win.cpp",
"chars": 20316,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_as_copy.cpp",
"chars": 7365,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_as_copy.h",
"chars": 864,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_attached_stickers.cpp",
"chars": 2650,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_attached_stickers.h",
"chars": 950,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_authorizations.cpp",
"chars": 10858,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_authorizations.h",
"chars": 2451,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_blocked_peers.cpp",
"chars": 5505,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_blocked_peers.h",
"chars": 1503,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_bot.cpp",
"chars": 16678,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_bot.h",
"chars": 944,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_chat_filters.cpp",
"chars": 26164,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_chat_filters.h",
"chars": 1176,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_chat_filters_remove_manager.cpp",
"chars": 3816,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_chat_filters_remove_manager.h",
"chars": 683,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_chat_invite.cpp",
"chars": 20682,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_chat_invite.h",
"chars": 599,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_chat_links.cpp",
"chars": 4405,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_chat_links.h",
"chars": 1335,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_chat_participants.cpp",
"chars": 26857,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_chat_participants.h",
"chars": 4622,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_cloud_password.cpp",
"chars": 17408,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_cloud_password.h",
"chars": 2203,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_common.cpp",
"chars": 1287,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_common.h",
"chars": 2018,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_compose_with_ai.cpp",
"chars": 3200,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_compose_with_ai.h",
"chars": 1385,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_confirm_phone.cpp",
"chars": 5300,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_confirm_phone.h",
"chars": 703,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_credits.cpp",
"chars": 12554,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_credits.h",
"chars": 2818,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_credits_history_entry.cpp",
"chars": 6547,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_credits_history_entry.h",
"chars": 501,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_earn.cpp",
"chars": 4592,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_earn.h",
"chars": 747,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_editing.cpp",
"chars": 16862,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_editing.h",
"chars": 1679,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_filter_updates.h",
"chars": 626,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_global_privacy.cpp",
"chars": 10179,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_global_privacy.h",
"chars": 3371,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_hash.cpp",
"chars": 3624,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_hash.h",
"chars": 1894,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_invite_links.cpp",
"chars": 21750,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_invite_links.h",
"chars": 6341,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_media.cpp",
"chars": 5089,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_media.h",
"chars": 565,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_messages_search.cpp",
"chars": 6679,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_messages_search.h",
"chars": 1659,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_messages_search_merged.cpp",
"chars": 2852,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_messages_search_merged.h",
"chars": 1344,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_peer_colors.cpp",
"chars": 7991,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_peer_colors.h",
"chars": 2170,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_peer_photo.cpp",
"chars": 20280,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_peer_photo.h",
"chars": 3610,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_peer_search.cpp",
"chars": 5021,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_peer_search.h",
"chars": 1827,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_polls.cpp",
"chars": 9075,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_polls.h",
"chars": 1431,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_premium.cpp",
"chars": 35134,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_premium.h",
"chars": 7859,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_premium_option.cpp",
"chars": 1402,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_premium_option.h",
"chars": 1929,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_reactions_notify_settings.cpp",
"chars": 5193,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_reactions_notify_settings.h",
"chars": 1775,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_read_metrics.cpp",
"chars": 1762,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_read_metrics.h",
"chars": 936,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_report.cpp",
"chars": 4756,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_report.h",
"chars": 1242,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_ringtones.cpp",
"chars": 5575,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_ringtones.h",
"chars": 1518,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_self_destruct.cpp",
"chars": 2117,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_self_destruct.h",
"chars": 927,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_send_progress.cpp",
"chars": 5234,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_send_progress.h",
"chars": 2157,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_sending.cpp",
"chars": 22878,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_sending.h",
"chars": 1604,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_sensitive_content.cpp",
"chars": 2911,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_sensitive_content.h",
"chars": 1257,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_single_message_search.cpp",
"chars": 6506,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_single_message_search.h",
"chars": 1943,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_statistics.cpp",
"chars": 24552,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_statistics.h",
"chars": 3010,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_statistics_data_deserialize.cpp",
"chars": 1036,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_statistics_data_deserialize.h",
"chars": 442,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_statistics_sender.cpp",
"chars": 2056,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_statistics_sender.h",
"chars": 1415,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_suggest_post.cpp",
"chars": 20663,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_suggest_post.h",
"chars": 750,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_text_entities.cpp",
"chars": 11600,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_text_entities.h",
"chars": 831,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_todo_lists.cpp",
"chars": 7357,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_todo_lists.h",
"chars": 1472,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_toggling_media.cpp",
"chars": 3402,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
},
{
"path": "Telegram/SourceFiles/api/api_toggling_media.h",
"chars": 990,
"preview": "/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\n\nFor lice"
}
]
// ... and 2604 more files (download for full content)
About this extraction
This page contains the full source code of the forkgram/tdesktop GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2804 files (26.6 MB), approximately 7.1M tokens, and a symbol index with 15763 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.