Библиотека шарписта | C#, F#, .NET, ASP.NET
21.7K subscribers
2.89K photos
45 videos
91 files
5.35K links
Все самое полезное для C#-разработчика в одном канале.

Наши курсы: https://clc.to/y3LDtw

По рекламе: @proglib_adv

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
🧑‍💻 SkiaSharp 4.0: движок обновлён, новый сопровождающий, переменные шрифты

Вышел первый превью SkiaSharp 4.0. Библиотека существует 10 лет и лежит в основе кроссплатформенной 2D-графики в .NET: её используют .NET MAUI, WebAssembly, WinUI 3. Это первый крупный мейджор за долгое время.

Что поменялось в движке

Главное обновление — переход на Skia milestone 147. Это 2,5 года апстрим-изменений, которые достаются автоматически без правки кода.

Качество изображений. Mipmap-шарпенинг включён по умолчанию, уменьшенные изображения стали чётче. Кодеки теперь читают Exif-метаданные и автоматически применяют поворот фото. Большие битмапы, которые не влезают в лимиты текстур GPU, тайлятся автоматически.

Цвет. Поправлены передаточные функции для Rec.709, HLG и PQ. Для тех, кто работает с видео или профессиональной цветокоррекцией, это важно.

Производительность. Незначительный прирост по всем операциям рендеринга. Более заметные улучшения в noise-шейдерах и canvas-операциях.

Безопасность. Обновлены нативные зависимости, включены современные митигации компилятора на всех платформах.

Новые возможности

Переменные шрифты. Полная поддержка OpenType variable fonts через SkiaSharp и HarfBuzz. Можно получить доступные оси, задать их значения и создавать варианты шрифта по весу, ширине, наклону или кастомным осям.

Палитры цветных шрифтов. Поддержка OpenType CPAL для эмодзи и иконочных шрифтов. Можно переключать палитры или переопределять цвет отдельных глифов.

SKPathBuilder. Новый способ строить пути. SKPath теперь иммутабелен, а SKPathBuilder предоставляет привычный API с MoveTo, LineTo, CubicTo и фабриками фигур. Старые методы SKPath сохранены для обратной совместимости.

Новые платформы. Добавлены нативные сборки для Linux Bionic и Tizen x64/arm64.

Uno Platform стала сопровождающим

Вместе с релизом объявили, что Uno Platform становится co-maintainer SkiaSharp. Они используют библиотеку в собственном рендер-пайплайне и уже сделали значимые вклады: обновления движка Skia, полная реализация API переменных шрифтов, фикс краша с typeface на Android API 36, поддержка генератора биндингов на Linux, интерактивная Wasm-галерея.

Для тех, кто зависит от SkiaSharp в продакшне: библиотека теперь поддерживается двумя организациями, что ускорит обновления и тришаж.

➡️ Интерактивная галерея с примерами и шейдер-плейграунд.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
7😁1
📰 Второй майский дайджест

Напоминаем, завтра выходной!

Кандидатов мало, а собесы становятся сложнее

Windows против других ИИ

Google Chrome автоматически загружает локальную модель Gemini Nano весом 4 ГБ без согласия пользователя, а ручное удаление файла приводит к повторной закачке. Заблокировать это можно через реестр Windows 11.

Майкрософт делают упор на ИИ:

Строим AI-агентов на .NET

AI-агенты в отказоустойчивом пайплайне на .NET

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
2
🤩 Copilot Studio перешёл на .NET 10 и стал быстрее

Microsoft Copilot Studio обновил свой WebAssembly-движок с .NET 8 до .NET 10.

Что изменилось

Сам переход свёлся к обновлению <TargetFramework> на net10.0 и проверке совместимости зависимостей. Но за этим стоят три заметных улучшения в .NET 10 для WASM.

Раньше WASM-приложениям приходилось вручную переименовывать файлы с добавлением SHA256-хеша для сброса кэша. Команда Copilot Studio использовала для этого отдельный PowerShell-скрипт, который читал манифест blazor.boot.json и прогонял каждый файл.

В .NET 10 fingerprint встроен в имена файлов при публикации, а проверка целостности работает из коробки через dotnet.js. Скрипт удалили, аргумент integrity в загрузчике ресурсов убрали.

Если вы загружаете .NET WASM-рантайм внутри WebWorker, при инициализации укажите dotnetSidecar = true.

После AOT-компиляции методов в WebAssembly исходный IL-код больше не нужен в рантайме. В .NET 8 эта настройка существовала, но была выключена. Теперь IL автоматически вырезается из опубликованных сборок.

