refactor(render): этап 1 — sanitizer.py (#28, переоткрыт на main после стек-орфана) #37

Merged
vvzvlad merged 2 commits from refactor/render-stage1-sanitizer into main 2026-07-06 17:25:48 +03:00
11 changed files with 657 additions and 742 deletions
+12 -43
View File
@@ -18,8 +18,7 @@ from datetime import datetime
from typing import Union, Dict, Any, List, Optional
from pyrogram.types import Message
from pyrogram.enums import MessageMediaType
from bleach.css_sanitizer import CSSSanitizer
from bleach import clean as HTMLSanitizer
from sanitizer import sanitize_html
from config import get_settings
from file_io import upsert_media_file_ids_bulk_sync, DB_PATH
from url_signer import generate_media_digest
@@ -638,10 +637,10 @@ class PostParser:
serializing every post.
sanitize: when True, run the html body and footer through a single
bleach pass each. Single-post HTML and JSON need this (there is no
whole-feed pass on those paths). Feed generation passes False and
relies on the final sanitize in rss_generator (per-post for RSS,
whole-feed for HTML), so no
fragment is sanitized more than once.
feed-level pass on those paths). Feed generation passes False and
relies on the per-post sanitize in rss_generator._render_pipeline
(per-post for BOTH RSS and HTML), so no fragment is sanitized more
than once.
"""
# Compute html body once — avoids triple _generate_html_body calls.
# The internal per-fragment sanitize passes were removed (4.4); sanitize
@@ -700,41 +699,10 @@ class PostParser:
def _sanitize_html(self, html_raw: str) -> str:
import time as _time
sanitize_start = _time.monotonic()
allowed_tags = ['p', 'a', 'b', 'i', 'strong',
'em', 's', 'del', 'ul', 'ol', 'li', 'br',
'div', 'span', 'img', 'video', 'audio',
'source']
allowed_attributes = {
'a': ['href', 'title', 'target'],
'img': ['src', 'alt', 'style'],
'video': ['controls', 'src', 'style'],
'audio': ['controls', 'style'],
'source': ['src', 'type'],
'div': ['class', 'style'],
'span': ['class']
}
try:
css_sanitizer = CSSSanitizer(
allowed_css_properties=["max-width", "max-height", "object-fit", "width", "height"]
)
sanitized_html = HTMLSanitizer(
html_raw,
tags=allowed_tags,
attributes=allowed_attributes,
protocols=['http', 'https', 'tg'],
css_sanitizer=css_sanitizer,
strip=True,
)
elapsed = _time.monotonic() - sanitize_start
if elapsed > 0.05:
logger.warning(f"diag_sanitize_slow: bleach.clean() took {elapsed:.3f}s, input_len={len(html_raw)}")
return sanitized_html
except Exception as e:
logger.error(f"html_sanitization_error: error {str(e)}")
return html_raw
# Delegate to the single project-wide bleach config (sanitizer.sanitize_html).
# This drops the former fail-open branch: sanitize_html is fail-closed and
# html.escape()s on any bleach error (registry §3.2).
return sanitize_html(html_raw)
def _format_forward_info(self, message: Message) -> Union[str, None]:
if forward_origin := getattr(message, "forward_origin", None):
@@ -831,7 +799,7 @@ class PostParser:
# NOTE: sanitize is NOT applied here. Sanitization happens exactly once per
# output boundary (process_message for single-post/JSON; in rss_generator the
# per-post pass for RSS and the whole-feed pass for HTML). See the map (4.4).
# per-post pass in _render_pipeline for BOTH RSS and HTML). See the map (4.4).
html_body = '\n'.join(content_body)
return html_body
@@ -1036,7 +1004,8 @@ class PostParser:
content_footer.append('<br>' + flags_html)
# Not sanitized here — sanitized once at the output boundary (4.4 coverage map):
# process_message for single-post/JSON; per-post (RSS) / whole-feed (HTML) for feeds.
# process_message for single-post/JSON; per-post in _render_pipeline for feeds
# (both RSS and HTML).
html_footer = '\n'.join(content_footer)
return html_footer
+37 -78
View File
@@ -14,7 +14,6 @@ import logging
import asyncio
import re
import time
from html import escape as html_escape
from datetime import datetime, timezone
from types import SimpleNamespace
from typing import Optional
@@ -24,8 +23,7 @@ from pyrogram.types import Message
from post_parser import PostParser
from config import get_settings
from tg_throttle import tg_rpc_bounded
from bleach.css_sanitizer import CSSSanitizer
from bleach import clean as HTMLSanitizer
from sanitizer import sanitize_html
Config = get_settings()
@@ -222,8 +220,9 @@ def _render_messages_groups(messages_groups: list[list[Message]],
try:
if len(group) == 1: # Single message - simple case
one_message = group[0]
# Feed path: raw_message not needed and sanitize deferred to the final
# whole-feed pass, so each fragment is sanitized exactly once.
# Feed path: raw_message not needed and sanitize deferred to the per-post
# pass in _render_pipeline (both RSS and HTML), so each fragment is
# sanitized exactly once.
message_data = post_parser.process_message(one_message, include_raw=False, sanitize=False)
html_parts = [
f'<div class="message-body">{message_data["html"]["body"]}</div>',
@@ -327,21 +326,37 @@ def _render_pipeline(messages: list[Message],
exclude_flags: str | None,
exclude_text: str | None,
merge_seconds: int,
time_based_merge: bool):
time_based_merge: bool,
channel: str | int):
"""
Full synchronous feed render pipeline (grouping + trimming + rendering).
Full synchronous feed render pipeline (grouping + trimming + rendering + sanitize).
Runs entirely in a worker thread via a single asyncio.to_thread call. It contains
NO await, NO asyncio primitives, NO create_task/get_running_loop — all the CPU-heavy
work (deepcopy, grouping, bleach-free rendering) happens here off the event loop.
work (deepcopy, grouping, rendering, bleach) happens here off the event loop.
Media file-id records are accumulated on post_parser._pending_media_ids and flushed
by the caller after this returns.
`channel` is used only for the sanitize log_context (grep-ability).
"""
if time_based_merge:
messages = _create_time_based_media_groups(messages, merge_seconds)
message_groups = _create_messages_groups(messages)
message_groups = _trim_messages_groups(message_groups, limit)
return _render_messages_groups(message_groups, post_parser, exclude_flags, exclude_text)
posts = _render_messages_groups(message_groups, post_parser, exclude_flags, exclude_text)
# Sanitize each surviving (post-filter) post exactly once, here in the worker
# thread — no per-post thread hop / per-post CSSSanitizer anymore. Per-post
# granularity means a failed post is html.escape()d in isolation instead of the
# whole feed (registry §3.5), and an unbalanced fragment is normalized within its
# OWN post rather than swallowing the following ones (registry §3.4). sanitize_html
# is fail-closed (registry §3.2). For the HTML path the <hr> divider is joined in
# the formatter AFTER this, so it survives sanitize (registry §3.3).
for post in posts:
post['html'] = sanitize_html(
post['html'],
log_context=f"channel {channel}, message_id {post['message_id']}",
)
return posts
async def generate_channel_rss(channel: str | int,
@@ -433,6 +448,7 @@ async def generate_channel_rss(channel: str | int,
final_posts = await asyncio.to_thread(
_render_pipeline, messages, post_parser, limit,
exclude_flags, exclude_text, merge_seconds, Config['time_based_merge'],
channel,
)
finally:
# Persist media file-ids collected during rendering with a single bulk
@@ -463,38 +479,10 @@ async def generate_channel_rss(channel: str | int,
fe.link(href=post_link)
fe.description(post['text'].replace('\n', ' '))
# Sanitize heavy HTML in thread to avoid blocking the loop
try:
def _sanitize_sync(html_raw: str) -> str:
css_sanitizer = CSSSanitizer(
allowed_css_properties=["max-width", "max-height", "object-fit", "width", "height"]
)
return HTMLSanitizer(
html_raw,
tags=['p', 'a', 'b', 'i', 'strong', 'em', 'ul', 'ol', 'li', 'br', 'div', 'span', 'img', 'video', 'audio', 'source'],
attributes={
'a': ['href', 'title', 'target'],
'img': ['src', 'alt', 'style'],
'video': ['controls', 'src', 'style'],
'audio': ['controls', 'style'],
'source': ['src', 'type'],
'div': ['class', 'style'],
'span': ['class']
},
protocols=['http', 'https', 'tg'],
css_sanitizer=css_sanitizer,
strip=True,
)
sanitized_html = await asyncio.to_thread(_sanitize_sync, post['html'])
except Exception as e:
# FAIL CLOSED: since 4.4 removed the per-fragment passes, post['html'] is
# raw channel-controlled HTML, and this is its ONLY sanitize. If bleach
# itself throws (e.g. RecursionError on pathological nested HTML), do NOT
# emit the raw payload (that would be stored XSS) — html.escape it so the
# content survives as inert text.
logger.error(f"rss_html_sanitization_error: channel {channel}, message_id {post['message_id']}, error {str(e)}")
sanitized_html = html_escape(post['html'])
fe.content(content=sanitized_html, type='CDATA')
# post['html'] is already sanitized per-post inside _render_pipeline
# (single project-wide bleach config, fail-closed). No per-post thread
# hop / CSSSanitizer here anymore.
fe.content(content=post['html'], type='CDATA')
if post['date'] is not None:
pub_date = datetime.fromtimestamp(post['date'], tz=timezone.utc)
@@ -657,6 +645,7 @@ async def generate_channel_html(channel: str | int,
final_posts = await asyncio.to_thread(
_render_pipeline, messages, post_parser, limit,
exclude_flags, exclude_text, merge_seconds, Config['time_based_merge'],
channel,
)
finally:
# Persist media file-ids collected during rendering with a single bulk
@@ -666,44 +655,14 @@ async def generate_channel_html(channel: str | int,
processing_elapsed = time.time() - processing_start_time
logger.debug(f"html_messages_processing_timing: channel {channel}, {len(final_posts)} posts processed in {processing_elapsed:.3f} seconds")
# Generate HTML content
# Generate HTML content.
html_gen_start_time = time.time()
# Concatenate HTML in thread to avoid blocking the loop on large payloads
html_posts = [post['html'] for post in final_posts]
def _concat_html(parts: list[str]) -> str:
return '\n<hr class="post-divider">\n'.join(parts)
html = await asyncio.to_thread(_concat_html, html_posts)
# Optionally re-sanitize the final big HTML to ensure safety without blocking the loop
try:
def _sanitize_sync(html_raw: str) -> str:
css_sanitizer = CSSSanitizer(
allowed_css_properties=["max-width", "max-height", "object-fit", "width", "height"]
)
return HTMLSanitizer(
html_raw,
tags=['p', 'a', 'b', 'i', 'strong', 'em', 'ul', 'ol', 'li', 'br', 'div', 'span', 'img', 'video', 'audio', 'source'],
attributes={
'a': ['href', 'title', 'target'],
'img': ['src', 'alt', 'style'],
'video': ['controls', 'src', 'style'],
'audio': ['controls', 'style'],
'source': ['src', 'type'],
'div': ['class', 'style'],
'span': ['class']
},
protocols=['http', 'https', 'tg'],
css_sanitizer=css_sanitizer,
strip=True,
)
html = await asyncio.to_thread(_sanitize_sync, html)
except Exception as e:
# FAIL CLOSED (see the RSS path): `html` is now the raw concatenated feed
# (4.4 removed the per-fragment passes). If bleach throws, html.escape the
# whole feed rather than returning raw channel HTML/JS to the client.
logger.error(f"html_final_sanitization_error: channel {channel}, error {str(e)}")
html = html_escape(html)
# Each post is already sanitized per-post inside _render_pipeline. Join with the
# <hr> divider AFTER sanitize so the divider survives (registry §3.3), and each
# post's DOM was normalized within its own fragment (registry §3.4). The join is
# a trivial string op — no worker thread needed.
html = '\n<hr class="post-divider">\n'.join(post['html'] for post in final_posts)
html_gen_elapsed = time.time() - html_gen_start_time
logger.debug(f"html_generation_timing: channel {channel}, HTML generated in {html_gen_elapsed:.3f} seconds")
+88
View File
@@ -0,0 +1,88 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# flake8: noqa
# pylint: disable=broad-exception-caught, logging-fstring-interpolation, line-too-long
"""The ONLY bleach configuration in the project.
Before this module the sanitize config was copy-pasted three times (the single-post
path in post_parser plus the RSS and HTML feed paths in rss_generator) and had
drifted: `s`/`del` survived only in the single-post copy, and the three error-log
names diverged. Here the config lives exactly once; every render path routes
through sanitize_html().
"""
import logging
import time as _time
from html import escape as _html_escape
# Imported under this name so tests can monkeypatch `sanitizer.HTMLSanitizer`
# (API relocation from rss_generator — no behaviour change).
from bleach import clean as HTMLSanitizer
from bleach.css_sanitizer import CSSSanitizer
logger = logging.getLogger(__name__)
# Union of the three former copies. `s`/`del` (strikethrough) were previously
# allowed only in the single-post path; registry §3.1 makes them survive in feeds too.
ALLOWED_TAGS = ['p', 'a', 'b', 'i', 'strong', 'em', 's', 'del',
'ul', 'ol', 'li', 'br', 'div', 'span',
'img', 'video', 'audio', 'source']
# Identical in all three former copies — moved here as-is.
ALLOWED_ATTRIBUTES = {
'a': ['href', 'title', 'target'],
'img': ['src', 'alt', 'style'],
'video': ['controls', 'src', 'style'],
'audio': ['controls', 'style'],
'source': ['src', 'type'],
'div': ['class', 'style'],
'span': ['class'],
}
ALLOWED_CSS_PROPERTIES = ["max-width", "max-height", "object-fit", "width", "height"]
# Non-default! bleach's default protocol list would strip tg:// links (channel
# footers / service links use them). Load-bearing.
ALLOWED_PROTOCOLS = ['http', 'https', 'tg']
# Shared instance is safe: CSSSanitizer only holds the allowed-properties list
# (stateless config); bleach builds a fresh Cleaner per clean() call anyway.
_CSS_SANITIZER = CSSSanitizer(allowed_css_properties=ALLOWED_CSS_PROPERTIES)
def sanitize_html(html_raw: str, log_context: str = "") -> str:
"""Sanitize one HTML fragment.
FAIL-CLOSED: on any bleach error the fragment is html.escape()d, never returned
raw (stored-XSS guard registry §3.2). log_context (e.g. "channel X, message_id
Y") is included in the error/slow logs to keep operational grep-ability across
call sites.
"""
sanitize_start = _time.monotonic()
try:
# Both non-default params are load-bearing:
# protocols=ALLOWED_PROTOCOLS keeps tg:// links alive;
# strip=True REMOVES disallowed tags (bleach's default False would escape
# them into visible text). strip_comments stays default (True), matching
# all former call sites.
sanitized_html = HTMLSanitizer(
html_raw,
tags=ALLOWED_TAGS,
attributes=ALLOWED_ATTRIBUTES,
protocols=ALLOWED_PROTOCOLS,
css_sanitizer=_CSS_SANITIZER,
strip=True,
)
except Exception as e:
# Single error-log name across all call sites (registry §3.16); log_context
# distinguishes them. Fail-closed: escape rather than emit the raw payload.
_ctx = f"{log_context}, " if log_context else ""
logger.error(f"html_sanitization_error: {_ctx}error {str(e)}")
return _html_escape(html_raw)
elapsed = _time.monotonic() - sanitize_start
if elapsed > 0.05:
_ctx = f", {log_context}" if log_context else ""
logger.warning(f"diag_sanitize_slow: bleach.clean() took {elapsed:.3f}s, input_len={len(html_raw)}{_ctx}")
return sanitized_html
File diff suppressed because one or more lines are too long
+91 -174
View File
@@ -9,8 +9,7 @@
<div class="message-footer"><br>
<span class="reaction">🤔 17&nbsp;&nbsp;</span><span class="reaction">🌚 5&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">1582 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">19/06/26, 17:37:03</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1438</span><br><a href="tg://resolve?domain=embedoka&amp;post=1438">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1438">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1437/AgADpR5rG_ojSEk/aca760d9" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -22,8 +21,7 @@
<div class="message-footer"><br>
<span class="reaction">🤣 41&nbsp;&nbsp;</span><span class="reaction">❓ 7&nbsp;&nbsp;</span><span class="reaction">👍 4&nbsp;&nbsp;</span><span class="reaction">🤯 2&nbsp;&nbsp;</span><span class="reaction">🎉 1&nbsp;&nbsp;</span><span class="reaction">🤪 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">2452 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">11/06/26, 10:34:32</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1437</span><br><a href="tg://resolve?domain=embedoka&amp;post=1437">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1437">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1436/AgAD8hJrGzIQKUg/47c5c3fd" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -35,8 +33,7 @@
<div class="message-footer"><br>
<span class="reaction">🦄 25&nbsp;&nbsp;</span><span class="reaction">❓ 8&nbsp;&nbsp;</span><span class="reaction">❤ 6&nbsp;&nbsp;</span><span class="reaction">👍 6&nbsp;&nbsp;</span><span class="reaction">🤣 3&nbsp;&nbsp;</span><span class="reaction">🔥 1&nbsp;&nbsp;</span><span class="reaction">🤔 1&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3797 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/05/26, 09:15:55</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1436</span><br><a href="tg://resolve?domain=embedoka&amp;post=1436">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1436">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1435/AgADuhlrGxx30Es/6b08cf3f" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -48,8 +45,7 @@
<div class="message-footer"><br>
<span class="reaction">😭 24&nbsp;&nbsp;</span><span class="reaction">🫡 3&nbsp;&nbsp;</span><span class="reaction">🤪 3&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span><span class="reaction">🤔 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4149 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">05/05/26, 12:47:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1435</span><br><a href="tg://resolve?domain=embedoka&amp;post=1435">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1435">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1433/AgADTBRrGxx3yEs/dc9ae82d" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -68,8 +64,7 @@
<div class="message-footer"><br>
<span class="reaction">👏 11&nbsp;&nbsp;</span><span class="reaction">🤯 6&nbsp;&nbsp;</span><span class="reaction">👍 5&nbsp;&nbsp;</span><span class="reaction">🔥 2&nbsp;&nbsp;</span><span class="reaction">❓ 2&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3233 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">04/05/26, 14:04:48</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1433</span><br><a href="tg://resolve?domain=embedoka&amp;post=1433">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1433">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1432/AgADRhZrGzy4MEs/9b707ec5" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -82,8 +77,7 @@
<div class="message-footer"><br>
<span class="reaction">❓ 10&nbsp;&nbsp;</span><span class="reaction">🔥 5&nbsp;&nbsp;</span><span class="reaction">🤯 4&nbsp;&nbsp;</span><span class="reaction">❤ 3&nbsp;&nbsp;</span><span class="reaction">👎 1&nbsp;&nbsp;</span><span class="reaction">👏 1&nbsp;&nbsp;</span><span class="reaction">😁 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3616 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">20/04/26, 16:06:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1432</span><br><a href="tg://resolve?domain=embedoka&amp;post=1432">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1432">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1431/AgADThRrG8FT-Uo/427a9bdb" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -95,8 +89,7 @@
<div class="message-footer"><br>
<span class="reaction">🤣 28&nbsp;&nbsp;</span><span class="reaction">🦄 3&nbsp;&nbsp;</span><span class="reaction">❓ 2&nbsp;&nbsp;</span><span class="reaction">😁 1&nbsp;&nbsp;</span><span class="reaction">💯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3704 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/04/26, 12:15:03</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1431</span><br><a href="tg://resolve?domain=embedoka&amp;post=1431">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1431">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1428/AgAD_xVrG2GmyUo/43f1a808" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -122,8 +115,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">🔥 13&nbsp;&nbsp;</span><span class="reaction">❓ 6&nbsp;&nbsp;</span><span class="reaction">😁 3&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3365 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">10/04/26, 09:13:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1428</span><br><a href="tg://resolve?domain=embedoka&amp;post=1428">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1428">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1427/AgADKhRrG_9D6Es/eb430d19" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -135,8 +127,7 @@
<div class="message-footer"><br>
<span class="reaction">🤣 34&nbsp;&nbsp;</span><span class="reaction">❓ 10&nbsp;&nbsp;</span><span class="reaction">👍 2&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5377 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">30/01/26, 19:37:56</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1427</span><br><a href="tg://resolve?domain=embedoka&amp;post=1427">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1427">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/embedoka/1426/AgADv5sAAr7skUk/00cfb5ed" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -148,8 +139,7 @@
<div class="message-footer"><br>
<span class="reaction">🔥 21&nbsp;&nbsp;</span><span class="reaction">❓ 6&nbsp;&nbsp;</span><span class="reaction">✍ 3&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">😁 1&nbsp;&nbsp;</span><span class="reaction">🤣 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span><span class="reaction">❓ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">7128 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">04/12/25, 15:29:32</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1426</span><br><a href="tg://resolve?domain=embedoka&amp;post=1426">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1426">Open in Web</a>
<br><div class="message-flags"> 🏷 video 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1425/AgADbg1rG_ih6Ug/1ad7eeb1" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -161,21 +151,19 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 5&nbsp;&nbsp;</span><span class="reaction">❓ 20&nbsp;&nbsp;</span><span class="reaction">✍ 9&nbsp;&nbsp;</span><span class="reaction">🔥 5&nbsp;&nbsp;</span><span class="reaction">🤔 3&nbsp;&nbsp;</span><span class="reaction">👍 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">6967 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">18/11/25, 12:04:21</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1425</span><br><a href="tg://resolve?domain=embedoka&amp;post=1425">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1425">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/embedoka/1424/AgADW4oAAnlTuUg/ce36e0bb" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
</div>
<br>
<b>Невероятно, но rust </b>🤯<br><br><b>Topola PCB</b> - роутер и автороутер печатных плат, написанный на расте. Проект в активной фазе развития, судя по локализации пилят его наши восточные соседи разрабатывается на европейские деньги (грант известной <a href="https://t.me/vlsihub/586">NLnet</a>). Что интересно: название перекликается с отечественным продуктом из 2000х с аналогичным функционалом 😅<br><br>🔗 <a href="https://topola.dev/" target="_blank">https://topola.dev/</a><br>🐱 <a href="https://codeberg.org/topola/topola" target="_blank">https://codeberg.org/topola/topola</a><br><br>PS: Есть даже <a href="https://topola.dev/app/">веб-версия</a>, а вот поддерживаемых форматов я не нашёл нигде 🤓<br><br>@embedoka
<b>Невероятно, но rust </b>🤯<br><br><b>Topola PCB</b> - роутер и автороутер печатных плат, написанный на расте. Проект в активной фазе развития, судя по локализации <s>пилят его наши восточные соседи</s> разрабатывается на европейские деньги (грант известной <a href="https://t.me/vlsihub/586">NLnet</a>). Что интересно: название перекликается с отечественным продуктом из 2000х с аналогичным функционалом 😅<br><br>🔗 <a href="https://topola.dev/" target="_blank">https://topola.dev/</a><br>🐱 <a href="https://codeberg.org/topola/topola" target="_blank">https://codeberg.org/topola/topola</a><br><br>PS: Есть даже <a href="https://topola.dev/app/">веб-версия</a>, а вот поддерживаемых форматов я не нашёл нигде 🤓<br><br>@embedoka
<br>
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">⭐ 3&nbsp;&nbsp;</span><span class="reaction">👍 19&nbsp;&nbsp;</span><span class="reaction">✍ 9&nbsp;&nbsp;</span><span class="reaction">🤔 4&nbsp;&nbsp;</span><span class="reaction">❓ 4&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">🤣 2&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">11038 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/11/25, 08:11:48</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1424</span><br><a href="tg://resolve?domain=embedoka&amp;post=1424">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1424">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1423/AgADoPgxG07T4Us/b7716ac3" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -187,8 +175,7 @@
<div class="message-footer"><br>
<span class="reaction">❓ 5&nbsp;&nbsp;</span><span class="reaction">✍ 4&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">😁 2&nbsp;&nbsp;</span><span class="reaction">🤯 2&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span><span class="reaction">🔥 1&nbsp;&nbsp;</span><span class="reaction">👏 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5989 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">24/10/25, 18:52:08</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1423</span><br><a href="tg://resolve?domain=embedoka&amp;post=1423">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1423">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1422/AgADWvcxG-C6aUs/ae5e5c4f" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -200,8 +187,7 @@
<div class="message-footer"><br>
<span class="reaction">✍ 17&nbsp;&nbsp;</span><span class="reaction">🔥 8&nbsp;&nbsp;</span><span class="reaction">❤ 5&nbsp;&nbsp;</span><span class="reaction">🤔 4&nbsp;&nbsp;</span><span class="reaction">👍 3&nbsp;&nbsp;</span><span class="reaction">❓ 2&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">6041 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">13/10/25, 08:21:12</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1422</span><br><a href="tg://resolve?domain=embedoka&amp;post=1422">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1422">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1421/AgADfwIyG6gE4Eo/ba1f840e" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -214,8 +200,7 @@
<div class="message-footer"><br>
<span class="reaction">❓ 22&nbsp;&nbsp;</span><span class="reaction">❓ 8&nbsp;&nbsp;</span><span class="reaction">👍 5&nbsp;&nbsp;</span><span class="reaction">🤣 2&nbsp;&nbsp;</span><span class="reaction">💊 2&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">6231 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">30/09/25, 06:56:56</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1421</span><br><a href="tg://resolve?domain=embedoka&amp;post=1421">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1421">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -230,8 +215,7 @@
<div class="message-footer"><br>
<span class="reaction">❓ 37&nbsp;&nbsp;</span><span class="reaction">😁 23&nbsp;&nbsp;</span><span class="reaction">💯 15&nbsp;&nbsp;</span><span class="reaction">❓ 3&nbsp;&nbsp;</span><span class="reaction">🎉 2&nbsp;&nbsp;</span><span class="reaction">🤪 2&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5845 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">26/09/25, 08:14:27</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1420</span><br><a href="tg://resolve?domain=embedoka&amp;post=1420">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1420">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1418/AgAD4PkxG81KaEo/dbc37d40" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -243,8 +227,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 10&nbsp;&nbsp;</span><span class="reaction">😁 75&nbsp;&nbsp;</span><span class="reaction">❓ 14&nbsp;&nbsp;</span><span class="reaction">🔥 9&nbsp;&nbsp;</span><span class="reaction">👍 3&nbsp;&nbsp;</span><span class="reaction">🤣 3&nbsp;&nbsp;</span><span class="reaction">❓ 3&nbsp;&nbsp;</span><span class="reaction">❓ 3&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">7013 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">19/09/25, 09:41:00</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1418</span><br><a href="tg://resolve?domain=embedoka&amp;post=1418">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1418">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1417/AgADpPcxG7a4OEo/84bac231" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -256,8 +239,7 @@
<div class="message-footer"><br>
<span class="reaction">❓ 70&nbsp;&nbsp;</span><span class="reaction">🔥 9&nbsp;&nbsp;</span><span class="reaction">🤯 8&nbsp;&nbsp;</span><span class="reaction">🤪 5&nbsp;&nbsp;</span><span class="reaction">😁 2&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span><span class="reaction">💯 1&nbsp;&nbsp;</span><span class="reaction">❓ 1&nbsp;&nbsp;</span><span class="reaction">❓ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">6658 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/09/25, 12:40:51</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1417</span><br><a href="tg://resolve?domain=embedoka&amp;post=1417">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1417">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1416/AgADuPIxG-0aIEo/1eb8aabc" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -269,8 +251,7 @@
<div class="message-footer"><br>
<span class="reaction">🤣 27&nbsp;&nbsp;</span><span class="reaction">🔥 6&nbsp;&nbsp;</span><span class="reaction">❓ 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span><span class="reaction">🤪 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span><span class="reaction">❓ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5426 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">12/09/25, 08:58:29</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1416</span><br><a href="tg://resolve?domain=embedoka&amp;post=1416">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1416">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1415/AgADn_sxGywDCEo/3e65d9a7" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -282,8 +263,7 @@
<div class="message-footer"><br>
<span class="reaction">🤯 17&nbsp;&nbsp;</span><span class="reaction">❓ 6&nbsp;&nbsp;</span><span class="reaction">❓ 4&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">🤪 2&nbsp;&nbsp;</span><span class="reaction">🤷‍♂ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5546 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">10/09/25, 07:12:16</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1415</span><br><a href="tg://resolve?domain=embedoka&amp;post=1415">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1415">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1414/AgADKvMxG8I6-Uk/e73ca3b0" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -296,8 +276,7 @@
<div class="message-footer"><br>
<span class="reaction">❓ 28&nbsp;&nbsp;</span><span class="reaction">👍 6&nbsp;&nbsp;</span><span class="reaction">🤔 3&nbsp;&nbsp;</span><span class="reaction">❓ 2&nbsp;&nbsp;</span><span class="reaction">👎 1&nbsp;&nbsp;</span><span class="reaction">🌚 1&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span><span class="reaction">❓ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4374 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">08/09/25, 07:21:44</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1414</span><br><a href="tg://resolve?domain=embedoka&amp;post=1414">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1414">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/embedoka/1413/AgADBoAAAl9N2Ek/5f9d42a9" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -309,8 +288,7 @@
<div class="message-footer"><br>
<span class="reaction">🤣 34&nbsp;&nbsp;</span><span class="reaction">🤪 8&nbsp;&nbsp;</span><span class="reaction">🔥 2&nbsp;&nbsp;</span><span class="reaction">❓ 1&nbsp;&nbsp;</span><span class="reaction">❓ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4445 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">05/09/25, 12:04:56</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1413</span><br><a href="tg://resolve?domain=embedoka&amp;post=1413">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1413">Open in Web</a>
<br><div class="message-flags"> 🏷 video 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1411/AgADyfQxGzt2uUk/0c8debd2" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -329,8 +307,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 2&nbsp;&nbsp;</span><span class="reaction">👍 29&nbsp;&nbsp;</span><span class="reaction">✍ 4&nbsp;&nbsp;</span><span class="reaction">❤ 3&nbsp;&nbsp;</span><span class="reaction">🔥 1&nbsp;&nbsp;</span><span class="reaction">🤔 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">6052 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">02/09/25, 10:40:26</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1411</span><br><a href="tg://resolve?domain=embedoka&amp;post=1411">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1411">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1410/AgADMfgxGz9iqEk/b6a57a4d" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -342,8 +319,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 2&nbsp;&nbsp;</span><span class="reaction">🤯 45&nbsp;&nbsp;</span><span class="reaction">👍 22&nbsp;&nbsp;</span><span class="reaction">🔥 12&nbsp;&nbsp;</span><span class="reaction">😱 5&nbsp;&nbsp;</span><span class="reaction">❤ 4&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span><span class="reaction">❓ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">7009 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">01/09/25, 11:48:33</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1410</span><br><a href="tg://resolve?domain=embedoka&amp;post=1410">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1410">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -358,8 +334,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 5&nbsp;&nbsp;</span><span class="reaction">💯 47&nbsp;&nbsp;</span><span class="reaction">😁 11&nbsp;&nbsp;</span><span class="reaction">👍 4&nbsp;&nbsp;</span><span class="reaction">🤣 4&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">🤪 2&nbsp;&nbsp;</span><span class="reaction">🌚 1&nbsp;&nbsp;</span><span class="reaction">❓ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4106 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">29/08/25, 09:30:09</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1409</span><br><a href="tg://resolve?domain=embedoka&amp;post=1409">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1409">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1408/AgAD0vwxG1pieEk/20d9f550" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -371,8 +346,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">🤔 8&nbsp;&nbsp;</span><span class="reaction">👍 4&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span><span class="reaction">💯 1&nbsp;&nbsp;</span><span class="reaction">🤪 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4475 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">27/08/25, 08:36:36</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1408</span><br><a href="tg://resolve?domain=embedoka&amp;post=1408">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1408">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1407/AgADWPkxGxjdSUk/8e10a42e" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -384,8 +358,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">🤣 42&nbsp;&nbsp;</span><span class="reaction">😱 4&nbsp;&nbsp;</span><span class="reaction">🔥 3&nbsp;&nbsp;</span><span class="reaction">🤪 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4868 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">22/08/25, 13:05:20</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1407</span><br><a href="tg://resolve?domain=embedoka&amp;post=1407">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1407">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -400,8 +373,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">💯 52&nbsp;&nbsp;</span><span class="reaction">🤣 31&nbsp;&nbsp;</span><span class="reaction">❤ 4&nbsp;&nbsp;</span><span class="reaction">🔥 3&nbsp;&nbsp;</span><span class="reaction">😱 2&nbsp;&nbsp;</span><span class="reaction">🫡 2&nbsp;&nbsp;</span><span class="reaction">🤪 2&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4971 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">15/08/25, 10:38:00</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1406</span><br><a href="tg://resolve?domain=embedoka&amp;post=1406">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1406">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1400/AgADZfYxGzA94Ug/16a55862" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -448,8 +420,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">❤ 6&nbsp;&nbsp;</span><span class="reaction">🤣 4&nbsp;&nbsp;</span><span class="reaction">👍 3&nbsp;&nbsp;</span><span class="reaction">🤔 2&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span><span class="reaction">🔥 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3573 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/08/25, 08:10:58</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1400</span><br><a href="tg://resolve?domain=embedoka&amp;post=1400">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1400">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -464,8 +435,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">💯 9&nbsp;&nbsp;</span><span class="reaction">😁 5&nbsp;&nbsp;</span><span class="reaction">❤ 3&nbsp;&nbsp;</span><span class="reaction">💊 3&nbsp;&nbsp;</span><span class="reaction">🔥 2&nbsp;&nbsp;</span><span class="reaction">😈 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3136 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">13/08/25, 08:13:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1399</span><br><a href="tg://resolve?domain=embedoka&amp;post=1399">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1399">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1397/AgADnvUxGx6B2Ug/4c3b484b" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -478,17 +448,15 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 2&nbsp;&nbsp;</span><span class="reaction">🔥 39&nbsp;&nbsp;</span><span class="reaction">❤ 7&nbsp;&nbsp;</span><span class="reaction">🤪 3&nbsp;&nbsp;</span><span class="reaction">🎉 2&nbsp;&nbsp;</span><span class="reaction">🤣 2&nbsp;&nbsp;</span><span class="reaction">🦄 2&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span><span class="reaction">👎 1&nbsp;&nbsp;</span><span class="reaction">😱 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3747 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">12/08/25, 07:58:31</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1397</span><br><a href="tg://resolve?domain=embedoka&amp;post=1397">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1397">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
640 КБ хватит всем
<s>640 КБ хватит всем</s>
<br>
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">🌚 19&nbsp;&nbsp;</span><span class="reaction">🤣 13&nbsp;&nbsp;</span><span class="reaction">💯 4&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3195 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">11/08/25, 17:37:57</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1396</span><br><a href="tg://resolve?domain=embedoka&amp;post=1396">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1396">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1395/AgADefYxGzfRwUg/1970b79b" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -500,8 +468,7 @@
<div class="message-footer"><br>
<span class="reaction">👍 22&nbsp;&nbsp;</span><span class="reaction">🔥 10&nbsp;&nbsp;</span><span class="reaction">😁 8&nbsp;&nbsp;</span><span class="reaction">🤪 4&nbsp;&nbsp;</span><span class="reaction">✍ 2&nbsp;&nbsp;</span><span class="reaction">🤔 2&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">6114 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">11/08/25, 08:45:02</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1395</span><br><a href="tg://resolve?domain=embedoka&amp;post=1395">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1395">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/embedoka/1394/AgADpIkAAjfRuUg/52e736e7" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -513,8 +480,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">🔥 48&nbsp;&nbsp;</span><span class="reaction">👍 11&nbsp;&nbsp;</span><span class="reaction">❤ 3&nbsp;&nbsp;</span><span class="reaction">🤔 2&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4069 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">09/08/25, 18:34:52</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1394</span><br><a href="tg://resolve?domain=embedoka&amp;post=1394">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1394">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -525,8 +491,7 @@
<div class="message-footer"><br>
<span class="reaction">💯 22&nbsp;&nbsp;</span><span class="reaction">🤣 9&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span><span class="reaction">🤪 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3113 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">08/08/25, 08:27:21</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1393</span><br><a href="tg://resolve?domain=embedoka&amp;post=1393">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1393">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 no_image 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1392/AgADN_IxGw1doUg/aa9b6bf5" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -538,8 +503,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">👍 8&nbsp;&nbsp;</span><span class="reaction">❤ 3&nbsp;&nbsp;</span><span class="reaction">🔥 2&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3812 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">07/08/25, 09:07:31</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1392</span><br><a href="tg://resolve?domain=embedoka&amp;post=1392">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1392">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1391/AgADoP8xGwPzeUg/29252be6" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -551,8 +515,7 @@
<div class="message-footer"><br>
<span class="reaction">👍 15&nbsp;&nbsp;</span><span class="reaction">✍ 8&nbsp;&nbsp;</span><span class="reaction">🤯 6&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">🤔 2&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3181 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">06/08/25, 09:34:19</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1391</span><br><a href="tg://resolve?domain=embedoka&amp;post=1391">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1391">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/vlsihub">VLSI HUB (@vlsihub)</a> ---</div>
<br>
@@ -567,8 +530,7 @@
<div class="message-footer"><br>
<span class="reaction">🔥 18&nbsp;&nbsp;</span><span class="reaction">❤ 9&nbsp;&nbsp;</span><span class="reaction">👍 2&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span><span class="reaction">😈 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3040 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">04/08/25, 09:46:21</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1390</span><br><a href="tg://resolve?domain=embedoka&amp;post=1390">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1390">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1389/AgADPwIyGwPzeUg/a3c293a9" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -580,21 +542,19 @@
<div class="message-footer"><br>
<span class="reaction">🔥 21&nbsp;&nbsp;</span><span class="reaction">👍 5&nbsp;&nbsp;</span><span class="reaction">🦄 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">👎 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span><span class="reaction">🙏 1&nbsp;&nbsp;</span><span class="reaction">💯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3439 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">03/08/25, 16:03:34</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1389</span><br><a href="tg://resolve?domain=embedoka&amp;post=1389">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1389">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1388/AgADC_kxG0xOKUg/42b2fd35" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
</div>
<br>
Наконец-то что-то дельное про нишевый микро-бизнес в эмбеддед за последние годы <a href="https://habr.com/ru/companies/moysklad/articles/931072/">прочёл</a>. А не про эти ваши диктофоны с телесисек, которым 100 лет в обед и которые уже всем в смартфон не впились (остались нишевые применения, но они сильно завязаны на гос.регуляторику).<br><br>TLDR: Чел из Омска разработал и теперь производит платы-&quot;обманки&quot; для уменьшения костов дорогостоящего ремонта холодильника. Маркетплейсы душат комиссией, но на хлеб с маслом хватает (в масштабах выпро-живания в миллионнике).<br><br>PS: если кому-то попадалось схожее чтиво (да еще и с юнит-экономикой) - кидайте в коменты 🙏<br><br>@embedoka
Наконец-то что-то дельное про нишевый микро-бизнес в эмбеддед за последние годы <a href="https://habr.com/ru/companies/moysklad/articles/931072/">прочёл</a>. А не про эти ваши диктофоны с телесисек, которым 100 лет в обед и которые уже всем в смартфон не впились (остались нишевые применения, но они сильно завязаны на гос.регуляторику).<br><br>TLDR: Чел из Омска разработал и теперь производит платы-&quot;обманки&quot; для уменьшения костов дорогостоящего ремонта холодильника. Маркетплейсы душат комиссией, но на хлеб с маслом хватает (в масштабах <s>вы</s>про-живания в миллионнике).<br><br>PS: если кому-то попадалось схожее чтиво (да еще и с юнит-экономикой) - кидайте в коменты 🙏<br><br>@embedoka
<br>
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">👍 40&nbsp;&nbsp;</span><span class="reaction">🔥 15&nbsp;&nbsp;</span><span class="reaction">❤ 5&nbsp;&nbsp;</span><span class="reaction">💊 3&nbsp;&nbsp;</span><span class="reaction">✍ 2&nbsp;&nbsp;</span><span class="reaction">🌚 2&nbsp;&nbsp;</span><span class="reaction">🦄 2&nbsp;&nbsp;</span><span class="reaction">👎 1&nbsp;&nbsp;</span><span class="reaction">😁 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4722 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">26/07/25, 09:15:19</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1388</span><br><a href="tg://resolve?domain=embedoka&amp;post=1388">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1388">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1387/AgAD7vkxGyNd0Es/8081f7e5" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -606,8 +566,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">😁 59&nbsp;&nbsp;</span><span class="reaction">🤣 31&nbsp;&nbsp;</span><span class="reaction">🔥 11&nbsp;&nbsp;</span><span class="reaction">❤ 3&nbsp;&nbsp;</span><span class="reaction">💊 3&nbsp;&nbsp;</span><span class="reaction">🤪 2&nbsp;&nbsp;</span><span class="reaction">🤔 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span><span class="reaction">😈 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5992 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">18/07/25, 15:23:59</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1387</span><br><a href="tg://resolve?domain=embedoka&amp;post=1387">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1387">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1386/AgADqvcxGx5cmUs/19bb89c7" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -620,8 +579,7 @@
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">👍 10&nbsp;&nbsp;</span><span class="reaction">🔥 4&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span><span class="reaction">😱 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5446 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/07/25, 11:04:40</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1386</span><br><a href="tg://resolve?domain=embedoka&amp;post=1386">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1386">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1385/AgADlPcxGx5cmUs/f7d8428b" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -633,18 +591,16 @@
<div class="message-footer"><br>
<span class="reaction">🔥 28&nbsp;&nbsp;</span><span class="reaction">👍 7&nbsp;&nbsp;</span><span class="reaction">❤ 5&nbsp;&nbsp;</span><span class="reaction">🤔 5&nbsp;&nbsp;</span><span class="reaction">🤯 3&nbsp;&nbsp;</span><span class="reaction">🤪 2&nbsp;&nbsp;</span><span class="reaction">🦄 2&nbsp;&nbsp;</span><span class="reaction">👏 1&nbsp;&nbsp;</span><span class="reaction">😁 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5400 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/07/25, 08:37:57</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1385</span><br><a href="tg://resolve?domain=embedoka&amp;post=1385">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1385">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
В электронике тоже есть своё <a href="https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE_34">правило№34</a>:<br>
На любую вашу хотелку существует готовая реализация в интегральном исполнении (с) Doka 😅<br><br><b>Правило#35</b>: если нет микросхемы, перепроверь еще раз у китайцев <br><br><b>Правило#36</b>: всегда существует еще более тупая дешевая дискретная реализация нужного функционала из говна и палок на рассыпухе<br><br><b>Правило#37</b>: рассыпуха под рукой всегда будет не той мощности, которая нужна в данный момент, поэтому <a href="https://en.wikipedia.org/wiki/TO-3">TO-3</a> балласт будет соседствовать с 0201 <br><br><b>Правило#38</b>: Всегда существует реализация которая займет больше времени на разработку и отладку и вы выберете именно ее<br><b><br>Правило#39</b>: [Если вы не китаец, то] что бы вы не делали у китайцев этот же функционал реализован проще<br><br>@embedoka
На любую вашу хотелку существует готовая реализация в интегральном исполнении (с) Doka 😅<br><br><b>Правило#35</b>: если нет микросхемы, перепроверь еще раз у китайцев <br><br><b>Правило#36</b>: всегда существует еще более <s>тупая</s> дешевая дискретная реализация нужного функционала <s>из говна и палок</s> на рассыпухе<br><br><b>Правило#37</b>: рассыпуха под рукой всегда будет не той мощности, которая нужна в данный момент, поэтому <a href="https://en.wikipedia.org/wiki/TO-3">TO-3</a> балласт будет соседствовать с 0201 <br><br><b>Правило#38</b>: Всегда существует реализация которая займет больше времени на разработку и отладку и вы выберете именно ее<br><b><br>Правило#39</b>: [Если вы не китаец, то] что бы вы не делали у китайцев этот же функционал реализован проще<br><br>@embedoka
<br>
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">⭐ 7&nbsp;&nbsp;</span><span class="reaction">💯 45&nbsp;&nbsp;</span><span class="reaction">👍 7&nbsp;&nbsp;</span><span class="reaction">🤪 5&nbsp;&nbsp;</span><span class="reaction">✍ 3&nbsp;&nbsp;</span><span class="reaction">🫡 3&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">🔥 2&nbsp;&nbsp;</span><span class="reaction">👏 2&nbsp;&nbsp;</span><span class="reaction">🌚 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5650 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">12/07/25, 21:22:19</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1384</span><br><a href="tg://resolve?domain=embedoka&amp;post=1384">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1384">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1383/AgADrO8xG7tzCEg/8ef97c5c" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -656,35 +612,32 @@
<div class="message-footer"><br>
<span class="reaction">🤣 67&nbsp;&nbsp;</span><span class="reaction">👍 12&nbsp;&nbsp;</span><span class="reaction">🔥 2&nbsp;&nbsp;</span><span class="reaction">😁 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5637 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">20/06/25, 11:26:48</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1383</span><br><a href="tg://resolve?domain=embedoka&amp;post=1383">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1383">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1382/AgADDfwxG9h5kEo/51587cc3" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
</div>
<br>
The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series modules. Customers using NVIDIA Jetson-based products <b>can seamlessly replace</b> the original module with SM9 without hardware development efforts— simply unplug the NVIDIA module, plug in SM9, and complete hardware integration. <br><br>Ай-да китайцы, ай-да молодцы. Правильной дорогой идут, нефиг Nvidia булки расслаблять 😅<br><br>Понятно, что вопрос поддержки компиляторов и вот это всё тоже немаловажен, но DeepSeek R1 distilled 7B and 1.5B на ней уже запустили и <a href="https://sophon.ai/post/439.html">отбенчмарками</a> (скрин в коментах).<br><br>Кстати-кстати, это не просто рандомный китайский стартап, а перелицованный старый добрый Bitmain - мировой лидер в разработке и производстве чипов для майнинга крипты (и AI темой они начали заниматься еще в эпоху криптолихорадки - в общем, всегда держат руку на пульсе).<br><br>@embedoka
The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series modules. Customers using NVIDIA Jetson-based products <b>can seamlessly replace</b> the original module with SM9 without hardware development efforts— simply unplug the NVIDIA module, plug in SM9, and complete hardware integration. <br><br>Ай-да китайцы, ай-да молодцы. Правильной дорогой идут, нефиг Nvidia булки расслаблять 😅<br><br>Понятно, что вопрос поддержки компиляторов и вот это всё тоже немаловажен, но DeepSeek R1 distilled 7B and 1.5B на ней уже запустили и <a href="https://sophon.ai/post/439.html">отбенчмарками</a> (скрин в коментах).<br><br>Кстати-кстати, это не просто рандомный китайский стартап, а <s>перелицованный</s> старый добрый Bitmain - мировой лидер в разработке и производстве чипов для майнинга крипты (и AI темой они начали заниматься еще в эпоху криптолихорадки - в общем, всегда держат руку на пульсе).<br><br>@embedoka
<br>
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">🔥 25&nbsp;&nbsp;</span><span class="reaction">✍ 6&nbsp;&nbsp;</span><span class="reaction">❤ 5&nbsp;&nbsp;</span><span class="reaction">👏 2&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5818 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">17/06/25, 13:48:20</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1382</span><br><a href="tg://resolve?domain=embedoka&amp;post=1382">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1382">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1380/AgADvPIxG_ZGIUo/a9e857b4" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
</div>
<br>
Если <a href="https://t.me/embedoka/1334">предыдущий адаптер</a> был прям &quot;находкой&quot;, то вот идея не столь однозначного адаптера: можно назвать это 1000 и 1 способ выломать RJ-45 к чертям 😈<br><br>А внутри у неё неонка <a href="https://www.olimex.com/Products/USB-Modules/Ethernet/USB-GIGABIT/resources/rtl8153.pdf">RTL8153</a><br><br>@embedoka
Если <a href="https://t.me/embedoka/1334">предыдущий адаптер</a> был прям &quot;находкой&quot;, то вот идея не столь однозначного адаптера: можно назвать это 1000 и 1 способ выломать RJ-45 к чертям 😈<br><br>А внутри у неё <s>неонка</s> <a href="https://www.olimex.com/Products/USB-Modules/Ethernet/USB-GIGABIT/resources/rtl8153.pdf">RTL8153</a><br><br>@embedoka
<br>
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">⭐ 1&nbsp;&nbsp;</span><span class="reaction">🤪 17&nbsp;&nbsp;</span><span class="reaction">👍 6&nbsp;&nbsp;</span><span class="reaction">😁 3&nbsp;&nbsp;</span><span class="reaction">🤯 2&nbsp;&nbsp;</span><span class="reaction">🌚 2&nbsp;&nbsp;</span><span class="reaction">🙏 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5251 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">07/06/25, 12:51:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1380</span><br><a href="tg://resolve?domain=embedoka&amp;post=1380">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1380">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -699,8 +652,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">💯 46&nbsp;&nbsp;</span><span class="reaction">🔥 9&nbsp;&nbsp;</span><span class="reaction">😁 8&nbsp;&nbsp;</span><span class="reaction">🤪 6&nbsp;&nbsp;</span><span class="reaction">✍ 5&nbsp;&nbsp;</span><span class="reaction">❤ 3&nbsp;&nbsp;</span><span class="reaction">🌚 2&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4589 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">06/06/25, 12:59:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1379</span><br><a href="tg://resolve?domain=embedoka&amp;post=1379">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1379">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1378/AgADxfoxG-1iEEo/61954e50" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -712,8 +664,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🔥 24&nbsp;&nbsp;</span><span class="reaction">🤪 16&nbsp;&nbsp;</span><span class="reaction">❤ 5&nbsp;&nbsp;</span><span class="reaction">😁 2&nbsp;&nbsp;</span><span class="reaction">🌚 2&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4082 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">05/06/25, 19:27:19</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1378</span><br><a href="tg://resolve?domain=embedoka&amp;post=1378">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1378">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1377/AgADfPIxG39dAAFK/3fa0417c" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -725,8 +676,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">👍 25&nbsp;&nbsp;</span><span class="reaction">🤣 11&nbsp;&nbsp;</span><span class="reaction">🔥 7&nbsp;&nbsp;</span><span class="reaction">🤯 3&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">😱 2&nbsp;&nbsp;</span><span class="reaction">🤪 2&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3665 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">04/06/25, 14:11:42</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1377</span><br><a href="tg://resolve?domain=embedoka&amp;post=1377">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1377">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -741,8 +691,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">❤ 27&nbsp;&nbsp;</span><span class="reaction">🔥 9&nbsp;&nbsp;</span><span class="reaction">🫡 6&nbsp;&nbsp;</span><span class="reaction">👍 4&nbsp;&nbsp;</span><span class="reaction">✍ 3&nbsp;&nbsp;</span><span class="reaction">🦄 3&nbsp;&nbsp;</span><span class="reaction">👏 1&nbsp;&nbsp;</span><span class="reaction">😁 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4320 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">30/05/25, 11:42:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1376</span><br><a href="tg://resolve?domain=embedoka&amp;post=1376">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1376">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -756,8 +705,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">✍ 1&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span><span class="reaction">🔥 1&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4130 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">28/05/25, 12:02:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1375</span><br><a href="tg://resolve?domain=embedoka&amp;post=1375">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1375">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -772,8 +720,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">👍 19&nbsp;&nbsp;</span><span class="reaction">🔥 8&nbsp;&nbsp;</span><span class="reaction">🤯 4&nbsp;&nbsp;</span><span class="reaction">❤ 3&nbsp;&nbsp;</span><span class="reaction">✍ 2&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4652 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">28/05/25, 12:01:03</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1374</span><br><a href="tg://resolve?domain=embedoka&amp;post=1374">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1374">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -788,8 +735,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🔥 25&nbsp;&nbsp;</span><span class="reaction">👍 11&nbsp;&nbsp;</span><span class="reaction">✍ 3&nbsp;&nbsp;</span><span class="reaction">💊 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">🤔 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3380 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">26/05/25, 09:37:37</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1373</span><br><a href="tg://resolve?domain=embedoka&amp;post=1373">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1373">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -804,8 +750,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">😁 64&nbsp;&nbsp;</span><span class="reaction">💯 13&nbsp;&nbsp;</span><span class="reaction">🔥 6&nbsp;&nbsp;</span><span class="reaction">✍ 2&nbsp;&nbsp;</span><span class="reaction">👍 2&nbsp;&nbsp;</span><span class="reaction">😱 2&nbsp;&nbsp;</span><span class="reaction">👎 1&nbsp;&nbsp;</span><span class="reaction">🤣 1&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3781 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">23/05/25, 09:39:19</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1372</span><br><a href="tg://resolve?domain=embedoka&amp;post=1372">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1372">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1370/AgAD9_IxGz_YeEk/8ceb6448" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -824,8 +769,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🔥 35&nbsp;&nbsp;</span><span class="reaction">👍 13&nbsp;&nbsp;</span><span class="reaction">👏 3&nbsp;&nbsp;</span><span class="reaction">🤔 3&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4838 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">22/05/25, 07:49:49</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1370</span><br><a href="tg://resolve?domain=embedoka&amp;post=1370">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1370">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1369/AgADou8xG7tzCEg/08ed14c1" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -837,8 +781,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">😁 55&nbsp;&nbsp;</span><span class="reaction">🤣 12&nbsp;&nbsp;</span><span class="reaction">👍 4&nbsp;&nbsp;</span><span class="reaction">🔥 4&nbsp;&nbsp;</span><span class="reaction">😭 4&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">🤯 2&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4782 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">16/05/25, 11:03:04</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1369</span><br><a href="tg://resolve?domain=embedoka&amp;post=1369">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1369">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
1️⃣ и 2️⃣: прям ностальгия по одному из предыдущих мест работ 🥰<br><br>PS: коллегам пламенный привет 🖤
<br>
@@ -846,8 +789,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🔥 12&nbsp;&nbsp;</span><span class="reaction">🤪 5&nbsp;&nbsp;</span><span class="reaction">🫡 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">😁 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4768 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">12/05/25, 06:53:56</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1368</span><br><a href="tg://resolve?domain=embedoka&amp;post=1368">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1368">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
два
<br>
@@ -855,8 +797,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🤣 14&nbsp;&nbsp;</span><span class="reaction">😁 3&nbsp;&nbsp;</span><span class="reaction">🤪 3&nbsp;&nbsp;</span><span class="reaction">🦄 2&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span><span class="reaction">🔥 1&nbsp;&nbsp;</span><span class="reaction">👏 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4794 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">12/05/25, 06:52:18</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1367</span><br><a href="tg://resolve?domain=embedoka&amp;post=1367">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1367">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
раз
<br>
@@ -864,8 +805,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🤪 9&nbsp;&nbsp;</span><span class="reaction">🤯 3&nbsp;&nbsp;</span><span class="reaction">🦄 2&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span><span class="reaction">👍 1&nbsp;&nbsp;</span><span class="reaction">🤔 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4842 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">12/05/25, 06:51:54</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1366</span><br><a href="tg://resolve?domain=embedoka&amp;post=1366">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1366">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1365/AgADpO8xG7tzCEg/2cb78505" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -877,8 +817,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">💯 68&nbsp;&nbsp;</span><span class="reaction">🤣 25&nbsp;&nbsp;</span><span class="reaction">👍 6&nbsp;&nbsp;</span><span class="reaction">😁 4&nbsp;&nbsp;</span><span class="reaction">✍ 2&nbsp;&nbsp;</span><span class="reaction">🤯 2&nbsp;&nbsp;</span><span class="reaction">🫡 2&nbsp;&nbsp;</span><span class="reaction">🦄 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5742 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">09/05/25, 10:45:08</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1365</span><br><a href="tg://resolve?domain=embedoka&amp;post=1365">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1365">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -893,16 +832,14 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🎉 43&nbsp;&nbsp;</span><span class="reaction">😁 22&nbsp;&nbsp;</span><span class="reaction">💯 5&nbsp;&nbsp;</span><span class="reaction">👏 4&nbsp;&nbsp;</span><span class="reaction">👍 3&nbsp;&nbsp;</span><span class="reaction">🫡 3&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">🦄 2&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4801 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">07/05/25, 06:19:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1364</span><br><a href="tg://resolve?domain=embedoka&amp;post=1364">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1364">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-poll">📊 Poll: Стоит ли выкладывать копии релевантных видео в канал (для участников, у которых ограничен доступ к ютьюб)? И вообще дублировать какой-либо контент в тг, доступ к которому может быть ограничен?<br>1. да<br>2. нет<br>3. всё равно<br>4. напишу в комментариях<br><br>→ Vote in Telegram 🔗<br></div>
</div><br></div>
<div class="message-footer"><br>
&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3822 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">05/05/25, 17:21:14</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1363</span><br><a href="tg://resolve?domain=embedoka&amp;post=1363">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1363">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image 🏷 poll </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/embedoka/1362/AgAD93cAApBjqEg/57742497" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -914,8 +851,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">⭐ 5&nbsp;&nbsp;</span><span class="reaction">🔥 11&nbsp;&nbsp;</span><span class="reaction">👍 4&nbsp;&nbsp;</span><span class="reaction">🤔 3&nbsp;&nbsp;</span><span class="reaction">✍ 2&nbsp;&nbsp;</span><span class="reaction">🤷‍♂ 1&nbsp;&nbsp;</span><span class="reaction">👎 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5478 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">02/05/25, 10:11:45</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1362</span><br><a href="tg://resolve?domain=embedoka&amp;post=1362">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1362">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1361/AgADbOkxG3lTgEg/62844987" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -927,8 +863,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">✍ 7&nbsp;&nbsp;</span><span class="reaction">🔥 7&nbsp;&nbsp;</span><span class="reaction">❤ 3&nbsp;&nbsp;</span><span class="reaction">🤪 3&nbsp;&nbsp;</span><span class="reaction">😁 2&nbsp;&nbsp;</span><span class="reaction">😱 2&nbsp;&nbsp;</span><span class="reaction">🦄 2&nbsp;&nbsp;</span><span class="reaction">🎉 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5031 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">29/04/25, 05:48:38</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1361</span><br><a href="tg://resolve?domain=embedoka&amp;post=1361">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1361">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from Aleksei ---</div>
<br>
@@ -944,8 +879,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">👍 3&nbsp;&nbsp;</span><span class="reaction">✍ 2&nbsp;&nbsp;</span><span class="reaction">🤔 1&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4984 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">23/04/25, 10:48:38</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1360</span><br><a href="tg://resolve?domain=embedoka&amp;post=1360">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1360">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/parasiticresistance">Паразитное сопротивление (@parasiticresistance)</a> ---</div>
<br>
@@ -961,8 +895,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🔥 10&nbsp;&nbsp;</span><span class="reaction">✍ 3&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">👍 2&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4143 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">23/04/25, 10:48:29</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1359</span><br><a href="tg://resolve?domain=embedoka&amp;post=1359">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1359">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1357/AgADBnQAAsdHMEg/df92faa1" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -974,8 +907,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">⭐ 10&nbsp;&nbsp;</span><span class="reaction">❤ 12&nbsp;&nbsp;</span><span class="reaction">🔥 7&nbsp;&nbsp;</span><span class="reaction">👍 3&nbsp;&nbsp;</span><span class="reaction">🌚 2&nbsp;&nbsp;</span><span class="reaction">🦄 2&nbsp;&nbsp;</span><span class="reaction">💊 2&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4110 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">21/04/25, 11:31:58</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1357</span><br><a href="tg://resolve?domain=embedoka&amp;post=1357">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1357">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1356/AgADReoxG5rsuEs/0976c6cb" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -987,8 +919,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🤣 66&nbsp;&nbsp;</span><span class="reaction">😭 17&nbsp;&nbsp;</span><span class="reaction">👍 6&nbsp;&nbsp;</span><span class="reaction">💯 4&nbsp;&nbsp;</span><span class="reaction">🫡 3&nbsp;&nbsp;</span><span class="reaction">🤪 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">😁 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5361 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">18/04/25, 11:24:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1356</span><br><a href="tg://resolve?domain=embedoka&amp;post=1356">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1356">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1355/AgADjO8xG7tzCEg/96e8ba13" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -1000,8 +931,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">👍 35&nbsp;&nbsp;</span><span class="reaction">🤯 11&nbsp;&nbsp;</span><span class="reaction">💯 10&nbsp;&nbsp;</span><span class="reaction">❤ 4&nbsp;&nbsp;</span><span class="reaction">✍ 2&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3888 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">17/04/25, 18:21:37</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1355</span><br><a href="tg://resolve?domain=embedoka&amp;post=1355">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1355">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -1016,8 +946,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">👍 27&nbsp;&nbsp;</span><span class="reaction">🤯 8&nbsp;&nbsp;</span><span class="reaction">❤ 4&nbsp;&nbsp;</span><span class="reaction">🔥 4&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4441 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/04/25, 09:36:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1354</span><br><a href="tg://resolve?domain=embedoka&amp;post=1354">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1354">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1353/AgAD0uwxG49X4Es/8755cf18" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -1029,8 +958,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">⭐ 51&nbsp;&nbsp;</span><span class="reaction">👏 12&nbsp;&nbsp;</span><span class="reaction">🤔 6&nbsp;&nbsp;</span><span class="reaction">✍ 4&nbsp;&nbsp;</span><span class="reaction">👍 4&nbsp;&nbsp;</span><span class="reaction">🫡 3&nbsp;&nbsp;</span><span class="reaction">🔥 2&nbsp;&nbsp;</span><span class="reaction">😈 2&nbsp;&nbsp;</span><span class="reaction">💯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4125 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">13/04/25, 16:46:03</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1353</span><br><a href="tg://resolve?domain=embedoka&amp;post=1353">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1353">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
А вы знали что если к названию вакансии "Senior С/C++ Developer" добавить "embedded" то вилка по з/п сразу уменьшается в 2 раза (c) hold3r
<br>
@@ -1038,8 +966,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🤣 85&nbsp;&nbsp;</span><span class="reaction">😭 42&nbsp;&nbsp;</span><span class="reaction">💯 18&nbsp;&nbsp;</span><span class="reaction">✍ 4&nbsp;&nbsp;</span><span class="reaction">👍 2&nbsp;&nbsp;</span><span class="reaction">🔥 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span><span class="reaction">😱 1&nbsp;&nbsp;</span><span class="reaction">🤪 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">7298 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">11/04/25, 09:53:15</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1352</span><br><a href="tg://resolve?domain=embedoka&amp;post=1352">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1352">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1350/AgADPeoxG5rsuEs/29272d5a" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -1058,8 +985,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🤯 11&nbsp;&nbsp;</span><span class="reaction">🤔 5&nbsp;&nbsp;</span><span class="reaction">🤷‍♂ 2&nbsp;&nbsp;</span><span class="reaction">👍 2&nbsp;&nbsp;</span><span class="reaction">🌚 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4720 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">10/04/25, 08:45:12</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1350</span><br><a href="tg://resolve?domain=embedoka&amp;post=1350">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1350">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1349/AgAD8vMxG5rssEs/26e59d01" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -1071,8 +997,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">⭐ 4&nbsp;&nbsp;</span><span class="reaction">👍 22&nbsp;&nbsp;</span><span class="reaction">🔥 7&nbsp;&nbsp;</span><span class="reaction">💊 6&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">🤔 2&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4133 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">09/04/25, 19:37:09</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1349</span><br><a href="tg://resolve?domain=embedoka&amp;post=1349">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1349">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1348/AgADQPExG-UNoEo/27cbdbef" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -1084,8 +1009,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🤪 26&nbsp;&nbsp;</span><span class="reaction">💯 14&nbsp;&nbsp;</span><span class="reaction">🔥 12&nbsp;&nbsp;</span><span class="reaction">🤣 4&nbsp;&nbsp;</span><span class="reaction">❤ 2&nbsp;&nbsp;</span><span class="reaction">😭 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4861 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/03/25, 12:34:13</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1348</span><br><a href="tg://resolve?domain=embedoka&amp;post=1348">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1348">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from асоциальный пикотранзистор ᶘಠᴥಠᶅ ---</div>
<br>
@@ -1097,9 +1021,8 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">✍ 6&nbsp;&nbsp;</span><span class="reaction">👍 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">💊 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4876 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">13/03/25, 17:42:49</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1347</span><br><a href="tg://resolve?domain=embedoka&amp;post=1347">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1347">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link </div></div>
<br><div class="message-flags"> 🏷 fwd 🏷 link </div></div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/kitnerlive">kitnerlive (@kitnerlive)</a> ---</div>
<br>
@@ -1114,8 +1037,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">👍 49&nbsp;&nbsp;</span><span class="reaction">✍ 21&nbsp;&nbsp;</span><span class="reaction">🔥 10&nbsp;&nbsp;</span><span class="reaction">❤ 4&nbsp;&nbsp;</span><span class="reaction">🫡 2&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4550 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">13/03/25, 17:28:29</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1346</span><br><a href="tg://resolve?domain=embedoka&amp;post=1346">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1346">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -1130,8 +1052,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">😁 43&nbsp;&nbsp;</span><span class="reaction">❤ 9&nbsp;&nbsp;</span><span class="reaction">🔥 7&nbsp;&nbsp;</span><span class="reaction">🎉 2&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4861 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">07/03/25, 11:19:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1345</span><br><a href="tg://resolve?domain=embedoka&amp;post=1345">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1345">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1341/AgADy-kxG7WDUEo/edd29994" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -1164,8 +1085,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">⭐ 2&nbsp;&nbsp;</span><span class="reaction">❤ 41&nbsp;&nbsp;</span><span class="reaction">🔥 10&nbsp;&nbsp;</span><span class="reaction">😭 7&nbsp;&nbsp;</span><span class="reaction">🤪 4&nbsp;&nbsp;</span><span class="reaction">👍 3&nbsp;&nbsp;</span><span class="reaction">🎉 2&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span><span class="reaction">🦄 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4253 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">06/03/25, 18:05:55</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1341</span><br><a href="tg://resolve?domain=embedoka&amp;post=1341">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1341">Open in Web</a>
<br><div class="message-flags"> 🏷 mention 🏷 link 🏷 merged </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<b>DIY rule #43</b>:<br><br>
На каждую хотелку самодельщика-энтузиаста найдётся готовое решение в интегральном исполнении из Поднебесной.<br><br>По мотивам<a href="https://t.me/embedoka/383"> мема про могущественный китайский чип</a> и блестящих примеров исполнения за &quot;1 рубль&quot;:<br><br>▫️<a href="https://t.me/embedoka/654">BLE-UART</a><br>▫️<a href="https://t.me/embedoka/422">BLE-CAN</a><br><br><b>А теперь вопрос знатокам</b>:<br><br>На рынке есть такие решения, которые позволяют управлять режимами работы девайса последовательностями включения, например, реальный кейс: освещение, в зависимости от порядкового номера включения выбирается тот или иной канал/режим:<br>1️⃣ включение: канал/режим 1<br>2️⃣ включение: канал/режим 2<br>3️⃣ включение: канал/режим 3<br><br>(порядковый номер включения - это сколько щёлканий тумблером было в течении 15секунд, например, если прошло больше времени, то FSM автоматически сбрабывается в начальное состояние и следующее включение будет считаться 1️⃣ым)<br><br>Т.е. по факту некое многоканальное "реле" с управлением через последовательность вкл/выкл подачи питания.<br><br>❓Кому-нибудь попадались подобные чипы/модули, которые такое умеют "из коробки"?<br><br>@embedoka
@@ -1174,8 +1094,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">👍 4&nbsp;&nbsp;</span><span class="reaction">✍ 1&nbsp;&nbsp;</span><span class="reaction">🔥 1&nbsp;&nbsp;</span><span class="reaction">🤔 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4737 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">04/03/25, 09:55:07</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1340</span><br><a href="tg://resolve?domain=embedoka&amp;post=1340">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1340">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/embedoka">Embedded Doka (@embedoka)</a> ---</div>
<br>
@@ -1189,8 +1108,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🔥 22&nbsp;&nbsp;</span><span class="reaction">👍 5&nbsp;&nbsp;</span><span class="reaction">✍ 2&nbsp;&nbsp;</span><span class="reaction">🤣 2&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">3468 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">03/03/25, 19:36:39</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1339</span><br><a href="tg://resolve?domain=embedoka&amp;post=1339">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1339">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/embedoka/1338/AgADEGgAAp2xwUk/b005edd7" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -1202,8 +1120,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<div class="message-footer"><br>
<span class="reaction">🔥 42&nbsp;&nbsp;</span><span class="reaction">👍 7&nbsp;&nbsp;</span><span class="reaction">🤔 3&nbsp;&nbsp;</span><span class="reaction">✍ 2&nbsp;&nbsp;</span><span class="reaction">🎉 2&nbsp;&nbsp;</span><span class="reaction">🦄 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">🤣 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4896 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">21/02/25, 13:26:06</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1338</span><br><a href="tg://resolve?domain=embedoka&amp;post=1338">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1338">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/embedoka/1337/AgADd_MxGzkVoEk/ae181d28" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -1214,4 +1131,4 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">👍 6&nbsp;&nbsp;</span><span class="reaction">✍ 2&nbsp;&nbsp;</span><span class="reaction">❤ 1&nbsp;&nbsp;</span><span class="reaction">🤯 1&nbsp;&nbsp;</span><span class="reaction">🫡 1&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">4319 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">18/02/25, 18:22:24</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#1337</span><br><a href="tg://resolve?domain=embedoka&amp;post=1337">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/embedoka/1337">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div></div>
<br><div class="message-flags"> 🏷 link 🏷 mention </div></div>
+6 -6
View File
@@ -732,7 +732,7 @@
<img src="http://test.example.com/media/embedoka/1380/AgADvPIxG_ZGIUo/a9e857b4" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
</div>
<br>
Если <a href="https://t.me/embedoka/1334">предыдущий адаптер</a> был прям &quot;находкой&quot;, то вот идея не столь однозначного адаптера: можно назвать это 1000 и 1 способ выломать RJ-45 к чертям 😈<br><br>А внутри у неё неонка <a href="https://www.olimex.com/Products/USB-Modules/Ethernet/USB-GIGABIT/resources/rtl8153.pdf">RTL8153</a><br><br>@embedoka
Если <a href="https://t.me/embedoka/1334">предыдущий адаптер</a> был прям &quot;находкой&quot;, то вот идея не столь однозначного адаптера: можно назвать это 1000 и 1 способ выломать RJ-45 к чертям 😈<br><br>А внутри у неё <s>неонка</s> <a href="https://www.olimex.com/Products/USB-Modules/Ethernet/USB-GIGABIT/resources/rtl8153.pdf">RTL8153</a><br><br>@embedoka
<br>
</div><br></div>
<div class="message-footer"><br>
@@ -751,7 +751,7 @@
</div>
<br>
The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series modules. Customers using NVIDIA Jetson-based products <b>can seamlessly replace</b> the original module with SM9 without hardware development efforts— simply unplug the NVIDIA module, plug in SM9, and complete hardware integration. <br><br>Ай-да китайцы, ай-да молодцы. Правильной дорогой идут, нефиг Nvidia булки расслаблять 😅<br><br>Понятно, что вопрос поддержки компиляторов и вот это всё тоже немаловажен, но DeepSeek R1 distilled 7B and 1.5B на ней уже запустили и <a href="https://sophon.ai/post/439.html">отбенчмарками</a> (скрин в коментах).<br><br>Кстати-кстати, это не просто рандомный китайский стартап, а перелицованный старый добрый Bitmain - мировой лидер в разработке и производстве чипов для майнинга крипты (и AI темой они начали заниматься еще в эпоху криптолихорадки - в общем, всегда держат руку на пульсе).<br><br>@embedoka
The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series modules. Customers using NVIDIA Jetson-based products <b>can seamlessly replace</b> the original module with SM9 without hardware development efforts— simply unplug the NVIDIA module, plug in SM9, and complete hardware integration. <br><br>Ай-да китайцы, ай-да молодцы. Правильной дорогой идут, нефиг Nvidia булки расслаблять 😅<br><br>Понятно, что вопрос поддержки компиляторов и вот это всё тоже немаловажен, но DeepSeek R1 distilled 7B and 1.5B на ней уже запустили и <a href="https://sophon.ai/post/439.html">отбенчмарками</a> (скрин в коментах).<br><br>Кстати-кстати, это не просто рандомный китайский стартап, а <s>перелицованный</s> старый добрый Bitmain - мировой лидер в разработке и производстве чипов для майнинга крипты (и AI темой они начали заниматься еще в эпоху криптолихорадки - в общем, всегда держат руку на пульсе).<br><br>@embedoka
<br>
</div><br></div>
<div class="message-footer"><br>
@@ -784,7 +784,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<description>В электронике тоже есть своё правило№34: На любую вашу хотелку существует готовая реализация в интегральном исполнении (с) Doka 😅 Правило#35: если нет микросхемы, перепроверь еще раз у китайцев Правило#36: всегда существует еще более тупая дешевая дискретная реализация нужного функционала из говна и палок на рассыпухе Правило#37: рассыпуха под рукой всегда будет не той мощности, которая нужна в данный момент, поэтому TO-3 балласт будет соседствовать с 0201 Правило#38: Всегда существует реализация которая займет больше времени на разработку и отладку и вы выберете именно ее Правило#39: [Если вы не китаец, то] что бы вы не делали у китайцев этот же функционал реализован проще @embedoka</description>
<content:encoded><![CDATA[<div class="message-body"><div class="post">
В электронике тоже есть своё <a href="https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE_34">правило№34</a>:<br>
На любую вашу хотелку существует готовая реализация в интегральном исполнении (с) Doka 😅<br><br><b>Правило#35</b>: если нет микросхемы, перепроверь еще раз у китайцев <br><br><b>Правило#36</b>: всегда существует еще более тупая дешевая дискретная реализация нужного функционала из говна и палок на рассыпухе<br><br><b>Правило#37</b>: рассыпуха под рукой всегда будет не той мощности, которая нужна в данный момент, поэтому <a href="https://en.wikipedia.org/wiki/TO-3">TO-3</a> балласт будет соседствовать с 0201 <br><br><b>Правило#38</b>: Всегда существует реализация которая займет больше времени на разработку и отладку и вы выберете именно ее<br><b><br>Правило#39</b>: [Если вы не китаец, то] что бы вы не делали у китайцев этот же функционал реализован проще<br><br>@embedoka
На любую вашу хотелку существует готовая реализация в интегральном исполнении (с) Doka 😅<br><br><b>Правило#35</b>: если нет микросхемы, перепроверь еще раз у китайцев <br><br><b>Правило#36</b>: всегда существует еще более <s>тупая</s> дешевая дискретная реализация нужного функционала <s>из говна и палок</s> на рассыпухе<br><br><b>Правило#37</b>: рассыпуха под рукой всегда будет не той мощности, которая нужна в данный момент, поэтому <a href="https://en.wikipedia.org/wiki/TO-3">TO-3</a> балласт будет соседствовать с 0201 <br><br><b>Правило#38</b>: Всегда существует реализация которая займет больше времени на разработку и отладку и вы выберете именно ее<br><b><br>Правило#39</b>: [Если вы не китаец, то] что бы вы не делали у китайцев этот же функционал реализован проще<br><br>@embedoka
<br>
</div><br></div>
<div class="message-footer"><br>
@@ -857,7 +857,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<img src="http://test.example.com/media/embedoka/1388/AgADC_kxG0xOKUg/42b2fd35" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
</div>
<br>
Наконец-то что-то дельное про нишевый микро-бизнес в эмбеддед за последние годы <a href="https://habr.com/ru/companies/moysklad/articles/931072/">прочёл</a>. А не про эти ваши диктофоны с телесисек, которым 100 лет в обед и которые уже всем в смартфон не впились (остались нишевые применения, но они сильно завязаны на гос.регуляторику).<br><br>TLDR: Чел из Омска разработал и теперь производит платы-&quot;обманки&quot; для уменьшения костов дорогостоящего ремонта холодильника. Маркетплейсы душат комиссией, но на хлеб с маслом хватает (в масштабах выпро-живания в миллионнике).<br><br>PS: если кому-то попадалось схожее чтиво (да еще и с юнит-экономикой) - кидайте в коменты 🙏<br><br>@embedoka
Наконец-то что-то дельное про нишевый микро-бизнес в эмбеддед за последние годы <a href="https://habr.com/ru/companies/moysklad/articles/931072/">прочёл</a>. А не про эти ваши диктофоны с телесисек, которым 100 лет в обед и которые уже всем в смартфон не впились (остались нишевые применения, но они сильно завязаны на гос.регуляторику).<br><br>TLDR: Чел из Омска разработал и теперь производит платы-&quot;обманки&quot; для уменьшения костов дорогостоящего ремонта холодильника. Маркетплейсы душат комиссией, но на хлеб с маслом хватает (в масштабах <s>вы</s>про-живания в миллионнике).<br><br>PS: если кому-то попадалось схожее чтиво (да еще и с юнит-экономикой) - кидайте в коменты 🙏<br><br>@embedoka
<br>
</div><br></div>
<div class="message-footer"><br>
@@ -999,7 +999,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<link>https://t.me/embedoka/1396</link>
<description>640 КБ хватит всем</description>
<content:encoded><![CDATA[<div class="message-body"><div class="post">
640 КБ хватит всем
<s>640 КБ хватит всем</s>
<br>
</div><br></div>
<div class="message-footer"><br>
@@ -1416,7 +1416,7 @@ The SM9 module boasts <b>hardware compatibility</b> with NVIDIA Jetson series mo
<video controls src="http://test.example.com/media/embedoka/1424/AgADW4oAAnlTuUg/ce36e0bb" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
</div>
<br>
<b>Невероятно, но rust </b>🤯<br><br><b>Topola PCB</b> - роутер и автороутер печатных плат, написанный на расте. Проект в активной фазе развития, судя по локализации пилят его наши восточные соседи разрабатывается на европейские деньги (грант известной <a href="https://t.me/vlsihub/586">NLnet</a>). Что интересно: название перекликается с отечественным продуктом из 2000х с аналогичным функционалом 😅<br><br>🔗 <a href="https://topola.dev/" target="_blank">https://topola.dev/</a><br>🐱 <a href="https://codeberg.org/topola/topola" target="_blank">https://codeberg.org/topola/topola</a><br><br>PS: Есть даже <a href="https://topola.dev/app/">веб-версия</a>, а вот поддерживаемых форматов я не нашёл нигде 🤓<br><br>@embedoka
<b>Невероятно, но rust </b>🤯<br><br><b>Topola PCB</b> - роутер и автороутер печатных плат, написанный на расте. Проект в активной фазе развития, судя по локализации <s>пилят его наши восточные соседи</s> разрабатывается на европейские деньги (грант известной <a href="https://t.me/vlsihub/586">NLnet</a>). Что интересно: название перекликается с отечественным продуктом из 2000х с аналогичным функционалом 😅<br><br>🔗 <a href="https://topola.dev/" target="_blank">https://topola.dev/</a><br>🐱 <a href="https://codeberg.org/topola/topola" target="_blank">https://codeberg.org/topola/topola</a><br><br>PS: Есть даже <a href="https://topola.dev/app/">веб-версия</a>, а вот поддерживаемых форматов я не нашёл нигде 🤓<br><br>@embedoka
<br>
</div><br></div>
<div class="message-footer"><br>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+88 -176
View File
@@ -7,8 +7,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 211&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">5491 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">01/04/26, 12:43:55</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3582</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3582">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3582">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
мяу :3
<br>
@@ -16,8 +15,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 542&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">15028 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">01/11/25, 19:42:48</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3581</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3581">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3581">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
мяу ^_^
<br>
@@ -25,8 +23,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 630&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">35541 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">19/08/24, 12:08:59</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3580</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3580">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3580">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3579/AgADLNYxG-iNQUs/9b70d501" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -36,8 +33,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 410&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">72311 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">05/03/24, 17:38:57</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3579</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3579">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3579">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
Про сломанный @nowplaybot написала тут — <a href="https://t.me/nowplaylogs/28" target="_blank">https://t.me/nowplaylogs/28</a><br>Соррян!
<br>
@@ -45,8 +41,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 132&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">49663 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">29/02/24, 13:55:10</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3578</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3578">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3578">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from anna ---</div>
<br>
@@ -59,8 +54,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 308&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">51300 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">31/12/23, 22:28:04</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3577</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3577">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3577">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 video 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3576/AgADTNkxG0h3kUg/20de0828" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -72,8 +66,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 270&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">43730 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">31/12/23, 22:27:44</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3576</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3576">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3576">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/theyforcedme/3575/AgADiy4AArqwMEo/8dd01d1e" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -85,8 +78,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 136&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">46466 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">29/07/23, 20:05:51</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3575</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3575">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3575">Open in Web</a>
<br><div class="message-flags"> 🏷 video 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3574/AgADzcYxG5DrAAFJ/abbb2d3a" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -96,8 +88,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 194&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">48312 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">01/07/23, 08:29:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3574</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3574">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3574">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/tikcock">аня лайкнула тикток (@tikcock)</a> ---</div>
<br>
@@ -110,8 +101,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 138&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">42534 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">27/05/23, 12:08:43</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3573</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3573">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3573">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 video 🏷 link 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<audio controls style="width:100%; max-width:400px;"><source src="http://test.example.com/media/theyforcedme/3572/AgADiAkAAmILkEs/8ed3b88a" type="audio/mpeg"></audio>
@@ -124,8 +114,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 29&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">36433 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">20/05/23, 00:28:33</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3572</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3572">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3572">Open in Web</a>
<br><div class="message-flags"> 🏷 audio 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
новеньким кликать вот сюда ^^
<br>
@@ -133,8 +122,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 45&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">33634 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">18/05/23, 11:43:28</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3571</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3571">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3571">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/comp9503">9503 (@comp9503)</a> ---</div>
<br>
@@ -149,8 +137,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 69&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">32998 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">18/05/23, 11:33:48</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3570</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3570">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3570">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3569/AgAD2SgAApSZiUo/6a80bab3" alt="Sticker 👨‍❤️‍💋‍👨" style="max-width:100%;width:auto; height:auto; max-height:200px; object-fit:contain;">
@@ -160,8 +147,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 35&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">30096 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/05/23, 15:51:59</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3569</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3569">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3569">Open in Web</a>
<br><div class="message-flags"> 🏷 sticker 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/theyforcedme/3568/AgADeSoAAo-VuUo/07444e33" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -173,8 +159,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 46&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">31506 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">07/05/23, 16:45:27</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3568</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3568">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3568">Open in Web</a>
<br><div class="message-flags"> 🏷 video 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3567/AgAD884xG0O6uEo/80eb2a2c" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -184,8 +169,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 22&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">30060 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">06/05/23, 21:03:58</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3567</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3567">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3567">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
</div>
@@ -196,8 +180,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 43&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">34055 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">25/04/23, 19:32:13</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3565</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3565">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3565">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/theyforcedme/3564/AgAD9hAAAr1IIVI/69b0f18c" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -207,8 +190,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 76&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">31224 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">22/04/23, 17:29:05</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3564</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3564">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3564">Open in Web</a>
<br><div class="message-flags"> 🏷 video 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3563/AgADss4xG1tl-Ek/696a7cb3" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -220,8 +202,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 106&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">27794 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">18/04/23, 18:22:39</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3563</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3563">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3563">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3562/AgAD6ccxG1tl8Ek/9298131b" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -231,8 +212,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 123&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">26348 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">18/04/23, 10:30:52</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3562</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3562">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3562">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<audio controls style="width:100%; max-width:400px;"><source src="http://test.example.com/media/theyforcedme/3559/AgADKCsAAkCK6Uk/0c96fad0" type="audio/ogg"></audio>
@@ -256,8 +236,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 64&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">24432 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">17/04/23, 17:13:03</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3561</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3561">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3561">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 audio 🏷 no_image 🏷 merged </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<audio controls style="width:100%; max-width:400px;"><source src="http://test.example.com/media/theyforcedme/3558/AgADZTMAAhpq8Ek/139a2bc6" type="audio/ogg"></audio>
@@ -268,8 +247,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 79&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">17797 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">17/04/23, 16:46:09</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3558</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3558">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3558">Open in Web</a>
<br><div class="message-flags"> 🏷 audio 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3557/AgADmckxGwn6yEk/b660c91f" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -281,8 +259,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 151&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">19265 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/04/23, 12:20:52</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3557</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3557">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3557">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/neuralmeduza">Neural Meduza (@neuralmeduza)</a> ---</div>
<br>
@@ -293,8 +270,7 @@
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 65&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">16696 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">12/04/23, 13:00:13</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3556</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3556">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3556">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 no_image 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3555/AgAD5MYxG8W5uEk/b83af47c" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -306,8 +282,7 @@ Grammarly, ты очень хорошо корректируешь имейлы,
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 214&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">18532 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">12/04/23, 11:30:16</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3555</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3555">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3555">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3554/AgADVc0xG9vQqEk/13f542b2" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -319,8 +294,7 @@ Grammarly, ты очень хорошо корректируешь имейлы,
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 207&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">19095 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">11/04/23, 19:32:14</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3554</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3554">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3554">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
</div>
@@ -331,8 +305,7 @@ Grammarly, ты очень хорошо корректируешь имейлы,
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 114&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">17369 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">09/04/23, 17:29:06</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3553</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3553">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3553">Open in Web</a>
<br><div class="message-flags"> 🏷 only_link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/pisscorner">Sneaky’s Piss Corner (@pisscorner)</a> ---</div>
<br>
@@ -372,8 +345,7 @@ growing up is overrated!!<br><br>my girlfriends prepared an easter egg hunt for
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 74&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">11150 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">09/04/23, 14:06:27</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3549</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3549">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3549">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 mention 🏷 no_image 🏷 merged 🏷 fwd 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3547/AgADrckxG4theUk/e5cc86b1" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -392,8 +364,7 @@ growing up is overrated!!<br><br>my girlfriends prepared an easter egg hunt for
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 124&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">14050 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">06/04/23, 15:23:50</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3547</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3547">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3547">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 merged </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3546/AgADp8kxG4theUk/cc8f626b" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -405,8 +376,7 @@ growing up is overrated!!<br><br>my girlfriends prepared an easter egg hunt for
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 274&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">16651 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">06/04/23, 15:16:58</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3546</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3546">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3546">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
Почему у всех приложений карт такой отвратительный UX? Apple Maps, Google Maps. Всякие относительно малоизвестные томтомы и подобное туда же, порой даже хуже.<br><br>Буквально каждый раз раздражение пробирает, когда пытаюсь при уже построенном маршруте потыкать по точкам в гугл картах и добавить их в маршрут. Приложение ведет себя абсолютно непредсказуемо, меняет поведение в зависимости от количества точек в маршруте.<br><br>Именно в такие моменты я чувствую себя беспомощной и отставшей от современных технологий.
<br>
@@ -414,8 +384,7 @@ growing up is overrated!!<br><br>my girlfriends prepared an easter egg hunt for
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 117&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">11038 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">05/04/23, 12:56:43</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3545</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3545">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3545">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/theyforcedme/3544/AgADKy4AAt1VYEk/831ca2de" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -425,8 +394,7 @@ growing up is overrated!!<br><br>my girlfriends prepared an easter egg hunt for
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 47&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10327 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">04/04/23, 20:37:04</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3544</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3544">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3544">Open in Web</a>
<br><div class="message-flags"> 🏷 video 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
Читаю новости с родины. Просто взрыв мозга какой-то 🤯
<br>
@@ -434,8 +402,7 @@ growing up is overrated!!<br><br>my girlfriends prepared an easter egg hunt for
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 83&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">11613 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">02/04/23, 22:10:19</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3543</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3543">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3543">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3542/AgADV8wxGyvgUEk/0095d97e" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -445,8 +412,7 @@ growing up is overrated!!<br><br>my girlfriends prepared an easter egg hunt for
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 40&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">11956 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">02/04/23, 21:55:20</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3542</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3542">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3542">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/theyforcedme/3541/AgADtysAAvw5UUk/23bf25cd" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -456,8 +422,7 @@ growing up is overrated!!<br><br>my girlfriends prepared an easter egg hunt for
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 53&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">11150 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">02/04/23, 17:18:10</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3541</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3541">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3541">Open in Web</a>
<br><div class="message-flags"> 🏷 video 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<audio controls style="width:100%; max-width:400px;"><source src="http://test.example.com/media/theyforcedme/3540/AgADEDAAAs_hQUk/ad854e01" type="audio/ogg"></audio>
@@ -468,8 +433,7 @@ growing up is overrated!!<br><br>my girlfriends prepared an easter egg hunt for
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 95&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">12000 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">01/04/23, 15:44:49</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3540</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3540">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3540">Open in Web</a>
<br><div class="message-flags"> 🏷 audio 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from Astra’s thots! ---</div>
<br>
@@ -484,8 +448,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 110&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10156 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">31/03/23, 15:39:14</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3539</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3539">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3539">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
Как же порой мучительно трудно отвечать на сообщения и письма 🥺💀
<br>
@@ -493,8 +456,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 78&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">9679 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">31/03/23, 13:45:23</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3538</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3538">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3538">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3537/AgADh8IxGzQQOUk/90a70ecc" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -506,8 +468,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 179&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">9908 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">31/03/23, 10:23:40</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3537</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3537">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3537">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/theyforcedme/3536/AgAD8CcAAkgSMEk/b5b829a6" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -517,8 +478,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 42&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10185 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">30/03/23, 13:49:04</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3536</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3536">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3536">Open in Web</a>
<br><div class="message-flags"> 🏷 video 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
Я еще с начала войны забила на японский, потому что все жизненные приоритеты и планы перевернулись вверх дном, но до сих пор дико скучаю. Особенно, по урокам с Саори 😔<br><br>Поучитесь там за меня что ли, вам понравится. Расскажите потом. А мне ещё нидерландский зубрить
<br>
@@ -526,8 +486,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 59&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">9549 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">29/03/23, 13:26:32</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3535</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3535">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3535">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/japanaide">Monogatari Notes🐍 (@japanaide)</a> ---</div>
<br>
@@ -542,8 +501,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 29&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">9137 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">29/03/23, 13:23:49</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3534</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3534">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3534">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3533/AgADJskxGzMaEEk/964dcc88" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -555,8 +513,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 111&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">13284 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">27/03/23, 19:06:22</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3533</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3533">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3533">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
</div>
@@ -567,8 +524,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 63&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10845 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">25/03/23, 20:22:02</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3532</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3532">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3532">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3531/AgADVsoxG6eY-Ug/fb5f905c" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -578,8 +534,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 108&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10611 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">25/03/23, 15:46:43</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3531</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3531">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3531">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3530/AgADdMcxG07p2Ug/aad22e3f" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -591,16 +546,14 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 69&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">11555 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">22/03/23, 16:45:35</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3530</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3530">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3530">Open in Web</a>
<br><div class="message-flags"> 🏷 only_link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-poll">📊 Poll: Бизнес-партнёр прислал вам вежливое формальное письмо, явно написанное ChatGPT. Полезную нагрузку письмо исправно несёт. Вы оскорбитесь?<br>1. Да, это неуважение<br>2. Нет, крутая оптимизация<br>3. Я предпочитаю короткие письма с фактами и без воды<br>4. Я не умею отличать ChatGPT от человека<br><br>→ Vote in Telegram 🔗<br></div>
</div><br></div>
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 19&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">13929 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">16/03/23, 23:36:52</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3529</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3529">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3529">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image 🏷 poll </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3528/AgADA8gxG0hScEg/2294c29a" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -612,8 +565,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 124&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">14232 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">12/03/23, 11:23:08</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3528</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3528">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3528">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3527/AgADxssxG0SUOEg/194bcdcc" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -625,8 +577,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 96&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">12439 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">07/03/23, 13:35:57</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3527</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3527">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3527">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3526/AgADRMkxG1z0EEg/5c8aaa28" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -638,8 +589,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 122&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">19892 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">03/03/23, 21:04:12</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3526</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3526">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3526">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
Однажды житель Барнаула проснулся, увидел в интернете слово black, и придумал шутку, обыгрывающую хоть что-то, кроме чернокожих, и мир схлопнулся 😱
<br>
@@ -647,8 +597,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 59&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">11650 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">01/03/23, 17:41:59</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3525</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3525">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3525">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3522/AgAD3McxG98X-Es/deabd278" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -674,8 +623,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 66&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10014 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">01/03/23, 17:04:18</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3522</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3522">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3522">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 merged </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
В общем, коллективный разум постановил: если скачивать через Game Pass и не переворачивать консервы, то играть, вроде как, можно, но осторожно.
<br>
@@ -683,8 +631,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 47&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">9043 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">01/03/23, 13:36:26</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3521</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3521">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3521">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3520/AgADrMYxG98X-Es/3c608e10" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -696,8 +643,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 80&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">8833 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">01/03/23, 13:10:59</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3520</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3520">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3520">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3519/AgADddYxG98X8Es/2e4e9997" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -709,8 +655,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 104&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">9597 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">28/02/23, 22:30:59</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3519</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3519">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3519">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3518/AgAD2dMxG98X8Es/95d8a51f" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -722,8 +667,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 116&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">8984 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">28/02/23, 12:33:15</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3518</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3518">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3518">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3517/AgADiMkxG3aD6Es/893e60c4" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -733,8 +677,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 106&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10300 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">27/02/23, 20:00:43</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3517</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3517">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3517">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/theyforcedme/3516/AgADtAMAAkNTvFM/6a07023a" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -744,8 +687,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 39&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">12169 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">23/02/23, 15:11:18</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3516</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3516">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3516">Open in Web</a>
<br><div class="message-flags"> 🏷 video 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3515/AgADMMYxG14LuUs/ad90226a" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -757,8 +699,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 86&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">11289 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">22/02/23, 18:36:27</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3515</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3515">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3515">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3514/AgADecUxG-eSiEs/662b946d" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -770,8 +711,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 147&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">16217 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">18/02/23, 20:08:29</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3514</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3514">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3514">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3513/AgADlcIxG8dueEs/35737cf3" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -781,8 +721,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 70&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">12490 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">16/02/23, 22:43:30</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3513</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3513">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3513">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3512/AgADO8cxG9EIaEs/81b649c9" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -794,8 +733,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 101&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">12330 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">15/02/23, 20:52:30</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3512</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3512">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3512">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3511/AgADscUxG9EIaEs/beb99354" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -807,8 +745,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 76&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10675 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">15/02/23, 15:57:47</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3511</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3511">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3511">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3510/AgADuMcxGxzIWEs/7f22d920" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -820,8 +757,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 41&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">9245 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/02/23, 16:57:20</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3510</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3510">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3510">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3509/AgADtccxGxzIWEs/28cb7623" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -833,8 +769,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 58&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">8950 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/02/23, 16:53:30</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3509</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3509">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3509">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
Как правильно диагностировать проблемы с интернетом?<br><br>У меня симметричный полнодуплексный гигабитный канал (FTTH).<br>Есть основной роутер, Keenetic Ultra, и две дополнительные точки Keenetic Speedster для остальных этажей, подключенные к основному по Ethernet.<br>Задействован роуминг 802.11k/v/r для быстрого переключения между точками.<br>Клиенты используют основной роутер в качестве DNS, а тот переадресовывает запросы к 1.1.1.1.<br><br>Любая попытка измерить скорость всегда показывает идеальные результаты. Если по проводу, то гигабит. Если по вайфаю, то сколько может выжать вайфай. По результатам тестов и пингов никогда нет потерь пакетов. Локальная сеть работает без проблем. Торренты без проблем утилизируют почти весь канал.<br><br>При этом что у меня, что у остальных пользователей домашней сети, периодически <i>плохо работает интернет</i>. Это такие неизмеримые субъективные ощущения. Когда пишешь сообщение в Дискорд, а оно отправляется 5-15 секунд. Или когда медиа в Телеграме совершенно не грузится, пока не повторишь попытку. А когда повторяешь, загружается с отличной скоростью без проблем. Кажется, это чаще всего происходит на телефонах, но иногда соединение с играми и мессенджерами теряет один из компов, подключенный проводом.<br><br>Как правильно диагностировать такие вещи? В какую сторону копать? Может, есть какие-то более умные тесты, которые могут проверить всю мою сеть на предмет кривых настроек или лажи со стороны провайдера, и дать подробный отчёт?
<br>
@@ -842,8 +777,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 62&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">8879 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">14/02/23, 14:40:39</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3508</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3508">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3508">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from Astra’s thots! ---</div>
<br>
@@ -854,8 +788,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 43&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">8283 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">13/02/23, 15:26:01</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3507</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3507">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3507">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3506/AgADOskxGxzIUEs/07a50704" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -867,8 +800,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 112&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">9163 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">13/02/23, 14:55:40</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3506</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3506">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3506">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/doque_embedded">Doque Embedded (@doque_embedded)</a> ---</div>
<br>
@@ -883,8 +815,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 87&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">9608 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">10/02/23, 18:51:21</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3505</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3505">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3505">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3504/AgAD8cIxG0PgEUs/46c68f77" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -896,8 +827,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 30&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">12307 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">06/02/23, 18:19:19</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3504</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3504">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3504">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
Звонил мой семейный доктор. Сказал: «Анна, пришли ваши анализы, что-то мало вы эстрадиола пьёте». Выписал принимать больше. Гейропа...
<br>
@@ -905,8 +835,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 88&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10541 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">06/02/23, 16:05:02</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3503</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3503">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3503">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/flexagoon_schiz">придумайте мне новое название канала пожалуйста (@flexagoon_schiz)</a> ---</div>
<br>
@@ -919,8 +848,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 59&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10361 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">05/02/23, 11:29:00</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3502</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3502">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3502">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
</div>
@@ -931,8 +859,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 16&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10919 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">02/02/23, 14:51:00</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3501</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3501">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3501">Open in Web</a>
<br><div class="message-flags"> 🏷 only_link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
Девочек тут очень легко клеить. Просто рассказываешь ей про ШИЗО Навального, посадки за репост, и прочую повседневность с родины. Даже довоенных историй достаточно, про сейчас уж молчу. И она такая: «огоо, не может быть, это звучит как фантастика, как ты там вообще жила». А если вас ещё и на протестах задерживали, то всё, она твоя...<br><br>Эдакий party trick, попробуйте
<br>
@@ -940,8 +867,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 168&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">11109 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">31/01/23, 18:43:55</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3500</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3500">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3500">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
Открыла ради интереса местные новости, вот некоторые заголовки с главной страницы:<br>・Нидерланды — восьмая с конца в топе стран по уровню коррупции<br>・Пенсионеры могут бесплатно обследоваться на рак лёгких<br>・Инвалиды не дотягиваются до банкоматов из своих кресел<br>・Теннисная ассоциация рекомендует строить поля для игр подальше от домов, потому что ракетки громкие и мешают людям спать <i>(што???)</i><br>・Бывшей королеве исполнилось 85!<br>・Сотни климат-активистов были арестованы на протестах <i>(оо, хоть что-то</i> <i>интересное)</i><br>・23% молодых нидерландцев не верят в холокост<br><br>Никаких драм и интриг, очень скучно. Если вкладку "international" не открывать, конечно
<br>
@@ -949,8 +875,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 101&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10461 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">31/01/23, 18:25:40</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3499</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3499">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3499">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3498/AgADecYxG3dtmEo/876462fa" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -962,8 +887,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 203&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">11994 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">26/01/23, 23:54:52</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3498</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3498">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3498">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3497/AgADeMIxG3_zmEo/3e0f8183" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -975,8 +899,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 133&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10798 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">26/01/23, 22:15:24</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3497</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3497">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3497">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3496/AgADm8ExG1a_kUo/fe97680f" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -986,8 +909,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 41&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10216 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">26/01/23, 12:04:57</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3496</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3496">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3496">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-forward">--- Forwarded from <a href="https://t.me/localhost_ru">Локалхост (Никита Куликов) (@localhost_ru)</a> ---</div>
<br>
@@ -1002,8 +924,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 203&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">7636 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">26/01/23, 10:49:07</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3495</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3495">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3495">Open in Web</a>
<br><div class="message-flags"> 🏷 fwd 🏷 link 🏷 mention 🏷 foreign_channel </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3493/AgADZsUxG3_ziEo/5a06f07e" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -1022,8 +943,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 147&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">23180 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">25/01/23, 22:28:50</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3493</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3493">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3493">Open in Web</a>
<br><div class="message-flags"> 🏷 link 🏷 merged </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<audio controls style="width:100%; max-width:400px;"><source src="http://test.example.com/media/theyforcedme/3492/AgADKwoAAsuwuEo/e9ac0af0" type="audio/mpeg"></audio>
@@ -1036,8 +956,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 12&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10135 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">25/01/23, 01:08:30</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3492</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3492">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3492">Open in Web</a>
<br><div class="message-flags"> 🏷 audio 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
Продали только что <b>3000 Флипперов</b> в 🇺🇸 США за <b>2 минуты 11 секунд</b> (за 131 секунду).<br><br>За ними не угнаться.
<br>
@@ -1045,8 +964,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 143&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">13559 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">20/01/23, 22:26:22</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3491</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3491">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3491">Open in Web</a>
<br><div class="message-flags"> 🏷 no_image </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<video controls src="http://test.example.com/media/theyforcedme/3490/AgADECAAAsHcWUo/551ebf94" style="max-width:100%; width:auto;height:auto; max-height:400px;"></video>
@@ -1058,8 +976,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 16&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">12594 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">20/01/23, 15:34:07</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3490</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3490">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3490">Open in Web</a>
<br><div class="message-flags"> 🏷 video 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<audio controls style="width:100%; max-width:400px;"><source src="http://test.example.com/media/theyforcedme/3489/AgADmRoAAi4P4Uo/ac611361" type="audio/mpeg"></audio>
@@ -1072,8 +989,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 4&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10534 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">19/01/23, 17:58:51</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3489</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3489">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3489">Open in Web</a>
<br><div class="message-flags"> 🏷 audio 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3488/AgADxsQxG_sUSEo/a3f3abb0" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -1085,8 +1001,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 46&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">10115 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">19/01/23, 14:02:47</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3488</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3488">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3488">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3487/AgADtdAxG_sUQEo/ce3ab49e" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -1096,8 +1011,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 117&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">8867 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">18/01/23, 20:44:41</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3487</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3487">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3487">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
</div>
@@ -1108,8 +1022,7 @@ to all of my trans people
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 77&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">8559 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">18/01/23, 20:42:58</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3486</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3486">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3486">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3485/AgADxc0xG_sUQEo/5c337ec1" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
@@ -1121,8 +1034,7 @@ That is completely untrue. This is not how I close a bag of chips.
<div class="message-footer"><br>
<span class="reaction">❤‍🔥 54&nbsp;&nbsp;</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="views">8211 👁</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="date">18/01/23, 09:53:55</span>&nbsp;&nbsp;|&nbsp;&nbsp;<span class="message-id">#3485</span><br><a href="tg://resolve?domain=theyforcedme&amp;post=3485">Open in Telegram</a>&nbsp;|&nbsp;<a href="https://t.me/theyforcedme/3485">Open in Web</a>
<br><div class="message-flags"> 🏷 link </div></div>
<hr class="post-divider">
<div class="message-body"><div class="post">
<div class="message-media">
<img src="http://test.example.com/media/theyforcedme/3483/AgAD0McxG33mKEo/52a25a25" style="max-width:100%; width:auto; height:auto;max-height:400px; object-fit:contain;">
+141
View File
@@ -0,0 +1,141 @@
# flake8: noqa
# pylint: disable=missing-function-docstring, redefined-outer-name, line-too-long
"""Unit tests for the single project-wide bleach config (sanitizer.py, issue #28 / §3).
Covers the stage-1 registry items that this module owns:
§3.1 s / del (strikethrough) survive.
§3.2 fail-closed: on a bleach error the fragment is html.escape()d, never returned raw.
§3.16 the single error-log name `html_sanitization_error` + log_context.
Plus the two non-default bleach params the maintainer flagged as load-bearing:
strip=True (disallowed tags are REMOVED, not escaped into visible text) and
protocols including 'tg' (tg:// links survive).
And the one-config invariant: only one ALLOWED_TAGS list exists in the repo.
"""
import logging
import pytest
import sanitizer
from sanitizer import sanitize_html, ALLOWED_TAGS, ALLOWED_PROTOCOLS
# --------------------------------------------------------------------------- #
# §3.1 — strikethrough survives (the drift the single config fixes).
# --------------------------------------------------------------------------- #
def test_strikethrough_s_survives():
assert sanitize_html("<s>gone</s>") == "<s>gone</s>"
def test_strikethrough_del_survives():
assert sanitize_html("<del>removed</del>") == "<del>removed</del>"
def test_s_and_del_in_allowed_tags():
assert "s" in ALLOWED_TAGS
assert "del" in ALLOWED_TAGS
# --------------------------------------------------------------------------- #
# strip=True — disallowed tags are REMOVED (bleach's default False would escape
# them into visible text). Both the tag and its dangerous attrs must vanish.
# --------------------------------------------------------------------------- #
def test_script_is_stripped_not_escaped():
out = sanitize_html("<b>hi</b><script>alert(1)</script>")
assert out == "<b>hi</b>alert(1)"
# strip=True removed the tag entirely — it was NOT escaped into visible &lt;script&gt;.
assert "&lt;script&gt;" not in out
assert "<script" not in out
def test_onerror_attribute_is_stripped():
out = sanitize_html('<img src="http://e/x.png" onerror="alert(1)">')
assert "onerror" not in out
assert "alert(1)" not in out
def test_javascript_protocol_href_dropped():
out = sanitize_html('<a href="javascript:alert(1)">x</a>')
# The <a> tag survives (whitelisted) but the dangerous href is dropped by the protocol filter.
assert "javascript:" not in out
# --------------------------------------------------------------------------- #
# protocols — non-default 'tg' keeps tg:// links (channel footers use them).
# --------------------------------------------------------------------------- #
def test_tg_protocol_href_survives():
out = sanitize_html('<a href="tg://resolve?domain=x">x</a>')
assert 'href="tg://resolve?domain=x"' in out
def test_http_and_https_survive():
assert 'href="https://e/x"' in sanitize_html('<a href="https://e/x">x</a>')
assert 'href="http://e/x"' in sanitize_html('<a href="http://e/x">x</a>')
def test_tg_in_allowed_protocols():
assert ALLOWED_PROTOCOLS == ['http', 'https', 'tg']
# --------------------------------------------------------------------------- #
# CSS sanitizer — only the whitelisted properties survive inside style="".
# --------------------------------------------------------------------------- #
def test_css_allowed_property_survives():
out = sanitize_html('<img src="http://e/x" style="max-width: 100%">')
assert "max-width" in out
def test_css_disallowed_property_dropped():
out = sanitize_html('<div style="position: fixed; max-height: 50px">x</div>')
assert "position" not in out
assert "max-height" in out
# --------------------------------------------------------------------------- #
# §3.2 — FAIL-CLOSED: any bleach error escapes the raw input, never returns it raw.
# §3.16 — the single error-log name `html_sanitization_error` + log_context.
# --------------------------------------------------------------------------- #
def test_fail_closed_escapes_on_bleach_error(monkeypatch, caplog):
def boom(*a, **k):
raise RecursionError("bleach exploded")
# sanitize_html resolves HTMLSanitizer as a module global at call time.
monkeypatch.setattr(sanitizer, "HTMLSanitizer", boom, raising=True)
payload = '<script>alert(1)</script>'
with caplog.at_level(logging.ERROR):
out = sanitize_html(payload, log_context="channel test, message_id 7")
# Fail-closed: the raw payload was html.escape()d, NOT returned raw.
assert out == "&lt;script&gt;alert(1)&lt;/script&gt;"
assert "<script" not in out
# §3.16: single error-log name, with the log_context included for grep-ability.
assert "html_sanitization_error" in caplog.text
assert "channel test, message_id 7" in caplog.text
def test_fail_closed_log_name_without_context(monkeypatch, caplog):
def boom(*a, **k):
raise ValueError("nope")
monkeypatch.setattr(sanitizer, "HTMLSanitizer", boom, raising=True)
with caplog.at_level(logging.ERROR):
sanitize_html("<b>x</b>")
# Same single name even when no context is supplied (single-post path).
assert "html_sanitization_error" in caplog.text
# The legacy per-path names must be gone.
assert "rss_html_sanitization_error" not in caplog.text
assert "html_final_sanitization_error" not in caplog.text
# --------------------------------------------------------------------------- #
# One-config invariant: exactly one ALLOWED_TAGS list in the tree, in sanitizer.py.
# post_parser / rss_generator must route through the module, not re-declare bleach.
# --------------------------------------------------------------------------- #
def test_single_bleach_config_no_reimport_in_render_modules():
import inspect
import post_parser
import rss_generator
for mod in (post_parser, rss_generator):
src = inspect.getsource(mod)
assert "allowed_tags" not in src.lower() or "sanitizer" in src, \
f"{mod.__name__} appears to re-declare a bleach tag list instead of using sanitizer.py"
assert "from bleach" not in src and "import bleach" not in src, \
f"{mod.__name__} still imports bleach directly; the only config lives in sanitizer.py"
+55 -2
View File
@@ -383,6 +383,56 @@ async def test_xss_in_media_caption_stripped_in_feeds(monkeypatch):
_assert_clean(html_feed, "html feed (media caption)")
# --------------------------------------------------------------------------- #
# §3.4 — per-post sanitize ISOLATION (stage-1 load-bearing invariant, PR #36).
# A dangling/unbalanced tag in post A must be normalized WITHIN A's own fragment and
# cannot swallow post B (cross-post DOM/XSS bleed). This holds because _render_pipeline
# runs a SEPARATE bleach.clean per post and the formatter joins the <hr> divider AFTER
# sanitize. A FUTURE stage that rejoins BEFORE sanitizing would reintroduce the bleed
# and pass every single-message XSS test — so this 2-post case MUST turn it red.
# --------------------------------------------------------------------------- #
@pytest.mark.asyncio
async def test_unbalanced_post_does_not_swallow_next_post_html_feed(monkeypatch):
# Post A carries a dangling <div><b> with NO closers; post B is well-formed and
# carries a unique marker. _Str.html feeds the raw tags into the pre-sanitize body
# exactly as a real message with entities would.
msg_a = make_message(50, text="<div><b>DANGLING_A no closers here",
date=datetime(2024, 1, 1, 12, 5, 0, tzinfo=timezone.utc))
msg_b = make_message(51, text="INTACT_B_MARKER",
date=datetime(2024, 1, 1, 12, 0, 0, tzinfo=timezone.utc))
async def fake_get_chat(client, channel):
return SimpleNamespace(title="Test", username="testchan", id=-1001234567890)
async def fake_get_history(client, channel, limit=20):
return [msg_a, msg_b] # A is newer than B -> A rendered first
monkeypatch.setattr("tg_cache.cached_get_chat", fake_get_chat, raising=False)
monkeypatch.setattr("tg_cache.cached_get_chat_history", fake_get_history, raising=False)
html = await generate_channel_html("testchan", client=SimpleNamespace(), limit=5)
# The divider survives (joined AFTER per-post sanitize) and splits the feed into
# exactly two TOP-LEVEL fragments. A join-before-sanitize regression strips the
# non-whitelisted <hr> entirely (strip=True) -> this alone already goes red.
parts = html.split('<hr class="post-divider">')
assert len(parts) == 2, "expected exactly one top-level post-divider between the two posts"
frag_a, frag_b = parts
# A's dangling tags were balanced WITHIN A's own fragment, NOT deferred past the
# divider. A rejoin-before-sanitize regression closes them only at the very end of
# the whole feed (after B), leaving frag_a with more opens than closes.
assert "DANGLING_A" in frag_a
assert frag_a.count("<div") == frag_a.count("</div>"), "post A's <div> not closed within its own fragment"
assert frag_a.count("<b>") == frag_a.count("</b>"), "post A's <b> not closed within its own fragment"
# B is intact, lives at top level, and is itself balanced — never nested inside A
# (its marker must not have been trapped before A's divider).
assert "INTACT_B_MARKER" in frag_b, "post B content missing/swallowed by post A"
assert "INTACT_B_MARKER" not in frag_a, "post B content bled into post A's fragment"
assert frag_b.count("<div") == frag_b.count("</div>"), "post B fragment not self-contained"
# --------------------------------------------------------------------------- #
# Review round-1: the new bulk-upsert SQL executed for real (not mocked).
# --------------------------------------------------------------------------- #
@@ -468,10 +518,13 @@ async def test_rss_fails_closed_when_sanitizer_raises(monkeypatch):
monkeypatch.setattr("tg_cache.cached_get_chat_history", fake_get_history, raising=False)
# Force bleach to blow up (e.g. the RecursionError class already seen in prod).
# rss_generator imports it as `from bleach import clean as HTMLSanitizer`.
# API relocation: the single bleach config now lives in sanitizer.py, which imports
# it as `from bleach import clean as HTMLSanitizer`; sanitize_html resolves the name
# at call time, so patching sanitizer.HTMLSanitizer triggers the fail-closed path.
import sanitizer as sanitizer_module
def boom(*a, **k):
raise RecursionError("bleach exploded")
monkeypatch.setattr(rss_module, "HTMLSanitizer", boom, raising=True)
monkeypatch.setattr(sanitizer_module, "HTMLSanitizer", boom, raising=True)
rss = await generate_channel_rss("testchan", client=SimpleNamespace(), limit=5)
chunks = re.findall(r"<!\[CDATA\[(.*?)\]\]>", rss, re.DOTALL)