Выигрыш в рантайме перекрывает рост размера пакета. Холодный запуск стал быстрее примерно на 20%. Повторные вызовы ускорились на ~5%. Больше всего выигрывают сложные агенты с большим объёмом AOT-кода.

Как обновиться

Обновите <TargetFramework> на net10.0 и подтяните свежие версии пакетов Microsoft.AspNetCore.*, Microsoft.Extensions.* и System.*. Если у вас были скрипты для переименования ресурсов или ручная проверка integrity, их можно удалить.

Для автоматизации миграции Microsoft предлагает GitHub Copilot app modernization for .NET, который анализирует решение, планирует апгрейд и применяет изменения.

➡️ Блог разработчиков

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
⭐️ .NET 11 Preview 4

Microsoft выпустили четвёртый превью .NET 11. Релиз затрагивает рантайм, SDK, библиотеки, ASP.NET Core, MAUI, EF Core и C#.

Process API наконец стал удобным

System.Diagnostics.Process получил набор методов, которых не хватало годами. Раньше для простого «запустить процесс и прочитать stdout» приходилось вручную подписываться на OutputDataReceived, создавать TaskCompletionSource и следить за жизненным циклом. Теперь это одна строка.

Process.RunAndCaptureTextAsync запускает процесс и возвращает stdout, stderr и exit code:
var result = await Process.RunAndCaptureTextAsync(
"git", ["status", "--porcelain"]);

Console.WriteLine(result.StandardOutput);
Console.WriteLine($"exit code: {result.ExitStatus.ExitCode}");


Process.StartAndForget запускает дочерний процесс без ожидания. ProcessStartInfo.StartDetached отвязывает процесс от терминала, чтобы он жил после закрытия консоли. На Windows есть обратный вариант: KillOnParentExit убивает дочерний процесс, когда родительский завершается.

ProcessStartInfo.InheritedHandles позволяет передать дочернему процессу только конкретные OS-хендлы вместо поведения «всё или ничего» через UseShellExecute = false.

На Linux и macOS убрали лишние аллокации при запуске процессов. ProcessName и ToString больше не создают полный снапшот ProcessInfo, а формирование envp/argv обходится без промежуточных managed-строк.

Span-based сжатие для Deflate, ZLib и GZip

В System.IO.Compression добавили API на основе Span<byte> для Deflate, ZLib и GZip. По форме они повторяют BrotliEncoder/BrotliDecoder и Zstandard-примитивы. Можно сжимать и распаковывать буферы без создания Stream.
using ZLibEncoder encoder = new();
OperationStatus status = encoder.Compress(
source, destination, out int bytesConsumed,
out int bytesWritten, isFinalBlock: true);

Полезно для протокольных парсеров, лог-шипперов и middleware, которые и так работают со спанами.

Hex-формат для float и double

double, float и Half теперь умеют форматироваться и парситься в hex-представлении IEEE-754. Формат сохраняет каждый бит значения, что критично для golden-file тестов и интеропа с C/C++ printf("%a", ...).
double value = Math.PI;
string hex = value.ToString("X"); // "0X1.921FB54442D18P+1"
double round = double.Parse(hex, NumberStyles.HexFloat);
Console.WriteLine(round == value); // True


System.Text.Json теперь понимает F# discriminated unions

Сериализатор научился работать с F# discriminated unions без кастомных конвертеров. Если у вас F#-типы на бэкенде и C#-консьюмеры, теперь всё работает из коробки.

Source generator тоже подтянули: generic-обёртки аксессоров правильно прокидывают constraints от исходного типа, а для доступа к приватным членам используется [UnsafeAccessor] вместо рефлексии.

Рантайм-библиотеки скомпилированы с runtime-async

Стандартные библиотеки рантайма теперь собираются с включённым runtime-async. Это внутренняя оптимизация JIT, которая уменьшает overhead async/await на горячих путях.

ASP.NET Core

В генерируемые OpenAPI-документы добавили поддержку HTTP-метода QUERY (RFC 9110). Для Blazor появился атрибут SupplyParameterFromTempData и серверная пауза Blazor Server circuit. Вместе с SDK теперь идёт шаблон MCP Server, так что создать MCP-совместимый бэкенд можно через dotnet new.

SDK
 
dotnet watch получил выбор устройства для .NET MAUI и мобильных проектов. Fish shell теперь поддерживает автодополнение наравне с Bash, Zsh и PowerShell. CLI-телеметрия переехала с Application Insights на OpenTelemetry.

➡️ Полный список изменений

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍4
🔒 Майское обновление безопасности .NET и .NET Framework

Microsoft выпустила сервисные обновления для .NET 10.0.8, .NET 9.0.16, .NET 8.0.27 и .NET Framework.

Закрыты четыре уязвимости: две связаны с повышением привилегий (CVE-2026-32177, CVE-2026-35433), одна с подменой данных (CVE-2026-32175) и одна с отказом в обслуживании (CVE-2026-42899).

CVE-2026-32177 затрагивает все поддерживаемые версии, включая .NET Framework 3.5, 4.6.2, 4.7, 4.7.2, 4.8 и 4.8.1.

Остальные три CVE касаются только .NET 8, 9 и 10. Помимо патчей безопасности, в релиз вошли и обычные багфиксы.

➡️ Подробности

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
5😁2
🔄 Process API в .NET 11: большое обновление

System.Diagnostics.Process получил крупнейшее обновление за годы в .NET 11 Preview 4.

Чтение вывода без дедлоков

При перенаправлении stdout и stderr пайпы имеют ограниченный буфер. Последовательное чтение приводит к взаимной блокировке. Раньше нужно было вручную организовывать параллельное чтение. Теперь одна строка:
var output = Process.RunAndCaptureText("dotnet", ["--help"]);


Также есть ReadAllLinesAsync для построчного чтения и Process.Run когда вывод не нужен.

Контроль хэндлов

ProcessStartInfo.InheritedHandles указывает, какие хэндлы наследует дочерний процесс. Предотвращает утечку и удваивает пропускную способность параллельного запуска на Windows. Стандартные хэндлы можно перенаправить на файл, пайп или null.

Жизненный цикл

KillOnParentExit убивает дочерний процесс при завершении родителя, включая краши. StartDetached запускает процесс, переживающий родителя. StartAndForget возвращает PID и освобождает ресурсы.

Производительность

Запуск на Apple Silicon ускорен до 98x (posix_spawn). Параллельный запуск на Windows быстрее в 1.8x. Аллокации на Unix сокращены на 30–50%. NativeAOT с SafeProcessHandle до 32% меньше.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
3👏1
📰 Предпоследний майский дайджест

Следующий дайжест будет последним за май.

Microsoft обвинила исследователя в публикации обхода BitLocker через WinRE

Microsoft выложила свежие ISO-образы Windows 11

Образы доступны на странице загрузки Windows Insider Program и подходят для чистой установки, развёртывания на виртуалку или in-place апгрейда.

GitHub взломали через расширение VS Code

Vibe hiring

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
📢 Навигация по каналу

Чтобы не теряться в потоке постов, собрали удобную навигацию по рубрикам:

#sharp_view — короткие и полезные посты с кодом, best practices, фишки C#, сравнение подходов, code snippets и разбор багов

#il_люминатор — глубокие технические разборы: архитектурные паттерны, производительность, устройство .NET, CLR, GC, JIT и сложные концепции

#async_news — релизы .NET, обновления IDE, анонсы конференций, дайджесты и другие важные новости экосистемы

#entry_point — опросы, холивары, вопросы подписчикам, истории из практики и обсуждения с сообществом

#dotnet_challenge — задачи по C# и .NET, вопросы с собеседований, поиск ошибок в коде и интерактивные викторины

#схема — инфографика, диаграммы, шпаргалки, дорожные карты и визуальное объяснение сложных тем

#garbage_collector — мемы, юмор и забавные истории из жизни .NET-разработчиков

🔈 Используйте рубрики для быстрого поиска интересующих материалов и не пропускайте новые публикации.

🐸 Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
7
📌 Дайджест .NET за неделю

🔤 Material 3 для .NET MAUI на Android

Android-приложения на .NET MAUI 10 теперь можно перевести на Material 3 (Material You) одной настройкой в .csproj:


<PropertyGroup> <UseMaterial3>true</UseMaterial3> </PropertyGroup>


🔵 Поддержка появилась в SR6 (Microsoft.Maui.Controls 10.0.60+) и уже охватывает Entry, SearchBar, DatePicker, Slider, Switch, Shell и другие стандартные контролы.

Работает только на Android.

🔤 Гайд по GitHub Copilot для .NET

Microsoft выпустила практический гайд по работе с GitHub Copilot в .NET-проектах. Полезно тем, кто уже использует Copilot и хочет получать от него больше пользы.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥1
🔥 Union types добрались до C#

До сих пор в C# не было встроенного способа описать тип «либо одно, либо другое». Приходилось использовать наследование, object или сторонние библиотеки вроде OneOf.

В .NET 11 Preview появилась экспериментальная возможность — union.


public record class Dog(string Name);
public record class Cat(int Lives);

public union Pet(Dog, Cat);

static string Describe(Pet pet) => pet switch
{
Dog(var name) => $"dog: {name}",
Cat(var lives) => $"cat: {lives}"
};


Что это даёт:

один тип может хранить одно из нескольких значений
компилятор знает все возможные варианты
switch проверяется на полноту
меньше шаблонного кода и проверок типов в рантайме

Рядом появилась и поддержка закрытых иерархий (closed), которая позволяет компилятору анализировать всех наследников типа и также проверять исчерпывающее сопоставление с образцом.

Пока это preview-функциональность. До релиза .NET 11 синтаксис и детали реализации ещё могут измениться.

Идею union types сообщество просило больше десяти лет. Если фича дойдёт до релиза без серьёзных изменений, моделировать состояния, результаты операций и альтернативные типы станет заметно проще.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥302
🔗 EqualityComparer.Create. Сравнение по одному полю без лишнего кода

Нужно хранить пользователей в HashSet по email? Убирать дубли через Distinct? Группировать объекты по ключу?
Раньше для этого часто приходилось писать собственный IEqualityComparer<T>.

🔴 В .NET 11 Preview 5 появилась новая перегрузка EqualityComparer<T>.Create, которая позволяет описать сравнение через селектор ключа:


var users = new HashSet<User>(
EqualityComparer<User>.Create(
user => user!.Email,
StringComparer.OrdinalIgnoreCase));

users.Add(new User("ada@example.com", "Ada"));
users.Add(new User("ADA@example.com", "Ada Lovelace"));

Console.WriteLine(users.Count); // 1


Здесь сравнение выполняется по Email без учёта регистра.
Плюс такого подхода в том, что логика равенства остаётся локальной и не требует переопределения Equals и GetHashCode у самого типа.

Работает везде, где принимается IEqualityComparer<T>: HashSet, Distinct, GroupBy, ToDictionary и не только.

⚠️ Пока доступно в .NET 11 Preview 5.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍178
🔊 5 возможностей .NET 11 Preview 5, которые могли пройти мимо вас

Пока все обсуждают C# 15, в .NET 11 Preview 5 приехало несколько полезных улучшений библиотек и SDK.

🈶 JSON Lines в System.Text.Json

Теперь IAsyncEnumerable<T> можно сериализовать в формате JSON Lines без ручной сборки строк. Полезно для логов, событий и потоковой обработки данных.


🈶 EqualityComparer.Create по селектору ключа

Новая перегрузка позволяет быстро создавать компараторы для HashSet, Distinct и GroupBy без собственного IEqualityComparer<T>.


🈶 StringBuilder.MoveChunks

Передаёт накопленный текст в другой StringBuilder без копирования символов. Особенно интересно для генераторов кода и других сценариев с большими объёмами текста.


🈶 Улучшения производительности библиотек

В Preview 5 продолжается работа над уменьшением аллокаций и ускорением базовых API платформы.


🈶 Подготовка к C# 15

SDK и инструменты продолжают получать поддержку новых возможностей языка ещё до финального релиза .NET 11.


🔗 Подробнее

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
6
До окончания поддержки .NET 8 и .NET 9 осталось четыре месяца

Microsoft напомнила, что 10 ноября 2026 года одновременно заканчивается поддержка .NET 8 и .NET 9. После этой даты эти версии больше не будут получать обновления безопасности, исправления ошибок и официальную поддержку.

☝️ При этом существующие приложения продолжат работать.

Почему обе версии завершаются одновременно:

🔵 .NET 8 — LTS с трёхлетним циклом поддержки.

🔵 .NET 9 — STS. После изменения политики Microsoft срок поддержки STS увеличили до 24 месяцев, поэтому его конец совпал с окончанием поддержки .NET 8.


🔜 Если ваши сервисы ещё работают на .NET 8 или .NET 9, Microsoft рекомендует планировать переход на .NET 10 (LTS), который будет поддерживаться до ноября 2028 года.

Перед обновлением стоит:

проверить список breaking changes;
обновить SDK и базовые Docker-образы;
прогнать интеграционные тесты до начала осенней миграции.

Осенью этим наверняка займутся многие команды одновременно, поэтому лучше не откладывать обновление на последний момент.

🔗 Источник

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍4😢21
🔥 .NET MAUI окончательно переходит на CoreCLR

В .NET 11 Preview 6 для мобильных приложений .NET MAUI остался только один рантайм — CoreCLR. Отдельный путь через Mono для Android, iOS и Mac Catalyst больше недоступен.

🔴 Это тот же рантайм, на котором работают ASP.NET Core, серверные и десктопные приложения .NET. Переход должен сократить различия между платформами и упростить развитие самого рантайма.

По данным команды .NET, на iOS и Mac Catalyst CoreCLR уже обычно быстрее Mono. На Android результаты пока близки: разница по времени запуска и размеру приложения укладывается примерно в 10%.


🔴 В Preview 6 также появились новый CollectionView2 для Windows, версия HybridWebView, совместимая с Native AOT, и восстановление результата MediaPicker после пересоздания Activity на Android.

Переход крупный, поэтому Microsoft просит разработчиков уже сейчас запускать свои MAUI-приложения на Preview 6 и сообщать о регрессиях до ноябрьского релиза.

🔗 Источник

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍5🔥3
💡 EF Core научился переводить FullJoin в FULL OUTER JOIN

В .NET 11 Preview 6 EF Core получил поддержку трансляции нового LINQ-оператора FullJoin в SQL. Теперь запросы могут выполняться целиком на стороне базы данных, без ручных обходных решений.

Сам оператор FullJoin появился в .NET 11 раньше, но сначала работал только для LINQ to Objects. Теперь EF Core умеет преобразовывать его в FULL OUTER JOIN для реляционных провайдеров, которые поддерживают этот оператор.

Это удобно для задач, где нужно сохранить все строки из обеих таблиц, включая несовпавшие: поиск расхождений, сверка данных, объединение нескольких источников или построение отчётов.

Раньше такие запросы часто приходилось собирать вручную из нескольких JOIN и UNION либо писать сырой SQL.

⚠️ Пока это часть .NET 11 Preview 6. До финального релиза в ноябре поведение ещё может измениться.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍5
😬 Microsoft показала ещё один кусочек будущего .NET

Вышел .NET 11 Preview 7. Апдейт затронул почти весь стек: C#, Runtime, SDK, ASP.NET Core, EF Core, MAUI, F# и Windows Forms.

Главное изменение это перевод NativeAOT в режим по умолчанию в CLI ради заметно более быстрого старта приложений.

Из языка подъехали фичи C# 15, среди них паттерны union и помеченные break и continue для управления вложенными циклами.

В библиотеки добавили десятичные типы по стандарту IEEE 754 и шифрование паролем для ZIP.


Стабильный .NET 11 ожидается в ноябре, а пока Preview 7 можно использовать как полигон: проверить свои проекты на новом SDK и заранее найти проблемы с совместимостью.

👍 — тестирую превью
🔥 — до релиза даже не трогаю

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥45👍6🤩2
🖍 NuGet сокращает зависимость от долгоживущих API-ключей

NuGet продолжает ужесточать безопасность публикации пакетов. Один из главных шагов — переход от постоянных API-ключей к короткоживущим credentials через Trusted Publishing.

Вместо хранения секрета в CI/CD workflow получает OIDC-токен, NuGet проверяет его и выдаёт временный API-ключ. Такой ключ действует около часа и затем становится недействительным.

Для CI/CD это означает простую вещь: вместо регулярной ручной ротации секретов можно настроить Trusted Publishing и вообще убрать долгоживущий NuGet API key из пайплайна.


Для обычных scoped API keys NuGet по-прежнему позволяет задавать срок действия самостоятельно.

💡 Если у вас есть автоматическая публикация пакетов, сейчас хороший момент проверить, не хранится ли долгоживущий NuGet API key прямо в CI/CD.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4👍2🔥1😢1
😎 Три строки C# — и ваш AI-агент уже готов к хостингу в Azure

Microsoft показала интеграцию .NET с Foundry Hosted Agents: существующий агент на Microsoft Agent Framework можно превратить в hosted agent практически без изменения логики.

🤩 Достаточно добавить пакет:


dotnet add package Microsoft.Agents.AI.Foundry.Hosting --prerelease


🤩 И три строки:


var builder = AgentHost.CreateBuilder(args);

builder.Services.AddFoundryResponses(agent);

builder.RegisterProtocol(
"responses",
endpoints => endpoints.MapFoundryResponses());


🤩 Дальше:


azd provision
azd deploy


Foundry берёт на себя инфраструктуру, масштабирование, состояние сессий, identity, endpoint и observability. При этом сам AIAgent практически не меняется — вы просто добавляете вокруг него hosting-слой.

🔗 Источник: From dotnet run to Foundry Hosted Agent in 3 lines of C#

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩5🥱2