Files
securebit-chat/dist/app.js
T
SecureBitChatVolodymyr b4e12c2a98 web: the desktop version lives in two files, and only one was bumped
src/app.jsx carries its own SB_DESKTOP_VERSION for the compact download
table; src/components/ui/DownloadApps.jsx carries DESKTOP_VERSION for the
grid. Bumping one leaves the other pointing at a tag whose filenames no
longer exist — the failure tests/desktop-download-links.test.mjs was written
for, and which it caught here.

The i18n scan also learns that these dictionaries feed two clients. The
desktop client is a separate repository, so its keys can never appear in a
scan of this src/ and were being reported as dead strings to delete.
2026-09-01 23:49:50 -04:00

22930 lines
1.8 MiB
Plaintext

// src/utils/debugWindowHooks.js
function isSecureBitDebugEnabled(targetWindow = globalThis.window) {
return targetWindow?.SECUREBIT_DEBUG === true;
}
function installDebugWindowHooks({
targetWindow = globalThis.window,
webrtcManagerRef,
onClearData,
clearConsole = () => {
if (typeof console.clear === "function") {
console.clear();
}
}
}) {
if (!isSecureBitDebugEnabled(targetWindow)) {
return () => {
};
}
targetWindow.forceCleanup = () => {
onClearData();
if (webrtcManagerRef.current) {
webrtcManagerRef.current.disconnect();
}
};
targetWindow.clearLogs = clearConsole;
targetWindow.webrtcManagerRef = webrtcManagerRef;
return () => {
delete targetWindow.forceCleanup;
delete targetWindow.clearLogs;
delete targetWindow.webrtcManagerRef;
};
}
// src/network/iceSettingsStore.js
var DB_NAME = "securebit-net";
var DB_VERSION = 1;
var STORE = "kv";
var KEY_RECORD = "ice-device-key";
var SETTINGS_RECORD = "ice-settings";
var SETTINGS_VERSION = 1;
function isSupported() {
return typeof indexedDB !== "undefined" && typeof crypto !== "undefined" && !!crypto.subtle;
}
function openDb() {
return new Promise((resolve, reject) => {
let request;
try {
request = indexedDB.open(DB_NAME, DB_VERSION);
} catch (error) {
reject(error);
return;
}
request.onupgradeneeded = () => {
const db = request.result;
if (!db.objectStoreNames.contains(STORE)) {
db.createObjectStore(STORE);
}
};
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
}
function idbGet(db, key) {
return new Promise((resolve, reject) => {
const tx = db.transaction(STORE, "readonly");
const req = tx.objectStore(STORE).get(key);
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
}
function idbPut(db, key, value) {
return new Promise((resolve, reject) => {
const tx = db.transaction(STORE, "readwrite");
tx.objectStore(STORE).put(value, key);
tx.oncomplete = () => resolve();
tx.onerror = () => reject(tx.error);
});
}
function idbDelete(db, key) {
return new Promise((resolve, reject) => {
const tx = db.transaction(STORE, "readwrite");
tx.objectStore(STORE).delete(key);
tx.oncomplete = () => resolve();
tx.onerror = () => reject(tx.error);
});
}
async function getOrCreateDeviceKey(db) {
const existing = await idbGet(db, KEY_RECORD);
if (existing instanceof CryptoKey) {
return existing;
}
const key = await crypto.subtle.generateKey(
{ name: "AES-GCM", length: 256 },
false,
// non-extractable
["encrypt", "decrypt"]
);
await idbPut(db, KEY_RECORD, key);
return key;
}
async function saveIceSettings(settings) {
if (!isSupported()) throw new Error("Persistent storage is not available in this browser");
const db = await openDb();
const key = await getOrCreateDeviceKey(db);
const payload = JSON.stringify({
version: SETTINGS_VERSION,
servers: Array.isArray(settings?.servers) ? settings.servers : [],
privacyMode: settings?.privacyMode === "relay-only" ? "relay-only" : "standard"
});
const iv = crypto.getRandomValues(new Uint8Array(12));
const ciphertext = await crypto.subtle.encrypt(
{ name: "AES-GCM", iv },
key,
new TextEncoder().encode(payload)
);
await idbPut(db, SETTINGS_RECORD, {
iv: Array.from(iv),
data: Array.from(new Uint8Array(ciphertext))
});
}
async function loadIceSettings() {
if (!isSupported()) return null;
try {
const db = await openDb();
const record = await idbGet(db, SETTINGS_RECORD);
if (!record || !Array.isArray(record.iv) || !Array.isArray(record.data)) {
return null;
}
const key = await idbGet(db, KEY_RECORD);
if (!(key instanceof CryptoKey)) return null;
const plaintext = await crypto.subtle.decrypt(
{ name: "AES-GCM", iv: new Uint8Array(record.iv) },
key,
new Uint8Array(record.data)
);
const parsed = JSON.parse(new TextDecoder().decode(plaintext));
return {
servers: Array.isArray(parsed.servers) ? parsed.servers : [],
privacyMode: parsed.privacyMode === "relay-only" ? "relay-only" : "standard"
};
} catch {
return null;
}
}
async function clearIceSettings() {
if (!isSupported()) return;
try {
const db = await openDb();
await idbDelete(db, SETTINGS_RECORD);
} catch {
}
}
// src/i18n/generated.js
var DEFAULT_LOCALE = "en";
var SUPPORTED_LOCALES = ["en", "de", "fr", "es", "uk", "ru", "zh", "ko", "hi", "ar", "he", "fa", "ur"];
var LOCALE_META = {
"en": {
"htmlLang": "en",
"nativeName": "English",
"abbr": "EN",
"dir": "ltr",
"path": "/"
},
"de": {
"htmlLang": "de",
"nativeName": "Deutsch",
"abbr": "DE",
"dir": "ltr",
"path": "/de/"
},
"fr": {
"htmlLang": "fr",
"nativeName": "Fran\xE7ais",
"abbr": "FR",
"dir": "ltr",
"path": "/fr/"
},
"es": {
"htmlLang": "es",
"nativeName": "Espa\xF1ol",
"abbr": "ES",
"dir": "ltr",
"path": "/es/"
},
"uk": {
"htmlLang": "uk",
"nativeName": "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430",
"abbr": "UK",
"dir": "ltr",
"path": "/uk/"
},
"ru": {
"htmlLang": "ru",
"nativeName": "\u0420\u0443\u0441\u0441\u043A\u0438\u0439",
"abbr": "RU",
"dir": "ltr",
"path": "/ru/"
},
"zh": {
"htmlLang": "zh-Hans",
"nativeName": "\u7B80\u4F53\u4E2D\u6587",
"abbr": "ZH",
"dir": "ltr",
"path": "/zh/"
},
"ko": {
"htmlLang": "ko",
"nativeName": "\uD55C\uAD6D\uC5B4",
"abbr": "KO",
"dir": "ltr",
"path": "/ko/"
},
"hi": {
"htmlLang": "hi",
"nativeName": "\u0939\u093F\u0928\u094D\u0926\u0940",
"abbr": "HI",
"dir": "ltr",
"path": "/hi/"
},
"ar": {
"htmlLang": "ar",
"nativeName": "\u0627\u0644\u0639\u0631\u0628\u064A\u0629",
"abbr": "AR",
"dir": "rtl",
"path": "/ar/"
},
"he": {
"htmlLang": "he",
"nativeName": "\u05E2\u05D1\u05E8\u05D9\u05EA",
"abbr": "HE",
"dir": "rtl",
"path": "/he/"
},
"fa": {
"htmlLang": "fa",
"nativeName": "\u0641\u0627\u0631\u0633\u06CC",
"abbr": "FA",
"dir": "rtl",
"path": "/fa/"
},
"ur": {
"htmlLang": "ur",
"nativeName": "\u0627\u0631\u062F\u0648",
"abbr": "UR",
"dir": "rtl",
"path": "/ur/"
}
};
var DICTIONARIES = {
"en": {
"language.label": "Language",
"language.suggest.text": "This page is also available in English.",
"language.suggest.cta": "Read in English",
"language.suggest.dismiss": "Dismiss",
"community.title": "Join the future of privacy",
"community.description": "SecureBit grows thanks to its community. Your ideas and feedback shape the future of secure communication - built in the open, with complete ASN.1 validation end-to-end.",
"community.github": "GitHub Repository",
"community.feedback": "Feedback",
"unique.eyebrow": "What sets us apart",
"unique.heading": "Why SecureBit is unique",
"unique.s1.titleTop": "Layered",
"unique.s1.titleBottom": "encryption core",
"unique.s1.collapsed": "Encryption core",
"unique.s1.desc": "ECDH P-384 key exchange, AES-256-GCM payloads, ECDSA signatures and full ASN.1 validation - composed into one hardened pipeline.",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "Pure P2P",
"unique.s2.titleBottom": "WebRTC",
"unique.s2.collapsed": "Pure P2P WebRTC",
"unique.s2.desc": "Messages travel directly between devices over WebRTC. No relay holds your data - the server only helps two peers find each other.",
"unique.s2.tags": [
"DTLS 1.3",
"No relay"
],
"unique.s3.titleTop": "Perfect",
"unique.s3.titleBottom": "forward secrecy",
"unique.s3.collapsed": "Forward secrecy",
"unique.s3.desc": "Session keys rotate continuously and are discarded after use, so a single compromised key can never unlock past conversations.",
"unique.s3.tags": [
"Ephemeral keys",
"Auto-rotate"
],
"unique.s4.titleTop": "Traffic",
"unique.s4.titleBottom": "obfuscation",
"unique.s4.collapsed": "Traffic obfuscation",
"unique.s4.desc": "Packet sizes and timing are padded and randomized, hiding metadata patterns from anyone watching the wire.",
"unique.s4.tags": [
"Packet padding",
"Timing jitter"
],
"unique.s5.titleTop": "Zero data",
"unique.s5.titleBottom": "collection",
"unique.s5.collapsed": "Zero data collection",
"unique.s5.desc": "No accounts, no logs, no message storage. There is nothing on a server to leak, subpoena, or sell.",
"unique.s5.tags": [
"No accounts",
"No logs"
],
"partners.eyebrow": "Partners & ecosystem",
"partners.heading": "Trusted by our partners",
"partners.aegis.desc": "Capital partner securing confidential financial communications across its portfolio.",
"partners.aegis.role": "Strategic backer",
"partners.furilabs.desc": "Privacy-first Linux phones that ship SecureBit as a default secure channel.",
"partners.furilabs.role": "Technology partner",
"partners.inviteTitle": "Become a partner",
"partners.inviteDesc": "Building privacy hardware or infrastructure? Let's integrate SecureBit.",
"partners.inviteCta": "Start a conversation",
"roadmap.eyebrow": "Development Roadmap",
"roadmap.heading": "The evolution of SecureBit",
"roadmap.subheading": "From the first prototype to a quantum-resistant, decentralized network - with complete ASN.1 validation at every layer.",
"roadmap.progress": "{shipped} of {total} milestones shipped",
"roadmap.upcoming": "{upcoming} on the way",
"roadmap.keyFeatures": "Key features",
"roadmap.status.released": "Released",
"roadmap.status.current": "Current",
"roadmap.status.dev": "In development",
"roadmap.status.planned": "Planned",
"roadmap.status.research": "Research",
"hero.headlineTop": "A direct line",
"hero.headlineBottom": "only you two can read.",
"hero.subheading": "Keys are generated on your device and exchanged peer-to-peer. No accounts, no servers storing your messages.",
"hero.diagramAlt": "A direct encrypted line to one peer, with two more peers joining the mesh",
"intro.createTitle": "Create a new channel",
"intro.createDesc": "Your device generates the keys and a one-time invitation. Nothing touches a server.",
"intro.createCta": "Generate keys & invitation",
"intro.joinTitle": "Join a channel",
"intro.scanTitle": "Scan QR with camera",
"intro.scanSubtitle": "Fastest - point at your peer's screen",
"intro.orPasteCode": "or paste code",
"intro.pastePlaceholder": "Paste invitation code here\u2026",
"intro.connect": "Connect",
"intro.connecting": "Processing\u2026",
"roadmap.r1.title": "Start of Development",
"roadmap.r1.sub": "Idea, prototype, and infrastructure setup",
"roadmap.r1.date": "Early 2025",
"roadmap.r1.features": [
"Concept and requirements formation",
"Stack selection: WebRTC, P2P, cryptography",
"First messaging prototypes",
"Repository creation and CI",
"Basic encryption architecture",
"UX/UI design"
],
"roadmap.r2.title": "Alpha Release",
"roadmap.r2.sub": "First public alpha: basic chat and key exchange",
"roadmap.r2.date": "Spring 2025",
"roadmap.r2.features": [
"Basic P2P messaging via WebRTC",
"Simple E2E encryption (demo scheme)",
"Stable signaling and reconnection",
"Minimal UX for testing",
"Feedback collection from early testers"
],
"roadmap.r3.title": "Security Hardened",
"roadmap.r3.sub": "Security strengthening and stable branch release",
"roadmap.r3.date": "Summer 2025",
"roadmap.r3.features": [
"ECDH/ECDSA implementation in production",
"Perfect Forward Secrecy and key rotation",
"Improved authentication checks",
"File encryption and large payload transfers",
"Audit of basic cryptoprocesses"
],
"roadmap.r4.title": "Scaling & Stability",
"roadmap.r4.sub": "Network scaling and stability improvements",
"roadmap.r4.date": "Fall 2025",
"roadmap.r4.features": [
"Optimization of P2P connections and NAT traversal",
"Reconnection mechanisms and message queues",
"Reduced battery consumption on mobile",
"Multi-device synchronization support",
"Monitoring and logging tools for developers"
],
"roadmap.r5.title": "Privacy-first Release",
"roadmap.r5.sub": "Focus on privacy: minimizing metadata",
"roadmap.r5.date": "Winter 2025",
"roadmap.r5.features": [
"Metadata protection and fingerprint reduction",
"Experiments with onion routing and DHT",
"Options for anonymous connections",
"Preparation for open code audit",
"Improved user verification processes"
],
"roadmap.r6.title": "Enhanced Security Edition",
"roadmap.r6.sub": "18-layer military-grade cryptography with complete ASN.1 validation",
"roadmap.r6.date": "Late 2025",
"roadmap.r6.features": [
"ECDH + DTLS + SAS triple-layer security",
"ECDH P-384 + AES-GCM 256-bit encryption",
"DTLS fingerprint verification",
"SAS (Short Authentication String) verification",
"Perfect Forward Secrecy with key rotation",
"Enhanced MITM attack prevention",
"Complete ASN.1 DER validation",
"OID and EC point verification",
"SPKI structure validation",
"P2P WebRTC architecture",
"Metadata protection",
"100% open source code"
],
"roadmap.r7.title": "Desktop Edition",
"roadmap.r7.sub": "Native desktop apps for Windows, macOS, and Linux",
"roadmap.r7.date": "Early 2026",
"roadmap.r7.features": [
"Windows desktop app (Tauri v2)",
"macOS desktop app (Tauri v2)",
"Linux AppImage support (Tauri v2)",
"Real-time notifications",
"Automatic reconnection",
"Cross-device synchronization",
"Improved UX/UI",
"Support for files up to 100MB"
],
"roadmap.r8.title": "Secure Voice & Calls",
"roadmap.r8.sub": "Encrypted voice messages, audio calls, and video calls",
"roadmap.r8.date": "Early 2026",
"roadmap.r8.features": [
"End-to-end encrypted voice messages",
"1:1 encrypted audio calls (WebRTC)",
"1:1 encrypted video calls (WebRTC)",
"Perfect Forward Secrecy for live media",
"SRTP/DTLS-protected media streams",
"In-call SAS verification",
"Call notifications and auto-reconnection",
"Low-latency P2P media"
],
"roadmap.r9.title": "Group Communications",
"roadmap.r9.sub": "Group chats with preserved privacy",
"roadmap.r9.date": "Now",
"roadmap.r9.features": [
"P2P group chats up to 8 participants",
"Mesh delivery with signed relay fallback",
"One group safety code, compared by everyone",
"Commit-then-reveal ceremony against code grinding",
"Per-group identity keys, ephemeral by design",
"Signed membership with epoch ordering",
"Signed messages, so a split transcript is provable",
"No server, no shared group key, no history"
],
"roadmap.r10.title": "Mobile Edition",
"roadmap.r10.sub": "Native mobile apps for iOS and Android",
"roadmap.r10.date": "Q2 2027",
"roadmap.r10.features": [
"iOS native app (Swift/SwiftUI)",
"Android native app (Kotlin/Jetpack Compose)",
"PWA support for mobile browsers",
"Real-time push notifications",
"Battery optimization",
"Mobile-optimized UX/UI",
"Offline message queuing",
"Biometric authentication"
],
"roadmap.r11.title": "Quantum-Resistant Edition",
"roadmap.r11.sub": "Protection against quantum computers",
"roadmap.r11.date": "Q4 2027",
"roadmap.r11.features": [
"Post-quantum cryptography CRYSTALS-Kyber",
"SPHINCS+ digital signatures",
"Hybrid scheme: classic + PQ",
"Quantum-safe key exchange",
"Updated hashing algorithms",
"Migration of existing sessions",
"Compatibility with v5.x",
"Quantum-resistant protocols"
],
"roadmap.r12.title": "Decentralized Network",
"roadmap.r12.sub": "Fully decentralized network",
"roadmap.r12.date": "2028",
"roadmap.r12.features": [
"Node mesh network",
"DHT for peer discovery",
"Built-in onion routing",
"Tokenomics and node incentives",
"Governance via DAO",
"Interoperability with other networks",
"Cross-platform compatibility",
"Self-healing network"
],
"roadmap.r13.title": "AI Privacy Assistant",
"roadmap.r13.sub": "AI for privacy and security",
"roadmap.r13.date": "2028+",
"roadmap.r13.features": [
"Local AI threat analysis",
"Automatic MITM detection",
"Adaptive cryptography",
"Personalized security recommendations",
"Zero-knowledge machine learning",
"Private AI assistant",
"Predictive security",
"Autonomous attack protection"
],
"handshake.step1": "Generating ECDH P-384 key pair",
"handshake.step2": "Deriving verification code",
"handshake.step3": "Pinning Perfect Forward Secrecy",
"handshake.securingTitle": "Securing your channel",
"handshake.answerTitle": "Building your answer",
"handshake.securingDesc": "Forging keys strong enough to resist tampering.",
"handshake.shareTitle": "Share your invitation",
"handshake.sendAnswerTitle": "Send back your answer",
"handshake.shareDesc": "Show the QR or send the code to your peer. It is one-time and expires shortly.",
"handshake.sendAnswerDesc": "Give this answer to the channel creator so they can finish the handshake.",
"handshake.establish": "Establish connection",
"handshake.thenReceive": "Then receive the answer your peer sends back",
"handshake.pasteAnswerPlaceholder": "Paste peer's answer code\u2026",
"handshake.answerSentNote": "Send this answer to the creator, then wait - the chat opens once they connect.",
"handshake.qrHint": "Keep this open until your peer captures the code.",
"handshake.qrHintFrames": "The handshake is split across {frames} frames - keep this open until your peer captures all of them.",
"verify.title": "Security verification",
"verify.desc": "Compare this safety code with your peer over a separate channel (voice / in person), then type it to unlock the chat.",
"verify.enterLabel": "Enter the verified code",
"verify.placeholder": "Type code here",
"verify.confirm": "Confirm code",
"verify.confirmed": "Confirmed",
"verify.mismatch": "Don't match",
"verify.yours": "Your confirmation",
"verify.peer": "Peer confirmation",
"verify.pending": "Pending",
"verify.waiting": "Waiting for code\u2026",
"verify.verified": "Channel verified",
"verify.bothConfirmed": "Both parties confirmed. Opening the secure chat\u2026",
"pwa.bannerTitle": "Install SecureBit.chat",
"pwa.bannerDesc": "Get the native app experience with enhanced security",
"pwa.install": "Install",
"pwa.dismiss": "Dismiss",
"pwa.close": "Close",
"pwa.iosTitle": "Install on iOS",
"pwa.iosStep1": "Tap the Share button",
"pwa.iosStep1Hint": "Usually at the bottom of Safari",
"pwa.iosStep2": 'Find "Add to Home Screen"',
"pwa.iosStep2Hint": "Scroll down in the share menu",
"pwa.iosStep3": 'Tap "Add"',
"pwa.iosStep3Hint": "Confirm to install SecureBit.chat",
"pwa.genericTitle": "Install SecureBit",
"pwa.genericDesc": "Your browser handles installs its own way. Pick the steps that match yours.",
"pwa.gotIt": "Got it",
"pwa.installedTitle": "App Installed!",
"pwa.installedIos": "iOS App installed! Open from home screen.",
"pwa.installedGeneric": "SecureBit.chat is now on your device",
"pwa.anytimeTitle": "Install Anytime",
"pwa.anytimeDesc": "You can still install SecureBit.chat from your browser's menu for the best experience.",
"pwa.ok": "OK",
"step.open": "Step 1 \xB7 open a channel",
"step.exchange": "Step 2 \xB7 exchange",
"step.verification": "Step 3 \xB7 verification",
"action.create": "Create",
"action.join": "Join",
"action.back": "Back",
"action.copy": "Copy",
"action.copied": "Copied",
"action.scan": "Scan",
"action.downloadDesktop": "Download desktop app",
"action.advancedSettings": "Advanced settings",
"cred.offerTag": "offer \xB7 or copy text",
"cred.answerTag": "answer \xB7 or copy text",
"cred.reveal": "Click to reveal - keep this code private",
"qr.title": "Scan QR code",
"qr.subtitle": "Point your camera at their QR",
"qr.scanning": "Scanning\u2026",
"qr.hint": "Hold steady until all parts are captured. Camera access is local - nothing is uploaded.",
"mesh.you": "you",
"mesh.peer": "peer \xB7 session 1",
"mesh.joined2": "mara joined \xB7 +2",
"mesh.joined3": "tobi joined \xB7 +3",
"ice.title": "Network settings",
"ice.subtitle": "Configured locally - never shared with your peer",
"ice.intro": "SecureBit uses public STUN servers by default to negotiate the peer-to-peer link. Point it at your own STUN/TURN if you self-host.",
"ice.publicTitle": "Public servers (default)",
"ice.publicDesc": "Zero-config. Good for most users.",
"ice.customTitle": "My own STUN/TURN servers",
"ice.customDesc": "Up to {max} servers.",
"ice.turnNote": "A TURN relay sees both peers' IP and traffic timing - but never message contents, which stay end-to-end encrypted. Prefer ",
"ice.turnNoteTls": " (TLS).",
"ice.test": "Test servers",
"ice.testing": "Testing\u2026",
"ice.relayTitle": "Relay-only mode",
"ice.relayBadge": "MAX PRIVACY",
"ice.relayDesc": "Routes all traffic through TURN so your IP is never exposed to the peer. Requires a TURN server.",
"ice.relayWarning": "Relay-only is enabled but no TURN server is configured. The connection will not be able to start.",
"ice.persist": "Save on this device",
"ice.persistDesc": "Stored encrypted in this browser. Leave off to use only for this session.",
"ice.forget": "Forget saved",
"ice.cancel": "Cancel",
"ice.apply": "Apply",
"ice.errUnavailable": "WebRTC is not available in this browser",
"ice.errInvalid": "Invalid server configuration",
"update.title": "Update available",
"update.desc": "A newer version of SecureBit has been detected.",
"update.currentVersion": "Current version",
"update.newVersion": "New version",
"update.now": "Update now",
"update.later": "Later",
"update.unknown": "N/A",
"update.stepSaving": "Saving data...",
"update.stepSwCaches": "Clearing Service Worker caches...",
"update.stepSwUnregister": "Unregistering Service Workers...",
"update.stepBrowserCache": "Clearing browser cache...",
"update.stepVersion": "Updating version...",
"update.stepReload": "Reloading application...",
"update.error": "Update error. Please refresh the page manually (Ctrl+F5 or Cmd+Shift+R)",
"update.confirmSkip": "New version available. Update is recommended for security and stability. Continue without update?",
"offline.backOnline": "Back online",
"offline.mode": "Offline mode",
"offline.dismiss": "Dismiss",
"offline.lostTitle": "Connection lost",
"offline.lostDesc": "SecureBit is now in offline mode. Some features are limited, but your data stays safe.",
"offline.point1": "Your session and keys are preserved",
"offline.point2": "No data is stored on servers",
"offline.point3": "Messages & files sync when you reconnect",
"offline.continue": "Continue offline",
"offline.restoredTitle": "When you reconnect",
"offline.restoredDesc": "A dropped connection costs you nothing. SecureBit queues everything locally and resumes the encrypted session the instant you're back online.",
"offline.r1Title": "Your messages get delivered",
"offline.r1Desc": "Everything you wrote while offline is sent to your contact automatically.",
"offline.r2Title": "Files finish transferring",
"offline.r2Desc": "Uploads resume from where they stopped - no need to resend.",
"offline.r3Title": "Their messages & files arrive",
"offline.r3Desc": "Whatever your contact sent during the outage is delivered to you in order.",
"offline.r4Title": "Nothing is lost",
"offline.r4Desc": "After reconnect there's no gap - the conversation continues exactly where it paused.",
"offline.gotIt": "Got it",
"qr.showTitle": "Show QR code",
"qr.showSubtitle": "Full-screen \xB7 let your peer scan",
"qr.showSubtitleFrames": "Full-screen \xB7 let your peer scan all {frames} frames",
"notify.enabledBody": "Notifications enabled! You will receive alerts for new messages.",
"notify.workingBody": "Notifications are working! You will receive alerts for new messages.",
"pw.label": "Password input",
"pw.placeholder": "Enter password...",
"pw.decrypt": "Decrypt",
"pw.cancel": "Cancel",
"file.title": "File transfers",
"file.drop": "Drag & drop files here",
"file.dropHint": "Encrypted end-to-end before transfer \xB7 up to 100 MB",
"file.browse": "Browse device",
"file.incoming": "Incoming file request",
"file.accept": "Accept",
"file.reject": "Reject",
"file.download": "Download",
"file.notReady": "Connection not ready",
"file.tooLarge": "File too large",
"file.typeNotAllowed": "File type not allowed",
"file.maxConcurrent": "Maximum concurrent transfers",
"file.gone": "This file is no longer available for download.",
"call.incoming": "Incoming call",
"call.incomingVideo": "Incoming video call",
"call.encrypted": "Encrypted call",
"call.encryptedShort": "Encrypted",
"call.peer": "Secure peer",
"call.connecting": "Connecting\u2026",
"call.ringing": "Ringing\u2026",
"call.accept": "Accept",
"call.decline": "Decline",
"call.end": "End call",
"call.camera": "Camera",
"call.cameraOff": "Camera off",
"call.peerCameraOff": "Peer's camera is off",
"call.flipCamera": "Flip camera",
"call.addVideo": "Add video",
"call.video": "Video",
"call.muted": "Muted",
"call.expand": "Expand",
"call.minimize": "Minimize",
"call.quality": "Connection quality",
"call.qualityExcellent": "Excellent",
"call.videoPrefix": "Video \xB7 ",
"call.voicePrefix": "Voice \xB7 ",
"group.new": "New group",
"group.create": "Create group",
"group.join": "Join group",
"group.name": "Group name",
"group.nameTooLong": "The group name is too long.",
"group.capacity": "Up to {max} people, peer to peer. Everyone will compare one safety code before the group opens.",
"group.invite": "Invite",
"group.inviteMore": "Invite more members",
"group.invitePeople": "Invite {count} people",
"group.invitation": "Group invitation",
"group.addMembers": "Add members",
"group.roomFor": "Room for {remaining} more. Everyone will compare a new group code once they join.",
"group.membersCount": "{count} members",
"group.member": "Member",
"group.members": "Members",
"group.remove": "Remove {name}",
"group.message": "Message {name}",
"group.leave": "Leave",
"group.leaveThis": "Leave this group",
"group.cancel": "Cancel group",
"group.close": "Close",
"group.cancelBtn": "Cancel",
"group.decline": "Decline",
"group.working": "Working\u2026",
"group.sasTitle": "Group safety code",
"group.sasEveryone": "Everyone sees this code",
"group.sasCompare": "Compare the group code with every member to open this group.",
"group.sasReadAloud": "Read these digits aloud to ",
"group.sasWarning": "If even one member reads a different code, someone is sitting between you. Cancel the group - do not confirm.",
"group.confirmFirst": "Confirm the group code first",
"group.codeSuffix": " \xB7 code {code}",
"group.exchangingNonces": "Exchanging nonces\u2026",
"group.waitingCommit": "Waiting for every member to commit\u2026",
"group.waitingJoin": "Waiting for the other members to join\u2026",
"group.emptyChat": "Nothing here yet. Messages are signed by their sender and travel over each member's own encrypted link.",
"group.noVerified": "No verified chats yet. Open a 1:1 chat and compare its safety code first - a group is built out of connections you have already checked.",
"group.noMoreToAdd": "No other verified chats to add. Open a 1:1 chat and compare its safety code first.",
"group.directLink": "Direct peer-to-peer link",
"group.noDirectLink": "No direct link yet - messages are relayed by another member while one is being built",
"group.relayNote": "Some members have no direct link to you yet. Their messages travel through another member, who can see that you are talking but cannot read past the signature or change what you said. The group keeps trying to connect them directly.",
"group.relayOnlyOff": "Relay-only mode is off, so each member connects to you directly and learns your IP address - including members somebody else invited. Turn it on in network settings if that matters here.",
"group.memberOffline": "{name} is offline and will not receive messages. They are still a member - removing them re-keys the group.",
"group.joinNote": "Other members will learn your presence in this group. There is no message history to catch up on - a group starts empty.",
"group.inviteSentNote": "The group keeps working until they accept. There is no history for them to catch up on - they will only see what is sent from now on.",
"group.errNotCreated": "Group not created",
"group.errNobodyAccepted": "Nobody accepted the invitation in time.",
"group.errNothingSent": "Nothing was sent and nothing was verified. Close this and try again once everyone is connected.",
"group.errNotFormed": "This group could not be formed.",
"group.errFull": "This group is full.",
"group.errInviteFailed": "The invitation could not be sent - that chat is not connected.",
"group.errNoMemberList": "The group owner never sent the member list.",
"group.errUnsignedList": "The member list was not signed by the group owner. Do not retry - tell them.",
"group.errNotOwner": "Someone other than the group owner tried to change the members.",
"hdr.tagline": "End-to-end encrypted",
"hdr.netSettings": "Advanced network settings",
"hdr.netSettingsTitle": "Advanced network settings (STUN/TURN)",
"hdr.disconnect": "Disconnect",
"status.connected": "Connected",
"status.connecting": "Connecting...",
"status.notConnected": "Not connected",
"status.reconnecting": "Reconnecting...",
"status.retrying": "Retrying...",
"status.verifying": "Verifying...",
"status.peerDisconnected": "Peer disconnected",
"sec.replayProtection": "Replay Protection",
"sec.messageIntegrity": "Message Integrity (HMAC)",
"sec.forwardSecrecy": "Perfect Forward Secrecy",
"sec.metadataProtection": "Metadata Protection",
"sec.trafficObfuscation": "Traffic Obfuscation",
"sec.realTests": "Real Cryptographic Tests",
"sec.simulatedData": "Simulated Data",
"sec.testPassed": "Test passed",
"sec.testFailed": "Test failed or unavailable",
"sec.verificationDone": "Real cryptographic verification completed",
"sec.verificationInProgress": "Security verification in progress...",
"sec.verificationWait": "Security verification in progress...\nPlease wait for real-time cryptographic verification to complete.",
"sec.verificationUnavailable": "Security verification not available",
"chat.placeholder": "Type an encrypted message\u2026",
"chat.send": "Send message",
"chat.sendFiles": "Send files",
"chat.hideFiles": "Hide files",
"chat.recordVoice": "Record voice message",
"chat.sendVoice": "Send voice message",
"chat.discard": "Discard",
"chat.codeBlock": "Send as a code block (expands the input)",
"chat.codeHint": "Code snippet \xB7 formatting preserved \xB7 \u2318\u21B5 to send",
"chat.viewOnce": "View once",
"chat.viewOnceTitle": "View once - vanishes after the peer reads it",
"chat.viewOncePrefix": "View once \xB7 ",
"chat.viewOnceTap": "View once \xB7 tap to reveal",
"chat.viewedOnce": "Viewed once",
"chat.disappearing": "Disappearing message - deletes on both sides",
"chat.disappearAfter": "Disappear after",
"chat.visibleFor": "Visible for",
"chat.timerPrefix": "Timer \xB7 ",
"chat.expired": "This message has expired",
"chat.deleteForEveryone": "Delete for everyone",
"chat.sending": "Sending",
"chat.delivered": "Delivered",
"chat.notSent": "Not sent",
"chat.notSentReason": "Not sent - the secure channel is not ready. Reconnect to continue.",
"chat.encrypted": "Encrypted",
"chat.decrypted": "Decrypted",
"chat.encryptedOnDevice": "Encrypted on your device",
"chat.uploading": "Uploading",
"chat.downloading": "Downloading",
"chat.transferring": "Transferring\u2026",
"chat.copied": "Copied!",
"chat.collapse": "Collapse",
"chat.closeMenu": "Close menu",
"chat.newChat": "New chat",
"chat.newGroup": "New group",
"chat.createGroup": "Create a group",
"chat.groupChats": "Group chats",
"chat.secureChat": "Secure chat",
"chat.nameThis": "Name this chat",
"chat.rename": "Rename chat (local only)",
"chat.renameHint": "Double-click to rename",
"chat.localLabel": "Local label \xB7 stored only on this device",
"chat.setStatus": "Set your status",
"chat.yourStatusPrefix": "Your status - ",
"chat.meshHint": "Up to 8 peers \xB7 P2P mesh",
"chat.offline": "Offline",
"chat.noNetwork": "No network \xB7 reconnecting",
"chat.startVoiceCall": "Start encrypted voice call",
"chat.startVideoCall": "Start encrypted video call",
"chat.verifyForCalls": "Verify the session to enable calls",
"chat.e2eeNote": "Every message is end-to-end encrypted on your device before it leaves.",
"chat.peersOnly": "Sent end-to-end to connected peers only - never stored on a server.",
"flow.invitationCreated": "Secure invitation created",
"flow.invitationCreatedBang": "Secure invitation created and encrypted!",
"flow.responseCreated": "Secure response created",
"flow.responseCreatedBang": "Secure response created!",
"flow.sendInvitation": "Send the invitation code to your interlocutor via a secure channel (voice call, SMS, etc.).",
"flow.sendResponse": "Send the response code to the initiator via a secure channel or let them scan the QR code below.",
"flow.sendEncryptedCode": "Send the encrypted code",
"flow.sendTheResponse": "Send the response",
"flow.pasteOrWrite": "Paste or write code\u2026",
"flow.processingInvitation": "Processing the secure invitation...",
"flow.processingResponse": "Processing the secure response...",
"flow.finalizing": "Finalizing the secure connection...",
"flow.channelEstablished": "Secure channel established",
"flow.channelReady": "Secure channel is ready",
"flow.restoring": "Restoring connection\u2026",
"flow.invitationCaptured": "Invitation captured.",
"err.needInvitation": "You need to insert the invitation code from your interlocutor.",
"err.needResponse": "You need to insert the response code from your interlocutor.",
"err.responseFormat": "Invalid response format - please check the code",
"err.responseNoKey": "Invalid response code - missing or corrupted cryptographic key. Please check the code and try again.",
"err.responseNoSignKey": "Invalid response code - missing signature verification key. Please check the code and try again.",
"err.responseOutdated": "Response data is outdated - please use a fresh invitation",
"err.setupError": "Connection setup error",
"err.notReady": "Connection not ready",
"err.securityBreach": "Security breach detected - connection rejected",
"err.securityValidation": "Security validation failed - possible attack detected",
"err.retiredQr": "This QR code uses a retired format that could not transfer the invitation. Ask your peer to generate a new one, or use copy/paste.",
"err.compressedQrNote": "Compressed QR may omit SDP for brevity. Use copy/paste if connection fails.",
"err.inviteNotConnected": "The invitation could not be sent. That chat is not connected right now.",
"err.inviteNotConnectedRetry": "The invitation could not be sent. That chat is not connected right now - reopen it and try again.",
"err.nobodyAccepted": "Nobody accepted the invitation. The group is unchanged.",
"err.noAudio": "No audio captured - check microphone permission and try again.",
"err.voiceNeedsConnection": "Voice message needs an active secure connection. Reconnect and try again.",
"err.voiceRestoring": "Restoring the connection - try sending the voice message again in a moment.",
"err.fileTooLarge": "File too large",
"sas.safetyNumber": "Safety number",
"sas.incorrect": "Incorrect code. Check it with your peer and try again.",
"sas.noMatch": "The codes do not match",
"sas.makeSure": "Make sure the codes match exactly.",
"sas.tooManyAttempts": "Too many incorrect attempts. Session reset for safety.",
"sas.verificationFailed": "Verification failed",
"sas.verified": "Verified \xB7 Perfect Forward Secrecy",
"sas.runVerification": "Run security verification",
"sec.panelTitle": "Network & crypto details",
"sec.security": "Security",
"sec.transport": "Transport",
"sec.keyExchange": "Key exchange",
"sec.allEnabled": "All security features enabled by default",
"sec.realTimeNote": "Real-time verification using actual cryptographic functions - no mock data.",
"sec.simulatedWarning": "Warning: connection may not be fully established - values may be simulated.",
"dl.title": "Download SecureBit",
"dl.free": "Free \xB7 open source",
"dl.soon": "Mobile (iOS, Android) and browser extensions (Chrome, Firefox, Opera) are coming soon.",
"chatHdr.chat": "Chat",
"chatHdr.chats": "Chats",
"chatHdr.newChat": "+ New",
"chatHdr.secure": "Secure",
"chatHdr.p2pSub": "P2P \xB7 end-to-end encrypted",
"chatHdr.save": "Save",
"chatHdr.close": "Close",
"chatHdr.expand": "Expand",
"chatHdr.you": "You",
"chatHdr.qrCode": "QR code",
"chat.disconnected": "Disconnected",
"call.mute": "Mute",
"call.endShort": "End",
"group.add": "Add",
"group.send": "Send",
"sec.pfsShort": "Perfect Forward Secrecy",
"sec.cipher": "Cipher",
"chat.close": "Close",
"file.needConnection": "File transfer needs an open connection",
"presence.available": "Available",
"presence.away": "Away",
"presence.busy": "Busy",
"presence.offline": "Offline",
"presence.invisible": "Invisible",
"presence.availableDesc": "Online and reachable",
"presence.awayDesc": "Idle \xB7 stepped away",
"presence.busyDesc": "Do not disturb",
"presence.invisibleDesc": "Appear offline to peers",
"presence.online": "Online",
"conn.p2p": "P2P \xB7 connected",
"conn.verifying": "Verifying\u2026",
"conn.connecting": "Connecting\u2026",
"conn.reconnecting": "Reconnecting\u2026",
"conn.peerDisconnected": "Peer disconnected",
"conn.disconnected": "Disconnected",
"chat.defaultLabel": "Chat",
"groupPhase.forming": "Forming\u2026",
"groupPhase.commitments": "Exchanging commitments\u2026",
"groupPhase.revealing": "Revealing\u2026",
"groupPhase.compare": "Compare the group code",
"groupPhase.ready": "Group ready",
"groupPhase.failed": "Group failed",
"call.qualityGood": "Good",
"call.qualityFair": "Fair",
"call.qualityWeak": "Weak",
"msg.code": "Code",
"msg.timer": "Timer",
"msg.voice": "Voice",
"msg.play": "Play",
"msg.sent": "Sent",
"msg.read": "Read",
"report.title": "Real-time security verification",
"report.active": "Active",
"report.testsPassed": "Tests passed",
"report.verifiedAt": "Verified at",
"report.source": "Source",
"secTest.verifyECDHKeyExchange": "ECDH key exchange",
"secTest.verifyECDSASignatures": "ECDSA digital signatures",
"secTest.verifyEncryption": "AES-GCM encryption",
"secTest.verifyMessageIntegrity": "Message integrity",
"secTest.verifyPerfectForwardSecrecy": "Perfect forward secrecy",
"secTest.verifyPFS": "Perfect forward secrecy",
"secTest.verifyReplayProtection": "Replay protection",
"secTest.verifyDTLSFingerprint": "DTLS fingerprint",
"secTest.verifySASVerification": "SAS verification",
"secTest.verifyMetadataProtection": "Metadata protection",
"secTest.verifyTrafficObfuscation": "Traffic obfuscation",
"secTest.verifyPacketPadding": "Packet padding",
"secTest.verifyNestedEncryption": "Nested encryption",
"secTest.verifyNonExtractableKeys": "Non-extractable keys",
"secTest.verifyRateLimiting": "Rate limiting",
"secTest.verifyMutualAuth": "Mutual authentication",
"secTest.verifyAuthProof": "Authentication proof",
"secTest.verifyEnhancedValidation": "Enhanced validation",
"secTest.verifyAdvancedFeatures": "Advanced features",
"secTest.verifySignature": "Signature check",
"secDetail.Security system initializing...": "Security system initializing...",
"secDetail.Nested encryption active": "Nested encryption active",
"secDetail.Nested encryption failed": "Nested encryption failed",
"secDetail.Packet padding active": "Packet padding active",
"secDetail.Packet padding failed": "Packet padding failed",
"secDetail.Advanced features active": "Advanced features active",
"secDetail.Advanced features failed": "Advanced features failed",
"secDetail.No encryption key available": "No encryption key available",
"secDetail.AES-GCM encryption/decryption working correctly": "AES-GCM encryption/decryption working correctly",
"secDetail.No ECDH key pair available": "No ECDH key pair available",
"secDetail.Key derivation failed": "Key derivation failed",
"secDetail.No ECDSA key pair available": "No ECDSA key pair available",
"secDetail.ECDSA digital signatures working correctly": "ECDSA digital signatures working correctly",
"secDetail.MAC key not available or invalid": "MAC key not available or invalid",
"secDetail.Rate limiter did not block a message over the limit": "Rate limiter did not block a message over the limit",
"secDetail.Rate limiter is not available": "Rate limiter is not available",
"secDetail.Replay protection is working correctly": "Replay protection is working correctly",
"secDetail.Replay protection not enabled": "Replay protection not enabled",
"secDetail.SAS code not available": "SAS code not available",
"secDetail.SAS verification code is valid and available": "SAS verification code is valid and available",
"secDetail.Traffic obfuscation is working correctly": "Traffic obfuscation is working correctly",
"secDetail.Traffic obfuscation not enabled": "Traffic obfuscation not enabled",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "No non-extractable ephemeral ECDH key pair for this session",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation",
"msg.pause": "Pause",
"msg.failed": "Failed",
"groupErr.timeout": "A member stopped responding before the code was ready.",
"groupErr.keyMismatch": "A member's key did not match the identity claimed for it.",
"groupErr.revealMismatch": "A member's revealed value did not match what they committed to.",
"groupErr.commitChanged": "A member changed their commitment part-way through.",
"groupErr.missingKey": "A member was listed whose key never arrived.",
"groupErr.outsider": "A frame arrived from someone outside the group.",
"groupErr.limit": "A group is limited to eight members.",
"groupErr.tooLarge": "A message was too large to send to the group.",
"fileType.text": "Plain text",
"fileType.images": "Images",
"fileType.archives": "Archives",
"fileType.voice": "Voice messages",
"fileType.unsupported": "Unsupported",
"qrScan.title": "Scan QR Code",
"qrScan.auto": "Auto Mode",
"qrScan.reset": "Reset",
"qrScan.autoScroll": "Auto-scrolling enabled",
"qrScan.starting": "Starting camera...",
"qrScan.point": "Point camera at QR code",
"qrScan.tapFocus": "Tap screen to focus",
"qrScan.focusing": "Focusing...",
"iceErr.notArray": "Server list must be an array",
"iceErr.invalidJson": "Invalid JSON",
"iceErr.tooMany": "Too many servers (max {max})",
"iceErr.invalidEntry": "{label}: invalid entry",
"iceErr.urlCount": "{label}: between 1 and {max} URLs required",
"iceErr.turnCreds": "{label}: TURN servers usually require a username and credential",
"iceUrl.notString": "URL must be a string",
"iceUrl.empty": "URL is empty",
"iceUrl.tooLong": "URL is too long",
"iceUrl.badChars": "URL contains invalid characters",
"iceUrl.badScheme": "URL must start with stun:, stuns:, turn: or turns:",
"iceUrl.badQuery": "URL has an invalid query",
"iceUrl.noHost": "URL is missing a host",
"iceUrl.badHost": "URL has an invalid host or port",
"iceUrl.badTransport": "URL query must be transport=udp or transport=tcp",
"msg.off": "Off",
"file.consentUnavailable": "User consent unavailable",
"secLevel.MAXIMUM": "MAXIMUM",
"secLevel.INITIALIZING": "INITIALIZING",
"secLevel.ERROR": "ERROR",
"secLevel.UNKNOWN": "UNKNOWN",
"status.error": "Error",
"offline.disconnect": "Disconnect",
"offline.learnMore": "Learn more",
"pwa.installApp": "Install App",
"chat.onWeb": "You're on Web",
"groupCall.startVoice": "Start a group voice call",
"groupCall.startVideo": "Start a group video call",
"groupCall.join": "Join",
"groupCall.dismiss": "Not now",
"groupCall.leave": "Leave call",
"groupCall.you": "You",
"groupCall.connecting": "Connecting\u2026",
"groupCall.waitingLink": "Waiting for a direct link\u2026",
"groupCall.legFailed": "Could not connect",
"groupCall.startedVoice": "{name} started a voice call",
"groupCall.startedVideo": "{name} started a video call",
"groupCall.inCall": "{count} in the call",
"groupCall.err.permission_denied": "The call could not start - microphone and camera access is blocked. Allow it for this site, then try again.",
"groupCall.err.device_not_found": "The call could not start - no microphone was found on this device.",
"groupCall.err.device_busy": "The call could not start - your microphone is in use by another app. Close it and try again.",
"groupCall.err.media_failed": "The call could not start - the microphone could not be opened.",
"groupCall.err.call_in_progress": "A call is already running in this group. Join it instead of starting another.",
"groupCall.err.not_ready": "Confirm the group code before calling.",
"groupCall.speaking": "{name} is speaking",
"groupCall.pin": "Show {name} large",
"groupCall.unpin": "Back to everyone",
"groupCall.showEveryone": "Everyone",
"msg.after5s": "5s after reading",
"msg.after15s": "15s after reading",
"msg.after30s": "30s after reading",
"msg.after1m": "1m after reading",
"msg.sec30": "30 seconds",
"msg.min5": "5 minutes",
"msg.hour1": "1 hour",
"desktop.shareDesc": "Send the code to your peer. It is one-time and expires shortly.",
"desktop.invitationCreated": "Secure invitation created - send it to your peer.",
"desktop.joinDesc": "Paste your peer's invitation code to build your secure answer.",
"desktop.offerTag": "offer \xB7 copy text",
"desktop.answerTag": "answer \xB7 copy text",
"desktop.offerPlaceholder": "Invitation code will appear here\u2026",
"desktop.answerPlaceholder": "Response code will appear here\u2026",
"desktop.backToChats": "Back to chats",
"desktop.sendFeedback": "Send feedback",
"desktop.callsNeedVerified": "Calls require a verified secure channel.",
"desktop.noOpenChannel": "No open secure channel.",
"desktop.chatCarriesCall": "This chat is carrying a group call. Leave the group call before placing a 1:1 call.",
"desktop.err.permission_denied": "The call could not start - microphone and camera access is blocked. Allow it in system settings, then try again.",
"desktop.language": "Language",
"desktop.languageHint": "Applies at once. Messages already sent keep the words they were written in.",
"desktop.compareCode": "Compare the verification code with your peer and confirm if it matches.",
"desktop.verifyBeforeFiles": "Complete verification before sending files.",
"desktop.verifyBeforeSending": "Complete verification before sending messages.",
"desktop.disconnectedByBackend": "Connection securely disconnected.",
"desktop.restoreFailed": "Could not restore the connection. Closing this chat.",
"desktop.channelNotReady": "The data channel is not available yet. Wait for the connection to establish.",
"desktop.enterCode": "Enter the verification code to confirm.",
"desktop.noOffer": "No invitation found. Create one first.",
"desktop.notInitiator": "You did not create this connection, so there is no answer for you to apply.",
"desktop.decryptFailed": "A message could not be decrypted and was discarded.",
"desktop.badMessageFormat": "A malformed frame arrived and was discarded.",
"desktop.notSentNotReady": "Message not sent: the secure channel is not ready. Wait for verification to finish, or reconnect.",
"desktop.micDenied": "Microphone access was denied.",
"desktop.noChannelWait": "No open secure channel - wait for the connection to establish.",
"desktop.sasFailed": "Verification failed. A machine-in-the-middle may be present, so the connection was aborted.",
"desktop.sasOk": "Verification succeeded. This channel is authenticated end to end.",
"desktop.iceForgotten": "Saved servers forgotten. Using public ICE servers.",
"desktop.icePublic": "Using public ICE servers.",
"desktop.verificationInProgress": "Security verification is still running. Wait for it to finish.",
"desktop.fileGone": "This file is no longer available for download.",
"desktop.codeMismatch": "The verification codes do not match. Disconnecting for safety.",
"desktop.noLocalCode": "Verification failed: there is no locally derived code to compare against. Disconnecting for safety.",
"desktop.protocolViolation": "The peer claimed the code was confirmed before you confirmed it. Disconnecting for safety.",
"desktop.verificationRejected": "Verification rejected. The connection was aborted for safety.",
"secLevel.HIGH": "HIGH",
"secLevel.MEDIUM": "MEDIUM",
"secLevel.LOW": "LOW",
"desktop.rerun": "Re-run",
"desktop.ice.customDesc": "Up to {max} servers, one URL per line or JSON.",
"desktop.ice.persistDesc": "Stored locally on this device. Leave off to use only for this session.",
"desktop.group.leaveNote": "The other members are told you left. Nothing about this group is kept on this device afterwards - there is no server holding a copy to rejoin from, so you would need a fresh invitation.",
"desktop.sec.ecdsaOk": "Peer key package signature verified during the handshake (ECDSA P-384 / SHA-384)",
"desktop.sec.ecdsaNone": "No completed handshake",
"desktop.sec.ecdhOk": "Session keys derived from an ephemeral ECDH P-384 exchange via HKDF-SHA-256",
"desktop.sec.ecdhNone": "No session keys derived",
"desktop.sec.encryptionOk": "AES-GCM encryption and decryption verified inside the core",
"desktop.sec.encryptionNa": "The AES-GCM self-test could not be run",
"desktop.sec.integrityOk": "Message integrity verified (AES-GCM authentication)",
"desktop.sec.integrityNa": "The integrity self-test could not be run",
"desktop.sec.pfsOk": "Double Ratchet active - every message has a key of its own",
"desktop.sec.pfsNa": "Not measured",
"desktop.sec.replayOk": "Ratchet message keys are destroyed once used, so a captured frame cannot be replayed",
"desktop.sec.replayNa": "Not measured",
"desktop.sec.dtlsPinned": "Peer DTLS fingerprint pinned: {fp}",
"desktop.sec.dtlsNone": "No remote DTLS fingerprint available",
"desktop.sec.sasBoth": "Both peers confirmed the out-of-band safety code",
"desktop.sec.sasIncomplete": "The safety code has not been confirmed by both peers",
"desktop.sec.metadataOk": "A dedicated metadata key was derived (HKDF metadata-protection-v4)",
"desktop.sec.metadataNone": "No metadata key",
"desktop.sec.coverOn": "Cover traffic active: random fake frames (32-128 B every 15-30 s) on the ratcheted channel",
"desktop.sec.coverOff": "The cover traffic generator is not running",
"desktop.sec.coverUnsupported": "Cover traffic needs a Double Ratchet session (the peer is on an older release)",
"desktop.tagline": "End-to-end freedom"
},
"de": {
"language.label": "Sprache",
"language.suggest.text": "Diese Seite gibt es auch auf Deutsch.",
"language.suggest.cta": "Auf Deutsch lesen",
"language.suggest.dismiss": "Schlie\xDFen",
"community.title": "Gestalten Sie die Zukunft der Privatsph\xE4re mit",
"community.description": "SecureBit w\xE4chst durch seine Community. Ihre Ideen und Ihr Feedback pr\xE4gen die Zukunft sicherer Kommunikation - offen entwickelt, mit vollst\xE4ndiger ASN.1-Validierung von Ende zu Ende.",
"community.github": "GitHub-Repository",
"community.feedback": "Feedback",
"unique.eyebrow": "Was uns unterscheidet",
"unique.heading": "Warum SecureBit einzigartig ist",
"unique.s1.titleTop": "Mehrschichtiger",
"unique.s1.titleBottom": "Verschl\xFCsselungskern",
"unique.s1.collapsed": "Verschl\xFCsselungskern",
"unique.s1.desc": "ECDH-P-384-Schl\xFCsselaustausch, AES-256-GCM-Nutzdaten, ECDSA-Signaturen und vollst\xE4ndige ASN.1-Validierung - zu einer geh\xE4rteten Pipeline verbunden.",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "Reines P2P",
"unique.s2.titleBottom": "\xFCber WebRTC",
"unique.s2.collapsed": "Reines P2P \xFCber WebRTC",
"unique.s2.desc": "Nachrichten laufen \xFCber WebRTC direkt von Ger\xE4t zu Ger\xE4t. Kein Relay h\xE4lt Ihre Daten - der Server hilft zwei Teilnehmern nur, sich zu finden.",
"unique.s2.tags": [
"DTLS 1.3",
"Kein Relay"
],
"unique.s3.titleTop": "Perfekte",
"unique.s3.titleBottom": "Forward Secrecy",
"unique.s3.collapsed": "Forward Secrecy",
"unique.s3.desc": "Sitzungsschl\xFCssel wechseln fortlaufend und werden nach Gebrauch verworfen. Ein einzelner kompromittierter Schl\xFCssel \xF6ffnet damit niemals fr\xFChere Gespr\xE4che.",
"unique.s3.tags": [
"Ephemere Schl\xFCssel",
"Automatischer Wechsel"
],
"unique.s4.titleTop": "Verschleierung",
"unique.s4.titleBottom": "des Datenverkehrs",
"unique.s4.collapsed": "Verkehrsverschleierung",
"unique.s4.desc": "Paketgr\xF6\xDFen und Zeitabst\xE4nde werden aufgef\xFCllt und zuf\xE4llig ver\xE4ndert. Metadatenmuster bleiben damit verborgen, auch f\xFCr jemanden, der die Leitung beobachtet.",
"unique.s4.tags": [
"Paket-Padding",
"Zeit-Jitter"
],
"unique.s5.titleTop": "Keinerlei",
"unique.s5.titleBottom": "Datenerfassung",
"unique.s5.collapsed": "Keine Datenerfassung",
"unique.s5.desc": "Keine Konten, keine Protokolle, keine gespeicherten Nachrichten. Auf einem Server liegt nichts, was durchsickern, beschlagnahmt oder verkauft werden k\xF6nnte.",
"unique.s5.tags": [
"Keine Konten",
"Keine Protokolle"
],
"partners.eyebrow": "Partner & \xD6kosystem",
"partners.heading": "Unsere Partner vertrauen uns",
"partners.aegis.desc": "Kapitalpartner, der vertrauliche Finanzkommunikation \xFCber sein gesamtes Portfolio absichert.",
"partners.aegis.role": "Strategischer Investor",
"partners.furilabs.desc": "Linux-Telefone mit Fokus auf Privatsph\xE4re, die SecureBit als sicheren Standardkanal mitliefern.",
"partners.furilabs.role": "Technologiepartner",
"partners.inviteTitle": "Partner werden",
"partners.inviteDesc": "Sie bauen Hardware oder Infrastruktur f\xFCr Privatsph\xE4re? Lassen Sie uns SecureBit integrieren.",
"partners.inviteCta": "Gespr\xE4ch beginnen",
"roadmap.eyebrow": "Entwicklungs-Roadmap",
"roadmap.heading": "Die Entwicklung von SecureBit",
"roadmap.subheading": "Vom ersten Prototyp zu einem quantensicheren, dezentralen Netzwerk - mit vollst\xE4ndiger ASN.1-Validierung auf jeder Ebene.",
"roadmap.progress": "{shipped} von {total} Meilensteinen erreicht",
"roadmap.upcoming": "{upcoming} in Arbeit",
"roadmap.keyFeatures": "Kernfunktionen",
"roadmap.status.released": "Ver\xF6ffentlicht",
"roadmap.status.current": "Aktuell",
"roadmap.status.dev": "In Entwicklung",
"roadmap.status.planned": "Geplant",
"roadmap.status.research": "Forschung",
"hero.headlineTop": "Eine direkte Leitung,",
"hero.headlineBottom": "die nur Sie beide lesen k\xF6nnen.",
"hero.subheading": "Die Schl\xFCssel entstehen auf Ihrem Ger\xE4t und werden direkt zwischen den Ger\xE4ten ausgetauscht. Keine Konten, keine Server, die Ihre Nachrichten speichern.",
"hero.diagramAlt": "Eine direkte verschl\xFCsselte Leitung zu einem Teilnehmer, zu der zwei weitere Teilnehmer hinzusto\xDFen",
"intro.createTitle": "Neuen Kanal erstellen",
"intro.createDesc": "Ihr Ger\xE4t erzeugt die Schl\xFCssel und eine einmalige Einladung. Nichts davon ber\xFChrt einen Server.",
"intro.createCta": "Schl\xFCssel & Einladung erzeugen",
"intro.joinTitle": "Kanal beitreten",
"intro.scanTitle": "QR-Code mit der Kamera scannen",
"intro.scanSubtitle": "Am schnellsten - auf den Bildschirm Ihres Gegen\xFCbers halten",
"intro.orPasteCode": "oder Code einf\xFCgen",
"intro.pastePlaceholder": "Einladungscode hier einf\xFCgen \u2026",
"intro.connect": "Verbinden",
"intro.connecting": "Wird verarbeitet \u2026",
"roadmap.r1.title": "Entwicklungsbeginn",
"roadmap.r1.sub": "Idee, Prototyp und Aufbau der Infrastruktur",
"roadmap.r1.date": "Anfang 2025",
"roadmap.r1.features": [
"Konzept und Anforderungen festgelegt",
"Auswahl des Stacks: WebRTC, P2P, Kryptografie",
"Erste Messaging-Prototypen",
"Repository und CI eingerichtet",
"Grundlegende Verschl\xFCsselungsarchitektur",
"UX/UI-Design"
],
"roadmap.r2.title": "Alpha-Release",
"roadmap.r2.sub": "Erste \xF6ffentliche Alpha: einfacher Chat und Schl\xFCsselaustausch",
"roadmap.r2.date": "Fr\xFChjahr 2025",
"roadmap.r2.features": [
"Einfaches P2P-Messaging \xFCber WebRTC",
"Einfache Ende-zu-Ende-Verschl\xFCsselung (Demoverfahren)",
"Stabiles Signalling und Wiederverbindung",
"Minimale Oberfl\xE4che zum Testen",
"R\xFCckmeldungen der ersten Tester"
],
"roadmap.r3.title": "Sicherheit geh\xE4rtet",
"roadmap.r3.sub": "Sicherheit gest\xE4rkt, stabiler Zweig ver\xF6ffentlicht",
"roadmap.r3.date": "Sommer 2025",
"roadmap.r3.features": [
"ECDH/ECDSA im Produktivbetrieb",
"Perfect Forward Secrecy und Schl\xFCsselwechsel",
"Verbesserte Authentifizierungspr\xFCfungen",
"Dateiverschl\xFCsselung und \xDCbertragung gro\xDFer Nutzdaten",
"Pr\xFCfung der grundlegenden Kryptoabl\xE4ufe"
],
"roadmap.r4.title": "Skalierung & Stabilit\xE4t",
"roadmap.r4.sub": "Skalierung des Netzwerks und mehr Stabilit\xE4t",
"roadmap.r4.date": "Herbst 2025",
"roadmap.r4.features": [
"Optimierte P2P-Verbindungen und NAT-Traversal",
"Wiederverbindung und Nachrichtenwarteschlangen",
"Geringerer Akkuverbrauch auf Mobilger\xE4ten",
"Synchronisierung \xFCber mehrere Ger\xE4te",
"Monitoring- und Logging-Werkzeuge f\xFCr Entwickler"
],
"roadmap.r5.title": "Privatsph\xE4re zuerst",
"roadmap.r5.sub": "Schwerpunkt Privatsph\xE4re: Metadaten minimieren",
"roadmap.r5.date": "Winter 2025",
"roadmap.r5.features": [
"Metadatenschutz und weniger Fingerprinting",
"Experimente mit Onion-Routing und DHT",
"Optionen f\xFCr anonyme Verbindungen",
"Vorbereitung des offenen Code-Audits",
"Verbesserte Verifizierung der Teilnehmer"
],
"roadmap.r6.title": "Enhanced Security Edition",
"roadmap.r6.sub": "18-schichtige Kryptografie auf milit\xE4rischem Niveau mit vollst\xE4ndiger ASN.1-Validierung",
"roadmap.r6.date": "Ende 2025",
"roadmap.r6.features": [
"Dreifache Absicherung: ECDH + DTLS + SAS",
"Verschl\xFCsselung mit ECDH P-384 und AES-GCM 256 Bit",
"Pr\xFCfung des DTLS-Fingerabdrucks",
"SAS-Verifizierung (Short Authentication String)",
"Perfect Forward Secrecy mit Schl\xFCsselwechsel",
"Verst\xE4rkter Schutz vor Man-in-the-Middle-Angriffen",
"Vollst\xE4ndige ASN.1-DER-Validierung",
"Pr\xFCfung von OID und EC-Punkten",
"Validierung der SPKI-Struktur",
"P2P-WebRTC-Architektur",
"Metadatenschutz",
"Zu 100 % quelloffener Code"
],
"roadmap.r7.title": "Desktop Edition",
"roadmap.r7.sub": "Native Desktop-Apps f\xFCr Windows, macOS und Linux",
"roadmap.r7.date": "Anfang 2026",
"roadmap.r7.features": [
"Windows-Desktop-App (Tauri v2)",
"macOS-Desktop-App (Tauri v2)",
"Linux-AppImage (Tauri v2)",
"Benachrichtigungen in Echtzeit",
"Automatische Wiederverbindung",
"Synchronisierung \xFCber Ger\xE4te hinweg",
"\xDCberarbeitete Oberfl\xE4che",
"Dateien bis 100 MB"
],
"roadmap.r8.title": "Sichere Sprache & Anrufe",
"roadmap.r8.sub": "Verschl\xFCsselte Sprachnachrichten, Audio- und Videoanrufe",
"roadmap.r8.date": "Anfang 2026",
"roadmap.r8.features": [
"Ende-zu-Ende-verschl\xFCsselte Sprachnachrichten",
"Verschl\xFCsselte Audioanrufe zu zweit (WebRTC)",
"Verschl\xFCsselte Videoanrufe zu zweit (WebRTC)",
"Perfect Forward Secrecy f\xFCr laufende Medien",
"Medienstr\xF6me \xFCber SRTP/DTLS gesch\xFCtzt",
"SAS-Verifizierung w\xE4hrend des Anrufs",
"Anrufbenachrichtigungen und automatische Wiederverbindung",
"P2P-Medien mit geringer Latenz"
],
"roadmap.r9.title": "Gruppenkommunikation",
"roadmap.r9.sub": "Gruppenchats ohne Verlust der Privatsph\xE4re",
"roadmap.r9.date": "Jetzt",
"roadmap.r9.features": [
"P2P-Gruppenchats mit bis zu 8 Teilnehmenden",
"Mesh-Zustellung mit signiertem Relay als R\xFCckfallebene",
"Ein Sicherheitscode f\xFCr die Gruppe, den alle vergleichen",
"Commit-then-Reveal-Verfahren gegen das Erraten von Codes",
"Gruppeneigene Identit\xE4tsschl\xFCssel, bewusst kurzlebig",
"Signierte Mitgliedschaft mit Epochenreihenfolge",
"Signierte Nachrichten - ein abweichender Verlauf ist damit beweisbar",
"Kein Server, kein gemeinsamer Gruppenschl\xFCssel, kein Verlauf"
],
"roadmap.r10.title": "Mobile Edition",
"roadmap.r10.sub": "Native Apps f\xFCr iOS und Android",
"roadmap.r10.date": "Q2 2027",
"roadmap.r10.features": [
"Native iOS-App (Swift/SwiftUI)",
"Native Android-App (Kotlin/Jetpack Compose)",
"PWA-Unterst\xFCtzung f\xFCr mobile Browser",
"Push-Benachrichtigungen in Echtzeit",
"Optimierter Akkuverbrauch",
"F\xFCr Mobilger\xE4te optimierte Oberfl\xE4che",
"Nachrichtenwarteschlange offline",
"Biometrische Anmeldung"
],
"roadmap.r11.title": "Quantensichere Edition",
"roadmap.r11.sub": "Schutz vor Quantencomputern",
"roadmap.r11.date": "Q4 2027",
"roadmap.r11.features": [
"Post-Quanten-Kryptografie CRYSTALS-Kyber",
"Digitale Signaturen mit SPHINCS+",
"Hybridverfahren: klassisch + Post-Quanten",
"Quantensicherer Schl\xFCsselaustausch",
"Aktualisierte Hash-Algorithmen",
"Migration bestehender Sitzungen",
"Kompatibilit\xE4t mit v5.x",
"Quantenresistente Protokolle"
],
"roadmap.r12.title": "Dezentrales Netzwerk",
"roadmap.r12.sub": "Vollst\xE4ndig dezentrales Netzwerk",
"roadmap.r12.date": "2028",
"roadmap.r12.features": [
"Mesh-Netzwerk aus Knoten",
"DHT zum Auffinden von Teilnehmern",
"Eingebautes Onion-Routing",
"Tokenomics und Anreize f\xFCr Knotenbetreiber",
"Steuerung \xFCber eine DAO",
"Zusammenspiel mit anderen Netzwerken",
"Plattform\xFCbergreifende Kompatibilit\xE4t",
"Selbstheilendes Netzwerk"
],
"roadmap.r13.title": "KI-Assistent f\xFCr Privatsph\xE4re",
"roadmap.r13.sub": "KI f\xFCr Privatsph\xE4re und Sicherheit",
"roadmap.r13.date": "2028+",
"roadmap.r13.features": [
"Lokale KI-Bedrohungsanalyse",
"Automatische MITM-Erkennung",
"Adaptive Kryptografie",
"Pers\xF6nliche Sicherheitsempfehlungen",
"Maschinelles Lernen ohne Wissenspreisgabe",
"Privater KI-Assistent",
"Vorausschauende Sicherheit",
"Autonomer Angriffsschutz"
],
"handshake.step1": "ECDH-P-384-Schl\xFCsselpaar wird erzeugt",
"handshake.step2": "Verifizierungscode wird abgeleitet",
"handshake.step3": "Perfect Forward Secrecy wird festgelegt",
"handshake.securingTitle": "Ihr Kanal wird abgesichert",
"handshake.answerTitle": "Ihre Antwort wird erstellt",
"handshake.securingDesc": "Es entstehen Schl\xFCssel, die Manipulation standhalten.",
"handshake.shareTitle": "Teilen Sie Ihre Einladung",
"handshake.sendAnswerTitle": "Senden Sie Ihre Antwort zur\xFCck",
"handshake.shareDesc": "Zeigen Sie den QR-Code oder senden Sie den Code an Ihr Gegen\xFCber. Er gilt einmalig und l\xE4uft bald ab.",
"handshake.sendAnswerDesc": "Geben Sie diese Antwort dem Ersteller des Kanals, damit er den Handschlag abschlie\xDFen kann.",
"handshake.establish": "Verbindung herstellen",
"handshake.thenReceive": "Nehmen Sie danach die Antwort Ihres Gegen\xFCbers entgegen",
"handshake.pasteAnswerPlaceholder": "Antwortcode des Gegen\xFCbers einf\xFCgen \u2026",
"handshake.answerSentNote": "Senden Sie diese Antwort an den Ersteller und warten Sie - der Chat \xF6ffnet sich, sobald er sich verbindet.",
"handshake.qrHint": "Lassen Sie dies ge\xF6ffnet, bis Ihr Gegen\xFCber den Code erfasst hat.",
"handshake.qrHintFrames": "Der Handschlag ist auf {frames} Einzelbilder verteilt - lassen Sie dies ge\xF6ffnet, bis Ihr Gegen\xFCber alle erfasst hat.",
"verify.title": "Sicherheitspr\xFCfung",
"verify.desc": "Vergleichen Sie diesen Sicherheitscode \xFCber einen anderen Weg mit Ihrem Gegen\xFCber (Anruf oder pers\xF6nlich) und geben Sie ihn dann ein, um den Chat freizuschalten.",
"verify.enterLabel": "Gepr\xFCften Code eingeben",
"verify.placeholder": "Code hier eingeben",
"verify.confirm": "Code best\xE4tigen",
"verify.confirmed": "Best\xE4tigt",
"verify.mismatch": "Stimmt nicht \xFCberein",
"verify.yours": "Ihre Best\xE4tigung",
"verify.peer": "Best\xE4tigung des Gegen\xFCbers",
"verify.pending": "Ausstehend",
"verify.waiting": "Warten auf den Code \u2026",
"verify.verified": "Kanal gepr\xFCft",
"verify.bothConfirmed": "Beide Seiten haben best\xE4tigt. Der sichere Chat wird ge\xF6ffnet \u2026",
"pwa.bannerTitle": "SecureBit.chat installieren",
"pwa.bannerDesc": "Die App-Erfahrung mit zus\xE4tzlicher Sicherheit",
"pwa.install": "Installieren",
"pwa.dismiss": "Schlie\xDFen",
"pwa.close": "Schlie\xDFen",
"pwa.iosTitle": "Auf iOS installieren",
"pwa.iosStep1": "Auf \u201ETeilen\u201C tippen",
"pwa.iosStep1Hint": "Meist unten in Safari",
"pwa.iosStep2": "\u201EZum Home-Bildschirm\u201C suchen",
"pwa.iosStep2Hint": "Im Teilen-Men\xFC nach unten scrollen",
"pwa.iosStep3": "Auf \u201EHinzuf\xFCgen\u201C tippen",
"pwa.iosStep3Hint": "Best\xE4tigen, um SecureBit.chat zu installieren",
"pwa.genericTitle": "SecureBit installieren",
"pwa.genericDesc": "Jeder Browser installiert auf seine eigene Weise. W\xE4hlen Sie die Schritte, die zu Ihrem passen.",
"pwa.gotIt": "Verstanden",
"pwa.installedTitle": "App installiert!",
"pwa.installedIos": "iOS-App installiert! Vom Home-Bildschirm \xF6ffnen.",
"pwa.installedGeneric": "SecureBit.chat ist jetzt auf Ihrem Ger\xE4t",
"pwa.anytimeTitle": "Jederzeit installierbar",
"pwa.anytimeDesc": "Sie k\xF6nnen SecureBit.chat jederzeit \xFCber das Browsermen\xFC installieren - so l\xE4uft es am besten.",
"pwa.ok": "OK",
"step.open": "Schritt 1 \xB7 Kanal \xF6ffnen",
"step.exchange": "Schritt 2 \xB7 Austausch",
"step.verification": "Schritt 3 \xB7 Pr\xFCfung",
"action.create": "Erstellen",
"action.join": "Beitreten",
"action.back": "Zur\xFCck",
"action.copy": "Kopieren",
"action.copied": "Kopiert",
"action.scan": "Scannen",
"action.downloadDesktop": "Desktop-App laden",
"action.advancedSettings": "Erweiterte Einstellungen",
"cred.offerTag": "Angebot \xB7 oder Text kopieren",
"cred.answerTag": "Antwort \xB7 oder Text kopieren",
"cred.reveal": "Zum Anzeigen klicken - halten Sie diesen Code geheim",
"qr.title": "QR-Code scannen",
"qr.subtitle": "Richten Sie die Kamera auf den QR-Code",
"qr.scanning": "Wird gescannt \u2026",
"qr.hint": "Ruhig halten, bis alle Teile erfasst sind. Der Kamerazugriff bleibt lokal - nichts wird hochgeladen.",
"mesh.you": "Sie",
"mesh.peer": "Gegen\xFCber \xB7 Sitzung 1",
"mesh.joined2": "lena ist dabei \xB7 +2",
"mesh.joined3": "jonas ist dabei \xB7 +3",
"ice.title": "Netzwerkeinstellungen",
"ice.subtitle": "Lokal eingestellt - wird nie an Ihr Gegen\xFCber weitergegeben",
"ice.intro": "SecureBit nutzt standardm\xE4\xDFig \xF6ffentliche STUN-Server, um die direkte Verbindung auszuhandeln. Wenn Sie selbst hosten, tragen Sie Ihre eigenen STUN/TURN-Server ein.",
"ice.publicTitle": "\xD6ffentliche Server (Standard)",
"ice.publicDesc": "Ohne Einrichtung. F\xFCr die meisten passend.",
"ice.customTitle": "Eigene STUN/TURN-Server",
"ice.customDesc": "Bis zu {max} Server.",
"ice.turnNote": "Ein TURN-Relay sieht die IP-Adressen beider Seiten und das Timing des Verkehrs - nie aber die Inhalte, die Ende-zu-Ende verschl\xFCsselt bleiben. Bevorzugen Sie ",
"ice.turnNoteTls": " (TLS).",
"ice.test": "Server testen",
"ice.testing": "Wird getestet \u2026",
"ice.relayTitle": "Nur-Relay-Modus",
"ice.relayBadge": "MAXIMALE PRIVATSPH\xC4RE",
"ice.relayDesc": "Leitet den gesamten Verkehr \xFCber TURN, damit Ihr Gegen\xFCber Ihre IP nie zu sehen bekommt. Erfordert einen TURN-Server.",
"ice.relayWarning": "Nur-Relay ist aktiv, aber es ist kein TURN-Server eingetragen. Die Verbindung kann so nicht zustande kommen.",
"ice.persist": "Auf diesem Ger\xE4t speichern",
"ice.persistDesc": "Verschl\xFCsselt in diesem Browser abgelegt. Ausgeschaltet gilt die Einstellung nur f\xFCr diese Sitzung.",
"ice.forget": "Gespeichertes l\xF6schen",
"ice.cancel": "Abbrechen",
"ice.apply": "\xDCbernehmen",
"ice.errUnavailable": "WebRTC steht in diesem Browser nicht zur Verf\xFCgung",
"ice.errInvalid": "Ung\xFCltige Serverkonfiguration",
"update.title": "Update verf\xFCgbar",
"update.desc": "Es wurde eine neuere Version von SecureBit gefunden.",
"update.currentVersion": "Aktuelle Version",
"update.newVersion": "Neue Version",
"update.now": "Jetzt aktualisieren",
"update.later": "Sp\xE4ter",
"update.unknown": "k. A.",
"update.stepSaving": "Daten werden gesichert \u2026",
"update.stepSwCaches": "Service-Worker-Caches werden geleert \u2026",
"update.stepSwUnregister": "Service Worker werden abgemeldet \u2026",
"update.stepBrowserCache": "Browser-Cache wird geleert \u2026",
"update.stepVersion": "Version wird aktualisiert \u2026",
"update.stepReload": "Anwendung wird neu geladen \u2026",
"update.error": "Fehler beim Update. Bitte laden Sie die Seite manuell neu (Strg+F5 oder Cmd+Umschalt+R)",
"update.confirmSkip": "Eine neue Version ist verf\xFCgbar. Ein Update wird f\xFCr Sicherheit und Stabilit\xE4t empfohlen. Ohne Update fortfahren?",
"offline.backOnline": "Wieder online",
"offline.mode": "Offline-Modus",
"offline.dismiss": "Schlie\xDFen",
"offline.lostTitle": "Verbindung verloren",
"offline.lostDesc": "SecureBit l\xE4uft jetzt offline. Einiges ist eingeschr\xE4nkt, Ihre Daten bleiben aber sicher.",
"offline.point1": "Ihre Sitzung und die Schl\xFCssel bleiben erhalten",
"offline.point2": "Es liegen keine Daten auf Servern",
"offline.point3": "Nachrichten und Dateien gleichen sich nach der Wiederverbindung ab",
"offline.continue": "Offline fortfahren",
"offline.restoredTitle": "Wenn Sie wieder verbunden sind",
"offline.restoredDesc": "Ein Verbindungsabbruch kostet Sie nichts. SecureBit sammelt alles lokal und setzt die verschl\xFCsselte Sitzung fort, sobald Sie wieder online sind.",
"offline.r1Title": "Ihre Nachrichten kommen an",
"offline.r1Desc": "Alles, was Sie offline geschrieben haben, geht automatisch an Ihr Gegen\xFCber.",
"offline.r2Title": "Dateien werden zu Ende \xFCbertragen",
"offline.r2Desc": "\xDCbertragungen setzen dort fort, wo sie stehen geblieben sind - nichts muss erneut gesendet werden.",
"offline.r3Title": "Ihre Nachrichten und Dateien treffen ein",
"offline.r3Desc": "Was Ihr Gegen\xFCber w\xE4hrend der St\xF6rung gesendet hat, erreicht Sie der Reihe nach.",
"offline.r4Title": "Nichts geht verloren",
"offline.r4Desc": "Nach der Wiederverbindung bleibt keine L\xFCcke - das Gespr\xE4ch l\xE4uft genau dort weiter, wo es angehalten hat.",
"offline.gotIt": "Verstanden",
"qr.showTitle": "QR-Code anzeigen",
"qr.showSubtitle": "Vollbild \xB7 vom Gegen\xFCber scannen lassen",
"qr.showSubtitleFrames": "Vollbild \xB7 alle {frames} Einzelbilder vom Gegen\xFCber scannen lassen",
"notify.enabledBody": "Benachrichtigungen sind aktiv. Sie werden \xFCber neue Nachrichten informiert.",
"notify.workingBody": "Benachrichtigungen funktionieren. Sie werden \xFCber neue Nachrichten informiert.",
"pw.label": "Passworteingabe",
"pw.placeholder": "Passwort eingeben \u2026",
"pw.decrypt": "Entschl\xFCsseln",
"pw.cancel": "Abbrechen",
"file.title": "Datei\xFCbertragungen",
"file.drop": "Dateien hierher ziehen",
"file.dropHint": "Vor der \xDCbertragung Ende-zu-Ende verschl\xFCsselt \xB7 bis 100 MB",
"file.browse": "Ger\xE4t durchsuchen",
"file.incoming": "Eingehende Dateianfrage",
"file.accept": "Annehmen",
"file.reject": "Ablehnen",
"file.download": "Herunterladen",
"file.notReady": "Verbindung noch nicht bereit",
"file.tooLarge": "Datei zu gro\xDF",
"file.typeNotAllowed": "Dateityp nicht erlaubt",
"file.maxConcurrent": "H\xF6chstzahl gleichzeitiger \xDCbertragungen erreicht",
"file.gone": "Diese Datei steht nicht mehr zum Herunterladen bereit.",
"call.incoming": "Eingehender Anruf",
"call.incomingVideo": "Eingehender Videoanruf",
"call.encrypted": "Verschl\xFCsselter Anruf",
"call.encryptedShort": "Verschl\xFCsselt",
"call.peer": "Sicheres Gegen\xFCber",
"call.connecting": "Verbindung wird aufgebaut \u2026",
"call.ringing": "Es klingelt \u2026",
"call.accept": "Annehmen",
"call.decline": "Ablehnen",
"call.end": "Auflegen",
"call.camera": "Kamera",
"call.cameraOff": "Kamera aus",
"call.peerCameraOff": "Die Kamera des Gegen\xFCbers ist aus",
"call.flipCamera": "Kamera wechseln",
"call.addVideo": "Video hinzuf\xFCgen",
"call.video": "Video",
"call.muted": "Stumm",
"call.expand": "Vergr\xF6\xDFern",
"call.minimize": "Verkleinern",
"call.quality": "Verbindungsqualit\xE4t",
"call.qualityExcellent": "Ausgezeichnet",
"call.videoPrefix": "Video \xB7 ",
"call.voicePrefix": "Sprache \xB7 ",
"group.new": "Neue Gruppe",
"group.create": "Gruppe erstellen",
"group.join": "Gruppe beitreten",
"group.name": "Gruppenname",
"group.nameTooLong": "Der Gruppenname ist zu lang.",
"group.capacity": "Bis zu {max} Personen, direkt von Ger\xE4t zu Ger\xE4t. Alle vergleichen einen Sicherheitscode, bevor die Gruppe \xF6ffnet.",
"group.invite": "Einladen",
"group.inviteMore": "Weitere Mitglieder einladen",
"group.invitePeople": "{count} Personen einladen",
"group.invitation": "Gruppeneinladung",
"group.addMembers": "Mitglieder hinzuf\xFCgen",
"group.roomFor": "Platz f\xFCr {remaining} weitere. Nach dem Beitritt vergleichen alle einen neuen Gruppencode.",
"group.membersCount": "{count} Mitglieder",
"group.member": "Mitglied",
"group.members": "Mitglieder",
"group.remove": "{name} entfernen",
"group.message": "Nachricht an {name}",
"group.leave": "Verlassen",
"group.leaveThis": "Diese Gruppe verlassen",
"group.cancel": "Gruppe abbrechen",
"group.close": "Schlie\xDFen",
"group.cancelBtn": "Abbrechen",
"group.decline": "Ablehnen",
"group.working": "Wird ausgef\xFChrt \u2026",
"group.sasTitle": "Sicherheitscode der Gruppe",
"group.sasEveryone": "Alle sehen diesen Code",
"group.sasCompare": "Vergleichen Sie den Gruppencode mit jedem Mitglied, um die Gruppe zu \xF6ffnen.",
"group.sasReadAloud": "Lesen Sie diese Ziffern laut vor an ",
"group.sasWarning": "Liest auch nur ein Mitglied einen anderen Code vor, sitzt jemand dazwischen. Brechen Sie die Gruppe ab - best\xE4tigen Sie nicht.",
"group.confirmFirst": "Best\xE4tigen Sie zuerst den Gruppencode",
"group.codeSuffix": " \xB7 Code {code}",
"group.exchangingNonces": "Nonces werden ausgetauscht \u2026",
"group.waitingCommit": "Warten auf die Zusage aller Mitglieder \u2026",
"group.waitingJoin": "Warten auf die \xFCbrigen Mitglieder \u2026",
"group.emptyChat": "Hier ist noch nichts. Nachrichten sind von ihrem Absender signiert und laufen \xFCber die eigene verschl\xFCsselte Verbindung jedes Mitglieds.",
"group.noVerified": "Noch keine gepr\xFCften Chats. \xD6ffnen Sie zuerst einen Einzelchat und vergleichen Sie dessen Sicherheitscode - eine Gruppe entsteht aus bereits gepr\xFCften Verbindungen.",
"group.noMoreToAdd": "Keine weiteren gepr\xFCften Chats zum Hinzuf\xFCgen. \xD6ffnen Sie zuerst einen Einzelchat und vergleichen Sie dessen Sicherheitscode.",
"group.directLink": "Direkte Verbindung von Ger\xE4t zu Ger\xE4t",
"group.noDirectLink": "Noch keine direkte Verbindung - Nachrichten laufen \xFCber ein anderes Mitglied, w\xE4hrend eine aufgebaut wird",
"group.relayNote": "Zu einigen Mitgliedern besteht noch keine direkte Verbindung. Ihre Nachrichten laufen \xFCber ein anderes Mitglied, das sieht, dass Sie sprechen, aber weder mitlesen noch etwas \xE4ndern kann. Die Gruppe versucht weiterhin, sie direkt zu verbinden.",
"group.relayOnlyOff": "Der Nur-Relay-Modus ist aus, daher verbindet sich jedes Mitglied direkt mit Ihnen und erf\xE4hrt Ihre IP-Adresse - auch Mitglieder, die jemand anderes eingeladen hat. Schalten Sie ihn in den Netzwerkeinstellungen ein, wenn das hier z\xE4hlt.",
"group.memberOffline": "{name} ist offline und erh\xE4lt keine Nachrichten. Die Mitgliedschaft bleibt bestehen - ein Entfernen erneuert die Gruppenschl\xFCssel.",
"group.joinNote": "Die anderen Mitglieder erfahren, dass Sie in dieser Gruppe sind. Einen Nachrichtenverlauf zum Nachlesen gibt es nicht - eine Gruppe beginnt leer.",
"group.inviteSentNote": "Die Gruppe l\xE4uft weiter, bis sie annehmen. Einen Verlauf zum Nachlesen gibt es f\xFCr sie nicht - sie sehen nur, was ab jetzt gesendet wird.",
"group.errNotCreated": "Gruppe nicht erstellt",
"group.errNobodyAccepted": "Niemand hat die Einladung rechtzeitig angenommen.",
"group.errNothingSent": "Es wurde nichts gesendet und nichts gepr\xFCft. Schlie\xDFen Sie dies und versuchen Sie es erneut, sobald alle verbunden sind.",
"group.errNotFormed": "Diese Gruppe konnte nicht gebildet werden.",
"group.errFull": "Diese Gruppe ist voll.",
"group.errInviteFailed": "Die Einladung konnte nicht gesendet werden - dieser Chat ist nicht verbunden.",
"group.errNoMemberList": "Die Gruppeninhaberin oder der Gruppeninhaber hat die Mitgliederliste nie gesendet.",
"group.errUnsignedList": "Die Mitgliederliste wurde nicht von der Gruppeninhaberin oder dem Gruppeninhaber signiert. Nicht erneut versuchen - sagen Sie ihnen Bescheid.",
"group.errNotOwner": "Jemand anderes als die Gruppeninhaberin oder der Gruppeninhaber wollte die Mitglieder \xE4ndern.",
"hdr.tagline": "Ende-zu-Ende verschl\xFCsselt",
"hdr.netSettings": "Erweiterte Netzwerkeinstellungen",
"hdr.netSettingsTitle": "Erweiterte Netzwerkeinstellungen (STUN/TURN)",
"hdr.disconnect": "Trennen",
"status.connected": "Verbunden",
"status.connecting": "Verbindung wird aufgebaut \u2026",
"status.notConnected": "Nicht verbunden",
"status.reconnecting": "Neuverbindung \u2026",
"status.retrying": "Neuer Versuch \u2026",
"status.verifying": "Wird gepr\xFCft \u2026",
"status.peerDisconnected": "Gegen\xFCber hat die Verbindung getrennt",
"sec.replayProtection": "Schutz vor Wiedereinspielung",
"sec.messageIntegrity": "Nachrichtenintegrit\xE4t (HMAC)",
"sec.forwardSecrecy": "Perfect Forward Secrecy",
"sec.metadataProtection": "Metadatenschutz",
"sec.trafficObfuscation": "Verkehrsverschleierung",
"sec.realTests": "Echte kryptografische Pr\xFCfungen",
"sec.simulatedData": "Simulierte Daten",
"sec.testPassed": "Pr\xFCfung bestanden",
"sec.testFailed": "Pr\xFCfung fehlgeschlagen oder nicht verf\xFCgbar",
"sec.verificationDone": "Echte kryptografische Pr\xFCfung abgeschlossen",
"sec.verificationInProgress": "Sicherheitspr\xFCfung l\xE4uft \u2026",
"sec.verificationWait": "Sicherheitspr\xFCfung l\xE4uft \u2026\nBitte warten Sie, bis die kryptografische Pr\xFCfung in Echtzeit abgeschlossen ist.",
"sec.verificationUnavailable": "Sicherheitspr\xFCfung nicht verf\xFCgbar",
"chat.placeholder": "Verschl\xFCsselte Nachricht schreiben \u2026",
"chat.send": "Nachricht senden",
"chat.sendFiles": "Dateien senden",
"chat.hideFiles": "Dateien ausblenden",
"chat.recordVoice": "Sprachnachricht aufnehmen",
"chat.sendVoice": "Sprachnachricht senden",
"chat.discard": "Verwerfen",
"chat.codeBlock": "Als Codeblock senden (vergr\xF6\xDFert das Eingabefeld)",
"chat.codeHint": "Code-Ausschnitt \xB7 Formatierung bleibt erhalten \xB7 \u2318\u21B5 zum Senden",
"chat.viewOnce": "Einmal ansehen",
"chat.viewOnceTitle": "Einmal ansehen - verschwindet, sobald das Gegen\xFCber es gelesen hat",
"chat.viewOncePrefix": "Einmal ansehen \xB7 ",
"chat.viewOnceTap": "Einmal ansehen \xB7 zum Anzeigen tippen",
"chat.viewedOnce": "Bereits angesehen",
"chat.disappearing": "Verschwindende Nachricht - wird auf beiden Seiten gel\xF6scht",
"chat.disappearAfter": "Verschwindet nach",
"chat.visibleFor": "Sichtbar f\xFCr",
"chat.timerPrefix": "Timer \xB7 ",
"chat.expired": "Diese Nachricht ist abgelaufen",
"chat.deleteForEveryone": "F\xFCr alle l\xF6schen",
"chat.sending": "Wird gesendet",
"chat.delivered": "Zugestellt",
"chat.notSent": "Nicht gesendet",
"chat.notSentReason": "Nicht gesendet - der sichere Kanal ist nicht bereit. Verbinden Sie sich neu, um fortzufahren.",
"chat.encrypted": "Verschl\xFCsselt",
"chat.decrypted": "Entschl\xFCsselt",
"chat.encryptedOnDevice": "Auf Ihrem Ger\xE4t verschl\xFCsselt",
"chat.uploading": "Wird hochgeladen",
"chat.downloading": "Wird heruntergeladen",
"chat.transferring": "Wird \xFCbertragen \u2026",
"chat.copied": "Kopiert!",
"chat.collapse": "Einklappen",
"chat.closeMenu": "Men\xFC schlie\xDFen",
"chat.newChat": "Neuer Chat",
"chat.newGroup": "Neue Gruppe",
"chat.createGroup": "Gruppe erstellen",
"chat.groupChats": "Gruppenchats",
"chat.secureChat": "Sicherer Chat",
"chat.nameThis": "Diesem Chat einen Namen geben",
"chat.rename": "Chat umbenennen (nur lokal)",
"chat.renameHint": "Zum Umbenennen doppelklicken",
"chat.localLabel": "Lokale Bezeichnung \xB7 nur auf diesem Ger\xE4t gespeichert",
"chat.setStatus": "Status festlegen",
"chat.yourStatusPrefix": "Ihr Status - ",
"chat.meshHint": "Bis zu 8 Teilnehmende \xB7 P2P-Mesh",
"chat.offline": "Offline",
"chat.noNetwork": "Kein Netz \xB7 Neuverbindung",
"chat.startVoiceCall": "Verschl\xFCsselten Sprachanruf starten",
"chat.startVideoCall": "Verschl\xFCsselten Videoanruf starten",
"chat.verifyForCalls": "Pr\xFCfen Sie die Sitzung, um Anrufe freizuschalten",
"chat.e2eeNote": "Jede Nachricht wird auf Ihrem Ger\xE4t Ende-zu-Ende verschl\xFCsselt, bevor sie es verl\xE4sst.",
"chat.peersOnly": "Ende-zu-Ende nur an verbundene Teilnehmende gesendet - nie auf einem Server gespeichert.",
"flow.invitationCreated": "Sichere Einladung erstellt",
"flow.invitationCreatedBang": "Sichere Einladung erstellt und verschl\xFCsselt.",
"flow.responseCreated": "Sichere Antwort erstellt",
"flow.responseCreatedBang": "Sichere Antwort erstellt.",
"flow.sendInvitation": "Senden Sie den Einladungscode \xFCber einen sicheren Weg an Ihr Gegen\xFCber (Anruf, SMS o. \xC4.).",
"flow.sendResponse": "Senden Sie den Antwortcode \xFCber einen sicheren Weg an die Person, die den Kanal er\xF6ffnet hat, oder lassen Sie den QR-Code unten scannen.",
"flow.sendEncryptedCode": "Verschl\xFCsselten Code senden",
"flow.sendTheResponse": "Antwort senden",
"flow.pasteOrWrite": "Code einf\xFCgen oder eingeben \u2026",
"flow.processingInvitation": "Sichere Einladung wird verarbeitet \u2026",
"flow.processingResponse": "Sichere Antwort wird verarbeitet \u2026",
"flow.finalizing": "Sichere Verbindung wird abgeschlossen \u2026",
"flow.channelEstablished": "Sicherer Kanal aufgebaut",
"flow.channelReady": "Sicherer Kanal ist bereit",
"flow.restoring": "Verbindung wird wiederhergestellt \u2026",
"flow.invitationCaptured": "Einladung erfasst.",
"err.needInvitation": "Sie m\xFCssen den Einladungscode Ihres Gegen\xFCbers einf\xFCgen.",
"err.needResponse": "Sie m\xFCssen den Antwortcode Ihres Gegen\xFCbers einf\xFCgen.",
"err.responseFormat": "Ung\xFCltiges Antwortformat - bitte pr\xFCfen Sie den Code",
"err.responseNoKey": "Ung\xFCltiger Antwortcode - der kryptografische Schl\xFCssel fehlt oder ist besch\xE4digt. Bitte pr\xFCfen Sie den Code und versuchen Sie es erneut.",
"err.responseNoSignKey": "Ung\xFCltiger Antwortcode - der Schl\xFCssel zur Signaturpr\xFCfung fehlt. Bitte pr\xFCfen Sie den Code und versuchen Sie es erneut.",
"err.responseOutdated": "Die Antwortdaten sind veraltet - bitte verwenden Sie eine neue Einladung",
"err.setupError": "Fehler beim Verbindungsaufbau",
"err.notReady": "Verbindung noch nicht bereit",
"err.securityBreach": "Sicherheitsverletzung erkannt - Verbindung abgelehnt",
"err.securityValidation": "Sicherheitspr\xFCfung fehlgeschlagen - m\xF6glicher Angriff erkannt",
"err.retiredQr": "Dieser QR-Code nutzt ein altes Format, mit dem die Einladung nicht \xFCbertragen werden konnte. Bitten Sie Ihr Gegen\xFCber um einen neuen Code oder verwenden Sie Kopieren und Einf\xFCgen.",
"err.compressedQrNote": "Ein komprimierter QR-Code l\xE4sst SDP der K\xFCrze halber wom\xF6glich weg. Nutzen Sie Kopieren und Einf\xFCgen, falls die Verbindung scheitert.",
"err.inviteNotConnected": "Die Einladung konnte nicht gesendet werden. Dieser Chat ist gerade nicht verbunden.",
"err.inviteNotConnectedRetry": "Die Einladung konnte nicht gesendet werden. Dieser Chat ist gerade nicht verbunden - \xF6ffnen Sie ihn erneut und versuchen Sie es noch einmal.",
"err.nobodyAccepted": "Niemand hat die Einladung angenommen. Die Gruppe bleibt unver\xE4ndert.",
"err.noAudio": "Kein Ton aufgenommen - pr\xFCfen Sie die Mikrofonberechtigung und versuchen Sie es erneut.",
"err.voiceNeedsConnection": "F\xFCr eine Sprachnachricht braucht es eine aktive sichere Verbindung. Verbinden Sie sich neu und versuchen Sie es erneut.",
"err.voiceRestoring": "Die Verbindung wird wiederhergestellt - versuchen Sie die Sprachnachricht gleich noch einmal.",
"err.fileTooLarge": "Datei zu gro\xDF",
"sas.safetyNumber": "Sicherheitsnummer",
"sas.incorrect": "Falscher Code. Pr\xFCfen Sie ihn mit Ihrem Gegen\xFCber und versuchen Sie es erneut.",
"sas.noMatch": "Die Codes stimmen nicht \xFCberein",
"sas.makeSure": "Achten Sie darauf, dass die Codes exakt \xFCbereinstimmen.",
"sas.tooManyAttempts": "Zu viele Fehlversuche. Die Sitzung wurde aus Sicherheitsgr\xFCnden zur\xFCckgesetzt.",
"sas.verificationFailed": "Pr\xFCfung fehlgeschlagen",
"sas.verified": "Gepr\xFCft \xB7 Perfect Forward Secrecy",
"sas.runVerification": "Sicherheitspr\xFCfung starten",
"sec.panelTitle": "Netzwerk- und Kryptodetails",
"sec.security": "Sicherheit",
"sec.transport": "Transport",
"sec.keyExchange": "Schl\xFCsselaustausch",
"sec.allEnabled": "Alle Sicherheitsfunktionen sind standardm\xE4\xDFig aktiv",
"sec.realTimeNote": "Pr\xFCfung in Echtzeit mit echten kryptografischen Funktionen - keine Platzhalterdaten.",
"sec.simulatedWarning": "Achtung: Die Verbindung ist wom\xF6glich noch nicht vollst\xE4ndig aufgebaut - die Werte k\xF6nnen simuliert sein.",
"dl.title": "SecureBit herunterladen",
"dl.free": "Kostenlos \xB7 quelloffen",
"dl.soon": "Apps f\xFCr iOS und Android sowie Browser-Erweiterungen f\xFCr Chrome, Firefox und Opera folgen in K\xFCrze.",
"chatHdr.chat": "Chat",
"chatHdr.chats": "Chats",
"chatHdr.newChat": "+ Neu",
"chatHdr.secure": "Sicher",
"chatHdr.p2pSub": "P2P \xB7 Ende-zu-Ende verschl\xFCsselt",
"chatHdr.save": "Speichern",
"chatHdr.close": "Schlie\xDFen",
"chatHdr.expand": "Vergr\xF6\xDFern",
"chatHdr.you": "Sie",
"chatHdr.qrCode": "QR-Code",
"chat.disconnected": "Getrennt",
"call.mute": "Stummschalten",
"call.endShort": "Auflegen",
"group.add": "Hinzuf\xFCgen",
"group.send": "Senden",
"sec.pfsShort": "Perfect Forward Secrecy",
"sec.cipher": "Chiffre",
"chat.close": "Schlie\xDFen",
"file.needConnection": "F\xFCr die Datei\xFCbertragung braucht es eine offene Verbindung",
"presence.available": "Verf\xFCgbar",
"presence.away": "Abwesend",
"presence.busy": "Besch\xE4ftigt",
"presence.offline": "Offline",
"presence.invisible": "Unsichtbar",
"presence.availableDesc": "Online und erreichbar",
"presence.awayDesc": "Unt\xE4tig \xB7 kurz weg",
"presence.busyDesc": "Bitte nicht st\xF6ren",
"presence.invisibleDesc": "F\xFCr andere offline erscheinen",
"presence.online": "Online",
"conn.p2p": "P2P \xB7 verbunden",
"conn.verifying": "Wird gepr\xFCft \u2026",
"conn.connecting": "Verbindung wird aufgebaut \u2026",
"conn.reconnecting": "Neuverbindung \u2026",
"conn.peerDisconnected": "Gegen\xFCber hat die Verbindung getrennt",
"conn.disconnected": "Getrennt",
"chat.defaultLabel": "Chat",
"groupPhase.forming": "Wird gebildet \u2026",
"groupPhase.commitments": "Zusagen werden ausgetauscht \u2026",
"groupPhase.revealing": "Wird offengelegt \u2026",
"groupPhase.compare": "Gruppencode vergleichen",
"groupPhase.ready": "Gruppe bereit",
"groupPhase.failed": "Gruppe fehlgeschlagen",
"call.qualityGood": "Gut",
"call.qualityFair": "Mittelm\xE4\xDFig",
"call.qualityWeak": "Schwach",
"msg.code": "Code",
"msg.timer": "Timer",
"msg.voice": "Sprache",
"msg.play": "Abspielen",
"msg.sent": "Gesendet",
"msg.read": "Gelesen",
"report.title": "Sicherheitspr\xFCfung in Echtzeit",
"report.active": "Aktiv",
"report.testsPassed": "Bestandene Pr\xFCfungen",
"report.verifiedAt": "Gepr\xFCft am",
"report.source": "Quelle",
"secTest.verifyECDHKeyExchange": "ECDH-Schl\xFCsselaustausch",
"secTest.verifyECDSASignatures": "Digitale ECDSA-Signaturen",
"secTest.verifyEncryption": "AES-GCM-Verschl\xFCsselung",
"secTest.verifyMessageIntegrity": "Nachrichtenintegrit\xE4t",
"secTest.verifyPerfectForwardSecrecy": "Perfect Forward Secrecy",
"secTest.verifyPFS": "Perfect Forward Secrecy",
"secTest.verifyReplayProtection": "Schutz vor Wiedereinspielung",
"secTest.verifyDTLSFingerprint": "DTLS-Fingerabdruck",
"secTest.verifySASVerification": "SAS-Verifizierung",
"secTest.verifyMetadataProtection": "Metadatenschutz",
"secTest.verifyTrafficObfuscation": "Verkehrsverschleierung",
"secTest.verifyPacketPadding": "Paket-Padding",
"secTest.verifyNestedEncryption": "Verschachtelte Verschl\xFCsselung",
"secTest.verifyNonExtractableKeys": "Nicht auslesbare Schl\xFCssel",
"secTest.verifyRateLimiting": "Ratenbegrenzung",
"secTest.verifyMutualAuth": "Gegenseitige Authentifizierung",
"secTest.verifyAuthProof": "Authentifizierungsnachweis",
"secTest.verifyEnhancedValidation": "Erweiterte Pr\xFCfung",
"secTest.verifyAdvancedFeatures": "Erweiterte Funktionen",
"secTest.verifySignature": "Signaturpr\xFCfung",
"secDetail.Security system initializing...": "Sicherheitssystem startet \u2026",
"secDetail.Nested encryption active": "Verschachtelte Verschl\xFCsselung aktiv",
"secDetail.Nested encryption failed": "Verschachtelte Verschl\xFCsselung fehlgeschlagen",
"secDetail.Packet padding active": "Paket-Padding aktiv",
"secDetail.Packet padding failed": "Paket-Padding fehlgeschlagen",
"secDetail.Advanced features active": "Erweiterte Funktionen aktiv",
"secDetail.Advanced features failed": "Erweiterte Funktionen fehlgeschlagen",
"secDetail.No encryption key available": "Kein Verschl\xFCsselungsschl\xFCssel vorhanden",
"secDetail.AES-GCM encryption/decryption working correctly": "AES-GCM-Ver- und -Entschl\xFCsselung funktionieren korrekt",
"secDetail.No ECDH key pair available": "Kein ECDH-Schl\xFCsselpaar vorhanden",
"secDetail.Key derivation failed": "Schl\xFCsselableitung fehlgeschlagen",
"secDetail.No ECDSA key pair available": "Kein ECDSA-Schl\xFCsselpaar vorhanden",
"secDetail.ECDSA digital signatures working correctly": "Digitale ECDSA-Signaturen funktionieren korrekt",
"secDetail.MAC key not available or invalid": "MAC-Schl\xFCssel fehlt oder ist ung\xFCltig",
"secDetail.Rate limiter did not block a message over the limit": "Die Ratenbegrenzung hat eine Nachricht \xFCber dem Limit nicht blockiert",
"secDetail.Rate limiter is not available": "Die Ratenbegrenzung ist nicht verf\xFCgbar",
"secDetail.Replay protection is working correctly": "Der Schutz vor Wiedereinspielung funktioniert korrekt",
"secDetail.Replay protection not enabled": "Schutz vor Wiedereinspielung nicht aktiv",
"secDetail.SAS code not available": "SAS-Code nicht verf\xFCgbar",
"secDetail.SAS verification code is valid and available": "Der SAS-Pr\xFCfcode ist g\xFCltig und vorhanden",
"secDetail.Traffic obfuscation is working correctly": "Die Verkehrsverschleierung funktioniert korrekt",
"secDetail.Traffic obfuscation not enabled": "Verkehrsverschleierung nicht aktiv",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "F\xFCr diese Sitzung gibt es kein nicht auslesbares, kurzlebiges ECDH-Schl\xFCsselpaar",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "Nur Sitzungs-PFS: Die Schl\xFCssel sind pro Sitzung kurzlebig, aber der Double Ratchet ist f\xFCr diese Verbindung nicht aktiv (das Gegen\xFCber nutzt eine \xE4ltere Version). Ein kompromittierter Sitzungsschl\xFCssel legt damit das ganze Gespr\xE4ch offen.",
"msg.pause": "Pause",
"msg.failed": "Fehlgeschlagen",
"groupErr.timeout": "Ein Mitglied hat aufgeh\xF6rt zu antworten, bevor der Code fertig war.",
"groupErr.keyMismatch": "Der Schl\xFCssel eines Mitglieds passte nicht zu der Identit\xE4t, die daf\xFCr angegeben wurde.",
"groupErr.revealMismatch": "Der offengelegte Wert eines Mitglieds passte nicht zu seiner Zusage.",
"groupErr.commitChanged": "Ein Mitglied hat seine Zusage mittendrin ge\xE4ndert.",
"groupErr.missingKey": "Es wurde ein Mitglied gelistet, dessen Schl\xFCssel nie ankam.",
"groupErr.outsider": "Es kam ein Frame von jemandem au\xDFerhalb der Gruppe an.",
"groupErr.limit": "Eine Gruppe ist auf acht Mitglieder begrenzt.",
"groupErr.tooLarge": "Eine Nachricht war zu gro\xDF, um sie an die Gruppe zu senden.",
"fileType.text": "Reiner Text",
"fileType.images": "Bilder",
"fileType.archives": "Archive",
"fileType.voice": "Sprachnachrichten",
"fileType.unsupported": "Nicht unterst\xFCtzt",
"qrScan.title": "QR-Code scannen",
"qrScan.auto": "Automatik",
"qrScan.reset": "Zur\xFCcksetzen",
"qrScan.autoScroll": "Automatisches Scrollen aktiv",
"qrScan.starting": "Kamera wird gestartet \u2026",
"qrScan.point": "Kamera auf den QR-Code richten",
"qrScan.tapFocus": "Zum Fokussieren auf den Bildschirm tippen",
"qrScan.focusing": "Wird fokussiert \u2026",
"iceErr.notArray": "Die Serverliste muss ein Array sein",
"iceErr.invalidJson": "Ung\xFCltiges JSON",
"iceErr.tooMany": "Zu viele Server (h\xF6chstens {max})",
"iceErr.invalidEntry": "{label}: ung\xFCltiger Eintrag",
"iceErr.urlCount": "{label}: 1 bis {max} URLs erforderlich",
"iceErr.turnCreds": "{label}: TURN-Server brauchen \xFCblicherweise Benutzername und Zugangsdaten",
"iceUrl.notString": "Die URL muss eine Zeichenkette sein",
"iceUrl.empty": "Die URL ist leer",
"iceUrl.tooLong": "Die URL ist zu lang",
"iceUrl.badChars": "Die URL enth\xE4lt ung\xFCltige Zeichen",
"iceUrl.badScheme": "Die URL muss mit stun:, stuns:, turn: oder turns: beginnen",
"iceUrl.badQuery": "Die URL hat eine ung\xFCltige Abfrage",
"iceUrl.noHost": "In der URL fehlt der Host",
"iceUrl.badHost": "Die URL hat einen ung\xFCltigen Host oder Port",
"iceUrl.badTransport": "Die URL-Abfrage muss transport=udp oder transport=tcp lauten",
"msg.off": "Aus",
"file.consentUnavailable": "Keine Zustimmung m\xF6glich",
"secLevel.MAXIMUM": "MAXIMAL",
"secLevel.INITIALIZING": "WIRD GESTARTET",
"secLevel.ERROR": "FEHLER",
"secLevel.UNKNOWN": "UNBEKANNT",
"status.error": "Fehler",
"offline.disconnect": "Trennen",
"offline.learnMore": "Mehr erfahren",
"pwa.installApp": "App installieren",
"chat.onWeb": "Sie nutzen die Web-Version",
"groupCall.startVoice": "Gruppen-Sprachanruf starten",
"groupCall.startVideo": "Gruppen-Videoanruf starten",
"groupCall.join": "Beitreten",
"groupCall.dismiss": "Jetzt nicht",
"groupCall.leave": "Anruf verlassen",
"groupCall.you": "Du",
"groupCall.connecting": "Verbinden\u2026",
"groupCall.waitingLink": "Warten auf eine direkte Verbindung\u2026",
"groupCall.legFailed": "Verbindung fehlgeschlagen",
"groupCall.startedVoice": "{name} hat einen Sprachanruf gestartet",
"groupCall.startedVideo": "{name} hat einen Videoanruf gestartet",
"groupCall.inCall": "{count} im Anruf",
"groupCall.err.permission_denied": "Der Anruf konnte nicht starten - der Zugriff auf Mikrofon und Kamera ist blockiert. Erlaube ihn f\xFCr diese Seite und versuche es erneut.",
"groupCall.err.device_not_found": "Der Anruf konnte nicht starten - auf diesem Ger\xE4t wurde kein Mikrofon gefunden.",
"groupCall.err.device_busy": "Der Anruf konnte nicht starten - dein Mikrofon wird von einer anderen App verwendet. Schlie\xDFe sie und versuche es erneut.",
"groupCall.err.media_failed": "Der Anruf konnte nicht starten - das Mikrofon lie\xDF sich nicht \xF6ffnen.",
"groupCall.err.call_in_progress": "In dieser Gruppe l\xE4uft bereits ein Anruf. Tritt ihm bei, statt einen neuen zu starten.",
"groupCall.err.not_ready": "Best\xE4tige zuerst den Gruppencode, bevor du anrufst.",
"groupCall.speaking": "{name} spricht",
"groupCall.pin": "{name} gro\xDF anzeigen",
"groupCall.unpin": "Zur\xFCck zu allen",
"groupCall.showEveryone": "Alle",
"msg.after5s": "5 Sek. nach dem Lesen",
"msg.after15s": "15 Sek. nach dem Lesen",
"msg.after30s": "30 Sek. nach dem Lesen",
"msg.after1m": "1 Min. nach dem Lesen",
"msg.sec30": "30 Sekunden",
"msg.min5": "5 Minuten",
"msg.hour1": "1 Stunde",
"desktop.shareDesc": "Sende den Code an deinen Peer. Er gilt einmalig und l\xE4uft bald ab.",
"desktop.invitationCreated": "Sichere Einladung erstellt - sende sie an deinen Peer.",
"desktop.joinDesc": "F\xFCge den Einladungscode deines Peers ein, um deine sichere Antwort zu erzeugen.",
"desktop.offerTag": "Einladung \xB7 Text kopieren",
"desktop.answerTag": "Antwort \xB7 Text kopieren",
"desktop.offerPlaceholder": "Hier erscheint der Einladungscode\u2026",
"desktop.answerPlaceholder": "Hier erscheint der Antwortcode\u2026",
"desktop.backToChats": "Zur\xFCck zu den Chats",
"desktop.sendFeedback": "Feedback senden",
"desktop.callsNeedVerified": "Anrufe erfordern einen verifizierten sicheren Kanal.",
"desktop.noOpenChannel": "Kein offener sicherer Kanal.",
"desktop.chatCarriesCall": "\xDCber diesen Chat l\xE4uft ein Gruppenanruf. Verlasse den Gruppenanruf, bevor du einen Einzelanruf startest.",
"desktop.err.permission_denied": "Der Anruf konnte nicht starten - der Zugriff auf Mikrofon und Kamera ist blockiert. Erlaube ihn in den Systemeinstellungen und versuche es erneut.",
"desktop.language": "Sprache",
"desktop.languageHint": "Gilt sofort. Bereits gesendete Nachrichten behalten ihren Wortlaut.",
"desktop.compareCode": "Vergleiche den Pr\xFCfcode mit deinem Peer und best\xE4tige ihn, wenn er \xFCbereinstimmt.",
"desktop.verifyBeforeFiles": "Schlie\xDFe die Verifizierung ab, bevor du Dateien sendest.",
"desktop.verifyBeforeSending": "Schlie\xDFe die Verifizierung ab, bevor du Nachrichten sendest.",
"desktop.disconnectedByBackend": "Verbindung sicher getrennt.",
"desktop.restoreFailed": "Die Verbindung konnte nicht wiederhergestellt werden. Dieser Chat wird geschlossen.",
"desktop.channelNotReady": "Der Datenkanal ist noch nicht verf\xFCgbar. Warte, bis die Verbindung steht.",
"desktop.enterCode": "Gib den Pr\xFCfcode zur Best\xE4tigung ein.",
"desktop.noOffer": "Keine Einladung gefunden. Erstelle zuerst eine.",
"desktop.notInitiator": "Du hast diese Verbindung nicht erstellt, also gibt es f\xFCr dich keine Antwort zum Anwenden.",
"desktop.decryptFailed": "Eine Nachricht konnte nicht entschl\xFCsselt werden und wurde verworfen.",
"desktop.badMessageFormat": "Ein fehlerhaftes Frame kam an und wurde verworfen.",
"desktop.notSentNotReady": "Nachricht nicht gesendet: Der sichere Kanal ist nicht bereit. Warte, bis die Verifizierung abgeschlossen ist, oder verbinde dich neu.",
"desktop.micDenied": "Der Zugriff auf das Mikrofon wurde verweigert.",
"desktop.noChannelWait": "Kein offener sicherer Kanal - warte, bis die Verbindung steht.",
"desktop.sasFailed": "Verifizierung fehlgeschlagen. M\xF6glicherweise sitzt jemand dazwischen, deshalb wurde die Verbindung abgebrochen.",
"desktop.sasOk": "Verifizierung erfolgreich. Dieser Kanal ist Ende zu Ende authentifiziert.",
"desktop.iceForgotten": "Gespeicherte Server verworfen. Es werden \xF6ffentliche ICE-Server verwendet.",
"desktop.icePublic": "Es werden \xF6ffentliche ICE-Server verwendet.",
"desktop.verificationInProgress": "Die Sicherheitspr\xFCfung l\xE4uft noch. Warte, bis sie fertig ist.",
"desktop.fileGone": "Diese Datei steht nicht mehr zum Download bereit.",
"desktop.codeMismatch": "Die Pr\xFCfcodes stimmen nicht \xFCberein. Die Verbindung wird zur Sicherheit getrennt.",
"desktop.noLocalCode": "Verifizierung fehlgeschlagen: Es gibt keinen lokal abgeleiteten Code zum Vergleich. Die Verbindung wird zur Sicherheit getrennt.",
"desktop.protocolViolation": "Der Peer hat den Code als best\xE4tigt ausgegeben, bevor du ihn best\xE4tigt hast. Die Verbindung wird zur Sicherheit getrennt.",
"desktop.verificationRejected": "Verifizierung abgelehnt. Die Verbindung wurde zur Sicherheit abgebrochen.",
"secLevel.HIGH": "HOCH",
"secLevel.MEDIUM": "MITTEL",
"secLevel.LOW": "NIEDRIG",
"desktop.rerun": "Erneut pr\xFCfen",
"desktop.ice.customDesc": "Bis zu {max} Server, eine URL pro Zeile oder JSON.",
"desktop.ice.persistDesc": "Lokal auf diesem Ger\xE4t gespeichert. Aus lassen, um sie nur f\xFCr diese Sitzung zu verwenden.",
"desktop.group.leaveNote": "Den anderen Mitgliedern wird mitgeteilt, dass du gegangen bist. Danach bleibt nichts von dieser Gruppe auf diesem Ger\xE4t - es gibt keinen Server mit einer Kopie, \xFCber den du zur\xFCckkehren k\xF6nntest, du br\xE4uchtest also eine neue Einladung.",
"desktop.sec.ecdsaOk": "Signatur des Schl\xFCsselpakets der Gegenstelle beim Handshake gepr\xFCft (ECDSA P-384 / SHA-384)",
"desktop.sec.ecdsaNone": "Kein abgeschlossener Handshake",
"desktop.sec.ecdhOk": "Sitzungsschl\xFCssel aus einem fl\xFCchtigen ECDH-P-384-Austausch \xFCber HKDF-SHA-256 abgeleitet",
"desktop.sec.ecdhNone": "Keine Sitzungsschl\xFCssel abgeleitet",
"desktop.sec.encryptionOk": "AES-GCM-Ver- und Entschl\xFCsselung im Kern verifiziert",
"desktop.sec.encryptionNa": "Der AES-GCM-Selbsttest konnte nicht ausgef\xFChrt werden",
"desktop.sec.integrityOk": "Nachrichtenintegrit\xE4t verifiziert (AES-GCM-Authentifizierung)",
"desktop.sec.integrityNa": "Der Integrit\xE4ts-Selbsttest konnte nicht ausgef\xFChrt werden",
"desktop.sec.pfsOk": "Double Ratchet aktiv - jede Nachricht hat ihren eigenen Schl\xFCssel",
"desktop.sec.pfsNa": "Nicht gemessen",
"desktop.sec.replayOk": "Ratchet-Nachrichtenschl\xFCssel werden nach Gebrauch vernichtet, ein mitgeschnittenes Frame l\xE4sst sich nicht erneut abspielen",
"desktop.sec.replayNa": "Nicht gemessen",
"desktop.sec.dtlsPinned": "DTLS-Fingerabdruck der Gegenstelle verankert: {fp}",
"desktop.sec.dtlsNone": "Kein DTLS-Fingerabdruck der Gegenstelle verf\xFCgbar",
"desktop.sec.sasBoth": "Beide Seiten haben den Sicherheitscode au\xDFerhalb des Kanals best\xE4tigt",
"desktop.sec.sasIncomplete": "Der Sicherheitscode wurde nicht von beiden Seiten best\xE4tigt",
"desktop.sec.metadataOk": "Ein eigener Metadatenschl\xFCssel wurde abgeleitet (HKDF metadata-protection-v4)",
"desktop.sec.metadataNone": "Kein Metadatenschl\xFCssel",
"desktop.sec.coverOn": "Verdeckter Verkehr aktiv: zuf\xE4llige Scheinframes (32-128 B alle 15-30 s) auf dem Ratchet-Kanal",
"desktop.sec.coverOff": "Der Generator f\xFCr verdeckten Verkehr l\xE4uft nicht",
"desktop.sec.coverUnsupported": "Verdeckter Verkehr braucht eine Double-Ratchet-Sitzung (die Gegenstelle nutzt eine \xE4ltere Version)",
"desktop.tagline": "Ende-zu-Ende-Freiheit"
},
"fr": {
"language.label": "Langue",
"language.suggest.text": "Cette page est aussi disponible en fran\xE7ais.",
"language.suggest.cta": "Lire en fran\xE7ais",
"language.suggest.dismiss": "Fermer",
"community.title": "Construisez l'avenir de la vie priv\xE9e",
"community.description": "SecureBit grandit gr\xE2ce \xE0 sa communaut\xE9. Vos id\xE9es et vos retours fa\xE7onnent l'avenir des communications s\xE9curis\xE9es, d\xE9velopp\xE9es \xE0 ciel ouvert, avec une validation ASN.1 compl\xE8te de bout en bout.",
"community.github": "D\xE9p\xF4t GitHub",
"community.feedback": "Vos retours",
"unique.eyebrow": "Ce qui nous distingue",
"unique.heading": "Pourquoi SecureBit est unique",
"unique.s1.titleTop": "C\u0153ur de chiffrement",
"unique.s1.titleBottom": "en couches",
"unique.s1.collapsed": "C\u0153ur de chiffrement",
"unique.s1.desc": "\xC9change de cl\xE9s ECDH P-384, charges utiles en AES-256-GCM, signatures ECDSA et validation ASN.1 compl\xE8te, r\xE9unis en une seule cha\xEEne durcie.",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "Pur P2P",
"unique.s2.titleBottom": "sur WebRTC",
"unique.s2.collapsed": "Pur P2P sur WebRTC",
"unique.s2.desc": "Les messages passent directement d'un appareil \xE0 l'autre par WebRTC. Aucun relais ne retient vos donn\xE9es : le serveur aide seulement deux pairs \xE0 se trouver.",
"unique.s2.tags": [
"DTLS 1.3",
"Sans relais"
],
"unique.s3.titleTop": "Confidentialit\xE9",
"unique.s3.titleBottom": "persistante parfaite",
"unique.s3.collapsed": "Confidentialit\xE9 persistante",
"unique.s3.desc": "Les cl\xE9s de session tournent en continu et sont jet\xE9es apr\xE8s usage : une cl\xE9 compromise n'ouvre jamais les conversations pass\xE9es.",
"unique.s3.tags": [
"Cl\xE9s \xE9ph\xE9m\xE8res",
"Rotation automatique"
],
"unique.s4.titleTop": "Brouillage",
"unique.s4.titleBottom": "du trafic",
"unique.s4.collapsed": "Brouillage du trafic",
"unique.s4.desc": "La taille des paquets et leur cadence sont compl\xE9t\xE9es et rendues al\xE9atoires, ce qui masque les motifs de m\xE9tadonn\xE9es \xE0 quiconque observe la ligne.",
"unique.s4.tags": [
"Remplissage de paquets",
"D\xE9calage temporel"
],
"unique.s5.titleTop": "Aucune collecte",
"unique.s5.titleBottom": "de donn\xE9es",
"unique.s5.collapsed": "Aucune collecte de donn\xE9es",
"unique.s5.desc": "Aucun compte, aucun journal, aucun message conserv\xE9. Il n'y a rien sur un serveur \xE0 faire fuiter, \xE0 saisir ou \xE0 vendre.",
"unique.s5.tags": [
"Sans compte",
"Sans journaux"
],
"partners.eyebrow": "Partenaires et \xE9cosyst\xE8me",
"partners.heading": "Nos partenaires nous font confiance",
"partners.aegis.desc": "Partenaire financier qui prot\xE8ge les communications financi\xE8res confidentielles de tout son portefeuille.",
"partners.aegis.role": "Investisseur strat\xE9gique",
"partners.furilabs.desc": "T\xE9l\xE9phones Linux ax\xE9s sur la vie priv\xE9e, livr\xE9s avec SecureBit comme canal s\xE9curis\xE9 par d\xE9faut.",
"partners.furilabs.role": "Partenaire technologique",
"partners.inviteTitle": "Devenir partenaire",
"partners.inviteDesc": "Vous construisez du mat\xE9riel ou de l'infrastructure pour la vie priv\xE9e ? Int\xE9grons SecureBit.",
"partners.inviteCta": "Entamer la conversation",
"roadmap.eyebrow": "Feuille de route",
"roadmap.heading": "L'\xE9volution de SecureBit",
"roadmap.subheading": "Du premier prototype \xE0 un r\xE9seau d\xE9centralis\xE9 r\xE9sistant au quantique, avec une validation ASN.1 compl\xE8te \xE0 chaque couche.",
"roadmap.progress": "{shipped} jalons sur {total} atteints",
"roadmap.upcoming": "{upcoming} \xE0 venir",
"roadmap.keyFeatures": "Fonctions cl\xE9s",
"roadmap.status.released": "Publi\xE9",
"roadmap.status.current": "En cours",
"roadmap.status.dev": "En d\xE9veloppement",
"roadmap.status.planned": "Planifi\xE9",
"roadmap.status.research": "Recherche",
"hero.headlineTop": "Une ligne directe",
"hero.headlineBottom": "que vous seuls pouvez lire.",
"hero.subheading": "Les cl\xE9s sont cr\xE9\xE9es sur votre appareil et \xE9chang\xE9es directement entre pairs. Aucun compte, aucun serveur ne conserve vos messages.",
"hero.diagramAlt": "Une ligne chiffr\xE9e directe vers un pair, rejointe par deux autres pairs",
"intro.createTitle": "Cr\xE9er un canal",
"intro.createDesc": "Votre appareil g\xE9n\xE8re les cl\xE9s et une invitation \xE0 usage unique. Rien de tout cela ne passe par un serveur.",
"intro.createCta": "G\xE9n\xE9rer les cl\xE9s et l'invitation",
"intro.joinTitle": "Rejoindre un canal",
"intro.scanTitle": "Scanner le QR avec la cam\xE9ra",
"intro.scanSubtitle": "Le plus rapide : visez l'\xE9cran de votre correspondant",
"intro.orPasteCode": "ou collez le code",
"intro.pastePlaceholder": "Collez ici le code d'invitation\u2026",
"intro.connect": "Se connecter",
"intro.connecting": "Traitement\u2026",
"roadmap.r1.title": "D\xE9but du d\xE9veloppement",
"roadmap.r1.sub": "Id\xE9e, prototype et mise en place de l'infrastructure",
"roadmap.r1.date": "D\xE9but 2025",
"roadmap.r1.features": [
"Concept et exigences d\xE9finis",
"Choix de la pile : WebRTC, P2P, cryptographie",
"Premiers prototypes de messagerie",
"Cr\xE9ation du d\xE9p\xF4t et de l'int\xE9gration continue",
"Architecture de chiffrement de base",
"Conception UX/UI"
],
"roadmap.r2.title": "Version alpha",
"roadmap.r2.sub": "Premi\xE8re alpha publique : chat simple et \xE9change de cl\xE9s",
"roadmap.r2.date": "Printemps 2025",
"roadmap.r2.features": [
"Messagerie P2P simple par WebRTC",
"Chiffrement de bout en bout simple (sch\xE9ma de d\xE9monstration)",
"Signalisation et reconnexion stables",
"Interface minimale pour les tests",
"Retours des premiers testeurs"
],
"roadmap.r3.title": "S\xE9curit\xE9 durcie",
"roadmap.r3.sub": "Renforcement de la s\xE9curit\xE9 et publication de la branche stable",
"roadmap.r3.date": "\xC9t\xE9 2025",
"roadmap.r3.features": [
"ECDH/ECDSA en production",
"Confidentialit\xE9 persistante et rotation des cl\xE9s",
"Contr\xF4les d'authentification am\xE9lior\xE9s",
"Chiffrement des fichiers et envoi de charges volumineuses",
"Audit des processus cryptographiques de base"
],
"roadmap.r4.title": "Mont\xE9e en charge et stabilit\xE9",
"roadmap.r4.sub": "Mise \xE0 l'\xE9chelle du r\xE9seau et gains de stabilit\xE9",
"roadmap.r4.date": "Automne 2025",
"roadmap.r4.features": [
"Optimisation des connexions P2P et du passage de NAT",
"M\xE9canismes de reconnexion et files de messages",
"Consommation de batterie r\xE9duite sur mobile",
"Synchronisation entre plusieurs appareils",
"Outils de supervision et de journalisation pour les d\xE9veloppeurs"
],
"roadmap.r5.title": "La vie priv\xE9e d'abord",
"roadmap.r5.sub": "Priorit\xE9 \xE0 la vie priv\xE9e : r\xE9duire les m\xE9tadonn\xE9es",
"roadmap.r5.date": "Hiver 2025",
"roadmap.r5.features": [
"Protection des m\xE9tadonn\xE9es et empreinte r\xE9duite",
"Exp\xE9riences de routage en oignon et de DHT",
"Options de connexion anonyme",
"Pr\xE9paration de l'audit de code ouvert",
"V\xE9rification des correspondants am\xE9lior\xE9e"
],
"roadmap.r6.title": "Enhanced Security Edition",
"roadmap.r6.sub": "Cryptographie de niveau militaire en 18 couches, avec validation ASN.1 compl\xE8te",
"roadmap.r6.date": "Fin 2025",
"roadmap.r6.features": [
"Triple protection : ECDH + DTLS + SAS",
"Chiffrement ECDH P-384 et AES-GCM 256 bits",
"V\xE9rification de l'empreinte DTLS",
"V\xE9rification SAS (cha\xEEne d'authentification courte)",
"Confidentialit\xE9 persistante avec rotation des cl\xE9s",
"Protection renforc\xE9e contre les attaques de l'intercepteur",
"Validation ASN.1 DER compl\xE8te",
"V\xE9rification des OID et des points EC",
"Validation de la structure SPKI",
"Architecture P2P sur WebRTC",
"Protection des m\xE9tadonn\xE9es",
"Code ouvert \xE0 100 %"
],
"roadmap.r7.title": "Desktop Edition",
"roadmap.r7.sub": "Applications de bureau natives pour Windows, macOS et Linux",
"roadmap.r7.date": "D\xE9but 2026",
"roadmap.r7.features": [
"Application Windows (Tauri v2)",
"Application macOS (Tauri v2)",
"AppImage Linux (Tauri v2)",
"Notifications en temps r\xE9el",
"Reconnexion automatique",
"Synchronisation entre appareils",
"Interface remani\xE9e",
"Fichiers jusqu'\xE0 100 Mo"
],
"roadmap.r8.title": "Voix et appels s\xE9curis\xE9s",
"roadmap.r8.sub": "Messages vocaux, appels audio et vid\xE9o chiffr\xE9s",
"roadmap.r8.date": "D\xE9but 2026",
"roadmap.r8.features": [
"Messages vocaux chiffr\xE9s de bout en bout",
"Appels audio chiffr\xE9s en t\xEAte-\xE0-t\xEAte (WebRTC)",
"Appels vid\xE9o chiffr\xE9s en t\xEAte-\xE0-t\xEAte (WebRTC)",
"Confidentialit\xE9 persistante pour le flux en direct",
"Flux m\xE9dia prot\xE9g\xE9s par SRTP/DTLS",
"V\xE9rification SAS pendant l'appel",
"Notifications d'appel et reconnexion automatique",
"M\xE9dia P2P \xE0 faible latence"
],
"roadmap.r9.title": "Communication de groupe",
"roadmap.r9.sub": "Discussions de groupe sans renoncer \xE0 la vie priv\xE9e",
"roadmap.r9.date": "Maintenant",
"roadmap.r9.features": [
"Groupes P2P jusqu'\xE0 8 participants",
"Distribution en maillage, avec relais sign\xE9 en secours",
"Un seul code de s\xE9curit\xE9 de groupe, compar\xE9 par tous",
"C\xE9r\xE9monie d'engagement puis de r\xE9v\xE9lation, contre la recherche de codes",
"Cl\xE9s d'identit\xE9 propres au groupe, \xE9ph\xE9m\xE8res par conception",
"Composition sign\xE9e, ordonn\xE9e par \xE9poques",
"Messages sign\xE9s : une transcription divergente devient d\xE9montrable",
"Aucun serveur, aucune cl\xE9 de groupe partag\xE9e, aucun historique"
],
"roadmap.r10.title": "Mobile Edition",
"roadmap.r10.sub": "Applications natives pour iOS et Android",
"roadmap.r10.date": "2e trimestre 2027",
"roadmap.r10.features": [
"Application iOS native (Swift/SwiftUI)",
"Application Android native (Kotlin/Jetpack Compose)",
"Prise en charge PWA sur les navigateurs mobiles",
"Notifications push en temps r\xE9el",
"Optimisation de la batterie",
"Interface adapt\xE9e au mobile",
"File d'attente des messages hors ligne",
"Authentification biom\xE9trique"
],
"roadmap.r11.title": "\xC9dition r\xE9sistante au quantique",
"roadmap.r11.sub": "Protection contre les ordinateurs quantiques",
"roadmap.r11.date": "4e trimestre 2027",
"roadmap.r11.features": [
"Cryptographie post-quantique CRYSTALS-Kyber",
"Signatures num\xE9riques SPHINCS+",
"Sch\xE9ma hybride : classique et post-quantique",
"\xC9change de cl\xE9s r\xE9sistant au quantique",
"Algorithmes de hachage mis \xE0 jour",
"Migration des sessions existantes",
"Compatibilit\xE9 avec la v5.x",
"Protocoles r\xE9sistants au quantique"
],
"roadmap.r12.title": "R\xE9seau d\xE9centralis\xE9",
"roadmap.r12.sub": "Un r\xE9seau enti\xE8rement d\xE9centralis\xE9",
"roadmap.r12.date": "2028",
"roadmap.r12.features": [
"R\xE9seau maill\xE9 de n\u0153uds",
"DHT pour la d\xE9couverte des pairs",
"Routage en oignon int\xE9gr\xE9",
"Tokenomique et incitations pour les n\u0153uds",
"Gouvernance par une DAO",
"Interop\xE9rabilit\xE9 avec d'autres r\xE9seaux",
"Compatibilit\xE9 multiplateforme",
"R\xE9seau auto-r\xE9parateur"
],
"roadmap.r13.title": "Assistant de confidentialit\xE9 par IA",
"roadmap.r13.sub": "L'IA au service de la vie priv\xE9e et de la s\xE9curit\xE9",
"roadmap.r13.date": "2028+",
"roadmap.r13.features": [
"Analyse locale des menaces par IA",
"D\xE9tection automatique de l'intercepteur",
"Cryptographie adaptative",
"Recommandations de s\xE9curit\xE9 personnalis\xE9es",
"Apprentissage automatique \xE0 divulgation nulle",
"Assistant IA priv\xE9",
"S\xE9curit\xE9 pr\xE9dictive",
"Protection autonome contre les attaques"
],
"handshake.step1": "G\xE9n\xE9ration de la paire de cl\xE9s ECDH P-384",
"handshake.step2": "D\xE9rivation du code de v\xE9rification",
"handshake.step3": "Fixation de la confidentialit\xE9 persistante",
"handshake.securingTitle": "S\xE9curisation de votre canal",
"handshake.answerTitle": "Pr\xE9paration de votre r\xE9ponse",
"handshake.securingDesc": "Nous forgeons des cl\xE9s assez solides pour r\xE9sister \xE0 toute alt\xE9ration.",
"handshake.shareTitle": "Partagez votre invitation",
"handshake.sendAnswerTitle": "Renvoyez votre r\xE9ponse",
"handshake.shareDesc": "Montrez le QR ou envoyez le code \xE0 votre correspondant. Il est \xE0 usage unique et expire vite.",
"handshake.sendAnswerDesc": "Donnez cette r\xE9ponse \xE0 la personne qui a cr\xE9\xE9 le canal pour qu'elle termine la poign\xE9e de main.",
"handshake.establish": "\xC9tablir la connexion",
"handshake.thenReceive": "Recevez ensuite la r\xE9ponse que votre correspondant renvoie",
"handshake.pasteAnswerPlaceholder": "Collez le code de r\xE9ponse\u2026",
"handshake.answerSentNote": "Envoyez cette r\xE9ponse \xE0 la personne qui a cr\xE9\xE9 le canal, puis patientez : la discussion s'ouvre d\xE8s qu'elle se connecte.",
"handshake.qrHint": "Gardez ceci ouvert jusqu'\xE0 ce que votre correspondant ait captur\xE9 le code.",
"handshake.qrHintFrames": "La poign\xE9e de main est r\xE9partie sur {frames} images : gardez ceci ouvert jusqu'\xE0 ce que votre correspondant les ait toutes captur\xE9es.",
"verify.title": "V\xE9rification de s\xE9curit\xE9",
"verify.desc": "Comparez ce code de s\xE9curit\xE9 avec votre correspondant par un autre canal (voix ou en personne), puis saisissez-le pour ouvrir la discussion.",
"verify.enterLabel": "Saisissez le code v\xE9rifi\xE9",
"verify.placeholder": "Tapez le code ici",
"verify.confirm": "Confirmer le code",
"verify.confirmed": "Confirm\xE9",
"verify.mismatch": "Ne correspond pas",
"verify.yours": "Votre confirmation",
"verify.peer": "Confirmation du correspondant",
"verify.pending": "En attente",
"verify.waiting": "En attente du code\u2026",
"verify.verified": "Canal v\xE9rifi\xE9",
"verify.bothConfirmed": "Les deux parties ont confirm\xE9. Ouverture de la discussion s\xE9curis\xE9e\u2026",
"pwa.bannerTitle": "Installer SecureBit.chat",
"pwa.bannerDesc": "Profitez de l'exp\xE9rience d'une application native, avec une s\xE9curit\xE9 renforc\xE9e",
"pwa.install": "Installer",
"pwa.dismiss": "Ignorer",
"pwa.close": "Fermer",
"pwa.iosTitle": "Installer sur iOS",
"pwa.iosStep1": "Touchez le bouton Partager",
"pwa.iosStep1Hint": "En g\xE9n\xE9ral en bas de Safari",
"pwa.iosStep2": "Trouvez \xAB Sur l'\xE9cran d'accueil \xBB",
"pwa.iosStep2Hint": "Faites d\xE9filer le menu de partage",
"pwa.iosStep3": "Touchez \xAB Ajouter \xBB",
"pwa.iosStep3Hint": "Confirmez pour installer SecureBit.chat",
"pwa.genericTitle": "Installer SecureBit",
"pwa.genericDesc": "Chaque navigateur installe \xE0 sa mani\xE8re. Choisissez les \xE9tapes qui correspondent au v\xF4tre.",
"pwa.gotIt": "Compris",
"pwa.installedTitle": "Application install\xE9e !",
"pwa.installedIos": "Application iOS install\xE9e ! Ouvrez-la depuis l'\xE9cran d'accueil.",
"pwa.installedGeneric": "SecureBit.chat est maintenant sur votre appareil",
"pwa.anytimeTitle": "Installable \xE0 tout moment",
"pwa.anytimeDesc": "Vous pouvez installer SecureBit.chat depuis le menu de votre navigateur quand vous voulez, pour la meilleure exp\xE9rience.",
"pwa.ok": "D'accord",
"step.open": "\xC9tape 1 \xB7 ouvrir un canal",
"step.exchange": "\xC9tape 2 \xB7 \xE9change",
"step.verification": "\xC9tape 3 \xB7 v\xE9rification",
"action.create": "Cr\xE9er",
"action.join": "Rejoindre",
"action.back": "Retour",
"action.copy": "Copier",
"action.copied": "Copi\xE9",
"action.scan": "Scanner",
"action.downloadDesktop": "T\xE9l\xE9charger l'application",
"action.advancedSettings": "R\xE9glages avanc\xE9s",
"cred.offerTag": "offre \xB7 ou copiez le texte",
"cred.answerTag": "r\xE9ponse \xB7 ou copiez le texte",
"cred.reveal": "Cliquez pour afficher - gardez ce code priv\xE9",
"qr.title": "Scanner le QR",
"qr.subtitle": "Visez le QR de votre correspondant",
"qr.scanning": "Lecture\u2026",
"qr.hint": "Restez stable jusqu'\xE0 ce que toutes les parties soient captur\xE9es. La cam\xE9ra reste locale - rien n'est envoy\xE9.",
"mesh.you": "vous",
"mesh.peer": "correspondant \xB7 session 1",
"mesh.joined2": "chlo\xE9 a rejoint \xB7 +2",
"mesh.joined3": "hugo a rejoint \xB7 +3",
"ice.title": "R\xE9glages r\xE9seau",
"ice.subtitle": "Configur\xE9 en local - jamais transmis \xE0 votre correspondant",
"ice.intro": "Par d\xE9faut, SecureBit utilise des serveurs STUN publics pour n\xE9gocier le lien pair-\xE0-pair. Indiquez vos propres STUN/TURN si vous les h\xE9bergez.",
"ice.publicTitle": "Serveurs publics (par d\xE9faut)",
"ice.publicDesc": "Sans configuration. Suffisant pour la plupart.",
"ice.customTitle": "Mes propres serveurs STUN/TURN",
"ice.customDesc": "Jusqu'\xE0 {max} serveurs.",
"ice.turnNote": "Un relais TURN voit l'adresse IP des deux pairs et le rythme du trafic, mais jamais le contenu des messages, qui reste chiffr\xE9 de bout en bout. Pr\xE9f\xE9rez ",
"ice.turnNoteTls": " (TLS).",
"ice.test": "Tester les serveurs",
"ice.testing": "Test en cours\u2026",
"ice.relayTitle": "Mode relais uniquement",
"ice.relayBadge": "CONFIDENTIALIT\xC9 MAXIMALE",
"ice.relayDesc": "Fait passer tout le trafic par TURN : votre correspondant ne voit jamais votre adresse IP. N\xE9cessite un serveur TURN.",
"ice.relayWarning": "Le mode relais uniquement est activ\xE9 mais aucun serveur TURN n'est configur\xE9. La connexion ne pourra pas d\xE9marrer.",
"ice.persist": "Enregistrer sur cet appareil",
"ice.persistDesc": "Stock\xE9 chiffr\xE9 dans ce navigateur. Laissez d\xE9sactiv\xE9 pour n'utiliser ces r\xE9glages que le temps de la session.",
"ice.forget": "Oublier l'enregistrement",
"ice.cancel": "Annuler",
"ice.apply": "Appliquer",
"ice.errUnavailable": "WebRTC n'est pas disponible dans ce navigateur",
"ice.errInvalid": "Configuration de serveur invalide",
"update.title": "Mise \xE0 jour disponible",
"update.desc": "Une version plus r\xE9cente de SecureBit a \xE9t\xE9 d\xE9tect\xE9e.",
"update.currentVersion": "Version actuelle",
"update.newVersion": "Nouvelle version",
"update.now": "Mettre \xE0 jour",
"update.later": "Plus tard",
"update.unknown": "n/d",
"update.stepSaving": "Enregistrement des donn\xE9es\u2026",
"update.stepSwCaches": "Vidage des caches du Service Worker\u2026",
"update.stepSwUnregister": "D\xE9sinscription des Service Workers\u2026",
"update.stepBrowserCache": "Vidage du cache du navigateur\u2026",
"update.stepVersion": "Mise \xE0 jour de la version\u2026",
"update.stepReload": "Rechargement de l'application\u2026",
"update.error": "Erreur de mise \xE0 jour. Rechargez la page manuellement (Ctrl+F5 ou Cmd+Maj+R)",
"update.confirmSkip": "Une nouvelle version est disponible. La mise \xE0 jour est recommand\xE9e pour la s\xE9curit\xE9 et la stabilit\xE9. Continuer sans mettre \xE0 jour ?",
"offline.backOnline": "De nouveau en ligne",
"offline.mode": "Mode hors ligne",
"offline.dismiss": "Fermer",
"offline.lostTitle": "Connexion perdue",
"offline.lostDesc": "SecureBit est maintenant hors ligne. Certaines fonctions sont limit\xE9es, mais vos donn\xE9es restent en s\xE9curit\xE9.",
"offline.point1": "Votre session et vos cl\xE9s sont conserv\xE9es",
"offline.point2": "Aucune donn\xE9e n'est stock\xE9e sur un serveur",
"offline.point3": "Messages et fichiers se synchronisent \xE0 la reconnexion",
"offline.continue": "Continuer hors ligne",
"offline.restoredTitle": "\xC0 la reconnexion",
"offline.restoredDesc": "Une coupure ne vous co\xFBte rien. SecureBit met tout en file d'attente en local et reprend la session chiffr\xE9e d\xE8s que vous revenez en ligne.",
"offline.r1Title": "Vos messages sont remis",
"offline.r1Desc": "Tout ce que vous avez \xE9crit hors ligne part automatiquement \xE0 votre correspondant.",
"offline.r2Title": "Les fichiers finissent de partir",
"offline.r2Desc": "Les envois reprennent l\xE0 o\xF9 ils s'\xE9taient arr\xEAt\xE9s - rien \xE0 renvoyer.",
"offline.r3Title": "Leurs messages et fichiers arrivent",
"offline.r3Desc": "Tout ce que votre correspondant a envoy\xE9 pendant la coupure vous parvient dans l'ordre.",
"offline.r4Title": "Rien n'est perdu",
"offline.r4Desc": "Apr\xE8s la reconnexion il n'y a aucun trou - la conversation reprend exactement l\xE0 o\xF9 elle s'\xE9tait arr\xEAt\xE9e.",
"offline.gotIt": "Compris",
"qr.showTitle": "Afficher le QR",
"qr.showSubtitle": "Plein \xE9cran \xB7 laissez votre correspondant scanner",
"qr.showSubtitleFrames": "Plein \xE9cran \xB7 laissez votre correspondant scanner les {frames} images",
"notify.enabledBody": "Notifications activ\xE9es. Vous serez pr\xE9venu des nouveaux messages.",
"notify.workingBody": "Les notifications fonctionnent. Vous serez pr\xE9venu des nouveaux messages.",
"pw.label": "Champ du mot de passe",
"pw.placeholder": "Saisissez le mot de passe\u2026",
"pw.decrypt": "D\xE9chiffrer",
"pw.cancel": "Annuler",
"file.title": "Transferts de fichiers",
"file.drop": "D\xE9posez les fichiers ici",
"file.dropHint": "Chiffr\xE9s de bout en bout avant l'envoi \xB7 jusqu'\xE0 100 Mo",
"file.browse": "Parcourir l'appareil",
"file.incoming": "Fichier entrant",
"file.accept": "Accepter",
"file.reject": "Refuser",
"file.download": "T\xE9l\xE9charger",
"file.notReady": "Connexion pas encore pr\xEAte",
"file.tooLarge": "Fichier trop volumineux",
"file.typeNotAllowed": "Type de fichier non autoris\xE9",
"file.maxConcurrent": "Nombre maximal de transferts simultan\xE9s atteint",
"file.gone": "Ce fichier n'est plus disponible au t\xE9l\xE9chargement.",
"call.incoming": "Appel entrant",
"call.incomingVideo": "Appel vid\xE9o entrant",
"call.encrypted": "Appel chiffr\xE9",
"call.encryptedShort": "Chiffr\xE9",
"call.peer": "Pair s\xE9curis\xE9",
"call.connecting": "Connexion\u2026",
"call.ringing": "Sonnerie\u2026",
"call.accept": "Accepter",
"call.decline": "Refuser",
"call.end": "Raccrocher",
"call.camera": "Cam\xE9ra",
"call.cameraOff": "Cam\xE9ra \xE9teinte",
"call.peerCameraOff": "La cam\xE9ra de votre correspondant est \xE9teinte",
"call.flipCamera": "Changer de cam\xE9ra",
"call.addVideo": "Ajouter la vid\xE9o",
"call.video": "Vid\xE9o",
"call.muted": "Micro coup\xE9",
"call.expand": "Agrandir",
"call.minimize": "R\xE9duire",
"call.quality": "Qualit\xE9 de la connexion",
"call.qualityExcellent": "Excellente",
"call.videoPrefix": "Vid\xE9o \xB7 ",
"call.voicePrefix": "Voix \xB7 ",
"group.new": "Nouveau groupe",
"group.create": "Cr\xE9er le groupe",
"group.join": "Rejoindre le groupe",
"group.name": "Nom du groupe",
"group.nameTooLong": "Le nom du groupe est trop long.",
"group.capacity": "Jusqu'\xE0 {max} personnes, en pair-\xE0-pair. Tout le monde comparera un seul code de s\xE9curit\xE9 avant l'ouverture du groupe.",
"group.invite": "Inviter",
"group.inviteMore": "Inviter d'autres membres",
"group.invitePeople": "Inviter {count} personnes",
"group.invitation": "Invitation au groupe",
"group.addMembers": "Ajouter des membres",
"group.roomFor": "Encore de la place pour {remaining}. \xC0 leur arriv\xE9e, tout le monde comparera un nouveau code de groupe.",
"group.membersCount": "{count} membres",
"group.member": "Membre",
"group.members": "Membres",
"group.remove": "Retirer {name}",
"group.message": "\xC9crire \xE0 {name}",
"group.leave": "Quitter",
"group.leaveThis": "Quitter ce groupe",
"group.cancel": "Annuler le groupe",
"group.close": "Fermer",
"group.cancelBtn": "Annuler",
"group.decline": "Refuser",
"group.working": "En cours\u2026",
"group.sasTitle": "Code de s\xE9curit\xE9 du groupe",
"group.sasEveryone": "Tout le monde voit ce code",
"group.sasCompare": "Comparez le code du groupe avec chaque membre pour ouvrir ce groupe.",
"group.sasReadAloud": "Lisez ces chiffres \xE0 voix haute \xE0 ",
"group.sasWarning": "Si ne serait-ce qu'un membre lit un code diff\xE9rent, quelqu'un se trouve entre vous. Annulez le groupe - ne confirmez pas.",
"group.confirmFirst": "Confirmez d'abord le code du groupe",
"group.codeSuffix": " \xB7 code {code}",
"group.exchangingNonces": "\xC9change des valeurs \xE0 usage unique\u2026",
"group.waitingCommit": "En attente de l'engagement de chaque membre\u2026",
"group.waitingJoin": "En attente des autres membres\u2026",
"group.emptyChat": "Rien ici pour l'instant. Chaque message est sign\xE9 par son exp\xE9diteur et passe par le lien chiffr\xE9 propre \xE0 chaque membre.",
"group.noVerified": "Aucune discussion v\xE9rifi\xE9e pour l'instant. Ouvrez d'abord une discussion en t\xEAte-\xE0-t\xEAte et comparez son code de s\xE9curit\xE9 - un groupe se construit \xE0 partir de connexions d\xE9j\xE0 v\xE9rifi\xE9es.",
"group.noMoreToAdd": "Aucune autre discussion v\xE9rifi\xE9e \xE0 ajouter. Ouvrez une discussion en t\xEAte-\xE0-t\xEAte et comparez d'abord son code de s\xE9curit\xE9.",
"group.directLink": "Lien pair-\xE0-pair direct",
"group.noDirectLink": "Pas encore de lien direct - les messages passent par un autre membre pendant qu'il s'\xE9tablit",
"group.relayNote": "Certains membres n'ont pas encore de lien direct avec vous. Leurs messages passent par un autre membre, qui voit que vous discutez mais ne peut ni lire au-del\xE0 de la signature ni modifier vos propos. Le groupe continue d'essayer de les connecter directement.",
"group.relayOnlyOff": "Le mode relais uniquement est d\xE9sactiv\xE9 : chaque membre se connecte directement \xE0 vous et apprend votre adresse IP, y compris ceux invit\xE9s par quelqu'un d'autre. Activez-le dans les r\xE9glages r\xE9seau si cela compte ici.",
"group.memberOffline": "{name} est hors ligne et ne recevra pas les messages. Cette personne reste membre : la retirer r\xE9g\xE9n\xE8re les cl\xE9s du groupe.",
"group.joinNote": "Les autres membres sauront que vous \xEAtes dans ce groupe. Il n'y a pas d'historique \xE0 rattraper - un groupe d\xE9marre vide.",
"group.inviteSentNote": "Le groupe continue de fonctionner jusqu'\xE0 leur acceptation. Il n'y a pas d'historique \xE0 rattraper pour eux : ils ne verront que ce qui sera envoy\xE9 \xE0 partir de maintenant.",
"group.errNotCreated": "Groupe non cr\xE9\xE9",
"group.errNobodyAccepted": "Personne n'a accept\xE9 l'invitation \xE0 temps.",
"group.errNothingSent": "Rien n'a \xE9t\xE9 envoy\xE9 ni v\xE9rifi\xE9. Fermez cette fen\xEAtre et r\xE9essayez une fois tout le monde connect\xE9.",
"group.errNotFormed": "Ce groupe n'a pas pu \xEAtre form\xE9.",
"group.errFull": "Ce groupe est complet.",
"group.errInviteFailed": "L'invitation n'a pas pu \xEAtre envoy\xE9e - cette discussion n'est pas connect\xE9e.",
"group.errNoMemberList": "La personne qui a cr\xE9\xE9 le groupe n'a jamais envoy\xE9 la liste des membres.",
"group.errUnsignedList": "La liste des membres n'a pas \xE9t\xE9 sign\xE9e par la personne qui a cr\xE9\xE9 le groupe. Ne r\xE9essayez pas - pr\xE9venez-la.",
"group.errNotOwner": "Quelqu'un d'autre que le propri\xE9taire du groupe a tent\xE9 de modifier les membres.",
"hdr.tagline": "Chiffr\xE9 de bout en bout",
"hdr.netSettings": "R\xE9glages r\xE9seau avanc\xE9s",
"hdr.netSettingsTitle": "R\xE9glages r\xE9seau avanc\xE9s (STUN/TURN)",
"hdr.disconnect": "Se d\xE9connecter",
"status.connected": "Connect\xE9",
"status.connecting": "Connexion\u2026",
"status.notConnected": "Non connect\xE9",
"status.reconnecting": "Reconnexion\u2026",
"status.retrying": "Nouvelle tentative\u2026",
"status.verifying": "V\xE9rification\u2026",
"status.peerDisconnected": "Le correspondant s'est d\xE9connect\xE9",
"sec.replayProtection": "Protection contre le rejeu",
"sec.messageIntegrity": "Int\xE9grit\xE9 des messages (HMAC)",
"sec.forwardSecrecy": "Confidentialit\xE9 persistante parfaite",
"sec.metadataProtection": "Protection des m\xE9tadonn\xE9es",
"sec.trafficObfuscation": "Brouillage du trafic",
"sec.realTests": "Tests cryptographiques r\xE9els",
"sec.simulatedData": "Donn\xE9es simul\xE9es",
"sec.testPassed": "Test r\xE9ussi",
"sec.testFailed": "Test \xE9chou\xE9 ou indisponible",
"sec.verificationDone": "V\xE9rification cryptographique r\xE9elle termin\xE9e",
"sec.verificationInProgress": "V\xE9rification de s\xE9curit\xE9 en cours\u2026",
"sec.verificationWait": "V\xE9rification de s\xE9curit\xE9 en cours\u2026\nAttendez la fin de la v\xE9rification cryptographique en temps r\xE9el.",
"sec.verificationUnavailable": "V\xE9rification de s\xE9curit\xE9 indisponible",
"chat.placeholder": "\xC9crivez un message chiffr\xE9\u2026",
"chat.send": "Envoyer le message",
"chat.sendFiles": "Envoyer des fichiers",
"chat.hideFiles": "Masquer les fichiers",
"chat.recordVoice": "Enregistrer un message vocal",
"chat.sendVoice": "Envoyer le message vocal",
"chat.discard": "Abandonner",
"chat.codeBlock": "Envoyer comme bloc de code (agrandit le champ)",
"chat.codeHint": "Extrait de code \xB7 mise en forme conserv\xE9e \xB7 \u2318\u21B5 pour envoyer",
"chat.viewOnce": "Vue unique",
"chat.viewOnceTitle": "Vue unique - dispara\xEEt d\xE8s que votre correspondant l'a lu",
"chat.viewOncePrefix": "Vue unique \xB7 ",
"chat.viewOnceTap": "Vue unique \xB7 touchez pour afficher",
"chat.viewedOnce": "D\xE9j\xE0 vu",
"chat.disappearing": "Message \xE9ph\xE9m\xE8re - supprim\xE9 des deux c\xF4t\xE9s",
"chat.disappearAfter": "Dispara\xEEt apr\xE8s",
"chat.visibleFor": "Visible pendant",
"chat.timerPrefix": "Minuteur \xB7 ",
"chat.expired": "Ce message a expir\xE9",
"chat.deleteForEveryone": "Supprimer pour tout le monde",
"chat.sending": "Envoi",
"chat.delivered": "Remis",
"chat.notSent": "Non envoy\xE9",
"chat.notSentReason": "Non envoy\xE9 - le canal s\xE9curis\xE9 n'est pas pr\xEAt. Reconnectez-vous pour continuer.",
"chat.encrypted": "Chiffr\xE9",
"chat.decrypted": "D\xE9chiffr\xE9",
"chat.encryptedOnDevice": "Chiffr\xE9 sur votre appareil",
"chat.uploading": "Envoi",
"chat.downloading": "T\xE9l\xE9chargement",
"chat.transferring": "Transfert\u2026",
"chat.copied": "Copi\xE9 !",
"chat.collapse": "Replier",
"chat.closeMenu": "Fermer le menu",
"chat.newChat": "Nouvelle discussion",
"chat.newGroup": "Nouveau groupe",
"chat.createGroup": "Cr\xE9er un groupe",
"chat.groupChats": "Groupes",
"chat.secureChat": "Discussion s\xE9curis\xE9e",
"chat.nameThis": "Nommez cette discussion",
"chat.rename": "Renommer la discussion (en local)",
"chat.renameHint": "Double-cliquez pour renommer",
"chat.localLabel": "Nom local \xB7 stock\xE9 uniquement sur cet appareil",
"chat.setStatus": "Choisissez votre statut",
"chat.yourStatusPrefix": "Votre statut - ",
"chat.meshHint": "Jusqu'\xE0 8 pairs \xB7 maillage P2P",
"chat.offline": "Hors ligne",
"chat.noNetwork": "Pas de r\xE9seau \xB7 reconnexion",
"chat.startVoiceCall": "Lancer un appel vocal chiffr\xE9",
"chat.startVideoCall": "Lancer un appel vid\xE9o chiffr\xE9",
"chat.verifyForCalls": "V\xE9rifiez la session pour activer les appels",
"chat.e2eeNote": "Chaque message est chiffr\xE9 de bout en bout sur votre appareil avant de partir.",
"chat.peersOnly": "Envoy\xE9 de bout en bout aux seuls pairs connect\xE9s - jamais stock\xE9 sur un serveur.",
"flow.invitationCreated": "Invitation s\xE9curis\xE9e cr\xE9\xE9e",
"flow.invitationCreatedBang": "Invitation s\xE9curis\xE9e cr\xE9\xE9e et chiffr\xE9e.",
"flow.responseCreated": "R\xE9ponse s\xE9curis\xE9e cr\xE9\xE9e",
"flow.responseCreatedBang": "R\xE9ponse s\xE9curis\xE9e cr\xE9\xE9e.",
"flow.sendInvitation": "Envoyez le code d'invitation \xE0 votre correspondant par un canal s\xFBr (appel, SMS, etc.).",
"flow.sendResponse": "Envoyez le code de r\xE9ponse \xE0 la personne qui a ouvert le canal par un canal s\xFBr, ou laissez-la scanner le QR ci-dessous.",
"flow.sendEncryptedCode": "Envoyer le code chiffr\xE9",
"flow.sendTheResponse": "Envoyer la r\xE9ponse",
"flow.pasteOrWrite": "Collez ou saisissez le code\u2026",
"flow.processingInvitation": "Traitement de l'invitation s\xE9curis\xE9e\u2026",
"flow.processingResponse": "Traitement de la r\xE9ponse s\xE9curis\xE9e\u2026",
"flow.finalizing": "Finalisation de la connexion s\xE9curis\xE9e\u2026",
"flow.channelEstablished": "Canal s\xE9curis\xE9 \xE9tabli",
"flow.channelReady": "Le canal s\xE9curis\xE9 est pr\xEAt",
"flow.restoring": "R\xE9tablissement de la connexion\u2026",
"flow.invitationCaptured": "Invitation captur\xE9e.",
"err.needInvitation": "Vous devez coller le code d'invitation de votre correspondant.",
"err.needResponse": "Vous devez coller le code de r\xE9ponse de votre correspondant.",
"err.responseFormat": "Format de r\xE9ponse invalide - v\xE9rifiez le code",
"err.responseNoKey": "Code de r\xE9ponse invalide - cl\xE9 cryptographique manquante ou ab\xEEm\xE9e. V\xE9rifiez le code et r\xE9essayez.",
"err.responseNoSignKey": "Code de r\xE9ponse invalide - cl\xE9 de v\xE9rification de signature manquante. V\xE9rifiez le code et r\xE9essayez.",
"err.responseOutdated": "Les donn\xE9es de r\xE9ponse sont p\xE9rim\xE9es - utilisez une invitation r\xE9cente",
"err.setupError": "Erreur lors de l'\xE9tablissement de la connexion",
"err.notReady": "Connexion pas encore pr\xEAte",
"err.securityBreach": "Faille de s\xE9curit\xE9 d\xE9tect\xE9e - connexion refus\xE9e",
"err.securityValidation": "\xC9chec du contr\xF4le de s\xE9curit\xE9 - attaque possible",
"err.retiredQr": "Ce QR utilise un format abandonn\xE9 qui n'a pas permis de transf\xE9rer l'invitation. Demandez-en un nouveau, ou utilisez le copier-coller.",
"err.compressedQrNote": "Un QR compress\xE9 peut omettre le SDP par concision. Utilisez le copier-coller si la connexion \xE9choue.",
"err.inviteNotConnected": "L'invitation n'a pas pu \xEAtre envoy\xE9e. Cette discussion n'est pas connect\xE9e pour le moment.",
"err.inviteNotConnectedRetry": "L'invitation n'a pas pu \xEAtre envoy\xE9e. Cette discussion n'est pas connect\xE9e pour le moment - rouvrez-la et r\xE9essayez.",
"err.nobodyAccepted": "Personne n'a accept\xE9 l'invitation. Le groupe est inchang\xE9.",
"err.noAudio": "Aucun son enregistr\xE9 - v\xE9rifiez l'autorisation du micro et r\xE9essayez.",
"err.voiceNeedsConnection": "Un message vocal demande une connexion s\xE9curis\xE9e active. Reconnectez-vous et r\xE9essayez.",
"err.voiceRestoring": "R\xE9tablissement de la connexion - r\xE9essayez d'envoyer le message vocal dans un instant.",
"err.fileTooLarge": "Fichier trop volumineux",
"sas.safetyNumber": "Num\xE9ro de s\xE9curit\xE9",
"sas.incorrect": "Code incorrect. V\xE9rifiez-le avec votre correspondant et r\xE9essayez.",
"sas.noMatch": "Les codes ne correspondent pas",
"sas.makeSure": "Assurez-vous que les codes correspondent exactement.",
"sas.tooManyAttempts": "Trop de tentatives incorrectes. La session a \xE9t\xE9 r\xE9initialis\xE9e par s\xE9curit\xE9.",
"sas.verificationFailed": "V\xE9rification \xE9chou\xE9e",
"sas.verified": "V\xE9rifi\xE9 \xB7 confidentialit\xE9 persistante parfaite",
"sas.runVerification": "Lancer la v\xE9rification de s\xE9curit\xE9",
"sec.panelTitle": "D\xE9tails r\xE9seau et cryptographie",
"sec.security": "S\xE9curit\xE9",
"sec.transport": "Transport",
"sec.keyExchange": "\xC9change de cl\xE9s",
"sec.allEnabled": "Toutes les protections sont actives par d\xE9faut",
"sec.realTimeNote": "V\xE9rification en temps r\xE9el avec de vraies fonctions cryptographiques - aucune donn\xE9e factice.",
"sec.simulatedWarning": "Attention : la connexion n'est peut-\xEAtre pas enti\xE8rement \xE9tablie - les valeurs peuvent \xEAtre simul\xE9es.",
"dl.title": "T\xE9l\xE9charger SecureBit",
"dl.free": "Gratuit \xB7 code ouvert",
"dl.soon": "Les applications mobiles (iOS, Android) et les extensions de navigateur (Chrome, Firefox, Opera) arrivent bient\xF4t.",
"chatHdr.chat": "Discussion",
"chatHdr.chats": "Discussions",
"chatHdr.newChat": "+ Nouvelle",
"chatHdr.secure": "S\xE9curis\xE9",
"chatHdr.p2pSub": "P2P \xB7 chiffr\xE9 de bout en bout",
"chatHdr.save": "Enregistrer",
"chatHdr.close": "Fermer",
"chatHdr.expand": "Agrandir",
"chatHdr.you": "Vous",
"chatHdr.qrCode": "QR code",
"chat.disconnected": "D\xE9connect\xE9",
"call.mute": "Couper le micro",
"call.endShort": "Fin",
"group.add": "Ajouter",
"group.send": "Envoyer",
"sec.pfsShort": "Confidentialit\xE9 persistante parfaite",
"sec.cipher": "Chiffrement",
"chat.close": "Fermer",
"file.needConnection": "Le transfert de fichiers demande une connexion ouverte",
"presence.available": "Disponible",
"presence.away": "Absent",
"presence.busy": "Occup\xE9",
"presence.offline": "Hors ligne",
"presence.invisible": "Invisible",
"presence.availableDesc": "En ligne et joignable",
"presence.awayDesc": "Inactif \xB7 momentan\xE9ment absent",
"presence.busyDesc": "Ne pas d\xE9ranger",
"presence.invisibleDesc": "Appara\xEEtre hors ligne pour les autres",
"presence.online": "En ligne",
"conn.p2p": "P2P \xB7 connect\xE9",
"conn.verifying": "V\xE9rification\u2026",
"conn.connecting": "Connexion\u2026",
"conn.reconnecting": "Reconnexion\u2026",
"conn.peerDisconnected": "Le correspondant s'est d\xE9connect\xE9",
"conn.disconnected": "D\xE9connect\xE9",
"chat.defaultLabel": "Discussion",
"groupPhase.forming": "Formation\u2026",
"groupPhase.commitments": "\xC9change des engagements\u2026",
"groupPhase.revealing": "R\xE9v\xE9lation\u2026",
"groupPhase.compare": "Comparez le code du groupe",
"groupPhase.ready": "Groupe pr\xEAt",
"groupPhase.failed": "Groupe non cr\xE9\xE9",
"call.qualityGood": "Bonne",
"call.qualityFair": "Correcte",
"call.qualityWeak": "Faible",
"msg.code": "Code",
"msg.timer": "Minuteur",
"msg.voice": "Voix",
"msg.play": "Lire",
"msg.sent": "Envoy\xE9",
"msg.read": "Lu",
"report.title": "V\xE9rification de s\xE9curit\xE9 en temps r\xE9el",
"report.active": "Actif",
"report.testsPassed": "Tests r\xE9ussis",
"report.verifiedAt": "V\xE9rifi\xE9 le",
"report.source": "Source",
"secTest.verifyECDHKeyExchange": "\xC9change de cl\xE9s ECDH",
"secTest.verifyECDSASignatures": "Signatures num\xE9riques ECDSA",
"secTest.verifyEncryption": "Chiffrement AES-GCM",
"secTest.verifyMessageIntegrity": "Int\xE9grit\xE9 des messages",
"secTest.verifyPerfectForwardSecrecy": "Confidentialit\xE9 persistante parfaite",
"secTest.verifyPFS": "Confidentialit\xE9 persistante parfaite",
"secTest.verifyReplayProtection": "Protection contre le rejeu",
"secTest.verifyDTLSFingerprint": "Empreinte DTLS",
"secTest.verifySASVerification": "V\xE9rification SAS",
"secTest.verifyMetadataProtection": "Protection des m\xE9tadonn\xE9es",
"secTest.verifyTrafficObfuscation": "Brouillage du trafic",
"secTest.verifyPacketPadding": "Remplissage de paquets",
"secTest.verifyNestedEncryption": "Chiffrement imbriqu\xE9",
"secTest.verifyNonExtractableKeys": "Cl\xE9s non extractibles",
"secTest.verifyRateLimiting": "Limitation du d\xE9bit",
"secTest.verifyMutualAuth": "Authentification mutuelle",
"secTest.verifyAuthProof": "Preuve d'authentification",
"secTest.verifyEnhancedValidation": "Validation renforc\xE9e",
"secTest.verifyAdvancedFeatures": "Fonctions avanc\xE9es",
"secTest.verifySignature": "Contr\xF4le de signature",
"secDetail.Security system initializing...": "D\xE9marrage du syst\xE8me de s\xE9curit\xE9\u2026",
"secDetail.Nested encryption active": "Chiffrement imbriqu\xE9 actif",
"secDetail.Nested encryption failed": "\xC9chec du chiffrement imbriqu\xE9",
"secDetail.Packet padding active": "Remplissage de paquets actif",
"secDetail.Packet padding failed": "\xC9chec du remplissage de paquets",
"secDetail.Advanced features active": "Fonctions avanc\xE9es actives",
"secDetail.Advanced features failed": "\xC9chec des fonctions avanc\xE9es",
"secDetail.No encryption key available": "Aucune cl\xE9 de chiffrement disponible",
"secDetail.AES-GCM encryption/decryption working correctly": "Le chiffrement et le d\xE9chiffrement AES-GCM fonctionnent correctement",
"secDetail.No ECDH key pair available": "Aucune paire de cl\xE9s ECDH disponible",
"secDetail.Key derivation failed": "\xC9chec de la d\xE9rivation de cl\xE9",
"secDetail.No ECDSA key pair available": "Aucune paire de cl\xE9s ECDSA disponible",
"secDetail.ECDSA digital signatures working correctly": "Les signatures num\xE9riques ECDSA fonctionnent correctement",
"secDetail.MAC key not available or invalid": "Cl\xE9 MAC absente ou invalide",
"secDetail.Rate limiter did not block a message over the limit": "Le limiteur n'a pas bloqu\xE9 un message au-del\xE0 de la limite",
"secDetail.Rate limiter is not available": "Le limiteur de d\xE9bit n'est pas disponible",
"secDetail.Replay protection is working correctly": "La protection contre le rejeu fonctionne correctement",
"secDetail.Replay protection not enabled": "Protection contre le rejeu inactive",
"secDetail.SAS code not available": "Code SAS indisponible",
"secDetail.SAS verification code is valid and available": "Le code de v\xE9rification SAS est valide et disponible",
"secDetail.Traffic obfuscation is working correctly": "Le brouillage du trafic fonctionne correctement",
"secDetail.Traffic obfuscation not enabled": "Brouillage du trafic inactif",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "Aucune paire de cl\xE9s ECDH \xE9ph\xE9m\xE8res non extractibles pour cette session",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "Confidentialit\xE9 persistante au niveau de la session seulement : les cl\xE9s sont \xE9ph\xE9m\xE8res pour chaque session, mais le Double Ratchet n'est pas actif sur cette connexion (le correspondant utilise une version plus ancienne), donc une cl\xE9 de session compromise expose toute la conversation.",
"msg.pause": "Pause",
"msg.failed": "\xC9chec",
"groupErr.timeout": "Un membre a cess\xE9 de r\xE9pondre avant que le code soit pr\xEAt.",
"groupErr.keyMismatch": "La cl\xE9 d'un membre ne correspondait pas \xE0 l'identit\xE9 annonc\xE9e.",
"groupErr.revealMismatch": "La valeur r\xE9v\xE9l\xE9e par un membre ne correspondait pas \xE0 son engagement.",
"groupErr.commitChanged": "Un membre a chang\xE9 son engagement en cours de route.",
"groupErr.missingKey": "Un membre figurait sur la liste alors que sa cl\xE9 n'est jamais arriv\xE9e.",
"groupErr.outsider": "Une trame est arriv\xE9e de quelqu'un ext\xE9rieur au groupe.",
"groupErr.limit": "Un groupe est limit\xE9 \xE0 huit membres.",
"groupErr.tooLarge": "Un message \xE9tait trop volumineux pour \xEAtre envoy\xE9 au groupe.",
"fileType.text": "Texte brut",
"fileType.images": "Images",
"fileType.archives": "Archives",
"fileType.voice": "Messages vocaux",
"fileType.unsupported": "Non pris en charge",
"qrScan.title": "Scanner le QR",
"qrScan.auto": "Mode auto",
"qrScan.reset": "R\xE9initialiser",
"qrScan.autoScroll": "D\xE9filement automatique activ\xE9",
"qrScan.starting": "D\xE9marrage de la cam\xE9ra\u2026",
"qrScan.point": "Visez le QR de votre correspondant",
"qrScan.tapFocus": "Touchez l'\xE9cran pour faire la mise au point",
"qrScan.focusing": "Mise au point\u2026",
"iceErr.notArray": "La liste de serveurs doit \xEAtre un tableau",
"iceErr.invalidJson": "JSON invalide",
"iceErr.tooMany": "Trop de serveurs (maximum {max})",
"iceErr.invalidEntry": "{label} : entr\xE9e invalide",
"iceErr.urlCount": "{label} : entre 1 et {max} URL requises",
"iceErr.turnCreds": "{label} : les serveurs TURN demandent en g\xE9n\xE9ral un nom d'utilisateur et un identifiant",
"iceUrl.notString": "L'URL doit \xEAtre une cha\xEEne",
"iceUrl.empty": "L'URL est vide",
"iceUrl.tooLong": "L'URL est trop longue",
"iceUrl.badChars": "L'URL contient des caract\xE8res invalides",
"iceUrl.badScheme": "L'URL doit commencer par stun:, stuns:, turn: ou turns:",
"iceUrl.badQuery": "L'URL contient une requ\xEAte invalide",
"iceUrl.noHost": "Il manque un h\xF4te \xE0 l'URL",
"iceUrl.badHost": "L'URL a un h\xF4te ou un port invalide",
"iceUrl.badTransport": "La requ\xEAte de l'URL doit \xEAtre transport=udp ou transport=tcp",
"msg.off": "D\xE9sactiv\xE9",
"file.consentUnavailable": "Impossible de demander l'accord",
"secLevel.MAXIMUM": "MAXIMUM",
"secLevel.INITIALIZING": "D\xC9MARRAGE",
"secLevel.ERROR": "ERREUR",
"secLevel.UNKNOWN": "INCONNU",
"status.error": "Erreur",
"offline.disconnect": "Se d\xE9connecter",
"offline.learnMore": "En savoir plus",
"pwa.installApp": "Installer l'application",
"chat.onWeb": "Vous \xEAtes sur la version web",
"groupCall.startVoice": "D\xE9marrer un appel vocal de groupe",
"groupCall.startVideo": "D\xE9marrer un appel vid\xE9o de groupe",
"groupCall.join": "Rejoindre",
"groupCall.dismiss": "Pas maintenant",
"groupCall.leave": "Quitter l'appel",
"groupCall.you": "Vous",
"groupCall.connecting": "Connexion\u2026",
"groupCall.waitingLink": "En attente d'un lien direct\u2026",
"groupCall.legFailed": "Connexion impossible",
"groupCall.startedVoice": "{name} a d\xE9marr\xE9 un appel vocal",
"groupCall.startedVideo": "{name} a d\xE9marr\xE9 un appel vid\xE9o",
"groupCall.inCall": "{count} dans l'appel",
"groupCall.err.permission_denied": "L'appel n'a pas pu d\xE9marrer - l'acc\xE8s au micro et \xE0 la cam\xE9ra est bloqu\xE9. Autorisez-le pour ce site, puis r\xE9essayez.",
"groupCall.err.device_not_found": "L'appel n'a pas pu d\xE9marrer - aucun micro n'a \xE9t\xE9 trouv\xE9 sur cet appareil.",
"groupCall.err.device_busy": "L'appel n'a pas pu d\xE9marrer - votre micro est utilis\xE9 par une autre application. Fermez-la et r\xE9essayez.",
"groupCall.err.media_failed": "L'appel n'a pas pu d\xE9marrer - le micro n'a pas pu \xEAtre ouvert.",
"groupCall.err.call_in_progress": "Un appel est d\xE9j\xE0 en cours dans ce groupe. Rejoignez-le plut\xF4t que d'en d\xE9marrer un autre.",
"groupCall.err.not_ready": "Confirmez le code du groupe avant d'appeler.",
"groupCall.speaking": "{name} parle",
"groupCall.pin": "Afficher {name} en grand",
"groupCall.unpin": "Revenir \xE0 tous",
"groupCall.showEveryone": "Tout le monde",
"msg.after5s": "5 s apr\xE8s lecture",
"msg.after15s": "15 s apr\xE8s lecture",
"msg.after30s": "30 s apr\xE8s lecture",
"msg.after1m": "1 min apr\xE8s lecture",
"msg.sec30": "30 secondes",
"msg.min5": "5 minutes",
"msg.hour1": "1 heure",
"desktop.shareDesc": "Envoyez le code \xE0 votre pair. Il est \xE0 usage unique et expire rapidement.",
"desktop.invitationCreated": "Invitation s\xE9curis\xE9e cr\xE9\xE9e - envoyez-la \xE0 votre pair.",
"desktop.joinDesc": "Collez le code d'invitation de votre pair pour construire votre r\xE9ponse s\xE9curis\xE9e.",
"desktop.offerTag": "invitation \xB7 copier le texte",
"desktop.answerTag": "r\xE9ponse \xB7 copier le texte",
"desktop.offerPlaceholder": "Le code d'invitation appara\xEEtra ici\u2026",
"desktop.answerPlaceholder": "Le code de r\xE9ponse appara\xEEtra ici\u2026",
"desktop.backToChats": "Retour aux discussions",
"desktop.sendFeedback": "Envoyer un retour",
"desktop.callsNeedVerified": "Les appels n\xE9cessitent un canal s\xE9curis\xE9 v\xE9rifi\xE9.",
"desktop.noOpenChannel": "Aucun canal s\xE9curis\xE9 ouvert.",
"desktop.chatCarriesCall": "Cette discussion porte un appel de groupe. Quittez l'appel de groupe avant de lancer un appel \xE0 deux.",
"desktop.err.permission_denied": "L'appel n'a pas pu d\xE9marrer - l'acc\xE8s au micro et \xE0 la cam\xE9ra est bloqu\xE9. Autorisez-le dans les r\xE9glages syst\xE8me, puis r\xE9essayez.",
"desktop.language": "Langue",
"desktop.languageHint": "S'applique imm\xE9diatement. Les messages d\xE9j\xE0 envoy\xE9s gardent leurs mots.",
"desktop.compareCode": "Comparez le code de v\xE9rification avec votre pair et confirmez s\u2019il correspond.",
"desktop.verifyBeforeFiles": "Terminez la v\xE9rification avant d\u2019envoyer des fichiers.",
"desktop.verifyBeforeSending": "Terminez la v\xE9rification avant d\u2019envoyer des messages.",
"desktop.disconnectedByBackend": "Connexion ferm\xE9e de fa\xE7on s\xE9curis\xE9e.",
"desktop.restoreFailed": "Impossible de r\xE9tablir la connexion. Fermeture de cette discussion.",
"desktop.channelNotReady": "Le canal de donn\xE9es n\u2019est pas encore disponible. Attendez que la connexion soit \xE9tablie.",
"desktop.enterCode": "Saisissez le code de v\xE9rification pour confirmer.",
"desktop.noOffer": "Aucune invitation trouv\xE9e. Cr\xE9ez-en une d\u2019abord.",
"desktop.notInitiator": "Vous n\u2019avez pas cr\xE9\xE9 cette connexion, il n\u2019y a donc aucune r\xE9ponse \xE0 appliquer.",
"desktop.decryptFailed": "Un message n\u2019a pas pu \xEAtre d\xE9chiffr\xE9 et a \xE9t\xE9 \xE9cart\xE9.",
"desktop.badMessageFormat": "Une trame mal form\xE9e est arriv\xE9e et a \xE9t\xE9 \xE9cart\xE9e.",
"desktop.notSentNotReady": "Message non envoy\xE9 : le canal s\xE9curis\xE9 n\u2019est pas pr\xEAt. Attendez la fin de la v\xE9rification ou reconnectez-vous.",
"desktop.micDenied": "L\u2019acc\xE8s au micro a \xE9t\xE9 refus\xE9.",
"desktop.noChannelWait": "Aucun canal s\xE9curis\xE9 ouvert - attendez que la connexion soit \xE9tablie.",
"desktop.sasFailed": "\xC9chec de la v\xE9rification. Un interm\xE9diaire est peut-\xEAtre pr\xE9sent : la connexion a \xE9t\xE9 interrompue.",
"desktop.sasOk": "V\xE9rification r\xE9ussie. Ce canal est authentifi\xE9 de bout en bout.",
"desktop.iceForgotten": "Serveurs enregistr\xE9s oubli\xE9s. Utilisation des serveurs ICE publics.",
"desktop.icePublic": "Utilisation des serveurs ICE publics.",
"desktop.verificationInProgress": "La v\xE9rification de s\xE9curit\xE9 est encore en cours. Attendez la fin.",
"desktop.fileGone": "Ce fichier n\u2019est plus disponible au t\xE9l\xE9chargement.",
"desktop.codeMismatch": "Les codes de v\xE9rification ne correspondent pas. D\xE9connexion par s\xE9curit\xE9.",
"desktop.noLocalCode": "\xC9chec de la v\xE9rification : aucun code d\xE9riv\xE9 localement \xE0 comparer. D\xE9connexion par s\xE9curit\xE9.",
"desktop.protocolViolation": "Le pair a affirm\xE9 que le code \xE9tait confirm\xE9 avant que vous ne le confirmiez. D\xE9connexion par s\xE9curit\xE9.",
"desktop.verificationRejected": "V\xE9rification rejet\xE9e. La connexion a \xE9t\xE9 interrompue par s\xE9curit\xE9.",
"secLevel.HIGH": "\xC9LEV\xC9",
"secLevel.MEDIUM": "MOYEN",
"secLevel.LOW": "FAIBLE",
"desktop.rerun": "Relancer",
"desktop.ice.customDesc": "Jusqu'\xE0 {max} serveurs, une URL par ligne ou du JSON.",
"desktop.ice.persistDesc": "Enregistr\xE9 localement sur cet appareil. Laissez d\xE9sactiv\xE9 pour ne l\u2019utiliser que pendant cette session.",
"desktop.group.leaveNote": "Les autres membres sont inform\xE9s de votre d\xE9part. Rien de ce groupe ne reste ensuite sur cet appareil - aucun serveur n\u2019en garde de copie, il vous faudrait donc une nouvelle invitation.",
"desktop.sec.ecdsaOk": "Signature du paquet de cl\xE9s du pair v\xE9rifi\xE9e pendant la poign\xE9e de main (ECDSA P-384 / SHA-384)",
"desktop.sec.ecdsaNone": "Aucune poign\xE9e de main achev\xE9e",
"desktop.sec.ecdhOk": "Cl\xE9s de session d\xE9riv\xE9es d\u2019un \xE9change ECDH P-384 \xE9ph\xE9m\xE8re via HKDF-SHA-256",
"desktop.sec.ecdhNone": "Aucune cl\xE9 de session d\xE9riv\xE9e",
"desktop.sec.encryptionOk": "Chiffrement et d\xE9chiffrement AES-GCM v\xE9rifi\xE9s dans le c\u0153ur",
"desktop.sec.encryptionNa": "L\u2019autotest AES-GCM n\u2019a pas pu \xEAtre ex\xE9cut\xE9",
"desktop.sec.integrityOk": "Int\xE9grit\xE9 des messages v\xE9rifi\xE9e (authentification AES-GCM)",
"desktop.sec.integrityNa": "L\u2019autotest d\u2019int\xE9grit\xE9 n\u2019a pas pu \xEAtre ex\xE9cut\xE9",
"desktop.sec.pfsOk": "Double Ratchet actif - chaque message a sa propre cl\xE9",
"desktop.sec.pfsNa": "Non mesur\xE9",
"desktop.sec.replayOk": "Les cl\xE9s de message du ratchet sont d\xE9truites apr\xE8s usage : une trame captur\xE9e ne peut pas \xEAtre rejou\xE9e",
"desktop.sec.replayNa": "Non mesur\xE9",
"desktop.sec.dtlsPinned": "Empreinte DTLS du pair \xE9pingl\xE9e : {fp}",
"desktop.sec.dtlsNone": "Aucune empreinte DTLS distante disponible",
"desktop.sec.sasBoth": "Les deux pairs ont confirm\xE9 le code de s\xE9curit\xE9 hors bande",
"desktop.sec.sasIncomplete": "Le code de s\xE9curit\xE9 n\u2019a pas \xE9t\xE9 confirm\xE9 par les deux pairs",
"desktop.sec.metadataOk": "Une cl\xE9 de m\xE9tadonn\xE9es d\xE9di\xE9e a \xE9t\xE9 d\xE9riv\xE9e (HKDF metadata-protection-v4)",
"desktop.sec.metadataNone": "Aucune cl\xE9 de m\xE9tadonn\xE9es",
"desktop.sec.coverOn": "Trafic de couverture actif : trames factices al\xE9atoires (32-128 o toutes les 15-30 s) sur le canal \xE0 ratchet",
"desktop.sec.coverOff": "Le g\xE9n\xE9rateur de trafic de couverture ne tourne pas",
"desktop.sec.coverUnsupported": "Le trafic de couverture exige une session Double Ratchet (le pair utilise une version plus ancienne)",
"desktop.tagline": "La libert\xE9 de bout en bout"
},
"es": {
"language.label": "Idioma",
"language.suggest.text": "Esta p\xE1gina tambi\xE9n est\xE1 disponible en espa\xF1ol.",
"language.suggest.cta": "Leer en espa\xF1ol",
"language.suggest.dismiss": "Cerrar",
"community.title": "Construye el futuro de la privacidad",
"community.description": "SecureBit crece gracias a su comunidad. Tus ideas y comentarios dan forma al futuro de la comunicaci\xF3n segura, desarrollada de forma abierta y con validaci\xF3n ASN.1 completa de extremo a extremo.",
"community.github": "Repositorio en GitHub",
"community.feedback": "Comentarios",
"unique.eyebrow": "Lo que nos distingue",
"unique.heading": "Por qu\xE9 SecureBit es \xFAnico",
"unique.s1.titleTop": "N\xFAcleo de cifrado",
"unique.s1.titleBottom": "por capas",
"unique.s1.collapsed": "N\xFAcleo de cifrado",
"unique.s1.desc": "Intercambio de claves ECDH P-384, carga \xFAtil AES-256-GCM, firmas ECDSA y validaci\xF3n ASN.1 completa, reunidos en una sola cadena reforzada.",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "P2P puro",
"unique.s2.titleBottom": "sobre WebRTC",
"unique.s2.collapsed": "P2P puro sobre WebRTC",
"unique.s2.desc": "Los mensajes viajan directamente entre dispositivos por WebRTC. Ning\xFAn relay retiene tus datos: el servidor solo ayuda a que dos pares se encuentren.",
"unique.s2.tags": [
"DTLS 1.3",
"Sin relay"
],
"unique.s3.titleTop": "Secreto perfecto",
"unique.s3.titleBottom": "hacia adelante",
"unique.s3.collapsed": "Secreto hacia adelante",
"unique.s3.desc": "Las claves de sesi\xF3n rotan continuamente y se descartan tras usarse, de modo que una clave comprometida nunca abre las conversaciones anteriores.",
"unique.s3.tags": [
"Claves ef\xEDmeras",
"Rotaci\xF3n autom\xE1tica"
],
"unique.s4.titleTop": "Ofuscaci\xF3n",
"unique.s4.titleBottom": "del tr\xE1fico",
"unique.s4.collapsed": "Ofuscaci\xF3n del tr\xE1fico",
"unique.s4.desc": "Los tama\xF1os de paquete y los tiempos se rellenan y se aleatorizan, ocultando los patrones de metadatos a quien observe la l\xEDnea.",
"unique.s4.tags": [
"Relleno de paquetes",
"Variaci\xF3n de tiempos"
],
"unique.s5.titleTop": "Cero recogida",
"unique.s5.titleBottom": "de datos",
"unique.s5.collapsed": "Cero recogida de datos",
"unique.s5.desc": "Sin cuentas, sin registros, sin mensajes almacenados. No hay nada en un servidor que filtrar, requisar o vender.",
"unique.s5.tags": [
"Sin cuentas",
"Sin registros"
],
"partners.eyebrow": "Socios y ecosistema",
"partners.heading": "Nuestros socios conf\xEDan en nosotros",
"partners.aegis.desc": "Socio de capital que protege las comunicaciones financieras confidenciales de toda su cartera.",
"partners.aegis.role": "Inversor estrat\xE9gico",
"partners.furilabs.desc": "Tel\xE9fonos Linux centrados en la privacidad que incluyen SecureBit como canal seguro por defecto.",
"partners.furilabs.role": "Socio tecnol\xF3gico",
"partners.inviteTitle": "Convi\xE9rtete en socio",
"partners.inviteDesc": "\xBFConstruyes hardware o infraestructura para la privacidad? Integremos SecureBit.",
"partners.inviteCta": "Iniciar una conversaci\xF3n",
"roadmap.eyebrow": "Hoja de ruta",
"roadmap.heading": "La evoluci\xF3n de SecureBit",
"roadmap.subheading": "Del primer prototipo a una red descentralizada y resistente a la computaci\xF3n cu\xE1ntica, con validaci\xF3n ASN.1 completa en cada capa.",
"roadmap.progress": "{shipped} de {total} hitos completados",
"roadmap.upcoming": "{upcoming} en camino",
"roadmap.keyFeatures": "Funciones clave",
"roadmap.status.released": "Publicado",
"roadmap.status.current": "Actual",
"roadmap.status.dev": "En desarrollo",
"roadmap.status.planned": "Planificado",
"roadmap.status.research": "Investigaci\xF3n",
"hero.headlineTop": "Una l\xEDnea directa",
"hero.headlineBottom": "que solo le\xE9is vosotros dos.",
"hero.subheading": "Las claves se generan en tu dispositivo y se intercambian directamente entre pares. Sin cuentas y sin servidores que guarden tus mensajes.",
"hero.diagramAlt": "Una l\xEDnea cifrada directa hacia un par, a la que se suman otros dos pares",
"intro.createTitle": "Crear un canal nuevo",
"intro.createDesc": "Tu dispositivo genera las claves y una invitaci\xF3n de un solo uso. Nada de esto pasa por un servidor.",
"intro.createCta": "Generar claves e invitaci\xF3n",
"intro.joinTitle": "Unirse a un canal",
"intro.scanTitle": "Escanear el QR con la c\xE1mara",
"intro.scanSubtitle": "Lo m\xE1s r\xE1pido: apunta a la pantalla de la otra persona",
"intro.orPasteCode": "o pega el c\xF3digo",
"intro.pastePlaceholder": "Pega aqu\xED el c\xF3digo de invitaci\xF3n\u2026",
"intro.connect": "Conectar",
"intro.connecting": "Procesando\u2026",
"roadmap.r1.title": "Inicio del desarrollo",
"roadmap.r1.sub": "Idea, prototipo y montaje de la infraestructura",
"roadmap.r1.date": "Principios de 2025",
"roadmap.r1.features": [
"Definici\xF3n del concepto y los requisitos",
"Elecci\xF3n del stack: WebRTC, P2P, criptograf\xEDa",
"Primeros prototipos de mensajer\xEDa",
"Creaci\xF3n del repositorio y CI",
"Arquitectura b\xE1sica de cifrado",
"Dise\xF1o de UX/UI"
],
"roadmap.r2.title": "Versi\xF3n alfa",
"roadmap.r2.sub": "Primera alfa p\xFAblica: chat b\xE1sico e intercambio de claves",
"roadmap.r2.date": "Primavera de 2025",
"roadmap.r2.features": [
"Mensajer\xEDa P2P b\xE1sica por WebRTC",
"Cifrado de extremo a extremo sencillo (esquema de demostraci\xF3n)",
"Se\xF1alizaci\xF3n y reconexi\xF3n estables",
"Interfaz m\xEDnima para pruebas",
"Recogida de comentarios de los primeros probadores"
],
"roadmap.r3.title": "Seguridad reforzada",
"roadmap.r3.sub": "Refuerzo de la seguridad y publicaci\xF3n de la rama estable",
"roadmap.r3.date": "Verano de 2025",
"roadmap.r3.features": [
"ECDH/ECDSA en producci\xF3n",
"Secreto hacia adelante y rotaci\xF3n de claves",
"Comprobaciones de autenticaci\xF3n mejoradas",
"Cifrado de archivos y env\xEDo de cargas grandes",
"Auditor\xEDa de los procesos criptogr\xE1ficos b\xE1sicos"
],
"roadmap.r4.title": "Escala y estabilidad",
"roadmap.r4.sub": "Escalado de la red y mejoras de estabilidad",
"roadmap.r4.date": "Oto\xF1o de 2025",
"roadmap.r4.features": [
"Optimizaci\xF3n de las conexiones P2P y del NAT traversal",
"Mecanismos de reconexi\xF3n y colas de mensajes",
"Menor consumo de bater\xEDa en el m\xF3vil",
"Sincronizaci\xF3n entre varios dispositivos",
"Herramientas de monitorizaci\xF3n y registro para desarrolladores"
],
"roadmap.r5.title": "La privacidad primero",
"roadmap.r5.sub": "Foco en la privacidad: reducir los metadatos",
"roadmap.r5.date": "Invierno de 2025",
"roadmap.r5.features": [
"Protecci\xF3n de metadatos y menos huella identificable",
"Experimentos con enrutamiento cebolla y DHT",
"Opciones de conexi\xF3n an\xF3nima",
"Preparaci\xF3n de la auditor\xEDa de c\xF3digo abierto",
"Mejora de la verificaci\xF3n entre usuarios"
],
"roadmap.r6.title": "Enhanced Security Edition",
"roadmap.r6.sub": "Criptograf\xEDa de grado militar en 18 capas con validaci\xF3n ASN.1 completa",
"roadmap.r6.date": "Finales de 2025",
"roadmap.r6.features": [
"Triple capa de seguridad: ECDH + DTLS + SAS",
"Cifrado ECDH P-384 y AES-GCM de 256 bits",
"Verificaci\xF3n de la huella DTLS",
"Verificaci\xF3n SAS (cadena corta de autenticaci\xF3n)",
"Secreto hacia adelante con rotaci\xF3n de claves",
"Mayor protecci\xF3n frente a ataques de intermediario",
"Validaci\xF3n ASN.1 DER completa",
"Verificaci\xF3n de OID y de puntos EC",
"Validaci\xF3n de la estructura SPKI",
"Arquitectura P2P sobre WebRTC",
"Protecci\xF3n de metadatos",
"C\xF3digo 100 % abierto"
],
"roadmap.r7.title": "Desktop Edition",
"roadmap.r7.sub": "Aplicaciones nativas de escritorio para Windows, macOS y Linux",
"roadmap.r7.date": "Principios de 2026",
"roadmap.r7.features": [
"Aplicaci\xF3n de escritorio para Windows (Tauri v2)",
"Aplicaci\xF3n de escritorio para macOS (Tauri v2)",
"AppImage para Linux (Tauri v2)",
"Notificaciones en tiempo real",
"Reconexi\xF3n autom\xE1tica",
"Sincronizaci\xF3n entre dispositivos",
"Interfaz renovada",
"Archivos de hasta 100 MB"
],
"roadmap.r8.title": "Voz y llamadas seguras",
"roadmap.r8.sub": "Mensajes de voz, llamadas de audio y de v\xEDdeo cifrados",
"roadmap.r8.date": "Principios de 2026",
"roadmap.r8.features": [
"Mensajes de voz cifrados de extremo a extremo",
"Llamadas de audio cifradas uno a uno (WebRTC)",
"Llamadas de v\xEDdeo cifradas uno a uno (WebRTC)",
"Secreto hacia adelante para el medio en directo",
"Flujos de medios protegidos con SRTP/DTLS",
"Verificaci\xF3n SAS durante la llamada",
"Avisos de llamada y reconexi\xF3n autom\xE1tica",
"Medios P2P de baja latencia"
],
"roadmap.r9.title": "Comunicaci\xF3n en grupo",
"roadmap.r9.sub": "Chats de grupo sin renunciar a la privacidad",
"roadmap.r9.date": "Ahora",
"roadmap.r9.features": [
"Chats de grupo P2P de hasta 8 participantes",
"Entrega en malla con relay firmado como alternativa",
"Un \xFAnico c\xF3digo de seguridad del grupo, comparado por todos",
"Ceremonia de compromiso y revelaci\xF3n contra el tanteo de c\xF3digos",
"Claves de identidad propias del grupo, ef\xEDmeras por dise\xF1o",
"Membres\xEDa firmada con orden por \xE9pocas",
"Mensajes firmados: una transcripci\xF3n divergente queda demostrada",
"Sin servidor, sin clave de grupo compartida, sin historial"
],
"roadmap.r10.title": "Mobile Edition",
"roadmap.r10.sub": "Aplicaciones nativas para iOS y Android",
"roadmap.r10.date": "2.\xBA trimestre de 2027",
"roadmap.r10.features": [
"Aplicaci\xF3n nativa de iOS (Swift/SwiftUI)",
"Aplicaci\xF3n nativa de Android (Kotlin/Jetpack Compose)",
"Soporte PWA en navegadores m\xF3viles",
"Notificaciones push en tiempo real",
"Optimizaci\xF3n de la bater\xEDa",
"Interfaz optimizada para el m\xF3vil",
"Cola de mensajes sin conexi\xF3n",
"Autenticaci\xF3n biom\xE9trica"
],
"roadmap.r11.title": "Edici\xF3n resistente a la computaci\xF3n cu\xE1ntica",
"roadmap.r11.sub": "Protecci\xF3n frente a los ordenadores cu\xE1nticos",
"roadmap.r11.date": "4.\xBA trimestre de 2027",
"roadmap.r11.features": [
"Criptograf\xEDa poscu\xE1ntica CRYSTALS-Kyber",
"Firmas digitales SPHINCS+",
"Esquema h\xEDbrido: cl\xE1sico y poscu\xE1ntico",
"Intercambio de claves seguro frente a lo cu\xE1ntico",
"Algoritmos de hash actualizados",
"Migraci\xF3n de las sesiones existentes",
"Compatibilidad con la v5.x",
"Protocolos resistentes a lo cu\xE1ntico"
],
"roadmap.r12.title": "Red descentralizada",
"roadmap.r12.sub": "Red completamente descentralizada",
"roadmap.r12.date": "2028",
"roadmap.r12.features": [
"Red en malla de nodos",
"DHT para descubrir pares",
"Enrutamiento cebolla integrado",
"Token\xF3mica e incentivos para los nodos",
"Gobernanza mediante DAO",
"Interoperabilidad con otras redes",
"Compatibilidad multiplataforma",
"Red que se repara sola"
],
"roadmap.r13.title": "Asistente de privacidad con IA",
"roadmap.r13.sub": "IA para la privacidad y la seguridad",
"roadmap.r13.date": "2028+",
"roadmap.r13.features": [
"An\xE1lisis local de amenazas con IA",
"Detecci\xF3n autom\xE1tica de intermediarios",
"Criptograf\xEDa adaptativa",
"Recomendaciones de seguridad personalizadas",
"Aprendizaje autom\xE1tico de conocimiento cero",
"Asistente de IA privado",
"Seguridad predictiva",
"Protecci\xF3n aut\xF3noma frente a ataques"
],
"handshake.step1": "Generando el par de claves ECDH P-384",
"handshake.step2": "Derivando el c\xF3digo de verificaci\xF3n",
"handshake.step3": "Fijando el secreto hacia adelante",
"handshake.securingTitle": "Asegurando tu canal",
"handshake.answerTitle": "Preparando tu respuesta",
"handshake.securingDesc": "Creando claves lo bastante fuertes para resistir manipulaciones.",
"handshake.shareTitle": "Comparte tu invitaci\xF3n",
"handshake.sendAnswerTitle": "Devuelve tu respuesta",
"handshake.shareDesc": "Muestra el QR o env\xEDa el c\xF3digo a la otra persona. Es de un solo uso y caduca pronto.",
"handshake.sendAnswerDesc": "Entrega esta respuesta a quien cre\xF3 el canal para que complete el saludo.",
"handshake.establish": "Establecer la conexi\xF3n",
"handshake.thenReceive": "Despu\xE9s recibe la respuesta que te devuelva la otra persona",
"handshake.pasteAnswerPlaceholder": "Pega aqu\xED el c\xF3digo de respuesta\u2026",
"handshake.answerSentNote": "Env\xEDa esta respuesta a quien cre\xF3 el canal y espera: el chat se abrir\xE1 cuando conecte.",
"handshake.qrHint": "Mant\xE9n esto abierto hasta que la otra persona capture el c\xF3digo.",
"handshake.qrHintFrames": "El saludo se reparte en {frames} im\xE1genes: mant\xE9n esto abierto hasta que las capture todas.",
"verify.title": "Verificaci\xF3n de seguridad",
"verify.desc": "Compara este c\xF3digo de seguridad con la otra persona por otra v\xEDa (voz o en persona) y escr\xEDbelo para desbloquear el chat.",
"verify.enterLabel": "Introduce el c\xF3digo verificado",
"verify.placeholder": "Escribe el c\xF3digo aqu\xED",
"verify.confirm": "Confirmar el c\xF3digo",
"verify.confirmed": "Confirmado",
"verify.mismatch": "No coinciden",
"verify.yours": "Tu confirmaci\xF3n",
"verify.peer": "Confirmaci\xF3n de la otra persona",
"verify.pending": "Pendiente",
"verify.waiting": "Esperando el c\xF3digo\u2026",
"verify.verified": "Canal verificado",
"verify.bothConfirmed": "Ambas partes han confirmado. Abriendo el chat seguro\u2026",
"pwa.bannerTitle": "Instala SecureBit.chat",
"pwa.bannerDesc": "Disfruta de la experiencia de app nativa con m\xE1s seguridad",
"pwa.install": "Instalar",
"pwa.dismiss": "Descartar",
"pwa.close": "Cerrar",
"pwa.iosTitle": "Instalar en iOS",
"pwa.iosStep1": "Toca el bot\xF3n Compartir",
"pwa.iosStep1Hint": "Suele estar en la parte inferior de Safari",
"pwa.iosStep2": "Busca \xABA\xF1adir a pantalla de inicio\xBB",
"pwa.iosStep2Hint": "Despl\xE1zate hacia abajo en el men\xFA de compartir",
"pwa.iosStep3": "Toca \xABA\xF1adir\xBB",
"pwa.iosStep3Hint": "Confirma para instalar SecureBit.chat",
"pwa.genericTitle": "Instalar SecureBit",
"pwa.genericDesc": "Cada navegador instala a su manera. Elige los pasos que coincidan con el tuyo.",
"pwa.gotIt": "Entendido",
"pwa.installedTitle": "\xA1App instalada!",
"pwa.installedIos": "\xA1App de iOS instalada! \xC1brela desde la pantalla de inicio.",
"pwa.installedGeneric": "SecureBit.chat ya est\xE1 en tu dispositivo",
"pwa.anytimeTitle": "Inst\xE1lalo cuando quieras",
"pwa.anytimeDesc": "Puedes instalar SecureBit.chat desde el men\xFA de tu navegador cuando quieras, para la mejor experiencia.",
"pwa.ok": "Aceptar",
"step.open": "Paso 1 \xB7 abrir un canal",
"step.exchange": "Paso 2 \xB7 intercambio",
"step.verification": "Paso 3 \xB7 verificaci\xF3n",
"action.create": "Crear",
"action.join": "Unirse",
"action.back": "Atr\xE1s",
"action.copy": "Copiar",
"action.copied": "Copiado",
"action.scan": "Escanear",
"action.downloadDesktop": "Descargar la app de escritorio",
"action.advancedSettings": "Ajustes avanzados",
"cred.offerTag": "oferta \xB7 o copia el texto",
"cred.answerTag": "respuesta \xB7 o copia el texto",
"cred.reveal": "Haz clic para mostrarlo: mant\xE9n este c\xF3digo en privado",
"qr.title": "Escanear c\xF3digo QR",
"qr.subtitle": "Apunta la c\xE1mara a su c\xF3digo QR",
"qr.scanning": "Escaneando\u2026",
"qr.hint": "Mant\xE9n el pulso hasta capturar todas las partes. La c\xE1mara se usa en local: no se sube nada.",
"mesh.you": "t\xFA",
"mesh.peer": "par \xB7 sesi\xF3n 1",
"mesh.joined2": "luc\xEDa se ha unido \xB7 +2",
"mesh.joined3": "mateo se ha unido \xB7 +3",
"ice.title": "Ajustes de red",
"ice.subtitle": "Se configura en local: nunca se comparte con la otra persona",
"ice.intro": "SecureBit usa servidores STUN p\xFAblicos por defecto para negociar el enlace entre pares. Si tienes los tuyos, ap\xFAntalo a tu STUN/TURN.",
"ice.publicTitle": "Servidores p\xFAblicos (por defecto)",
"ice.publicDesc": "Sin configuraci\xF3n. Suficiente para la mayor\xEDa.",
"ice.customTitle": "Mis propios servidores STUN/TURN",
"ice.customDesc": "Hasta {max} servidores.",
"ice.turnNote": "Un relay TURN ve la IP de ambas partes y el ritmo del tr\xE1fico, pero nunca el contenido, que sigue cifrado de extremo a extremo. Es preferible ",
"ice.turnNoteTls": " (TLS).",
"ice.test": "Probar los servidores",
"ice.testing": "Probando\u2026",
"ice.relayTitle": "Modo solo relay",
"ice.relayBadge": "M\xC1XIMA PRIVACIDAD",
"ice.relayDesc": "Env\xEDa todo el tr\xE1fico por TURN, as\xED la otra persona nunca ve tu IP. Necesita un servidor TURN.",
"ice.relayWarning": "El modo solo relay est\xE1 activado pero no hay ning\xFAn servidor TURN configurado. La conexi\xF3n no podr\xE1 iniciarse.",
"ice.persist": "Guardar en este dispositivo",
"ice.persistDesc": "Se guarda cifrado en este navegador. D\xE9jalo apagado para usarlo solo en esta sesi\xF3n.",
"ice.forget": "Olvidar lo guardado",
"ice.cancel": "Cancelar",
"ice.apply": "Aplicar",
"ice.errUnavailable": "WebRTC no est\xE1 disponible en este navegador",
"ice.errInvalid": "Configuraci\xF3n de servidor no v\xE1lida",
"update.title": "Actualizaci\xF3n disponible",
"update.desc": "Se ha detectado una versi\xF3n m\xE1s reciente de SecureBit.",
"update.currentVersion": "Versi\xF3n actual",
"update.newVersion": "Versi\xF3n nueva",
"update.now": "Actualizar ahora",
"update.later": "M\xE1s tarde",
"update.unknown": "N/D",
"update.stepSaving": "Guardando los datos\u2026",
"update.stepSwCaches": "Vaciando las cach\xE9s del Service Worker\u2026",
"update.stepSwUnregister": "Dando de baja los Service Workers\u2026",
"update.stepBrowserCache": "Vaciando la cach\xE9 del navegador\u2026",
"update.stepVersion": "Actualizando la versi\xF3n\u2026",
"update.stepReload": "Recargando la aplicaci\xF3n\u2026",
"update.error": "Error al actualizar. Recarga la p\xE1gina manualmente (Ctrl+F5 o Cmd+May\xFAs+R)",
"update.confirmSkip": "Hay una versi\xF3n nueva. Se recomienda actualizar por seguridad y estabilidad. \xBFContinuar sin actualizar?",
"offline.backOnline": "De nuevo en l\xEDnea",
"offline.mode": "Modo sin conexi\xF3n",
"offline.dismiss": "Descartar",
"offline.lostTitle": "Se ha perdido la conexi\xF3n",
"offline.lostDesc": "SecureBit est\xE1 ahora sin conexi\xF3n. Algunas funciones se limitan, pero tus datos siguen a salvo.",
"offline.point1": "Tu sesi\xF3n y tus claves se conservan",
"offline.point2": "No se guarda nada en servidores",
"offline.point3": "Los mensajes y archivos se sincronizan al reconectar",
"offline.continue": "Seguir sin conexi\xF3n",
"offline.restoredTitle": "Cuando vuelvas a conectarte",
"offline.restoredDesc": "Perder la conexi\xF3n no te cuesta nada. SecureBit lo encola todo en local y retoma la sesi\xF3n cifrada en cuanto vuelves a estar en l\xEDnea.",
"offline.r1Title": "Tus mensajes se entregan",
"offline.r1Desc": "Todo lo que escribiste sin conexi\xF3n se env\xEDa autom\xE1ticamente a tu contacto.",
"offline.r2Title": "Los archivos terminan de enviarse",
"offline.r2Desc": "Las subidas contin\xFAan donde se quedaron: no hace falta reenviar nada.",
"offline.r3Title": "Llegan sus mensajes y archivos",
"offline.r3Desc": "Lo que tu contacto enviara durante el corte te llega en orden.",
"offline.r4Title": "No se pierde nada",
"offline.r4Desc": "Tras reconectar no queda ning\xFAn hueco: la conversaci\xF3n sigue justo donde se detuvo.",
"offline.gotIt": "Entendido",
"qr.showTitle": "Mostrar el c\xF3digo QR",
"qr.showSubtitle": "Pantalla completa \xB7 deja que lo escaneen",
"qr.showSubtitleFrames": "Pantalla completa \xB7 deja que escaneen las {frames} im\xE1genes",
"notify.enabledBody": "Notificaciones activadas. Te avisaremos de los mensajes nuevos.",
"notify.workingBody": "Las notificaciones funcionan. Te avisaremos de los mensajes nuevos.",
"pw.label": "Campo de contrase\xF1a",
"pw.placeholder": "Escribe la contrase\xF1a\u2026",
"pw.decrypt": "Descifrar",
"pw.cancel": "Cancelar",
"file.title": "Transferencias de archivos",
"file.drop": "Arrastra los archivos aqu\xED",
"file.dropHint": "Cifrados de extremo a extremo antes de enviarse \xB7 hasta 100 MB",
"file.browse": "Buscar en el dispositivo",
"file.incoming": "Solicitud de archivo entrante",
"file.accept": "Aceptar",
"file.reject": "Rechazar",
"file.download": "Descargar",
"file.notReady": "La conexi\xF3n a\xFAn no est\xE1 lista",
"file.tooLarge": "El archivo es demasiado grande",
"file.typeNotAllowed": "Tipo de archivo no permitido",
"file.maxConcurrent": "Se ha alcanzado el m\xE1ximo de transferencias simult\xE1neas",
"file.gone": "Este archivo ya no est\xE1 disponible para descargar.",
"call.incoming": "Llamada entrante",
"call.incomingVideo": "Videollamada entrante",
"call.encrypted": "Llamada cifrada",
"call.encryptedShort": "Cifrada",
"call.peer": "Par seguro",
"call.connecting": "Conectando\u2026",
"call.ringing": "Llamando\u2026",
"call.accept": "Aceptar",
"call.decline": "Rechazar",
"call.end": "Colgar",
"call.camera": "C\xE1mara",
"call.cameraOff": "C\xE1mara apagada",
"call.peerCameraOff": "La c\xE1mara de la otra persona est\xE1 apagada",
"call.flipCamera": "Cambiar de c\xE1mara",
"call.addVideo": "A\xF1adir v\xEDdeo",
"call.video": "V\xEDdeo",
"call.muted": "Silenciado",
"call.expand": "Ampliar",
"call.minimize": "Minimizar",
"call.quality": "Calidad de la conexi\xF3n",
"call.qualityExcellent": "Excelente",
"call.videoPrefix": "V\xEDdeo \xB7 ",
"call.voicePrefix": "Voz \xB7 ",
"group.new": "Grupo nuevo",
"group.create": "Crear el grupo",
"group.join": "Unirse al grupo",
"group.name": "Nombre del grupo",
"group.nameTooLong": "El nombre del grupo es demasiado largo.",
"group.capacity": "Hasta {max} personas, de par a par. Todos comparar\xE1n un \xFAnico c\xF3digo de seguridad antes de abrir el grupo.",
"group.invite": "Invitar",
"group.inviteMore": "Invitar a m\xE1s miembros",
"group.invitePeople": "Invitar a {count} personas",
"group.invitation": "Invitaci\xF3n al grupo",
"group.addMembers": "A\xF1adir miembros",
"group.roomFor": "Queda sitio para {remaining} m\xE1s. Al entrar, todos comparar\xE1n un c\xF3digo de grupo nuevo.",
"group.membersCount": "{count} miembros",
"group.member": "Miembro",
"group.members": "Miembros",
"group.remove": "Expulsar a {name}",
"group.message": "Escribir a {name}",
"group.leave": "Salir",
"group.leaveThis": "Salir de este grupo",
"group.cancel": "Cancelar el grupo",
"group.close": "Cerrar",
"group.cancelBtn": "Cancelar",
"group.decline": "Rechazar",
"group.working": "Trabajando\u2026",
"group.sasTitle": "C\xF3digo de seguridad del grupo",
"group.sasEveryone": "Todos ven este c\xF3digo",
"group.sasCompare": "Compara el c\xF3digo del grupo con cada miembro para abrir el grupo.",
"group.sasReadAloud": "Lee estos d\xEDgitos en voz alta a ",
"group.sasWarning": "Si aunque sea un miembro lee un c\xF3digo distinto, hay alguien en medio. Cancela el grupo: no confirmes.",
"group.confirmFirst": "Confirma antes el c\xF3digo del grupo",
"group.codeSuffix": " \xB7 c\xF3digo {code}",
"group.exchangingNonces": "Intercambiando nonces\u2026",
"group.waitingCommit": "Esperando el compromiso de todos los miembros\u2026",
"group.waitingJoin": "Esperando a que se unan los dem\xE1s miembros\u2026",
"group.emptyChat": "Aqu\xED todav\xEDa no hay nada. Cada mensaje va firmado por quien lo env\xEDa y viaja por el enlace cifrado propio de cada miembro.",
"group.noVerified": "A\xFAn no hay chats verificados. Abre primero un chat individual y compara su c\xF3digo de seguridad: un grupo se construye con conexiones que ya has comprobado.",
"group.noMoreToAdd": "No hay m\xE1s chats verificados que a\xF1adir. Abre un chat individual y compara su c\xF3digo de seguridad primero.",
"group.directLink": "Enlace directo entre pares",
"group.noDirectLink": "A\xFAn no hay enlace directo: los mensajes pasan por otro miembro mientras se establece uno",
"group.relayNote": "Con algunos miembros todav\xEDa no hay enlace directo. Sus mensajes pasan por otro miembro, que ve que est\xE1is hablando pero no puede leer m\xE1s all\xE1 de la firma ni cambiar lo dicho. El grupo sigue intentando conectarlos directamente.",
"group.relayOnlyOff": "El modo solo relay est\xE1 desactivado, as\xED que cada miembro se conecta directamente contigo y conoce tu IP, incluidos los que haya invitado otra persona. Act\xEDvalo en los ajustes de red si aqu\xED importa.",
"group.memberOffline": "{name} est\xE1 sin conexi\xF3n y no recibir\xE1 mensajes. Sigue siendo miembro: expulsarle vuelve a generar las claves del grupo.",
"group.joinNote": "Los dem\xE1s miembros sabr\xE1n que est\xE1s en este grupo. No hay historial que recuperar: un grupo empieza vac\xEDo.",
"group.inviteSentNote": "El grupo sigue funcionando hasta que acepten. No hay historial que puedan recuperar: solo ver\xE1n lo que se env\xEDe a partir de ahora.",
"group.errNotCreated": "El grupo no se ha creado",
"group.errNobodyAccepted": "Nadie acept\xF3 la invitaci\xF3n a tiempo.",
"group.errNothingSent": "No se envi\xF3 ni se verific\xF3 nada. Cierra esto e int\xE9ntalo de nuevo cuando todos est\xE9n conectados.",
"group.errNotFormed": "No se ha podido formar el grupo.",
"group.errFull": "Este grupo est\xE1 lleno.",
"group.errInviteFailed": "No se ha podido enviar la invitaci\xF3n: ese chat no est\xE1 conectado.",
"group.errNoMemberList": "Quien cre\xF3 el grupo nunca envi\xF3 la lista de miembros.",
"group.errUnsignedList": "La lista de miembros no la firm\xF3 quien cre\xF3 el grupo. No lo reintentes: av\xEDsale.",
"group.errNotOwner": "Alguien que no cre\xF3 el grupo intent\xF3 cambiar los miembros.",
"hdr.tagline": "Cifrado de extremo a extremo",
"hdr.netSettings": "Ajustes de red avanzados",
"hdr.netSettingsTitle": "Ajustes de red avanzados (STUN/TURN)",
"hdr.disconnect": "Desconectar",
"status.connected": "Conectado",
"status.connecting": "Conectando\u2026",
"status.notConnected": "Sin conexi\xF3n",
"status.reconnecting": "Reconectando\u2026",
"status.retrying": "Reintentando\u2026",
"status.verifying": "Verificando\u2026",
"status.peerDisconnected": "La otra persona se ha desconectado",
"sec.replayProtection": "Protecci\xF3n contra reenv\xEDo",
"sec.messageIntegrity": "Integridad de los mensajes (HMAC)",
"sec.forwardSecrecy": "Secreto perfecto hacia adelante",
"sec.metadataProtection": "Protecci\xF3n de metadatos",
"sec.trafficObfuscation": "Ofuscaci\xF3n del tr\xE1fico",
"sec.realTests": "Pruebas criptogr\xE1ficas reales",
"sec.simulatedData": "Datos simulados",
"sec.testPassed": "Prueba superada",
"sec.testFailed": "La prueba ha fallado o no est\xE1 disponible",
"sec.verificationDone": "Verificaci\xF3n criptogr\xE1fica real completada",
"sec.verificationInProgress": "Verificaci\xF3n de seguridad en curso\u2026",
"sec.verificationWait": "Verificaci\xF3n de seguridad en curso\u2026\nEspera a que termine la verificaci\xF3n criptogr\xE1fica en tiempo real.",
"sec.verificationUnavailable": "La verificaci\xF3n de seguridad no est\xE1 disponible",
"chat.placeholder": "Escribe un mensaje cifrado\u2026",
"chat.send": "Enviar el mensaje",
"chat.sendFiles": "Enviar archivos",
"chat.hideFiles": "Ocultar los archivos",
"chat.recordVoice": "Grabar un mensaje de voz",
"chat.sendVoice": "Enviar el mensaje de voz",
"chat.discard": "Descartar",
"chat.codeBlock": "Enviar como bloque de c\xF3digo (ampl\xEDa el campo)",
"chat.codeHint": "Fragmento de c\xF3digo \xB7 se conserva el formato \xB7 \u2318\u21B5 para enviar",
"chat.viewOnce": "Ver una vez",
"chat.viewOnceTitle": "Ver una vez: desaparece cuando la otra persona lo lee",
"chat.viewOncePrefix": "Ver una vez \xB7 ",
"chat.viewOnceTap": "Ver una vez \xB7 toca para mostrar",
"chat.viewedOnce": "Ya visto",
"chat.disappearing": "Mensaje ef\xEDmero: se borra en ambos lados",
"chat.disappearAfter": "Desaparece tras",
"chat.visibleFor": "Visible durante",
"chat.timerPrefix": "Temporizador \xB7 ",
"chat.expired": "Este mensaje ha caducado",
"chat.deleteForEveryone": "Eliminar para todos",
"chat.sending": "Enviando",
"chat.delivered": "Entregado",
"chat.notSent": "No enviado",
"chat.notSentReason": "No enviado: el canal seguro no est\xE1 listo. Vuelve a conectar para continuar.",
"chat.encrypted": "Cifrado",
"chat.decrypted": "Descifrado",
"chat.encryptedOnDevice": "Cifrado en tu dispositivo",
"chat.uploading": "Subiendo",
"chat.downloading": "Descargando",
"chat.transferring": "Transfiriendo\u2026",
"chat.copied": "\xA1Copiado!",
"chat.collapse": "Contraer",
"chat.closeMenu": "Cerrar el men\xFA",
"chat.newChat": "Chat nuevo",
"chat.newGroup": "Grupo nuevo",
"chat.createGroup": "Crear un grupo",
"chat.groupChats": "Chats de grupo",
"chat.secureChat": "Chat seguro",
"chat.nameThis": "Ponle nombre a este chat",
"chat.rename": "Renombrar el chat (solo en local)",
"chat.renameHint": "Haz doble clic para renombrar",
"chat.localLabel": "Etiqueta local \xB7 solo se guarda en este dispositivo",
"chat.setStatus": "Elige tu estado",
"chat.yourStatusPrefix": "Tu estado: ",
"chat.meshHint": "Hasta 8 pares \xB7 malla P2P",
"chat.offline": "Sin conexi\xF3n",
"chat.noNetwork": "Sin red \xB7 reconectando",
"chat.startVoiceCall": "Iniciar una llamada de voz cifrada",
"chat.startVideoCall": "Iniciar una videollamada cifrada",
"chat.verifyForCalls": "Verifica la sesi\xF3n para poder llamar",
"chat.e2eeNote": "Cada mensaje se cifra de extremo a extremo en tu dispositivo antes de salir.",
"chat.peersOnly": "Se env\xEDa de extremo a extremo solo a los pares conectados: nunca se guarda en un servidor.",
"flow.invitationCreated": "Invitaci\xF3n segura creada",
"flow.invitationCreatedBang": "Invitaci\xF3n segura creada y cifrada.",
"flow.responseCreated": "Respuesta segura creada",
"flow.responseCreatedBang": "Respuesta segura creada.",
"flow.sendInvitation": "Env\xEDa el c\xF3digo de invitaci\xF3n a la otra persona por un canal seguro (llamada, SMS, etc.).",
"flow.sendResponse": "Env\xEDa el c\xF3digo de respuesta a quien inici\xF3 el canal por un canal seguro, o deja que escanee el QR de abajo.",
"flow.sendEncryptedCode": "Enviar el c\xF3digo cifrado",
"flow.sendTheResponse": "Enviar la respuesta",
"flow.pasteOrWrite": "Pega o escribe el c\xF3digo\u2026",
"flow.processingInvitation": "Procesando la invitaci\xF3n segura\u2026",
"flow.processingResponse": "Procesando la respuesta segura\u2026",
"flow.finalizing": "Ultimando la conexi\xF3n segura\u2026",
"flow.channelEstablished": "Canal seguro establecido",
"flow.channelReady": "El canal seguro est\xE1 listo",
"flow.restoring": "Restableciendo la conexi\xF3n\u2026",
"flow.invitationCaptured": "Invitaci\xF3n capturada.",
"err.needInvitation": "Tienes que pegar el c\xF3digo de invitaci\xF3n de la otra persona.",
"err.needResponse": "Tienes que pegar el c\xF3digo de respuesta de la otra persona.",
"err.responseFormat": "Formato de respuesta no v\xE1lido: revisa el c\xF3digo",
"err.responseNoKey": "C\xF3digo de respuesta no v\xE1lido: falta la clave criptogr\xE1fica o est\xE1 da\xF1ada. Rev\xEDsalo e int\xE9ntalo de nuevo.",
"err.responseNoSignKey": "C\xF3digo de respuesta no v\xE1lido: falta la clave de verificaci\xF3n de firma. Rev\xEDsalo e int\xE9ntalo de nuevo.",
"err.responseOutdated": "Los datos de la respuesta est\xE1n caducados: usa una invitaci\xF3n nueva",
"err.setupError": "Error al establecer la conexi\xF3n",
"err.notReady": "La conexi\xF3n a\xFAn no est\xE1 lista",
"err.securityBreach": "Se ha detectado una brecha de seguridad: conexi\xF3n rechazada",
"err.securityValidation": "La validaci\xF3n de seguridad ha fallado: posible ataque",
"err.retiredQr": "Este QR usa un formato retirado con el que no se pudo transferir la invitaci\xF3n. Pide uno nuevo o usa copiar y pegar.",
"err.compressedQrNote": "El QR comprimido puede omitir el SDP por brevedad. Usa copiar y pegar si falla la conexi\xF3n.",
"err.inviteNotConnected": "No se ha podido enviar la invitaci\xF3n. Ese chat no est\xE1 conectado ahora mismo.",
"err.inviteNotConnectedRetry": "No se ha podido enviar la invitaci\xF3n. Ese chat no est\xE1 conectado ahora mismo: vuelve a abrirlo e int\xE9ntalo otra vez.",
"err.nobodyAccepted": "Nadie acept\xF3 la invitaci\xF3n. El grupo no ha cambiado.",
"err.noAudio": "No se ha grabado audio: revisa el permiso del micr\xF3fono e int\xE9ntalo de nuevo.",
"err.voiceNeedsConnection": "El mensaje de voz necesita una conexi\xF3n segura activa. Vuelve a conectar e int\xE9ntalo de nuevo.",
"err.voiceRestoring": "Restableciendo la conexi\xF3n: prueba a enviar el mensaje de voz en un momento.",
"err.fileTooLarge": "El archivo es demasiado grande",
"sas.safetyNumber": "N\xFAmero de seguridad",
"sas.incorrect": "C\xF3digo incorrecto. Compru\xE9balo con la otra persona e int\xE9ntalo de nuevo.",
"sas.noMatch": "Los c\xF3digos no coinciden",
"sas.makeSure": "Aseg\xFArate de que los c\xF3digos coinciden exactamente.",
"sas.tooManyAttempts": "Demasiados intentos incorrectos. La sesi\xF3n se ha reiniciado por seguridad.",
"sas.verificationFailed": "La verificaci\xF3n ha fallado",
"sas.verified": "Verificado \xB7 secreto perfecto hacia adelante",
"sas.runVerification": "Ejecutar la verificaci\xF3n de seguridad",
"sec.panelTitle": "Detalles de red y criptograf\xEDa",
"sec.security": "Seguridad",
"sec.transport": "Transporte",
"sec.keyExchange": "Intercambio de claves",
"sec.allEnabled": "Todas las funciones de seguridad est\xE1n activas por defecto",
"sec.realTimeNote": "Verificaci\xF3n en tiempo real con funciones criptogr\xE1ficas reales, sin datos simulados.",
"sec.simulatedWarning": "Aviso: puede que la conexi\xF3n no est\xE9 del todo establecida; los valores podr\xEDan ser simulados.",
"dl.title": "Descargar SecureBit",
"dl.free": "Gratis \xB7 c\xF3digo abierto",
"dl.soon": "Las apps para iOS y Android y las extensiones para Chrome, Firefox y Opera llegar\xE1n pronto.",
"chatHdr.chat": "Chat",
"chatHdr.chats": "Chats",
"chatHdr.newChat": "+ Nuevo",
"chatHdr.secure": "Seguro",
"chatHdr.p2pSub": "P2P \xB7 cifrado de extremo a extremo",
"chatHdr.save": "Guardar",
"chatHdr.close": "Cerrar",
"chatHdr.expand": "Ampliar",
"chatHdr.you": "T\xFA",
"chatHdr.qrCode": "C\xF3digo QR",
"chat.disconnected": "Desconectado",
"call.mute": "Silenciar",
"call.endShort": "Colgar",
"group.add": "A\xF1adir",
"group.send": "Enviar",
"sec.pfsShort": "Secreto perfecto hacia adelante",
"sec.cipher": "Cifrado",
"chat.close": "Cerrar",
"file.needConnection": "La transferencia de archivos necesita una conexi\xF3n abierta",
"presence.available": "Disponible",
"presence.away": "Ausente",
"presence.busy": "Ocupado",
"presence.offline": "Sin conexi\xF3n",
"presence.invisible": "Invisible",
"presence.availableDesc": "En l\xEDnea y disponible",
"presence.awayDesc": "Inactivo \xB7 se ha ausentado",
"presence.busyDesc": "No molestar",
"presence.invisibleDesc": "Aparecer sin conexi\xF3n para los dem\xE1s",
"presence.online": "En l\xEDnea",
"conn.p2p": "P2P \xB7 conectado",
"conn.verifying": "Verificando\u2026",
"conn.connecting": "Conectando\u2026",
"conn.reconnecting": "Reconectando\u2026",
"conn.peerDisconnected": "La otra persona se ha desconectado",
"conn.disconnected": "Desconectado",
"chat.defaultLabel": "Chat",
"groupPhase.forming": "Form\xE1ndose\u2026",
"groupPhase.commitments": "Intercambiando compromisos\u2026",
"groupPhase.revealing": "Revelando\u2026",
"groupPhase.compare": "Compara el c\xF3digo del grupo",
"groupPhase.ready": "El grupo est\xE1 listo",
"groupPhase.failed": "El grupo ha fallado",
"call.qualityGood": "Buena",
"call.qualityFair": "Aceptable",
"call.qualityWeak": "D\xE9bil",
"msg.code": "C\xF3digo",
"msg.timer": "Temporizador",
"msg.voice": "Voz",
"msg.play": "Reproducir",
"msg.sent": "Enviado",
"msg.read": "Le\xEDdo",
"report.title": "Verificaci\xF3n de seguridad en tiempo real",
"report.active": "Activo",
"report.testsPassed": "Pruebas superadas",
"report.verifiedAt": "Verificado el",
"report.source": "Origen",
"secTest.verifyECDHKeyExchange": "Intercambio de claves ECDH",
"secTest.verifyECDSASignatures": "Firmas digitales ECDSA",
"secTest.verifyEncryption": "Cifrado AES-GCM",
"secTest.verifyMessageIntegrity": "Integridad de los mensajes",
"secTest.verifyPerfectForwardSecrecy": "Secreto perfecto hacia adelante",
"secTest.verifyPFS": "Secreto perfecto hacia adelante",
"secTest.verifyReplayProtection": "Protecci\xF3n contra reenv\xEDo",
"secTest.verifyDTLSFingerprint": "Huella DTLS",
"secTest.verifySASVerification": "Verificaci\xF3n SAS",
"secTest.verifyMetadataProtection": "Protecci\xF3n de metadatos",
"secTest.verifyTrafficObfuscation": "Ofuscaci\xF3n del tr\xE1fico",
"secTest.verifyPacketPadding": "Relleno de paquetes",
"secTest.verifyNestedEncryption": "Cifrado anidado",
"secTest.verifyNonExtractableKeys": "Claves no extra\xEDbles",
"secTest.verifyRateLimiting": "L\xEDmite de frecuencia",
"secTest.verifyMutualAuth": "Autenticaci\xF3n mutua",
"secTest.verifyAuthProof": "Prueba de autenticaci\xF3n",
"secTest.verifyEnhancedValidation": "Validaci\xF3n reforzada",
"secTest.verifyAdvancedFeatures": "Funciones avanzadas",
"secTest.verifySignature": "Comprobaci\xF3n de firma",
"secDetail.Security system initializing...": "El sistema de seguridad se est\xE1 iniciando\u2026",
"secDetail.Nested encryption active": "Cifrado anidado activo",
"secDetail.Nested encryption failed": "El cifrado anidado ha fallado",
"secDetail.Packet padding active": "Relleno de paquetes activo",
"secDetail.Packet padding failed": "El relleno de paquetes ha fallado",
"secDetail.Advanced features active": "Funciones avanzadas activas",
"secDetail.Advanced features failed": "Las funciones avanzadas han fallado",
"secDetail.No encryption key available": "No hay clave de cifrado disponible",
"secDetail.AES-GCM encryption/decryption working correctly": "El cifrado y descifrado AES-GCM funcionan correctamente",
"secDetail.No ECDH key pair available": "No hay par de claves ECDH disponible",
"secDetail.Key derivation failed": "La derivaci\xF3n de claves ha fallado",
"secDetail.No ECDSA key pair available": "No hay par de claves ECDSA disponible",
"secDetail.ECDSA digital signatures working correctly": "Las firmas digitales ECDSA funcionan correctamente",
"secDetail.MAC key not available or invalid": "La clave MAC no est\xE1 disponible o no es v\xE1lida",
"secDetail.Rate limiter did not block a message over the limit": "El limitador no bloque\xF3 un mensaje por encima del l\xEDmite",
"secDetail.Rate limiter is not available": "El limitador de frecuencia no est\xE1 disponible",
"secDetail.Replay protection is working correctly": "La protecci\xF3n contra reenv\xEDo funciona correctamente",
"secDetail.Replay protection not enabled": "La protecci\xF3n contra reenv\xEDo no est\xE1 activada",
"secDetail.SAS code not available": "El c\xF3digo SAS no est\xE1 disponible",
"secDetail.SAS verification code is valid and available": "El c\xF3digo de verificaci\xF3n SAS es v\xE1lido y est\xE1 disponible",
"secDetail.Traffic obfuscation is working correctly": "La ofuscaci\xF3n del tr\xE1fico funciona correctamente",
"secDetail.Traffic obfuscation not enabled": "La ofuscaci\xF3n del tr\xE1fico no est\xE1 activada",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "No hay par de claves ECDH ef\xEDmeras no extra\xEDbles para esta sesi\xF3n",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "Solo PFS a nivel de sesi\xF3n: las claves son ef\xEDmeras por sesi\xF3n, pero el Double Ratchet no est\xE1 activo en esta conexi\xF3n (la otra parte usa una versi\xF3n antigua), as\xED que una clave comprometida expone toda la conversaci\xF3n.",
"msg.pause": "Pausa",
"msg.failed": "Ha fallado",
"groupErr.timeout": "Un miembro dej\xF3 de responder antes de que el c\xF3digo estuviera listo.",
"groupErr.keyMismatch": "La clave de un miembro no coincid\xEDa con la identidad declarada.",
"groupErr.revealMismatch": "El valor revelado por un miembro no coincid\xEDa con su compromiso.",
"groupErr.commitChanged": "Un miembro cambi\xF3 su compromiso a mitad del proceso.",
"groupErr.missingKey": "Se list\xF3 a un miembro cuya clave nunca lleg\xF3.",
"groupErr.outsider": "Lleg\xF3 un fragmento de alguien ajeno al grupo.",
"groupErr.limit": "Un grupo admite como m\xE1ximo ocho miembros.",
"groupErr.tooLarge": "Un mensaje era demasiado grande para enviarlo al grupo.",
"fileType.text": "Texto plano",
"fileType.images": "Im\xE1genes",
"fileType.archives": "Archivos comprimidos",
"fileType.voice": "Mensajes de voz",
"fileType.unsupported": "No admitido",
"qrScan.title": "Escanear c\xF3digo QR",
"qrScan.auto": "Modo autom\xE1tico",
"qrScan.reset": "Reiniciar",
"qrScan.autoScroll": "Desplazamiento autom\xE1tico activado",
"qrScan.starting": "Iniciando la c\xE1mara\u2026",
"qrScan.point": "Apunta la c\xE1mara al c\xF3digo QR",
"qrScan.tapFocus": "Toca la pantalla para enfocar",
"qrScan.focusing": "Enfocando\u2026",
"iceErr.notArray": "La lista de servidores debe ser un array",
"iceErr.invalidJson": "JSON no v\xE1lido",
"iceErr.tooMany": "Demasiados servidores (m\xE1ximo {max})",
"iceErr.invalidEntry": "{label}: entrada no v\xE1lida",
"iceErr.urlCount": "{label}: se necesitan entre 1 y {max} URL",
"iceErr.turnCreds": "{label}: los servidores TURN suelen requerir usuario y credencial",
"iceUrl.notString": "La URL debe ser una cadena",
"iceUrl.empty": "La URL est\xE1 vac\xEDa",
"iceUrl.tooLong": "La URL es demasiado larga",
"iceUrl.badChars": "La URL contiene caracteres no v\xE1lidos",
"iceUrl.badScheme": "La URL debe empezar por stun:, stuns:, turn: o turns:",
"iceUrl.badQuery": "La URL tiene una consulta no v\xE1lida",
"iceUrl.noHost": "A la URL le falta el host",
"iceUrl.badHost": "La URL tiene un host o puerto no v\xE1lido",
"iceUrl.badTransport": "La consulta de la URL debe ser transport=udp o transport=tcp",
"msg.off": "Desactivado",
"file.consentUnavailable": "No se ha podido pedir permiso",
"secLevel.MAXIMUM": "M\xC1XIMO",
"secLevel.INITIALIZING": "INICIANDO",
"secLevel.ERROR": "ERROR",
"secLevel.UNKNOWN": "DESCONOCIDO",
"status.error": "Error",
"offline.disconnect": "Desconectar",
"offline.learnMore": "M\xE1s informaci\xF3n",
"pwa.installApp": "Instalar la app",
"chat.onWeb": "Est\xE1s en la versi\xF3n web",
"groupCall.startVoice": "Iniciar llamada de voz grupal",
"groupCall.startVideo": "Iniciar videollamada grupal",
"groupCall.join": "Unirse",
"groupCall.dismiss": "Ahora no",
"groupCall.leave": "Salir de la llamada",
"groupCall.you": "T\xFA",
"groupCall.connecting": "Conectando\u2026",
"groupCall.waitingLink": "Esperando un enlace directo\u2026",
"groupCall.legFailed": "No se pudo conectar",
"groupCall.startedVoice": "{name} inici\xF3 una llamada de voz",
"groupCall.startedVideo": "{name} inici\xF3 una videollamada",
"groupCall.inCall": "{count} en la llamada",
"groupCall.err.permission_denied": "La llamada no pudo iniciarse - el acceso al micr\xF3fono y a la c\xE1mara est\xE1 bloqueado. Perm\xEDtelo para este sitio e int\xE9ntalo de nuevo.",
"groupCall.err.device_not_found": "La llamada no pudo iniciarse - no se encontr\xF3 ning\xFAn micr\xF3fono en este dispositivo.",
"groupCall.err.device_busy": "La llamada no pudo iniciarse - otra aplicaci\xF3n est\xE1 usando tu micr\xF3fono. Ci\xE9rrala e int\xE9ntalo de nuevo.",
"groupCall.err.media_failed": "La llamada no pudo iniciarse - no se pudo abrir el micr\xF3fono.",
"groupCall.err.call_in_progress": "Ya hay una llamada en este grupo. \xDAnete en lugar de iniciar otra.",
"groupCall.err.not_ready": "Confirma el c\xF3digo del grupo antes de llamar.",
"groupCall.speaking": "{name} est\xE1 hablando",
"groupCall.pin": "Ver a {name} en grande",
"groupCall.unpin": "Volver a todos",
"groupCall.showEveryone": "Todos",
"msg.after5s": "5 s tras leerse",
"msg.after15s": "15 s tras leerse",
"msg.after30s": "30 s tras leerse",
"msg.after1m": "1 min tras leerse",
"msg.sec30": "30 segundos",
"msg.min5": "5 minutos",
"msg.hour1": "1 hora",
"desktop.shareDesc": "Env\xEDa el c\xF3digo a tu par. Es de un solo uso y caduca pronto.",
"desktop.invitationCreated": "Invitaci\xF3n segura creada: env\xEDasela a tu par.",
"desktop.joinDesc": "Pega el c\xF3digo de invitaci\xF3n de tu par para construir tu respuesta segura.",
"desktop.offerTag": "invitaci\xF3n \xB7 copiar texto",
"desktop.answerTag": "respuesta \xB7 copiar texto",
"desktop.offerPlaceholder": "El c\xF3digo de invitaci\xF3n aparecer\xE1 aqu\xED\u2026",
"desktop.answerPlaceholder": "El c\xF3digo de respuesta aparecer\xE1 aqu\xED\u2026",
"desktop.backToChats": "Volver a los chats",
"desktop.sendFeedback": "Enviar comentarios",
"desktop.callsNeedVerified": "Las llamadas requieren un canal seguro verificado.",
"desktop.noOpenChannel": "No hay ning\xFAn canal seguro abierto.",
"desktop.chatCarriesCall": "Este chat est\xE1 transportando una llamada de grupo. Sal de la llamada de grupo antes de iniciar una llamada 1:1.",
"desktop.err.permission_denied": "La llamada no pudo iniciarse: el acceso al micr\xF3fono y la c\xE1mara est\xE1 bloqueado. Perm\xEDtelo en los ajustes del sistema e int\xE9ntalo de nuevo.",
"desktop.language": "Idioma",
"desktop.languageHint": "Se aplica al instante. Los mensajes ya enviados conservan sus palabras.",
"desktop.compareCode": "Compara el c\xF3digo de verificaci\xF3n con tu par y conf\xEDrmalo si coincide.",
"desktop.verifyBeforeFiles": "Completa la verificaci\xF3n antes de enviar archivos.",
"desktop.verifyBeforeSending": "Completa la verificaci\xF3n antes de enviar mensajes.",
"desktop.disconnectedByBackend": "Conexi\xF3n cerrada de forma segura.",
"desktop.restoreFailed": "No se pudo restablecer la conexi\xF3n. Cerrando este chat.",
"desktop.channelNotReady": "El canal de datos a\xFAn no est\xE1 disponible. Espera a que se establezca la conexi\xF3n.",
"desktop.enterCode": "Introduce el c\xF3digo de verificaci\xF3n para confirmar.",
"desktop.noOffer": "No se encontr\xF3 ninguna invitaci\xF3n. Crea una primero.",
"desktop.notInitiator": "No creaste esta conexi\xF3n, as\xED que no hay ninguna respuesta que aplicar.",
"desktop.decryptFailed": "No se pudo descifrar un mensaje y se descart\xF3.",
"desktop.badMessageFormat": "Lleg\xF3 una trama con formato incorrecto y se descart\xF3.",
"desktop.notSentNotReady": "Mensaje no enviado: el canal seguro no est\xE1 listo. Espera a que termine la verificaci\xF3n o vuelve a conectarte.",
"desktop.micDenied": "Se deneg\xF3 el acceso al micr\xF3fono.",
"desktop.noChannelWait": "No hay canal seguro abierto: espera a que se establezca la conexi\xF3n.",
"desktop.sasFailed": "La verificaci\xF3n fall\xF3. Puede haber alguien en medio, as\xED que se abort\xF3 la conexi\xF3n.",
"desktop.sasOk": "Verificaci\xF3n correcta. Este canal est\xE1 autenticado de extremo a extremo.",
"desktop.iceForgotten": "Servidores guardados olvidados. Se usar\xE1n servidores ICE p\xFAblicos.",
"desktop.icePublic": "Se usar\xE1n servidores ICE p\xFAblicos.",
"desktop.verificationInProgress": "La verificaci\xF3n de seguridad sigue en curso. Espera a que termine.",
"desktop.fileGone": "Este archivo ya no est\xE1 disponible para descargar.",
"desktop.codeMismatch": "Los c\xF3digos de verificaci\xF3n no coinciden. Desconectando por seguridad.",
"desktop.noLocalCode": "Verificaci\xF3n fallida: no hay c\xF3digo derivado localmente con el que comparar. Desconectando por seguridad.",
"desktop.protocolViolation": "El par afirm\xF3 que el c\xF3digo estaba confirmado antes de que t\xFA lo confirmaras. Desconectando por seguridad.",
"desktop.verificationRejected": "Verificaci\xF3n rechazada. La conexi\xF3n se abort\xF3 por seguridad.",
"secLevel.HIGH": "ALTO",
"secLevel.MEDIUM": "MEDIO",
"secLevel.LOW": "BAJO",
"desktop.rerun": "Volver a ejecutar",
"desktop.ice.customDesc": "Hasta {max} servidores, una URL por l\xEDnea o JSON.",
"desktop.ice.persistDesc": "Guardado localmente en este dispositivo. D\xE9jalo desactivado para usarlo solo en esta sesi\xF3n.",
"desktop.group.leaveNote": "Se avisa a los dem\xE1s miembros de que te has ido. Despu\xE9s no queda nada de este grupo en este dispositivo: ning\xFAn servidor guarda una copia desde la que volver, as\xED que necesitar\xEDas una invitaci\xF3n nueva.",
"desktop.sec.ecdsaOk": "Firma del paquete de claves del par verificada durante el saludo (ECDSA P-384 / SHA-384)",
"desktop.sec.ecdsaNone": "No hay un saludo completado",
"desktop.sec.ecdhOk": "Claves de sesi\xF3n derivadas de un intercambio ECDH P-384 ef\xEDmero mediante HKDF-SHA-256",
"desktop.sec.ecdhNone": "No se derivaron claves de sesi\xF3n",
"desktop.sec.encryptionOk": "Cifrado y descifrado AES-GCM verificados en el n\xFAcleo",
"desktop.sec.encryptionNa": "No se pudo ejecutar la autocomprobaci\xF3n de AES-GCM",
"desktop.sec.integrityOk": "Integridad de los mensajes verificada (autenticaci\xF3n AES-GCM)",
"desktop.sec.integrityNa": "No se pudo ejecutar la autocomprobaci\xF3n de integridad",
"desktop.sec.pfsOk": "Double Ratchet activo: cada mensaje tiene su propia clave",
"desktop.sec.pfsNa": "No medido",
"desktop.sec.replayOk": "Las claves de mensaje del ratchet se destruyen al usarse, as\xED que una trama capturada no puede reproducirse",
"desktop.sec.replayNa": "No medido",
"desktop.sec.dtlsPinned": "Huella DTLS del par fijada: {fp}",
"desktop.sec.dtlsNone": "No hay huella DTLS remota disponible",
"desktop.sec.sasBoth": "Ambos pares confirmaron el c\xF3digo de seguridad fuera de banda",
"desktop.sec.sasIncomplete": "El c\xF3digo de seguridad no ha sido confirmado por ambos pares",
"desktop.sec.metadataOk": "Se deriv\xF3 una clave de metadatos dedicada (HKDF metadata-protection-v4)",
"desktop.sec.metadataNone": "Sin clave de metadatos",
"desktop.sec.coverOn": "Tr\xE1fico de cobertura activo: tramas falsas aleatorias (32-128 B cada 15-30 s) en el canal con ratchet",
"desktop.sec.coverOff": "El generador de tr\xE1fico de cobertura no est\xE1 en marcha",
"desktop.sec.coverUnsupported": "El tr\xE1fico de cobertura requiere una sesi\xF3n Double Ratchet (el par usa una versi\xF3n anterior)",
"desktop.tagline": "Libertad de extremo a extremo"
},
"uk": {
"language.label": "\u041C\u043E\u0432\u0430",
"language.suggest.text": "\u0426\u044F \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0442\u0430\u043A\u043E\u0436 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0443\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u043E\u044E.",
"language.suggest.cta": "\u0427\u0438\u0442\u0430\u0442\u0438 \u0443\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u043E\u044E",
"language.suggest.dismiss": "\u0417\u0430\u043A\u0440\u0438\u0442\u0438",
"community.title": "\u0414\u043E\u043B\u0443\u0447\u0430\u0439\u0442\u0435\u0441\u044F \u0434\u043E \u043C\u0430\u0439\u0431\u0443\u0442\u043D\u044C\u043E\u0433\u043E \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0456",
"community.description": "SecureBit \u0440\u043E\u0441\u0442\u0435 \u0437\u0430\u0432\u0434\u044F\u043A\u0438 \u0441\u0432\u043E\u0457\u0439 \u0441\u043F\u0456\u043B\u044C\u043D\u043E\u0442\u0456. \u0412\u0430\u0448\u0456 \u0456\u0434\u0435\u0457 \u0442\u0430 \u0432\u0456\u0434\u0433\u0443\u043A\u0438 \u0444\u043E\u0440\u043C\u0443\u044E\u0442\u044C \u043C\u0430\u0439\u0431\u0443\u0442\u043D\u0454 \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u043E\u0433\u043E \u0441\u043F\u0456\u043B\u043A\u0443\u0432\u0430\u043D\u043D\u044F - \u0440\u043E\u0437\u0440\u043E\u0431\u043A\u0430 \u0432\u0435\u0434\u0435\u0442\u044C\u0441\u044F \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u043E, \u0437 \u043F\u043E\u0432\u043D\u043E\u044E \u0432\u0430\u043B\u0456\u0434\u0430\u0446\u0456\u0454\u044E ASN.1 \u043D\u0430 \u0432\u0441\u044C\u043E\u043C\u0443 \u0448\u043B\u044F\u0445\u0443.",
"community.github": "\u0420\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0456\u0439 \u043D\u0430 GitHub",
"community.feedback": "\u0412\u0456\u0434\u0433\u0443\u043A",
"unique.eyebrow": "\u0427\u0438\u043C \u043C\u0438 \u0432\u0438\u0440\u0456\u0437\u043D\u044F\u0454\u043C\u043E\u0441\u044C",
"unique.heading": "\u0427\u043E\u043C\u0443 SecureBit - \u043E\u0441\u043E\u0431\u043B\u0438\u0432\u0438\u0439",
"unique.s1.titleTop": "\u0411\u0430\u0433\u0430\u0442\u043E\u0448\u0430\u0440\u043E\u0432\u0435",
"unique.s1.titleBottom": "\u044F\u0434\u0440\u043E \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F",
"unique.s1.collapsed": "\u042F\u0434\u0440\u043E \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F",
"unique.s1.desc": "\u041E\u0431\u043C\u0456\u043D \u043A\u043B\u044E\u0447\u0430\u043C\u0438 ECDH P-384, \u043A\u043E\u0440\u0438\u0441\u043D\u0435 \u043D\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u0432 AES-256-GCM, \u043F\u0456\u0434\u043F\u0438\u0441\u0438 ECDSA \u0456 \u043F\u043E\u0432\u043D\u0430 \u0432\u0430\u043B\u0456\u0434\u0430\u0446\u0456\u044F ASN.1 - \u0437\u0432\u0435\u0434\u0435\u043D\u0456 \u0432 \u043E\u0434\u0438\u043D \u0437\u0430\u0433\u0430\u0440\u0442\u043E\u0432\u0430\u043D\u0438\u0439 \u043A\u043E\u043D\u0432\u0435\u0454\u0440.",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "\u0427\u0438\u0441\u0442\u0438\u0439 P2P",
"unique.s2.titleBottom": "\u0447\u0435\u0440\u0435\u0437 WebRTC",
"unique.s2.collapsed": "\u0427\u0438\u0441\u0442\u0438\u0439 P2P \u0447\u0435\u0440\u0435\u0437 WebRTC",
"unique.s2.desc": "\u041F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u0439\u0434\u0443\u0442\u044C \u043D\u0430\u043F\u0440\u044F\u043C\u0443 \u043C\u0456\u0436 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u044F\u043C\u0438 \u0447\u0435\u0440\u0435\u0437 WebRTC. \u0416\u043E\u0434\u0435\u043D relay \u043D\u0435 \u0442\u0440\u0438\u043C\u0430\u0454 \u0432\u0430\u0448\u0438\u0445 \u0434\u0430\u043D\u0438\u0445 - \u0441\u0435\u0440\u0432\u0435\u0440 \u043B\u0438\u0448\u0435 \u0434\u043E\u043F\u043E\u043C\u0430\u0433\u0430\u0454 \u0434\u0432\u043E\u043C \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0430\u043C \u0437\u043D\u0430\u0439\u0442\u0438 \u043E\u0434\u043D\u0435 \u043E\u0434\u043D\u043E\u0433\u043E.",
"unique.s2.tags": [
"DTLS 1.3",
"\u0411\u0435\u0437 relay"
],
"unique.s3.titleTop": "\u0414\u043E\u0441\u043A\u043E\u043D\u0430\u043B\u0430",
"unique.s3.titleBottom": "\u043F\u0440\u044F\u043C\u0430 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u0456\u0441\u0442\u044C",
"unique.s3.collapsed": "\u041F\u0440\u044F\u043C\u0430 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u0456\u0441\u0442\u044C",
"unique.s3.desc": "\u0421\u0435\u0430\u043D\u0441\u043E\u0432\u0456 \u043A\u043B\u044E\u0447\u0456 \u0437\u043C\u0456\u043D\u044E\u044E\u0442\u044C\u0441\u044F \u0431\u0435\u0437\u043F\u0435\u0440\u0435\u0440\u0432\u043D\u043E \u0439 \u0432\u0456\u0434\u043A\u0438\u0434\u0430\u044E\u0442\u044C\u0441\u044F \u043F\u0456\u0441\u043B\u044F \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u043D\u043D\u044F, \u0442\u043E\u0436 \u043E\u0434\u0438\u043D \u0441\u043A\u043E\u043C\u043F\u0440\u043E\u043C\u0435\u0442\u043E\u0432\u0430\u043D\u0438\u0439 \u043A\u043B\u044E\u0447 \u043D\u0456\u043A\u043E\u043B\u0438 \u043D\u0435 \u0432\u0456\u0434\u043A\u0440\u0438\u0454 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u0456\u0445 \u0440\u043E\u0437\u043C\u043E\u0432.",
"unique.s3.tags": [
"\u0415\u0444\u0435\u043C\u0435\u0440\u043D\u0456 \u043A\u043B\u044E\u0447\u0456",
"\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0430 \u0437\u043C\u0456\u043D\u0430"
],
"unique.s4.titleTop": "\u041C\u0430\u0441\u043A\u0443\u0432\u0430\u043D\u043D\u044F",
"unique.s4.titleBottom": "\u0442\u0440\u0430\u0444\u0456\u043A\u0443",
"unique.s4.collapsed": "\u041C\u0430\u0441\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0442\u0440\u0430\u0444\u0456\u043A\u0443",
"unique.s4.desc": "\u0420\u043E\u0437\u043C\u0456\u0440\u0438 \u043F\u0430\u043A\u0435\u0442\u0456\u0432 \u0456 \u043F\u0430\u0443\u0437\u0438 \u043C\u0456\u0436 \u043D\u0438\u043C\u0438 \u0434\u043E\u043F\u043E\u0432\u043D\u044E\u044E\u0442\u044C\u0441\u044F \u0442\u0430 \u0440\u0430\u043D\u0434\u043E\u043C\u0456\u0437\u0443\u044E\u0442\u044C\u0441\u044F, \u0442\u043E\u0436 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u0456 \u043D\u0435 \u0441\u043A\u043B\u0430\u0434\u0430\u044E\u0442\u044C\u0441\u044F \u0432 \u043F\u043E\u043C\u0456\u0442\u043D\u0438\u0439 \u0432\u0456\u0437\u0435\u0440\u0443\u043D\u043E\u043A \u043D\u0430\u0432\u0456\u0442\u044C \u0434\u043B\u044F \u0442\u043E\u0433\u043E, \u0445\u0442\u043E \u0441\u0442\u0435\u0436\u0438\u0442\u044C \u0437\u0430 \u043A\u0430\u043D\u0430\u043B\u043E\u043C.",
"unique.s4.tags": [
"\u0414\u043E\u043F\u043E\u0432\u043D\u0435\u043D\u043D\u044F \u043F\u0430\u043A\u0435\u0442\u0456\u0432",
"\u0420\u043E\u0437\u043A\u0438\u0434 \u0443 \u0447\u0430\u0441\u0456"
],
"unique.s5.titleTop": "\u0416\u043E\u0434\u043D\u043E\u0433\u043E",
"unique.s5.titleBottom": "\u0437\u0431\u043E\u0440\u0443 \u0434\u0430\u043D\u0438\u0445",
"unique.s5.collapsed": "\u0416\u043E\u0434\u043D\u043E\u0433\u043E \u0437\u0431\u043E\u0440\u0443 \u0434\u0430\u043D\u0438\u0445",
"unique.s5.desc": "\u0411\u0435\u0437 \u043E\u0431\u043B\u0456\u043A\u043E\u0432\u0438\u0445 \u0437\u0430\u043F\u0438\u0441\u0456\u0432, \u0431\u0435\u0437 \u0436\u0443\u0440\u043D\u0430\u043B\u0456\u0432, \u0431\u0435\u0437 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043D\u044F \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u044C. \u041D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0456 \u043D\u0435\u043C\u0430\u0454 \u043D\u0456\u0447\u043E\u0433\u043E, \u0449\u043E \u043C\u043E\u0436\u043D\u0430 \u0437\u043B\u0438\u0442\u0438, \u0432\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0437\u0430 \u0443\u0445\u0432\u0430\u043B\u043E\u044E \u0447\u0438 \u043F\u0440\u043E\u0434\u0430\u0442\u0438.",
"unique.s5.tags": [
"\u0411\u0435\u0437 \u043E\u0431\u043B\u0456\u043A\u043E\u0432\u0438\u0445 \u0437\u0430\u043F\u0438\u0441\u0456\u0432",
"\u0411\u0435\u0437 \u0436\u0443\u0440\u043D\u0430\u043B\u0456\u0432"
],
"partners.eyebrow": "\u041F\u0430\u0440\u0442\u043D\u0435\u0440\u0438 \u0442\u0430 \u0435\u043A\u043E\u0441\u0438\u0441\u0442\u0435\u043C\u0430",
"partners.heading": "\u041D\u0430\u043C \u0434\u043E\u0432\u0456\u0440\u044F\u044E\u0442\u044C \u043D\u0430\u0448\u0456 \u043F\u0430\u0440\u0442\u043D\u0435\u0440\u0438",
"partners.aegis.desc": "\u0406\u043D\u0432\u0435\u0441\u0442\u0438\u0446\u0456\u0439\u043D\u0438\u0439 \u043F\u0430\u0440\u0442\u043D\u0435\u0440, \u044F\u043A\u0438\u0439 \u0437\u0430\u0445\u0438\u0449\u0430\u0454 \u043A\u043E\u043D\u0444\u0456\u0434\u0435\u043D\u0446\u0456\u0439\u043D\u0456 \u0444\u0456\u043D\u0430\u043D\u0441\u043E\u0432\u0456 \u043A\u043E\u043C\u0443\u043D\u0456\u043A\u0430\u0446\u0456\u0457 \u0443 \u0441\u0432\u043E\u0454\u043C\u0443 \u043F\u043E\u0440\u0442\u0444\u0435\u043B\u0456.",
"partners.aegis.role": "\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0456\u0447\u043D\u0438\u0439 \u0456\u043D\u0432\u0435\u0441\u0442\u043E\u0440",
"partners.furilabs.desc": "Linux-\u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0438 \u0437 \u043F\u0440\u0456\u043E\u0440\u0438\u0442\u0435\u0442\u043E\u043C \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0456, \u044F\u043A\u0456 \u043F\u043E\u0441\u0442\u0430\u0447\u0430\u044E\u0442\u044C SecureBit \u044F\u043A \u0442\u0438\u043F\u043E\u0432\u0438\u0439 \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u0439 \u043A\u0430\u043D\u0430\u043B.",
"partners.furilabs.role": "\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0456\u0447\u043D\u0438\u0439 \u043F\u0430\u0440\u0442\u043D\u0435\u0440",
"partners.inviteTitle": "\u0421\u0442\u0430\u0442\u0438 \u043F\u0430\u0440\u0442\u043D\u0435\u0440\u043E\u043C",
"partners.inviteDesc": "\u0421\u0442\u0432\u043E\u0440\u044E\u0454\u0442\u0435 \u043E\u0431\u043B\u0430\u0434\u043D\u0430\u043D\u043D\u044F \u0447\u0438 \u0456\u043D\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u0434\u043B\u044F \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0456? \u0406\u043D\u0442\u0435\u0433\u0440\u0443\u0439\u043C\u043E SecureBit.",
"partners.inviteCta": "\u041F\u043E\u0447\u0430\u0442\u0438 \u0440\u043E\u0437\u043C\u043E\u0432\u0443",
"roadmap.eyebrow": "\u0414\u043E\u0440\u043E\u0436\u043D\u044F \u043A\u0430\u0440\u0442\u0430",
"roadmap.heading": "\u042F\u043A \u0440\u043E\u0437\u0432\u0438\u0432\u0430\u0432\u0441\u044F SecureBit",
"roadmap.subheading": "\u0412\u0456\u0434 \u043F\u0435\u0440\u0448\u043E\u0433\u043E \u043F\u0440\u043E\u0442\u043E\u0442\u0438\u043F\u0443 \u0434\u043E \u0434\u0435\u0446\u0435\u043D\u0442\u0440\u0430\u043B\u0456\u0437\u043E\u0432\u0430\u043D\u043E\u0457 \u043C\u0435\u0440\u0435\u0436\u0456, \u0441\u0442\u0456\u0439\u043A\u043E\u0457 \u0434\u043E \u043A\u0432\u0430\u043D\u0442\u043E\u0432\u0438\u0445 \u043E\u0431\u0447\u0438\u0441\u043B\u0435\u043D\u044C, \u0437 \u043F\u043E\u0432\u043D\u043E\u044E \u0432\u0430\u043B\u0456\u0434\u0430\u0446\u0456\u0454\u044E ASN.1 \u043D\u0430 \u043A\u043E\u0436\u043D\u043E\u043C\u0443 \u0440\u0456\u0432\u043D\u0456.",
"roadmap.progress": "\u041F\u0440\u043E\u0439\u0434\u0435\u043D\u043E {shipped} \u0437 {total} \u0435\u0442\u0430\u043F\u0456\u0432",
"roadmap.upcoming": "{upcoming} \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u0443",
"roadmap.keyFeatures": "\u041A\u043B\u044E\u0447\u043E\u0432\u0456 \u043C\u043E\u0436\u043B\u0438\u0432\u043E\u0441\u0442\u0456",
"roadmap.status.released": "\u0412\u0438\u043F\u0443\u0449\u0435\u043D\u043E",
"roadmap.status.current": "\u041F\u043E\u0442\u043E\u0447\u043D\u0438\u0439",
"roadmap.status.dev": "\u0423 \u0440\u043E\u0437\u0440\u043E\u0431\u0446\u0456",
"roadmap.status.planned": "\u0417\u0430\u043F\u043B\u0430\u043D\u043E\u0432\u0430\u043D\u043E",
"roadmap.status.research": "\u0414\u043E\u0441\u043B\u0456\u0434\u0436\u0435\u043D\u043D\u044F",
"hero.headlineTop": "\u041F\u0440\u044F\u043C\u0430 \u043B\u0456\u043D\u0456\u044F,",
"hero.headlineBottom": "\u044F\u043A\u0443 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0454\u0442\u0435 \u043B\u0438\u0448\u0435 \u0432\u0438 \u0434\u0432\u043E\u0454.",
"hero.subheading": "\u041A\u043B\u044E\u0447\u0456 \u0441\u0442\u0432\u043E\u0440\u044E\u044E\u0442\u044C\u0441\u044F \u043D\u0430 \u0432\u0430\u0448\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457 \u0439 \u043F\u0435\u0440\u0435\u0434\u0430\u044E\u0442\u044C\u0441\u044F \u043D\u0430\u043F\u0440\u044F\u043C\u0443 \u043C\u0456\u0436 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0430\u043C\u0438. \u0411\u0435\u0437 \u043E\u0431\u043B\u0456\u043A\u043E\u0432\u0438\u0445 \u0437\u0430\u043F\u0438\u0441\u0456\u0432 \u0456 \u0431\u0435\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u0456\u0432, \u0449\u043E \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u044E\u0442\u044C \u0432\u0430\u0448\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F.",
"hero.diagramAlt": "\u041F\u0440\u044F\u043C\u0430 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0430 \u043B\u0456\u043D\u0456\u044F \u0434\u043E \u043E\u0434\u043D\u043E\u0433\u043E \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0430, \u0434\u043E \u044F\u043A\u043E\u0457 \u0434\u043E\u043B\u0443\u0447\u0430\u044E\u0442\u044C\u0441\u044F \u0449\u0435 \u0434\u0432\u043E\u0454",
"intro.createTitle": "\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043D\u043E\u0432\u0438\u0439 \u043A\u0430\u043D\u0430\u043B",
"intro.createDesc": "\u0412\u0430\u0448 \u043F\u0440\u0438\u0441\u0442\u0440\u0456\u0439 \u0441\u0442\u0432\u043E\u0440\u044E\u0454 \u043A\u043B\u044E\u0447\u0456 \u0442\u0430 \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u0435 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F. \u041D\u0456\u0449\u043E \u0437 \u0446\u044C\u043E\u0433\u043E \u043D\u0435 \u043F\u043E\u0442\u0440\u0430\u043F\u043B\u044F\u0454 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.",
"intro.createCta": "\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043A\u043B\u044E\u0447\u0456 \u0442\u0430 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F",
"intro.joinTitle": "\u041F\u0440\u0438\u0454\u0434\u043D\u0430\u0442\u0438\u0441\u044F \u0434\u043E \u043A\u0430\u043D\u0430\u043B\u0443",
"intro.scanTitle": "\u0421\u043A\u0430\u043D\u0443\u0432\u0430\u0442\u0438 QR \u043A\u0430\u043C\u0435\u0440\u043E\u044E",
"intro.scanSubtitle": "\u041D\u0430\u0439\u0448\u0432\u0438\u0434\u0448\u0435 - \u043D\u0430\u0432\u0435\u0434\u0456\u0442\u044C \u043D\u0430 \u0435\u043A\u0440\u0430\u043D \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430",
"intro.orPasteCode": "\u0430\u0431\u043E \u0432\u0441\u0442\u0430\u0432\u0442\u0435 \u043A\u043E\u0434",
"intro.pastePlaceholder": "\u0412\u0441\u0442\u0430\u0432\u0442\u0435 \u043A\u043E\u0434 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0441\u044E\u0434\u0438\u2026",
"intro.connect": "\u0417'\u0454\u0434\u043D\u0430\u0442\u0438\u0441\u044F",
"intro.connecting": "\u041E\u0431\u0440\u043E\u0431\u043A\u0430\u2026",
"roadmap.r1.title": "\u041F\u043E\u0447\u0430\u0442\u043E\u043A \u0440\u043E\u0437\u0440\u043E\u0431\u043A\u0438",
"roadmap.r1.sub": "\u0406\u0434\u0435\u044F, \u043F\u0440\u043E\u0442\u043E\u0442\u0438\u043F \u0456 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0456\u043D\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0438",
"roadmap.r1.date": "\u041F\u043E\u0447\u0430\u0442\u043E\u043A 2025",
"roadmap.r1.features": [
"\u0424\u043E\u0440\u043C\u0443\u0432\u0430\u043D\u043D\u044F \u043A\u043E\u043D\u0446\u0435\u043F\u0446\u0456\u0457 \u0442\u0430 \u0432\u0438\u043C\u043E\u0433",
"\u0412\u0438\u0431\u0456\u0440 \u0441\u0442\u0435\u043A\u0430: WebRTC, P2P, \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0456\u044F",
"\u041F\u0435\u0440\u0448\u0456 \u043F\u0440\u043E\u0442\u043E\u0442\u0438\u043F\u0438 \u043E\u0431\u043C\u0456\u043D\u0443 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F\u043C\u0438",
"\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0456\u044E \u0442\u0430 CI",
"\u0411\u0430\u0437\u043E\u0432\u0430 \u0430\u0440\u0445\u0456\u0442\u0435\u043A\u0442\u0443\u0440\u0430 \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F",
"\u0414\u0438\u0437\u0430\u0439\u043D UX/UI"
],
"roadmap.r2.title": "\u0410\u043B\u044C\u0444\u0430-\u0432\u0435\u0440\u0441\u0456\u044F",
"roadmap.r2.sub": "\u041F\u0435\u0440\u0448\u0430 \u043F\u0443\u0431\u043B\u0456\u0447\u043D\u0430 \u0430\u043B\u044C\u0444\u0430: \u0431\u0430\u0437\u043E\u0432\u0438\u0439 \u0447\u0430\u0442 \u0456 \u043E\u0431\u043C\u0456\u043D \u043A\u043B\u044E\u0447\u0430\u043C\u0438",
"roadmap.r2.date": "\u0412\u0435\u0441\u043D\u0430 2025",
"roadmap.r2.features": [
"\u0411\u0430\u0437\u043E\u0432\u0438\u0439 \u043E\u0431\u043C\u0456\u043D \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F\u043C\u0438 P2P \u0447\u0435\u0440\u0435\u0437 WebRTC",
"\u041F\u0440\u043E\u0441\u0442\u0435 \u043D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u0435 \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F (\u0434\u0435\u043C\u043E\u043D\u0441\u0442\u0440\u0430\u0446\u0456\u0439\u043D\u0430 \u0441\u0445\u0435\u043C\u0430)",
"\u0421\u0442\u0430\u0431\u0456\u043B\u044C\u043D\u0438\u0439 \u0441\u0438\u0433\u043D\u0430\u043B\u0456\u043D\u0433 \u0456 \u043F\u0435\u0440\u0435\u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F",
"\u041C\u0456\u043D\u0456\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0456\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043B\u044F \u0442\u0435\u0441\u0442\u0443\u0432\u0430\u043D\u043D\u044F",
"\u0417\u0431\u0456\u0440 \u0432\u0456\u0434\u0433\u0443\u043A\u0456\u0432 \u0432\u0456\u0434 \u043F\u0435\u0440\u0448\u0438\u0445 \u0442\u0435\u0441\u0442\u0443\u0432\u0430\u043B\u044C\u043D\u0438\u043A\u0456\u0432"
],
"roadmap.r3.title": "\u041F\u043E\u0441\u0438\u043B\u0435\u043D\u0438\u0439 \u0437\u0430\u0445\u0438\u0441\u0442",
"roadmap.r3.sub": "\u0417\u043C\u0456\u0446\u043D\u0435\u043D\u043D\u044F \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u0442\u0430 \u0432\u0438\u043F\u0443\u0441\u043A \u0441\u0442\u0430\u0431\u0456\u043B\u044C\u043D\u043E\u0457 \u0433\u0456\u043B\u043A\u0438",
"roadmap.r3.date": "\u041B\u0456\u0442\u043E 2025",
"roadmap.r3.features": [
"ECDH/ECDSA \u0443 \u043F\u0440\u043E\u043C\u0438\u0441\u043B\u043E\u0432\u0456\u0439 \u0435\u043A\u0441\u043F\u043B\u0443\u0430\u0442\u0430\u0446\u0456\u0457",
"\u041F\u0440\u044F\u043C\u0430 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u0456\u0441\u0442\u044C \u0456 \u0437\u043C\u0456\u043D\u0430 \u043A\u043B\u044E\u0447\u0456\u0432",
"\u041F\u043E\u043A\u0440\u0430\u0449\u0435\u043D\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438 \u0430\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0446\u0456\u0457",
"\u0428\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0444\u0430\u0439\u043B\u0456\u0432 \u0456 \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043D\u043D\u044F \u0432\u0435\u043B\u0438\u043A\u0438\u0445 \u043E\u0431\u0441\u044F\u0433\u0456\u0432",
"\u0410\u0443\u0434\u0438\u0442 \u0431\u0430\u0437\u043E\u0432\u0438\u0445 \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0456\u0447\u043D\u0438\u0445 \u043F\u0440\u043E\u0446\u0435\u0441\u0456\u0432"
],
"roadmap.r4.title": "\u041C\u0430\u0441\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u043D\u043D\u044F \u0442\u0430 \u0441\u0442\u0430\u0431\u0456\u043B\u044C\u043D\u0456\u0441\u0442\u044C",
"roadmap.r4.sub": "\u041C\u0430\u0441\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u043D\u043D\u044F \u043C\u0435\u0440\u0435\u0436\u0456 \u0442\u0430 \u043F\u0456\u0434\u0432\u0438\u0449\u0435\u043D\u043D\u044F \u0441\u0442\u0430\u0431\u0456\u043B\u044C\u043D\u043E\u0441\u0442\u0456",
"roadmap.r4.date": "\u041E\u0441\u0456\u043D\u044C 2025",
"roadmap.r4.features": [
"\u041E\u043F\u0442\u0438\u043C\u0456\u0437\u0430\u0446\u0456\u044F P2P-\u0437'\u0454\u0434\u043D\u0430\u043D\u044C \u0456 \u043F\u0440\u043E\u0445\u043E\u0434\u0436\u0435\u043D\u043D\u044F NAT",
"\u041C\u0435\u0445\u0430\u043D\u0456\u0437\u043C\u0438 \u043F\u0435\u0440\u0435\u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F \u0442\u0430 \u0447\u0435\u0440\u0433\u0438 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u044C",
"\u041C\u0435\u043D\u0448\u0435 \u0441\u043F\u043E\u0436\u0438\u0432\u0430\u043D\u043D\u044F \u0431\u0430\u0442\u0430\u0440\u0435\u0457 \u043D\u0430 \u043C\u043E\u0431\u0456\u043B\u044C\u043D\u0438\u0445",
"\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0430\u0446\u0456\u044F \u043C\u0456\u0436 \u043A\u0456\u043B\u044C\u043A\u043E\u043C\u0430 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u044F\u043C\u0438",
"\u0406\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0438 \u043C\u043E\u043D\u0456\u0442\u043E\u0440\u0438\u043D\u0433\u0443 \u0442\u0430 \u0436\u0443\u0440\u043D\u0430\u043B\u044E\u0432\u0430\u043D\u043D\u044F \u0434\u043B\u044F \u0440\u043E\u0437\u0440\u043E\u0431\u043D\u0438\u043A\u0456\u0432"
],
"roadmap.r5.title": "\u041F\u0440\u0438\u0432\u0430\u0442\u043D\u0456\u0441\u0442\u044C \u043F\u0435\u0440\u0435\u0434\u0443\u0441\u0456\u043C",
"roadmap.r5.sub": "\u0424\u043E\u043A\u0443\u0441 \u043D\u0430 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0456: \u0437\u043C\u0435\u043D\u0448\u0435\u043D\u043D\u044F \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u0438\u0445",
"roadmap.r5.date": "\u0417\u0438\u043C\u0430 2025",
"roadmap.r5.features": [
"\u0417\u0430\u0445\u0438\u0441\u0442 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u0438\u0445 \u0456 \u0437\u043C\u0435\u043D\u0448\u0435\u043D\u043D\u044F \u0432\u0456\u0434\u0431\u0438\u0442\u043A\u0430",
"\u0415\u043A\u0441\u043F\u0435\u0440\u0438\u043C\u0435\u043D\u0442\u0438 \u0437 \u0446\u0438\u0431\u0443\u043B\u0435\u0432\u043E\u044E \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0456\u0454\u044E \u0442\u0430 DHT",
"\u0412\u0430\u0440\u0456\u0430\u043D\u0442\u0438 \u0430\u043D\u043E\u043D\u0456\u043C\u043D\u0438\u0445 \u0437'\u0454\u0434\u043D\u0430\u043D\u044C",
"\u041F\u0456\u0434\u0433\u043E\u0442\u043E\u0432\u043A\u0430 \u0434\u043E \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u043E\u0433\u043E \u0430\u0443\u0434\u0438\u0442\u0443 \u043A\u043E\u0434\u0443",
"\u041F\u043E\u043A\u0440\u0430\u0449\u0435\u043D\u0430 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0456\u0432"
],
"roadmap.r6.title": "Enhanced Security Edition",
"roadmap.r6.sub": "18-\u0448\u0430\u0440\u043E\u0432\u0430 \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0456\u044F \u0432\u0456\u0439\u0441\u044C\u043A\u043E\u0432\u043E\u0433\u043E \u0440\u0456\u0432\u043D\u044F \u0437 \u043F\u043E\u0432\u043D\u043E\u044E \u0432\u0430\u043B\u0456\u0434\u0430\u0446\u0456\u0454\u044E ASN.1",
"roadmap.r6.date": "\u041A\u0456\u043D\u0435\u0446\u044C 2025",
"roadmap.r6.features": [
"\u041F\u043E\u0442\u0440\u0456\u0439\u043D\u0438\u0439 \u0437\u0430\u0445\u0438\u0441\u0442: ECDH + DTLS + SAS",
"\u0428\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F ECDH P-384 \u0456 AES-GCM 256 \u0431\u0456\u0442",
"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0432\u0456\u0434\u0431\u0438\u0442\u043A\u0430 DTLS",
"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 SAS (\u043A\u043E\u0440\u043E\u0442\u043A\u0438\u0439 \u0440\u044F\u0434\u043E\u043A \u0430\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0446\u0456\u0457)",
"\u041F\u0440\u044F\u043C\u0430 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u0456\u0441\u0442\u044C \u0437\u0456 \u0437\u043C\u0456\u043D\u043E\u044E \u043A\u043B\u044E\u0447\u0456\u0432",
"\u041F\u043E\u0441\u0438\u043B\u0435\u043D\u0438\u0439 \u0437\u0430\u0445\u0438\u0441\u0442 \u0432\u0456\u0434 \u0430\u0442\u0430\u043A \xAB\u043B\u044E\u0434\u0438\u043D\u0430 \u043F\u043E\u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0456\xBB",
"\u041F\u043E\u0432\u043D\u0430 \u0432\u0430\u043B\u0456\u0434\u0430\u0446\u0456\u044F ASN.1 DER",
"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 OID \u0456 \u0442\u043E\u0447\u043E\u043A EC",
"\u0412\u0430\u043B\u0456\u0434\u0430\u0446\u0456\u044F \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0438 SPKI",
"\u0410\u0440\u0445\u0456\u0442\u0435\u043A\u0442\u0443\u0440\u0430 P2P \u043D\u0430 WebRTC",
"\u0417\u0430\u0445\u0438\u0441\u0442 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u0438\u0445",
"100 % \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u0439 \u043A\u043E\u0434"
],
"roadmap.r7.title": "Desktop Edition",
"roadmap.r7.sub": "\u0412\u043B\u0430\u0441\u043D\u0456 \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043A\u0438 \u0434\u043B\u044F Windows, macOS \u0456 Linux",
"roadmap.r7.date": "\u041F\u043E\u0447\u0430\u0442\u043E\u043A 2026",
"roadmap.r7.features": [
"\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043E\u043A \u0434\u043B\u044F Windows (Tauri v2)",
"\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043E\u043A \u0434\u043B\u044F macOS (Tauri v2)",
"AppImage \u0434\u043B\u044F Linux (Tauri v2)",
"\u0421\u043F\u043E\u0432\u0456\u0449\u0435\u043D\u043D\u044F \u0432 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u0447\u0430\u0441\u0456",
"\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0435 \u043F\u0435\u0440\u0435\u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F",
"\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0430\u0446\u0456\u044F \u043C\u0456\u0436 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u044F\u043C\u0438",
"\u041E\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0439 \u0456\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441",
"\u0424\u0430\u0439\u043B\u0438 \u0434\u043E 100 \u041C\u0411"
],
"roadmap.r8.title": "\u0417\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u0439 \u0433\u043E\u043B\u043E\u0441 \u0456 \u0434\u0437\u0432\u0456\u043D\u043A\u0438",
"roadmap.r8.sub": "\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0456 \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F, \u0430\u0443\u0434\u0456\u043E- \u0442\u0430 \u0432\u0456\u0434\u0435\u043E\u0434\u0437\u0432\u0456\u043D\u043A\u0438",
"roadmap.r8.date": "\u041F\u043E\u0447\u0430\u0442\u043E\u043A 2026",
"roadmap.r8.features": [
"\u0413\u043E\u043B\u043E\u0441\u043E\u0432\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u0437 \u043D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u0438\u043C \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F\u043C",
"\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0456 \u0430\u0443\u0434\u0456\u043E\u0434\u0437\u0432\u0456\u043D\u043A\u0438 \u0432\u0456\u0447-\u043D\u0430-\u0432\u0456\u0447 (WebRTC)",
"\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0456 \u0432\u0456\u0434\u0435\u043E\u0434\u0437\u0432\u0456\u043D\u043A\u0438 \u0432\u0456\u0447-\u043D\u0430-\u0432\u0456\u0447 (WebRTC)",
"\u041F\u0440\u044F\u043C\u0430 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u0456\u0441\u0442\u044C \u0434\u043B\u044F \u0436\u0438\u0432\u043E\u0433\u043E \u043F\u043E\u0442\u043E\u043A\u0443",
"\u041C\u0435\u0434\u0456\u0430\u043F\u043E\u0442\u043E\u043A\u0438 \u043F\u0456\u0434 \u0437\u0430\u0445\u0438\u0441\u0442\u043E\u043C SRTP/DTLS",
"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 SAS \u043F\u0456\u0434 \u0447\u0430\u0441 \u0434\u0437\u0432\u0456\u043D\u043A\u0430",
"\u0421\u043F\u043E\u0432\u0456\u0449\u0435\u043D\u043D\u044F \u043F\u0440\u043E \u0434\u0437\u0432\u0456\u043D\u043A\u0438 \u0442\u0430 \u0430\u0432\u0442\u043E\u043F\u0435\u0440\u0435\u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F",
"\u041C\u0435\u0434\u0456\u0430 P2P \u0437 \u043D\u0438\u0437\u044C\u043A\u043E\u044E \u0437\u0430\u0442\u0440\u0438\u043C\u043A\u043E\u044E"
],
"roadmap.r9.title": "\u0413\u0440\u0443\u043F\u043E\u0432\u0435 \u0441\u043F\u0456\u043B\u043A\u0443\u0432\u0430\u043D\u043D\u044F",
"roadmap.r9.sub": "\u0413\u0440\u0443\u043F\u043E\u0432\u0456 \u0447\u0430\u0442\u0438 \u0431\u0435\u0437 \u0432\u0442\u0440\u0430\u0442\u0438 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0456",
"roadmap.r9.date": "\u0417\u0430\u0440\u0430\u0437",
"roadmap.r9.features": [
"\u0413\u0440\u0443\u043F\u043E\u0432\u0456 \u0447\u0430\u0442\u0438 P2P \u0434\u043E 8 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0456\u0432",
"\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u0447\u0435\u0440\u0435\u0437 \u043C\u0435\u0440\u0435\u0436\u0443 \u0437 \u043F\u0456\u0434\u043F\u0438\u0441\u0430\u043D\u0438\u043C relay \u044F\u043A \u0437\u0430\u043F\u0430\u0441\u043D\u0438\u043C \u0448\u043B\u044F\u0445\u043E\u043C",
"\u041E\u0434\u0438\u043D \u043A\u043E\u0434 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u0433\u0440\u0443\u043F\u0438, \u044F\u043A\u0438\u0439 \u0437\u0432\u0456\u0440\u044F\u044E\u0442\u044C \u0443\u0441\u0456",
"\u0426\u0435\u0440\u0435\u043C\u043E\u043D\u0456\u044F \xAB\u0441\u043F\u0435\u0440\u0448\u0443 \u0437\u043E\u0431\u043E\u0432'\u044F\u0437\u0430\u043D\u043D\u044F, \u043F\u043E\u0442\u0456\u043C \u0440\u043E\u0437\u043A\u0440\u0438\u0442\u0442\u044F\xBB \u043F\u0440\u043E\u0442\u0438 \u0434\u043E\u0431\u043E\u0440\u0443 \u043A\u043E\u0434\u0456\u0432",
"\u0412\u043B\u0430\u0441\u043D\u0456 \u043A\u043B\u044E\u0447\u0456 \u043E\u0441\u043E\u0431\u0438 \u0432 \u0433\u0440\u0443\u043F\u0456, \u0435\u0444\u0435\u043C\u0435\u0440\u043D\u0456 \u0437\u0430 \u0437\u0430\u0434\u0443\u043C\u043E\u043C",
"\u041F\u0456\u0434\u043F\u0438\u0441\u0430\u043D\u0435 \u0447\u043B\u0435\u043D\u0441\u0442\u0432\u043E \u0437 \u0443\u043F\u043E\u0440\u044F\u0434\u043A\u0443\u0432\u0430\u043D\u043D\u044F\u043C \u0437\u0430 \u0435\u043F\u043E\u0445\u0430\u043C\u0438",
"\u041F\u0456\u0434\u043F\u0438\u0441\u0430\u043D\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F - \u0440\u043E\u0437\u0431\u0456\u0436\u043D\u0456\u0441\u0442\u044C \u0443 \u0441\u0442\u0435\u043D\u043E\u0433\u0440\u0430\u043C\u0456 \u043C\u043E\u0436\u043D\u0430 \u0434\u043E\u0432\u0435\u0441\u0442\u0438",
"\u0411\u0435\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0431\u0435\u0437 \u0441\u043F\u0456\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u043B\u044E\u0447\u0430 \u0433\u0440\u0443\u043F\u0438, \u0431\u0435\u0437 \u0456\u0441\u0442\u043E\u0440\u0456\u0457"
],
"roadmap.r10.title": "Mobile Edition",
"roadmap.r10.sub": "\u0412\u043B\u0430\u0441\u043D\u0456 \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043A\u0438 \u0434\u043B\u044F iOS \u0442\u0430 Android",
"roadmap.r10.date": "II \u043A\u0432\u0430\u0440\u0442\u0430\u043B 2027",
"roadmap.r10.features": [
"\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043E\u043A \u0434\u043B\u044F iOS (Swift/SwiftUI)",
"\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043E\u043A \u0434\u043B\u044F Android (Kotlin/Jetpack Compose)",
"\u041F\u0456\u0434\u0442\u0440\u0438\u043C\u043A\u0430 PWA \u0432 \u043C\u043E\u0431\u0456\u043B\u044C\u043D\u0438\u0445 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u0445",
"Push-\u0441\u043F\u043E\u0432\u0456\u0449\u0435\u043D\u043D\u044F \u0432 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u0447\u0430\u0441\u0456",
"\u041E\u043F\u0442\u0438\u043C\u0456\u0437\u0430\u0446\u0456\u044F \u0432\u0438\u0442\u0440\u0430\u0442\u0438 \u0431\u0430\u0442\u0430\u0440\u0435\u0457",
"\u0406\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043F\u0440\u0438\u0441\u0442\u043E\u0441\u043E\u0432\u0430\u043D\u0438\u0439 \u0434\u043E \u043C\u043E\u0431\u0456\u043B\u044C\u043D\u0438\u0445",
"\u0427\u0435\u0440\u0433\u0430 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u044C \u043E\u0444\u043B\u0430\u0439\u043D",
"\u0411\u0456\u043E\u043C\u0435\u0442\u0440\u0438\u0447\u043D\u0430 \u0430\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0446\u0456\u044F"
],
"roadmap.r11.title": "\u0421\u0442\u0456\u0439\u043A\u0456\u0441\u0442\u044C \u0434\u043E \u043A\u0432\u0430\u043D\u0442\u043E\u0432\u0438\u0445 \u043E\u0431\u0447\u0438\u0441\u043B\u0435\u043D\u044C",
"roadmap.r11.sub": "\u0417\u0430\u0445\u0438\u0441\u0442 \u0432\u0456\u0434 \u043A\u0432\u0430\u043D\u0442\u043E\u0432\u0438\u0445 \u043A\u043E\u043C\u043F'\u044E\u0442\u0435\u0440\u0456\u0432",
"roadmap.r11.date": "IV \u043A\u0432\u0430\u0440\u0442\u0430\u043B 2027",
"roadmap.r11.features": [
"\u041F\u043E\u0441\u0442\u043A\u0432\u0430\u043D\u0442\u043E\u0432\u0430 \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0456\u044F CRYSTALS-Kyber",
"\u0426\u0438\u0444\u0440\u043E\u0432\u0456 \u043F\u0456\u0434\u043F\u0438\u0441\u0438 SPHINCS+",
"\u0413\u0456\u0431\u0440\u0438\u0434\u043D\u0430 \u0441\u0445\u0435\u043C\u0430: \u043A\u043B\u0430\u0441\u0438\u0447\u043D\u0430 \u0442\u0430 \u043F\u043E\u0441\u0442\u043A\u0432\u0430\u043D\u0442\u043E\u0432\u0430",
"\u041A\u0432\u0430\u043D\u0442\u043E\u0432\u043E \u0441\u0442\u0456\u0439\u043A\u0438\u0439 \u043E\u0431\u043C\u0456\u043D \u043A\u043B\u044E\u0447\u0430\u043C\u0438",
"\u041E\u043D\u043E\u0432\u043B\u0435\u043D\u0456 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0438 \u0433\u0435\u0448\u0443\u0432\u0430\u043D\u043D\u044F",
"\u041C\u0456\u0433\u0440\u0430\u0446\u0456\u044F \u043D\u0430\u044F\u0432\u043D\u0438\u0445 \u0441\u0435\u0430\u043D\u0441\u0456\u0432",
"\u0421\u0443\u043C\u0456\u0441\u043D\u0456\u0441\u0442\u044C \u0456\u0437 v5.x",
"\u041A\u0432\u0430\u043D\u0442\u043E\u0432\u043E \u0441\u0442\u0456\u0439\u043A\u0456 \u043F\u0440\u043E\u0442\u043E\u043A\u043E\u043B\u0438"
],
"roadmap.r12.title": "\u0414\u0435\u0446\u0435\u043D\u0442\u0440\u0430\u043B\u0456\u0437\u043E\u0432\u0430\u043D\u0430 \u043C\u0435\u0440\u0435\u0436\u0430",
"roadmap.r12.sub": "\u041F\u043E\u0432\u043D\u0456\u0441\u0442\u044E \u0434\u0435\u0446\u0435\u043D\u0442\u0440\u0430\u043B\u0456\u0437\u043E\u0432\u0430\u043D\u0430 \u043C\u0435\u0440\u0435\u0436\u0430",
"roadmap.r12.date": "2028",
"roadmap.r12.features": [
"\u0421\u0456\u0442\u0447\u0430\u0441\u0442\u0430 \u043C\u0435\u0440\u0435\u0436\u0430 \u0432\u0443\u0437\u043B\u0456\u0432",
"DHT \u0434\u043B\u044F \u043F\u043E\u0448\u0443\u043A\u0443 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0456\u0432",
"\u0412\u0431\u0443\u0434\u043E\u0432\u0430\u043D\u0430 \u0446\u0438\u0431\u0443\u043B\u0435\u0432\u0430 \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0456\u044F",
"\u0422\u043E\u043A\u0435\u043D\u043E\u043C\u0456\u043A\u0430 \u0442\u0430 \u0441\u0442\u0438\u043C\u0443\u043B\u0438 \u0434\u043B\u044F \u0432\u0443\u0437\u043B\u0456\u0432",
"\u0412\u0440\u044F\u0434\u0443\u0432\u0430\u043D\u043D\u044F \u0447\u0435\u0440\u0435\u0437 DAO",
"\u0412\u0437\u0430\u0454\u043C\u043E\u0434\u0456\u044F \u0437 \u0456\u043D\u0448\u0438\u043C\u0438 \u043C\u0435\u0440\u0435\u0436\u0430\u043C\u0438",
"\u0421\u0443\u043C\u0456\u0441\u043D\u0456\u0441\u0442\u044C \u043C\u0456\u0436 \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u0430\u043C\u0438",
"\u041C\u0435\u0440\u0435\u0436\u0430, \u0449\u043E \u0432\u0456\u0434\u043D\u043E\u0432\u043B\u044E\u0454\u0442\u044C\u0441\u044F \u0441\u0430\u043C\u0430"
],
"roadmap.r13.title": "\u0428\u0406-\u043F\u043E\u043C\u0456\u0447\u043D\u0438\u043A \u0456\u0437 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0456",
"roadmap.r13.sub": "\u0428\u0442\u0443\u0447\u043D\u0438\u0439 \u0456\u043D\u0442\u0435\u043B\u0435\u043A\u0442 \u0434\u043B\u044F \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0456 \u0442\u0430 \u0431\u0435\u0437\u043F\u0435\u043A\u0438",
"roadmap.r13.date": "2028+",
"roadmap.r13.features": [
"\u041B\u043E\u043A\u0430\u043B\u044C\u043D\u0438\u0439 \u0430\u043D\u0430\u043B\u0456\u0437 \u0437\u0430\u0433\u0440\u043E\u0437 \u0437\u0430 \u0434\u043E\u043F\u043E\u043C\u043E\u0433\u043E\u044E \u0428\u0406",
"\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0435 \u0432\u0438\u044F\u0432\u043B\u0435\u043D\u043D\u044F \u0430\u0442\u0430\u043A \xAB\u043B\u044E\u0434\u0438\u043D\u0430 \u043F\u043E\u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0456\xBB",
"\u0410\u0434\u0430\u043F\u0442\u0438\u0432\u043D\u0430 \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0456\u044F",
"\u041F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u0456 \u043F\u043E\u0440\u0430\u0434\u0438 \u0437 \u0431\u0435\u0437\u043F\u0435\u043A\u0438",
"\u041C\u0430\u0448\u0438\u043D\u043D\u0435 \u043D\u0430\u0432\u0447\u0430\u043D\u043D\u044F \u0437 \u043D\u0443\u043B\u044C\u043E\u0432\u0438\u043C \u0440\u043E\u0437\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F\u043C",
"\u041F\u0440\u0438\u0432\u0430\u0442\u043D\u0438\u0439 \u0428\u0406-\u043F\u043E\u043C\u0456\u0447\u043D\u0438\u043A",
"\u041F\u0435\u0440\u0435\u0434\u0431\u0430\u0447\u0443\u0432\u0430\u043B\u044C\u043D\u0430 \u0431\u0435\u0437\u043F\u0435\u043A\u0430",
"\u0410\u0432\u0442\u043E\u043D\u043E\u043C\u043D\u0438\u0439 \u0437\u0430\u0445\u0438\u0441\u0442 \u0432\u0456\u0434 \u0430\u0442\u0430\u043A"
],
"handshake.step1": "\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u043F\u0430\u0440\u0438 \u043A\u043B\u044E\u0447\u0456\u0432 ECDH P-384",
"handshake.step2": "\u041E\u0431\u0447\u0438\u0441\u043B\u0435\u043D\u043D\u044F \u043A\u043E\u0434\u0443 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438",
"handshake.step3": "\u0417\u0430\u043A\u0440\u0456\u043F\u043B\u0435\u043D\u043D\u044F \u043F\u0440\u044F\u043C\u043E\u0457 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u0456",
"handshake.securingTitle": "\u0417\u0430\u0445\u0438\u0449\u0430\u0454\u043C\u043E \u0432\u0430\u0448 \u043A\u0430\u043D\u0430\u043B",
"handshake.answerTitle": "\u0413\u043E\u0442\u0443\u0454\u043C\u043E \u0432\u0430\u0448\u0443 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C",
"handshake.securingDesc": "\u0421\u0442\u0432\u043E\u0440\u044E\u0454\u043C\u043E \u043A\u043B\u044E\u0447\u0456, \u0437\u0434\u0430\u0442\u043D\u0456 \u0432\u0438\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u0432\u0442\u0440\u0443\u0447\u0430\u043D\u043D\u044F.",
"handshake.shareTitle": "\u041F\u043E\u0434\u0456\u043B\u0456\u0442\u044C\u0441\u044F \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F\u043C",
"handshake.sendAnswerTitle": "\u041D\u0430\u0434\u0456\u0448\u043B\u0456\u0442\u044C \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \u043D\u0430\u0437\u0430\u0434",
"handshake.shareDesc": "\u041F\u043E\u043A\u0430\u0436\u0456\u0442\u044C QR-\u043A\u043E\u0434 \u0430\u0431\u043E \u043D\u0430\u0434\u0456\u0448\u043B\u0456\u0442\u044C \u043A\u043E\u0434 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0443. \u0412\u0456\u043D \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u0438\u0439 \u0456 \u0441\u043A\u043E\u0440\u043E \u0432\u0442\u0440\u0430\u0442\u0438\u0442\u044C \u0447\u0438\u043D\u043D\u0456\u0441\u0442\u044C.",
"handshake.sendAnswerDesc": "\u041F\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 \u0446\u044E \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \u0442\u043E\u043C\u0443, \u0445\u0442\u043E \u0441\u0442\u0432\u043E\u0440\u0438\u0432 \u043A\u0430\u043D\u0430\u043B, \u0449\u043E\u0431 \u0432\u0456\u043D \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432 \u0440\u0443\u043A\u043E\u0441\u0442\u0438\u0441\u043A\u0430\u043D\u043D\u044F.",
"handshake.establish": "\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438 \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F",
"handshake.thenReceive": "\u041F\u043E\u0442\u0456\u043C \u043E\u0442\u0440\u0438\u043C\u0430\u0439\u0442\u0435 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C, \u044F\u043A\u0443 \u043D\u0430\u0434\u0456\u0448\u043B\u0435 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A",
"handshake.pasteAnswerPlaceholder": "\u0412\u0441\u0442\u0430\u0432\u0442\u0435 \u043A\u043E\u0434 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0456 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430\u2026",
"handshake.answerSentNote": "\u041D\u0430\u0434\u0456\u0448\u043B\u0456\u0442\u044C \u0446\u044E \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \u0441\u0442\u0432\u043E\u0440\u044E\u0432\u0430\u0447\u0443 \u0439 \u0437\u0430\u0447\u0435\u043A\u0430\u0439\u0442\u0435 - \u0447\u0430\u0442 \u0432\u0456\u0434\u043A\u0440\u0438\u0454\u0442\u044C\u0441\u044F, \u0449\u043E\u0439\u043D\u043E \u0432\u0456\u043D \u043F\u0440\u0438\u0454\u0434\u043D\u0430\u0454\u0442\u044C\u0441\u044F.",
"handshake.qrHint": "\u0422\u0440\u0438\u043C\u0430\u0439\u0442\u0435 \u0446\u0435 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u043C, \u0434\u043E\u043A\u0438 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A \u043D\u0435 \u0437\u0447\u0438\u0442\u0430\u0454 \u043A\u043E\u0434.",
"handshake.qrHintFrames": "\u0420\u0443\u043A\u043E\u0441\u0442\u0438\u0441\u043A\u0430\u043D\u043D\u044F \u0440\u043E\u0437\u0431\u0438\u0442\u0435 \u043D\u0430 {frames} \u043A\u0430\u0434\u0440\u0456\u0432 - \u0442\u0440\u0438\u043C\u0430\u0439\u0442\u0435 \u0446\u0435 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u043C, \u0434\u043E\u043A\u0438 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A \u043D\u0435 \u0437\u0447\u0438\u0442\u0430\u0454 \u0432\u0441\u0456.",
"verify.title": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0431\u0435\u0437\u043F\u0435\u043A\u0438",
"verify.desc": "\u0417\u0432\u0456\u0440\u0442\u0435 \u0446\u0435\u0439 \u043A\u043E\u0434 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u0437\u0456 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u043E\u043C \u0456\u043D\u0448\u0438\u043C \u043A\u0430\u043D\u0430\u043B\u043E\u043C (\u0433\u043E\u043B\u043E\u0441\u043E\u043C \u0430\u0431\u043E \u043E\u0441\u043E\u0431\u0438\u0441\u0442\u043E), \u043F\u043E\u0442\u0456\u043C \u0432\u0432\u0435\u0434\u0456\u0442\u044C \u0439\u043E\u0433\u043E, \u0449\u043E\u0431 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0447\u0430\u0442.",
"verify.enterLabel": "\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u0437\u0432\u0456\u0440\u0435\u043D\u0438\u0439 \u043A\u043E\u0434",
"verify.placeholder": "\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u043A\u043E\u0434 \u0442\u0443\u0442",
"verify.confirm": "\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0438 \u043A\u043E\u0434",
"verify.confirmed": "\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043E",
"verify.mismatch": "\u041D\u0435 \u0437\u0431\u0456\u0433\u0430\u044E\u0442\u044C\u0441\u044F",
"verify.yours": "\u0412\u0430\u0448\u0435 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F",
"verify.peer": "\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430",
"verify.pending": "\u041E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F",
"verify.waiting": "\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u043A\u043E\u0434\u0443\u2026",
"verify.verified": "\u041A\u0430\u043D\u0430\u043B \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E",
"verify.bothConfirmed": "\u041E\u0431\u0438\u0434\u0432\u0456 \u0441\u0442\u043E\u0440\u043E\u043D\u0438 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438. \u0412\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0454\u043C\u043E \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u0439 \u0447\u0430\u0442\u2026",
"pwa.bannerTitle": "\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0456\u0442\u044C SecureBit.chat",
"pwa.bannerDesc": "\u0414\u043E\u0441\u0432\u0456\u0434 \u0432\u043B\u0430\u0441\u043D\u043E\u0433\u043E \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043A\u0443 \u0437 \u043F\u043E\u0441\u0438\u043B\u0435\u043D\u0438\u043C \u0437\u0430\u0445\u0438\u0441\u0442\u043E\u043C",
"pwa.install": "\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438",
"pwa.dismiss": "\u0417\u0430\u043A\u0440\u0438\u0442\u0438",
"pwa.close": "\u0417\u0430\u043A\u0440\u0438\u0442\u0438",
"pwa.iosTitle": "\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u043D\u0430 iOS",
"pwa.iosStep1": "\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C \u043A\u043D\u043E\u043F\u043A\u0443 \xAB\u041F\u043E\u0434\u0456\u043B\u0438\u0442\u0438\u0441\u044F\xBB",
"pwa.iosStep1Hint": "\u0417\u0430\u0437\u0432\u0438\u0447\u0430\u0439 \u0443\u043D\u0438\u0437\u0443 Safari",
"pwa.iosStep2": "\u0417\u043D\u0430\u0439\u0434\u0456\u0442\u044C \xAB\u041D\u0430 \u0435\u043A\u0440\u0430\u043D \xAB\u0414\u043E\u043C\u0456\u0432\xBB\xBB",
"pwa.iosStep2Hint": "\u041F\u0440\u043E\u0433\u043E\u0440\u043D\u0456\u0442\u044C \u043C\u0435\u043D\u044E \u043F\u043E\u0434\u0456\u043B\u0438\u0442\u0438\u0441\u044F \u0432\u043D\u0438\u0437",
"pwa.iosStep3": "\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C \xAB\u0414\u043E\u0434\u0430\u0442\u0438\xBB",
"pwa.iosStep3Hint": "\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0456\u0442\u044C, \u0449\u043E\u0431 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438 SecureBit.chat",
"pwa.genericTitle": "\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438 SecureBit",
"pwa.genericDesc": "\u041A\u043E\u0436\u0435\u043D \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u044E\u0454 \u043F\u043E-\u0441\u0432\u043E\u0454\u043C\u0443. \u041E\u0431\u0435\u0440\u0456\u0442\u044C \u043A\u0440\u043E\u043A\u0438, \u044F\u043A\u0456 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u044E\u0442\u044C \u0432\u0430\u0448\u043E\u043C\u0443.",
"pwa.gotIt": "\u0417\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u043E",
"pwa.installedTitle": "\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043E\u043A \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E!",
"pwa.installedIos": "\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043E\u043A \u0434\u043B\u044F iOS \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! \u0412\u0456\u0434\u043A\u0440\u0438\u0439\u0442\u0435 \u0439\u043E\u0433\u043E \u0437 \u0435\u043A\u0440\u0430\u043D\u0430 \xAB\u0414\u043E\u043C\u0456\u0432\xBB.",
"pwa.installedGeneric": "SecureBit.chat \u0442\u0435\u043F\u0435\u0440 \u043D\u0430 \u0432\u0430\u0448\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457",
"pwa.anytimeTitle": "\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438 \u0431\u0443\u0434\u044C-\u043A\u043E\u043B\u0438",
"pwa.anytimeDesc": "\u0412\u0438 \u0437\u0430\u0432\u0436\u0434\u0438 \u043C\u043E\u0436\u0435\u0442\u0435 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438 SecureBit.chat \u0456\u0437 \u043C\u0435\u043D\u044E \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 - \u0442\u0430\u043A \u0432\u0456\u043D \u043F\u0440\u0430\u0446\u044E\u0454 \u043D\u0430\u0439\u043A\u0440\u0430\u0449\u0435.",
"pwa.ok": "\u0413\u0430\u0440\u0430\u0437\u0434",
"step.open": "\u041A\u0440\u043E\u043A 1 \xB7 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u043A\u0430\u043D\u0430\u043B",
"step.exchange": "\u041A\u0440\u043E\u043A 2 \xB7 \u043E\u0431\u043C\u0456\u043D",
"step.verification": "\u041A\u0440\u043E\u043A 3 \xB7 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430",
"action.create": "\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438",
"action.join": "\u041F\u0440\u0438\u0454\u0434\u043D\u0430\u0442\u0438\u0441\u044F",
"action.back": "\u041D\u0430\u0437\u0430\u0434",
"action.copy": "\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438",
"action.copied": "\u0421\u043A\u043E\u043F\u0456\u0439\u043E\u0432\u0430\u043D\u043E",
"action.scan": "\u0421\u043A\u0430\u043D\u0443\u0432\u0430\u0442\u0438",
"action.downloadDesktop": "\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043E\u043A",
"action.advancedSettings": "\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u0456 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F",
"cred.offerTag": "\u043F\u0440\u043E\u043F\u043E\u0437\u0438\u0446\u0456\u044F \xB7 \u0430\u0431\u043E \u0441\u043A\u043E\u043F\u0456\u044E\u0439\u0442\u0435 \u0442\u0435\u043A\u0441\u0442",
"cred.answerTag": "\u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \xB7 \u0430\u0431\u043E \u0441\u043A\u043E\u043F\u0456\u044E\u0439\u0442\u0435 \u0442\u0435\u043A\u0441\u0442",
"cred.reveal": "\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 - \u0442\u0440\u0438\u043C\u0430\u0439\u0442\u0435 \u0446\u0435\u0439 \u043A\u043E\u0434 \u0443 \u0442\u0430\u0454\u043C\u043D\u0438\u0446\u0456",
"qr.title": "\u0421\u043A\u0430\u043D\u0443\u0432\u0430\u0442\u0438 QR-\u043A\u043E\u0434",
"qr.subtitle": "\u041D\u0430\u0432\u0435\u0434\u0456\u0442\u044C \u043A\u0430\u043C\u0435\u0440\u0443 \u043D\u0430 \u0457\u0445\u043D\u0456\u0439 QR-\u043A\u043E\u0434",
"qr.scanning": "\u0421\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F\u2026",
"qr.hint": "\u0422\u0440\u0438\u043C\u0430\u0439\u0442\u0435 \u0440\u0456\u0432\u043D\u043E, \u0434\u043E\u043A\u0438 \u043D\u0435 \u0437\u0447\u0438\u0442\u0430\u044E\u0442\u044C\u0441\u044F \u0432\u0441\u0456 \u0447\u0430\u0441\u0442\u0438\u043D\u0438. \u041A\u0430\u043C\u0435\u0440\u0430 \u043F\u0440\u0430\u0446\u044E\u0454 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E - \u043D\u0456\u0447\u043E\u0433\u043E \u043D\u0435 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0454\u0442\u044C\u0441\u044F.",
"mesh.you": "\u0432\u0438",
"mesh.peer": "\u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A \xB7 \u0441\u0435\u0430\u043D\u0441 1",
"mesh.joined2": "\u043E\u043A\u0441\u0430\u043D\u0430 \u043F\u0440\u0438\u0454\u0434\u043D\u0430\u043B\u0430\u0441\u044F \xB7 +2",
"mesh.joined3": "\u0442\u0430\u0440\u0430\u0441 \u043F\u0440\u0438\u0454\u0434\u043D\u0430\u0432\u0441\u044F \xB7 +3",
"ice.title": "\u041C\u0435\u0440\u0435\u0436\u0435\u0432\u0456 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F",
"ice.subtitle": "\u041D\u0430\u043B\u0430\u0448\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E - \u043D\u0456\u043A\u043E\u043B\u0438 \u043D\u0435 \u043F\u0435\u0440\u0435\u0434\u0430\u0454\u0442\u044C\u0441\u044F \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0443",
"ice.intro": "\u0422\u0438\u043F\u043E\u0432\u043E SecureBit \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454 \u043F\u0443\u0431\u043B\u0456\u0447\u043D\u0456 STUN-\u0441\u0435\u0440\u0432\u0435\u0440\u0438, \u0449\u043E\u0431 \u0443\u0437\u0433\u043E\u0434\u0438\u0442\u0438 \u043F\u0440\u044F\u043C\u0435 \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F. \u042F\u043A\u0449\u043E \u0442\u0440\u0438\u043C\u0430\u0454\u0442\u0435 \u0432\u043B\u0430\u0441\u043D\u0456, \u0432\u043A\u0430\u0436\u0456\u0442\u044C \u0441\u0432\u043E\u0457 STUN/TURN.",
"ice.publicTitle": "\u041F\u0443\u0431\u043B\u0456\u0447\u043D\u0456 \u0441\u0435\u0440\u0432\u0435\u0440\u0438 (\u0442\u0438\u043F\u043E\u0432\u043E)",
"ice.publicDesc": "\u0411\u0435\u0437 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F. \u041F\u0456\u0434\u0445\u043E\u0434\u0438\u0442\u044C \u0431\u0456\u043B\u044C\u0448\u043E\u0441\u0442\u0456.",
"ice.customTitle": "\u0412\u043B\u0430\u0441\u043D\u0456 STUN/TURN-\u0441\u0435\u0440\u0432\u0435\u0440\u0438",
"ice.customDesc": "\u0414\u043E {max} \u0441\u0435\u0440\u0432\u0435\u0440\u0456\u0432.",
"ice.turnNote": "TURN-relay \u0431\u0430\u0447\u0438\u0442\u044C IP \u043E\u0431\u043E\u0445 \u0441\u0442\u043E\u0440\u0456\u043D \u0456 \u0440\u0438\u0442\u043C \u0442\u0440\u0430\u0444\u0456\u043A\u0443 - \u0430\u043B\u0435 \u043D\u0456\u043A\u043E\u043B\u0438 \u0432\u043C\u0456\u0441\u0442 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u044C, \u044F\u043A\u0438\u0439 \u043B\u0438\u0448\u0430\u0454\u0442\u044C\u0441\u044F \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u043C \u043D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u043E. \u041A\u0440\u0430\u0449\u0435 ",
"ice.turnNoteTls": " (TLS).",
"ice.test": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0438\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0438",
"ice.testing": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430\u2026",
"ice.relayTitle": "\u0420\u0435\u0436\u0438\u043C \u043B\u0438\u0448\u0435 \u0447\u0435\u0440\u0435\u0437 relay",
"ice.relayBadge": "\u041C\u0410\u041A\u0421\u0418\u041C\u0423\u041C \u041F\u0420\u0418\u0412\u0410\u0422\u041D\u041E\u0421\u0422\u0406",
"ice.relayDesc": "\u041F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u0454 \u0432\u0435\u0441\u044C \u0442\u0440\u0430\u0444\u0456\u043A \u0447\u0435\u0440\u0435\u0437 TURN, \u0442\u043E\u0436 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A \u043D\u0456\u043A\u043E\u043B\u0438 \u043D\u0435 \u043F\u043E\u0431\u0430\u0447\u0438\u0442\u044C \u0432\u0430\u0448\u043E\u0457 IP. \u041F\u043E\u0442\u0440\u0456\u0431\u0435\u043D TURN-\u0441\u0435\u0440\u0432\u0435\u0440.",
"ice.relayWarning": "\u0420\u0435\u0436\u0438\u043C \u043B\u0438\u0448\u0435 \u0447\u0435\u0440\u0435\u0437 relay \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E, \u0430\u043B\u0435 TURN-\u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u0432\u043A\u0430\u0437\u0430\u043D\u043E. \u0417'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u043D\u0435 \u0437\u043C\u043E\u0436\u0435 \u043F\u043E\u0447\u0430\u0442\u0438\u0441\u044F.",
"ice.persist": "\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457",
"ice.persistDesc": "\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0454\u0442\u044C\u0441\u044F \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E \u0432 \u0446\u044C\u043E\u043C\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0456. \u041B\u0438\u0448\u0456\u0442\u044C \u0432\u0438\u043C\u043A\u043D\u0435\u043D\u0438\u043C, \u0449\u043E\u0431 \u0434\u0456\u044F\u043B\u043E \u043B\u0438\u0448\u0435 \u0432 \u0446\u044C\u043E\u043C\u0443 \u0441\u0435\u0430\u043D\u0441\u0456.",
"ice.forget": "\u0417\u0430\u0431\u0443\u0442\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0435",
"ice.cancel": "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438",
"ice.apply": "\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438",
"ice.errUnavailable": "WebRTC \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 \u0443 \u0446\u044C\u043E\u043C\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0456",
"ice.errInvalid": "\u0425\u0438\u0431\u043D\u0430 \u043A\u043E\u043D\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u044F \u0441\u0435\u0440\u0432\u0435\u0440\u0430",
"update.title": "\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0435 \u043E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F",
"update.desc": "\u0412\u0438\u044F\u0432\u043B\u0435\u043D\u043E \u043D\u043E\u0432\u0456\u0448\u0443 \u0432\u0435\u0440\u0441\u0456\u044E SecureBit.",
"update.currentVersion": "\u041F\u043E\u0442\u043E\u0447\u043D\u0430 \u0432\u0435\u0440\u0441\u0456\u044F",
"update.newVersion": "\u041D\u043E\u0432\u0430 \u0432\u0435\u0440\u0441\u0456\u044F",
"update.now": "\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u0437\u0430\u0440\u0430\u0437",
"update.later": "\u041F\u0456\u0437\u043D\u0456\u0448\u0435",
"update.unknown": "\u043D/\u0434",
"update.stepSaving": "\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043D\u044F \u0434\u0430\u043D\u0438\u0445\u2026",
"update.stepSwCaches": "\u041E\u0447\u0438\u0449\u0435\u043D\u043D\u044F \u043A\u0435\u0448\u0456\u0432 Service Worker\u2026",
"update.stepSwUnregister": "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u043D\u043D\u044F \u0440\u0435\u0454\u0441\u0442\u0440\u0430\u0446\u0456\u0457 Service Worker\u2026",
"update.stepBrowserCache": "\u041E\u0447\u0438\u0449\u0435\u043D\u043D\u044F \u043A\u0435\u0448\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u2026",
"update.stepVersion": "\u041E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0432\u0435\u0440\u0441\u0456\u0457\u2026",
"update.stepReload": "\u041F\u0435\u0440\u0435\u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043A\u0443\u2026",
"update.error": "\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F. \u041F\u0435\u0440\u0435\u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0442\u0435 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0432\u0440\u0443\u0447\u043D\u0443 (Ctrl+F5 \u0430\u0431\u043E Cmd+Shift+R)",
"update.confirmSkip": "\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u043D\u043E\u0432\u0430 \u0432\u0435\u0440\u0441\u0456\u044F. \u041E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u0435 \u0437\u0430\u0434\u043B\u044F \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u0442\u0430 \u0441\u0442\u0430\u0431\u0456\u043B\u044C\u043D\u043E\u0441\u0442\u0456. \u041F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438 \u0431\u0435\u0437 \u043E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F?",
"offline.backOnline": "\u0417\u043D\u043E\u0432\u0443 \u043E\u043D\u043B\u0430\u0439\u043D",
"offline.mode": "\u0420\u0435\u0436\u0438\u043C \u043E\u0444\u043B\u0430\u0439\u043D",
"offline.dismiss": "\u0417\u0430\u043A\u0440\u0438\u0442\u0438",
"offline.lostTitle": "\u0417'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0432\u0442\u0440\u0430\u0447\u0435\u043D\u043E",
"offline.lostDesc": "SecureBit \u043F\u0440\u0430\u0446\u044E\u0454 \u043E\u0444\u043B\u0430\u0439\u043D. \u0414\u0435\u0449\u043E \u043E\u0431\u043C\u0435\u0436\u0435\u043D\u043E, \u0430\u043B\u0435 \u0432\u0430\u0448\u0456 \u0434\u0430\u043D\u0456 \u0432 \u0431\u0435\u0437\u043F\u0435\u0446\u0456.",
"offline.point1": "\u0412\u0430\u0448 \u0441\u0435\u0430\u043D\u0441 \u0456 \u043A\u043B\u044E\u0447\u0456 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043E",
"offline.point2": "\u0416\u043E\u0434\u043D\u0438\u0445 \u0434\u0430\u043D\u0438\u0445 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445",
"offline.point3": "\u041F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u0439 \u0444\u0430\u0439\u043B\u0438 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0443\u044E\u0442\u044C\u0441\u044F \u043F\u0456\u0441\u043B\u044F \u0432\u0456\u0434\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0437\u0432'\u044F\u0437\u043A\u0443",
"offline.continue": "\u041F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438 \u043E\u0444\u043B\u0430\u0439\u043D",
"offline.restoredTitle": "\u041A\u043E\u043B\u0438 \u0437\u0432'\u044F\u0437\u043E\u043A \u0432\u0456\u0434\u043D\u043E\u0432\u0438\u0442\u044C\u0441\u044F",
"offline.restoredDesc": "\u041E\u0431\u0440\u0438\u0432 \u0437\u0432'\u044F\u0437\u043A\u0443 \u043D\u0456\u0447\u043E\u0433\u043E \u043D\u0435 \u043A\u043E\u0448\u0442\u0443\u0454. SecureBit \u0441\u043A\u043B\u0430\u0434\u0430\u0454 \u0432\u0441\u0435 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u0432 \u0447\u0435\u0440\u0433\u0443 \u0439 \u0432\u0456\u0434\u043D\u043E\u0432\u043B\u044E\u0454 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \u0441\u0435\u0430\u043D\u0441, \u0449\u043E\u0439\u043D\u043E \u0432\u0438 \u0437\u043D\u043E\u0432\u0443 \u043E\u043D\u043B\u0430\u0439\u043D.",
"offline.r1Title": "\u0412\u0430\u0448\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u0434\u0456\u0439\u0434\u0443\u0442\u044C",
"offline.r1Desc": "\u0423\u0441\u0435, \u0449\u043E \u0432\u0438 \u043D\u0430\u043F\u0438\u0441\u0430\u043B\u0438 \u043E\u0444\u043B\u0430\u0439\u043D, \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0454\u0442\u044C\u0441\u044F \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0443 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E.",
"offline.r2Title": "\u0424\u0430\u0439\u043B\u0438 \u0434\u043E\u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0430\u0442\u044C\u0441\u044F",
"offline.r2Desc": "\u041F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043D\u043D\u044F \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u044C\u0441\u044F \u0437 \u043C\u0456\u0441\u0446\u044F \u0437\u0443\u043F\u0438\u043D\u043A\u0438 - \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438 \u0437\u0430\u043D\u043E\u0432\u043E \u043D\u0435 \u0442\u0440\u0435\u0431\u0430.",
"offline.r3Title": "\u0407\u0445\u043D\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u0439 \u0444\u0430\u0439\u043B\u0438 \u043D\u0430\u0434\u0456\u0439\u0434\u0443\u0442\u044C",
"offline.r3Desc": "\u0423\u0441\u0435, \u0449\u043E \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u0432 \u043F\u0456\u0434 \u0447\u0430\u0441 \u043F\u0435\u0440\u0435\u0440\u0432\u0438, \u043D\u0430\u0434\u0456\u0439\u0434\u0435 \u0432\u0430\u043C \u043F\u043E \u043F\u043E\u0440\u044F\u0434\u043A\u0443.",
"offline.r4Title": "\u041D\u0456\u0447\u043E\u0433\u043E \u043D\u0435 \u0432\u0442\u0440\u0430\u0447\u0430\u0454\u0442\u044C\u0441\u044F",
"offline.r4Desc": "\u041F\u0456\u0441\u043B\u044F \u0432\u0456\u0434\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0437\u0432'\u044F\u0437\u043A\u0443 \u0440\u043E\u0437\u0440\u0438\u0432\u0443 \u043D\u0435 \u043B\u0438\u0448\u0430\u0454\u0442\u044C\u0441\u044F - \u0440\u043E\u0437\u043C\u043E\u0432\u0430 \u0442\u0440\u0438\u0432\u0430\u0454 \u0440\u0456\u0432\u043D\u043E \u0437 \u0442\u043E\u0433\u043E \u043C\u0456\u0441\u0446\u044F, \u0434\u0435 \u0441\u043F\u0438\u043D\u0438\u043B\u0430\u0441\u044F.",
"offline.gotIt": "\u0417\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u043E",
"qr.showTitle": "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 QR-\u043A\u043E\u0434",
"qr.showSubtitle": "\u041D\u0430 \u0432\u0435\u0441\u044C \u0435\u043A\u0440\u0430\u043D \xB7 \u043D\u0435\u0445\u0430\u0439 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A \u0432\u0456\u0434\u0441\u043A\u0430\u043D\u0443\u0454",
"qr.showSubtitleFrames": "\u041D\u0430 \u0432\u0435\u0441\u044C \u0435\u043A\u0440\u0430\u043D \xB7 \u043D\u0435\u0445\u0430\u0439 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A \u0432\u0456\u0434\u0441\u043A\u0430\u043D\u0443\u0454 \u0432\u0441\u0456 {frames} \u043A\u0430\u0434\u0440\u0456\u0432",
"notify.enabledBody": "\u0421\u043F\u043E\u0432\u0456\u0449\u0435\u043D\u043D\u044F \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E. \u0412\u0438 \u043E\u0442\u0440\u0438\u043C\u0443\u0432\u0430\u0442\u0438\u043C\u0435\u0442\u0435 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F \u043F\u0440\u043E \u043D\u043E\u0432\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F.",
"notify.workingBody": "\u0421\u043F\u043E\u0432\u0456\u0449\u0435\u043D\u043D\u044F \u043F\u0440\u0430\u0446\u044E\u044E\u0442\u044C. \u0412\u0438 \u043E\u0442\u0440\u0438\u043C\u0443\u0432\u0430\u0442\u0438\u043C\u0435\u0442\u0435 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F \u043F\u0440\u043E \u043D\u043E\u0432\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F.",
"pw.label": "\u041F\u043E\u043B\u0435 \u043F\u0430\u0440\u043E\u043B\u044F",
"pw.placeholder": "\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C\u2026",
"pw.decrypt": "\u0420\u043E\u0437\u0448\u0438\u0444\u0440\u0443\u0432\u0430\u0442\u0438",
"pw.cancel": "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438",
"file.title": "\u041F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043D\u043D\u044F \u0444\u0430\u0439\u043B\u0456\u0432",
"file.drop": "\u041F\u0435\u0440\u0435\u0442\u044F\u0433\u043D\u0456\u0442\u044C \u0444\u0430\u0439\u043B\u0438 \u0441\u044E\u0434\u0438",
"file.dropHint": "\u0428\u0438\u0444\u0440\u0443\u044E\u0442\u044C\u0441\u044F \u043D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u043E \u043F\u0435\u0440\u0435\u0434 \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043D\u043D\u044F\u043C \xB7 \u0434\u043E 100 \u041C\u0411",
"file.browse": "\u041E\u0433\u043B\u044F\u0434 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u044E",
"file.incoming": "\u0412\u0445\u0456\u0434\u043D\u0438\u0439 \u0437\u0430\u043F\u0438\u0442 \u043D\u0430 \u0444\u0430\u0439\u043B",
"file.accept": "\u041F\u0440\u0438\u0439\u043D\u044F\u0442\u0438",
"file.reject": "\u0412\u0456\u0434\u0445\u0438\u043B\u0438\u0442\u0438",
"file.download": "\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438",
"file.notReady": "\u0417'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0449\u0435 \u043D\u0435 \u0433\u043E\u0442\u043E\u0432\u0435",
"file.tooLarge": "\u0424\u0430\u0439\u043B \u0437\u0430\u0432\u0435\u043B\u0438\u043A\u0438\u0439",
"file.typeNotAllowed": "\u0422\u0438\u043F \u0444\u0430\u0439\u043B\u0443 \u043D\u0435 \u0434\u043E\u0437\u0432\u043E\u043B\u0435\u043D\u043E",
"file.maxConcurrent": "\u0414\u043E\u0441\u044F\u0433\u043D\u0443\u0442\u043E \u043C\u0435\u0436\u0443 \u043E\u0434\u043D\u043E\u0447\u0430\u0441\u043D\u0438\u0445 \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043D\u044C",
"file.gone": "\u0426\u0435\u0439 \u0444\u0430\u0439\u043B \u0431\u0456\u043B\u044C\u0448\u0435 \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 \u0434\u043B\u044F \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F.",
"call.incoming": "\u0412\u0445\u0456\u0434\u043D\u0438\u0439 \u0434\u0437\u0432\u0456\u043D\u043E\u043A",
"call.incomingVideo": "\u0412\u0445\u0456\u0434\u043D\u0438\u0439 \u0432\u0456\u0434\u0435\u043E\u0434\u0437\u0432\u0456\u043D\u043E\u043A",
"call.encrypted": "\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \u0434\u0437\u0432\u0456\u043D\u043E\u043A",
"call.encryptedShort": "\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E",
"call.peer": "\u0417\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u0439 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A",
"call.connecting": "\u0417'\u0454\u0434\u043D\u0430\u043D\u043D\u044F\u2026",
"call.ringing": "\u0414\u0437\u0432\u0456\u043D\u043E\u043A\u2026",
"call.accept": "\u041F\u0440\u0438\u0439\u043D\u044F\u0442\u0438",
"call.decline": "\u0412\u0456\u0434\u0445\u0438\u043B\u0438\u0442\u0438",
"call.end": "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0438 \u0434\u0437\u0432\u0456\u043D\u043E\u043A",
"call.camera": "\u041A\u0430\u043C\u0435\u0440\u0430",
"call.cameraOff": "\u041A\u0430\u043C\u0435\u0440\u0443 \u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043E",
"call.peerCameraOff": "\u041A\u0430\u043C\u0435\u0440\u0443 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430 \u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043E",
"call.flipCamera": "\u041F\u0435\u0440\u0435\u043C\u043A\u043D\u0443\u0442\u0438 \u043A\u0430\u043C\u0435\u0440\u0443",
"call.addVideo": "\u0414\u043E\u0434\u0430\u0442\u0438 \u0432\u0456\u0434\u0435\u043E",
"call.video": "\u0412\u0456\u0434\u0435\u043E",
"call.muted": "\u0411\u0435\u0437 \u0437\u0432\u0443\u043A\u0443",
"call.expand": "\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438",
"call.minimize": "\u0417\u0433\u043E\u0440\u043D\u0443\u0442\u0438",
"call.quality": "\u042F\u043A\u0456\u0441\u0442\u044C \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F",
"call.qualityExcellent": "\u0412\u0456\u0434\u043C\u0456\u043D\u043D\u0430",
"call.videoPrefix": "\u0412\u0456\u0434\u0435\u043E \xB7 ",
"call.voicePrefix": "\u0413\u043E\u043B\u043E\u0441 \xB7 ",
"group.new": "\u041D\u043E\u0432\u0430 \u0433\u0440\u0443\u043F\u0430",
"group.create": "\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0433\u0440\u0443\u043F\u0443",
"group.join": "\u041F\u0440\u0438\u0454\u0434\u043D\u0430\u0442\u0438\u0441\u044F \u0434\u043E \u0433\u0440\u0443\u043F\u0438",
"group.name": "\u041D\u0430\u0437\u0432\u0430 \u0433\u0440\u0443\u043F\u0438",
"group.nameTooLong": "\u041D\u0430\u0437\u0432\u0430 \u0433\u0440\u0443\u043F\u0438 \u0437\u0430\u0434\u043E\u0432\u0433\u0430.",
"group.capacity": "\u0414\u043E {max} \u043E\u0441\u0456\u0431, \u043D\u0430\u043F\u0440\u044F\u043C\u0443 \u043C\u0456\u0436 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u044F\u043C\u0438. \u0423\u0441\u0456 \u0437\u0432\u0456\u0440\u044F\u0442\u044C \u043E\u0434\u0438\u043D \u043A\u043E\u0434 \u0431\u0435\u0437\u043F\u0435\u043A\u0438, \u043F\u0435\u0440\u0448 \u043D\u0456\u0436 \u0433\u0440\u0443\u043F\u0430 \u0432\u0456\u0434\u043A\u0440\u0438\u0454\u0442\u044C\u0441\u044F.",
"group.invite": "\u0417\u0430\u043F\u0440\u043E\u0441\u0438\u0442\u0438",
"group.inviteMore": "\u0417\u0430\u043F\u0440\u043E\u0441\u0438\u0442\u0438 \u0449\u0435 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0456\u0432",
"group.invitePeople": "\u0417\u0430\u043F\u0440\u043E\u0441\u0438\u0442\u0438 {count} \u043E\u0441\u0456\u0431",
"group.invitation": "\u0417\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0434\u043E \u0433\u0440\u0443\u043F\u0438",
"group.addMembers": "\u0414\u043E\u0434\u0430\u0442\u0438 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0456\u0432",
"group.roomFor": "\u0404 \u043C\u0456\u0441\u0446\u0435 \u0449\u0435 \u0434\u043B\u044F {remaining}. \u041F\u0456\u0441\u043B\u044F \u043F\u0440\u0438\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0432\u0441\u0456 \u0437\u0432\u0456\u0440\u044F\u0442\u044C \u043D\u043E\u0432\u0438\u0439 \u043A\u043E\u0434 \u0433\u0440\u0443\u043F\u0438.",
"group.membersCount": "{count} \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0456\u0432",
"group.member": "\u0423\u0447\u0430\u0441\u043D\u0438\u043A",
"group.members": "\u0423\u0447\u0430\u0441\u043D\u0438\u043A\u0438",
"group.remove": "\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 {name}",
"group.message": "\u041D\u0430\u043F\u0438\u0441\u0430\u0442\u0438 \u0432 \xAB{name}\xBB",
"group.leave": "\u0412\u0438\u0439\u0442\u0438",
"group.leaveThis": "\u0412\u0438\u0439\u0442\u0438 \u0437 \u0446\u0456\u0454\u0457 \u0433\u0440\u0443\u043F\u0438",
"group.cancel": "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438 \u0433\u0440\u0443\u043F\u0443",
"group.close": "\u0417\u0430\u043A\u0440\u0438\u0442\u0438",
"group.cancelBtn": "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438",
"group.decline": "\u0412\u0456\u0434\u0445\u0438\u043B\u0438\u0442\u0438",
"group.working": "\u0412\u0438\u043A\u043E\u043D\u0443\u0454\u0442\u044C\u0441\u044F\u2026",
"group.sasTitle": "\u041A\u043E\u0434 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u0433\u0440\u0443\u043F\u0438",
"group.sasEveryone": "\u0426\u0435\u0439 \u043A\u043E\u0434 \u0431\u0430\u0447\u0430\u0442\u044C \u0443\u0441\u0456",
"group.sasCompare": "\u0417\u0432\u0456\u0440\u0442\u0435 \u043A\u043E\u0434 \u0433\u0440\u0443\u043F\u0438 \u0437 \u043A\u043E\u0436\u043D\u0438\u043C \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u043E\u043C, \u0449\u043E\u0431 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0433\u0440\u0443\u043F\u0443.",
"group.sasReadAloud": "\u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0446\u0456 \u0446\u0438\u0444\u0440\u0438 \u0432\u0433\u043E\u043B\u043E\u0441 \u0434\u043B\u044F ",
"group.sasWarning": "\u042F\u043A\u0449\u043E \u0431\u043E\u0434\u0430\u0439 \u043E\u0434\u0438\u043D \u0443\u0447\u0430\u0441\u043D\u0438\u043A \u0447\u0438\u0442\u0430\u0454 \u0456\u043D\u0448\u0438\u0439 \u043A\u043E\u0434, \u043C\u0456\u0436 \u0432\u0430\u043C\u0438 \u0445\u0442\u043E\u0441\u044C \u0454. \u0421\u043A\u0430\u0441\u0443\u0439\u0442\u0435 \u0433\u0440\u0443\u043F\u0443 - \u043D\u0435 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0443\u0439\u0442\u0435.",
"group.confirmFirst": "\u0421\u043F\u0435\u0440\u0448\u0443 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0456\u0442\u044C \u043A\u043E\u0434 \u0433\u0440\u0443\u043F\u0438",
"group.codeSuffix": " \xB7 \u043A\u043E\u0434 {code}",
"group.exchangingNonces": "\u041E\u0431\u043C\u0456\u043D \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u0438\u043C\u0438 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F\u043C\u0438\u2026",
"group.waitingCommit": "\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0437\u043E\u0431\u043E\u0432'\u044F\u0437\u0430\u043D\u044C \u0432\u0456\u0434 \u0443\u0441\u0456\u0445 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0456\u0432\u2026",
"group.waitingJoin": "\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0440\u0438\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0456\u043D\u0448\u0438\u0445 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0456\u0432\u2026",
"group.emptyChat": "\u0422\u0443\u0442 \u043F\u043E\u043A\u0438 \u043D\u0456\u0447\u043E\u0433\u043E. \u041F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043F\u0456\u0434\u043F\u0438\u0441\u0430\u043D\u0456 \u0432\u0456\u0434\u043F\u0440\u0430\u0432\u043D\u0438\u043A\u043E\u043C \u0456 \u0439\u0434\u0443\u0442\u044C \u0432\u043B\u0430\u0441\u043D\u0438\u043C \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u043C \u043A\u0430\u043D\u0430\u043B\u043E\u043C \u043A\u043E\u0436\u043D\u043E\u0433\u043E \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0430.",
"group.noVerified": "\u0429\u0435 \u043D\u0435\u043C\u0430\u0454 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0438\u0445 \u0447\u0430\u0442\u0456\u0432. \u0421\u043F\u0435\u0440\u0448\u0443 \u0432\u0456\u0434\u043A\u0440\u0438\u0439\u0442\u0435 \u043E\u0441\u043E\u0431\u0438\u0441\u0442\u0438\u0439 \u0447\u0430\u0442 \u0456 \u0437\u0432\u0456\u0440\u0442\u0435 \u0439\u043E\u0433\u043E \u043A\u043E\u0434 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 - \u0433\u0440\u0443\u043F\u0430 \u0431\u0443\u0434\u0443\u0454\u0442\u044C\u0441\u044F \u0437 \u0443\u0436\u0435 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0438\u0445 \u0437'\u0454\u0434\u043D\u0430\u043D\u044C.",
"group.noMoreToAdd": "\u0406\u043D\u0448\u0438\u0445 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0438\u0445 \u0447\u0430\u0442\u0456\u0432 \u043D\u0435\u043C\u0430\u0454. \u0412\u0456\u0434\u043A\u0440\u0438\u0439\u0442\u0435 \u043E\u0441\u043E\u0431\u0438\u0441\u0442\u0438\u0439 \u0447\u0430\u0442 \u0456 \u0441\u043F\u0435\u0440\u0448\u0443 \u0437\u0432\u0456\u0440\u0442\u0435 \u0439\u043E\u0433\u043E \u043A\u043E\u0434 \u0431\u0435\u0437\u043F\u0435\u043A\u0438.",
"group.directLink": "\u041F\u0440\u044F\u043C\u0435 \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u043C\u0456\u0436 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u044F\u043C\u0438",
"group.noDirectLink": "\u041F\u0440\u044F\u043C\u043E\u0433\u043E \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0449\u0435 \u043D\u0435\u043C\u0430\u0454 - \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043F\u0435\u0440\u0435\u0434\u0430\u0454 \u0456\u043D\u0448\u0438\u0439 \u0443\u0447\u0430\u0441\u043D\u0438\u043A, \u043F\u043E\u043A\u0438 \u0432\u043E\u043D\u043E \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u044E\u0454\u0442\u044C\u0441\u044F",
"group.relayNote": "\u0417 \u0434\u0435\u044F\u043A\u0438\u043C\u0438 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0430\u043C\u0438 \u043F\u0440\u044F\u043C\u043E\u0433\u043E \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0449\u0435 \u043D\u0435\u043C\u0430\u0454. \u0407\u0445\u043D\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u0439\u0434\u0443\u0442\u044C \u0447\u0435\u0440\u0435\u0437 \u0456\u043D\u0448\u043E\u0433\u043E \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0430, \u044F\u043A\u0438\u0439 \u0431\u0430\u0447\u0438\u0442\u044C, \u0449\u043E \u0432\u0438 \u0441\u043F\u0456\u043B\u043A\u0443\u0454\u0442\u0435\u0441\u044C, \u0430\u043B\u0435 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0430\u043D\u0456 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u0438, \u0430\u043D\u0456 \u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u0441\u043A\u0430\u0437\u0430\u043D\u0435. \u0413\u0440\u0443\u043F\u0430 \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0443\u0454 \u0437'\u0454\u0434\u043D\u0443\u0432\u0430\u0442\u0438 \u0457\u0445 \u043D\u0430\u043F\u0440\u044F\u043C\u0443.",
"group.relayOnlyOff": "\u0420\u0435\u0436\u0438\u043C \u043B\u0438\u0448\u0435 \u0447\u0435\u0440\u0435\u0437 relay \u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043E, \u0442\u043E\u0436 \u043A\u043E\u0436\u0435\u043D \u0443\u0447\u0430\u0441\u043D\u0438\u043A \u0437'\u0454\u0434\u043D\u0443\u0454\u0442\u044C\u0441\u044F \u0437 \u0432\u0430\u043C\u0438 \u043D\u0430\u043F\u0440\u044F\u043C\u0443 \u0439 \u0434\u0456\u0437\u043D\u0430\u0454\u0442\u044C\u0441\u044F \u0432\u0430\u0448\u0443 IP-\u0430\u0434\u0440\u0435\u0441\u0443 - \u0437\u043E\u043A\u0440\u0435\u043C\u0430 \u0442\u0456, \u043A\u043E\u0433\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0438\u0432 \u0445\u0442\u043E\u0441\u044C \u0456\u043D\u0448\u0438\u0439. \u0423\u0432\u0456\u043C\u043A\u043D\u0456\u0442\u044C \u0439\u043E\u0433\u043E \u0432 \u043C\u0435\u0440\u0435\u0436\u0435\u0432\u0438\u0445 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F\u0445, \u044F\u043A\u0449\u043E \u0446\u0435 \u0432\u0430\u0436\u043B\u0438\u0432\u043E.",
"group.memberOffline": "{name} \u043E\u0444\u043B\u0430\u0439\u043D \u0456 \u043D\u0435 \u043E\u0442\u0440\u0438\u043C\u0430\u0454 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u044C. \u0423\u0447\u0430\u0441\u043D\u0438\u0446\u0442\u0432\u043E \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0454\u0442\u044C\u0441\u044F - \u0432\u0438\u043B\u0443\u0447\u0435\u043D\u043D\u044F \u043F\u0435\u0440\u0435\u0433\u0430\u043D\u044F\u0454 \u043A\u043B\u044E\u0447\u0456 \u0433\u0440\u0443\u043F\u0438.",
"group.joinNote": "\u0406\u043D\u0448\u0456 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0438 \u0434\u0456\u0437\u043D\u0430\u044E\u0442\u044C\u0441\u044F, \u0449\u043E \u0432\u0438 \u0432 \u0446\u0456\u0439 \u0433\u0440\u0443\u043F\u0456. \u0406\u0441\u0442\u043E\u0440\u0456\u0457 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u044C \u043D\u0435\u043C\u0430\u0454 - \u0433\u0440\u0443\u043F\u0430 \u043F\u043E\u0447\u0438\u043D\u0430\u0454\u0442\u044C\u0441\u044F \u043F\u043E\u0440\u043E\u0436\u043D\u044C\u043E\u044E.",
"group.inviteSentNote": "\u0413\u0440\u0443\u043F\u0430 \u043F\u0440\u0430\u0446\u044E\u0454 \u0434\u0430\u043B\u0456, \u0434\u043E\u043A\u0438 \u0432\u043E\u043D\u0438 \u043D\u0435 \u043F\u0440\u0438\u0439\u043C\u0443\u0442\u044C. \u0406\u0441\u0442\u043E\u0440\u0456\u0457 \u0434\u043B\u044F \u043D\u0438\u0445 \u043D\u0435\u043C\u0430\u0454 - \u0432\u043E\u043D\u0438 \u043F\u043E\u0431\u0430\u0447\u0430\u0442\u044C \u043B\u0438\u0448\u0435 \u0442\u0435, \u0449\u043E \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u043D\u043E \u0432\u0456\u0434\u0442\u0435\u043F\u0435\u0440.",
"group.errNotCreated": "\u0413\u0440\u0443\u043F\u0443 \u043D\u0435 \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043E",
"group.errNobodyAccepted": "\u041D\u0456\u0445\u0442\u043E \u043D\u0435 \u043F\u0440\u0438\u0439\u043D\u044F\u0432 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0432\u0447\u0430\u0441\u043D\u043E.",
"group.errNothingSent": "\u041D\u0456\u0447\u043E\u0433\u043E \u043D\u0435 \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u043D\u043E \u0439 \u043D\u0456\u0447\u043E\u0433\u043E \u043D\u0435 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E. \u0417\u0430\u043A\u0440\u0438\u0439\u0442\u0435 \u0446\u0435 \u0439 \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0437\u043D\u043E\u0432\u0443, \u043A\u043E\u043B\u0438 \u0432\u0441\u0456 \u043F\u0456\u0434'\u0454\u0434\u043D\u0430\u044E\u0442\u044C\u0441\u044F.",
"group.errNotFormed": "\u0426\u044E \u0433\u0440\u0443\u043F\u0443 \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0441\u0444\u043E\u0440\u043C\u0443\u0432\u0430\u0442\u0438.",
"group.errFull": "\u0426\u044F \u0433\u0440\u0443\u043F\u0430 \u0437\u0430\u043F\u043E\u0432\u043D\u0435\u043D\u0430.",
"group.errInviteFailed": "\u0417\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 - \u0442\u043E\u0439 \u0447\u0430\u0442 \u043D\u0435 \u0437'\u0454\u0434\u043D\u0430\u043D\u043E.",
"group.errNoMemberList": "\u0412\u043B\u0430\u0441\u043D\u0438\u043A \u0433\u0440\u0443\u043F\u0438 \u0442\u0430\u043A \u0456 \u043D\u0435 \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u0432 \u0441\u043F\u0438\u0441\u043E\u043A \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0456\u0432.",
"group.errUnsignedList": "\u0421\u043F\u0438\u0441\u043E\u043A \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0456\u0432 \u043D\u0435 \u043F\u0456\u0434\u043F\u0438\u0441\u0430\u043D\u043E \u0432\u043B\u0430\u0441\u043D\u0438\u043A\u043E\u043C \u0433\u0440\u0443\u043F\u0438. \u041D\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044E\u0439\u0442\u0435 - \u0441\u043A\u0430\u0436\u0456\u0442\u044C \u0457\u043C.",
"group.errNotOwner": "\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0441\u043A\u043B\u0430\u0434 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0456\u0432 \u043D\u0430\u043C\u0430\u0433\u0430\u0432\u0441\u044F \u043D\u0435 \u0432\u043B\u0430\u0441\u043D\u0438\u043A \u0433\u0440\u0443\u043F\u0438.",
"hdr.tagline": "\u041D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u0435 \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F",
"hdr.netSettings": "\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u0456 \u043C\u0435\u0440\u0435\u0436\u0435\u0432\u0456 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F",
"hdr.netSettingsTitle": "\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u0456 \u043C\u0435\u0440\u0435\u0436\u0435\u0432\u0456 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F (STUN/TURN)",
"hdr.disconnect": "\u0412\u0456\u0434'\u0454\u0434\u043D\u0430\u0442\u0438\u0441\u044F",
"status.connected": "\u0417'\u0454\u0434\u043D\u0430\u043D\u043E",
"status.connecting": "\u0417'\u0454\u0434\u043D\u0430\u043D\u043D\u044F\u2026",
"status.notConnected": "\u041D\u0435 \u0437'\u0454\u0434\u043D\u0430\u043D\u043E",
"status.reconnecting": "\u041F\u0435\u0440\u0435\u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F\u2026",
"status.retrying": "\u041F\u043E\u0432\u0442\u043E\u0440 \u0441\u043F\u0440\u043E\u0431\u0438\u2026",
"status.verifying": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430\u2026",
"status.peerDisconnected": "\u0421\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A \u0432\u0456\u0434'\u0454\u0434\u043D\u0430\u0432\u0441\u044F",
"sec.replayProtection": "\u0417\u0430\u0445\u0438\u0441\u0442 \u0432\u0456\u0434 \u043F\u043E\u0432\u0442\u043E\u0440\u0456\u0432",
"sec.messageIntegrity": "\u0426\u0456\u043B\u0456\u0441\u043D\u0456\u0441\u0442\u044C \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u044C (HMAC)",
"sec.forwardSecrecy": "\u0414\u043E\u0441\u043A\u043E\u043D\u0430\u043B\u0430 \u043F\u0440\u044F\u043C\u0430 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u0456\u0441\u0442\u044C",
"sec.metadataProtection": "\u0417\u0430\u0445\u0438\u0441\u0442 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u0438\u0445",
"sec.trafficObfuscation": "\u041C\u0430\u0441\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0442\u0440\u0430\u0444\u0456\u043A\u0443",
"sec.realTests": "\u0421\u043F\u0440\u0430\u0432\u0436\u043D\u0456 \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0456\u0447\u043D\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438",
"sec.simulatedData": "\u0417\u043C\u043E\u0434\u0435\u043B\u044C\u043E\u0432\u0430\u043D\u0456 \u0434\u0430\u043D\u0456",
"sec.testPassed": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u043E",
"sec.testFailed": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u043D\u0435 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u0430 \u0430\u0431\u043E \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430",
"sec.verificationDone": "\u0421\u043F\u0440\u0430\u0432\u0436\u043D\u044E \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0456\u0447\u043D\u0443 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E",
"sec.verificationInProgress": "\u0422\u0440\u0438\u0432\u0430\u0454 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0431\u0435\u0437\u043F\u0435\u043A\u0438\u2026",
"sec.verificationWait": "\u0422\u0440\u0438\u0432\u0430\u0454 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0431\u0435\u0437\u043F\u0435\u043A\u0438\u2026\n\u0417\u0430\u0447\u0435\u043A\u0430\u0439\u0442\u0435, \u0434\u043E\u043A\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C\u0441\u044F \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0456\u0447\u043D\u0430 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0432 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u0447\u0430\u0441\u0456.",
"sec.verificationUnavailable": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430",
"chat.placeholder": "\u041D\u0430\u043F\u0438\u0448\u0456\u0442\u044C \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0435 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F\u2026",
"chat.send": "\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F",
"chat.sendFiles": "\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 \u0444\u0430\u0439\u043B\u0438",
"chat.hideFiles": "\u0421\u0445\u043E\u0432\u0430\u0442\u0438 \u0444\u0430\u0439\u043B\u0438",
"chat.recordVoice": "\u0417\u0430\u043F\u0438\u0441\u0430\u0442\u0438 \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u0435 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F",
"chat.sendVoice": "\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u0435 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F",
"chat.discard": "\u0412\u0456\u0434\u0445\u0438\u043B\u0438\u0442\u0438",
"chat.codeBlock": "\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 \u044F\u043A \u0431\u043B\u043E\u043A \u043A\u043E\u0434\u0443 (\u0440\u043E\u0437\u0448\u0438\u0440\u044E\u0454 \u043F\u043E\u043B\u0435)",
"chat.codeHint": "\u0424\u0440\u0430\u0433\u043C\u0435\u043D\u0442 \u043A\u043E\u0434\u0443 \xB7 \u0444\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043E \xB7 \u2318\u21B5 \u0449\u043E\u0431 \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438",
"chat.viewOnce": "\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u0443\u0442\u0438 \u0440\u0430\u0437",
"chat.viewOnceTitle": "\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u0443\u0442\u0438 \u0440\u0430\u0437 - \u0437\u043D\u0438\u043A\u0430\u0454, \u0449\u043E\u0439\u043D\u043E \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0454",
"chat.viewOncePrefix": "\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u0443\u0442\u0438 \u0440\u0430\u0437 \xB7 ",
"chat.viewOnceTap": "\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u0443\u0442\u0438 \u0440\u0430\u0437 \xB7 \u0442\u043E\u0440\u043A\u043D\u0456\u0442\u044C\u0441\u044F, \u0449\u043E\u0431 \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u0438",
"chat.viewedOnce": "\u0423\u0436\u0435 \u043F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u0443\u0442\u043E",
"chat.disappearing": "\u0417\u043D\u0438\u043A\u043E\u043C\u0435 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F - \u0432\u0438\u0434\u0430\u043B\u044F\u0454\u0442\u044C\u0441\u044F \u0437 \u043E\u0431\u043E\u0445 \u0431\u043E\u043A\u0456\u0432",
"chat.disappearAfter": "\u0417\u043D\u0438\u043A\u043D\u0435 \u0447\u0435\u0440\u0435\u0437",
"chat.visibleFor": "\u0412\u0438\u0434\u043D\u043E",
"chat.timerPrefix": "\u0422\u0430\u0439\u043C\u0435\u0440 \xB7 ",
"chat.expired": "\u0426\u0435 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u0432\u0442\u0440\u0430\u0442\u0438\u043B\u043E \u0447\u0438\u043D\u043D\u0456\u0441\u0442\u044C",
"chat.deleteForEveryone": "\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0432 \u0443\u0441\u0456\u0445",
"chat.sending": "\u041D\u0430\u0434\u0441\u0438\u043B\u0430\u043D\u043D\u044F",
"chat.delivered": "\u0414\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043E",
"chat.notSent": "\u041D\u0435 \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u043D\u043E",
"chat.notSentReason": "\u041D\u0435 \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u043D\u043E - \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u0439 \u043A\u0430\u043D\u0430\u043B \u043D\u0435 \u0433\u043E\u0442\u043E\u0432\u0438\u0439. \u041F\u0435\u0440\u0435\u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0456\u0442\u044C\u0441\u044F, \u0449\u043E\u0431 \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438.",
"chat.encrypted": "\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E",
"chat.decrypted": "\u0420\u043E\u0437\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E",
"chat.encryptedOnDevice": "\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E \u043D\u0430 \u0432\u0430\u0448\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457",
"chat.uploading": "\u041D\u0430\u0434\u0441\u0438\u043B\u0430\u043D\u043D\u044F",
"chat.downloading": "\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F",
"chat.transferring": "\u041F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043D\u043D\u044F\u2026",
"chat.copied": "\u0421\u043A\u043E\u043F\u0456\u0439\u043E\u0432\u0430\u043D\u043E!",
"chat.collapse": "\u0417\u0433\u043E\u0440\u043D\u0443\u0442\u0438",
"chat.closeMenu": "\u0417\u0430\u043A\u0440\u0438\u0442\u0438 \u043C\u0435\u043D\u044E",
"chat.newChat": "\u041D\u043E\u0432\u0438\u0439 \u0447\u0430\u0442",
"chat.newGroup": "\u041D\u043E\u0432\u0430 \u0433\u0440\u0443\u043F\u0430",
"chat.createGroup": "\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0433\u0440\u0443\u043F\u0443",
"chat.groupChats": "\u0413\u0440\u0443\u043F\u043E\u0432\u0456 \u0447\u0430\u0442\u0438",
"chat.secureChat": "\u0417\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u0439 \u0447\u0430\u0442",
"chat.nameThis": "\u041D\u0430\u0437\u0432\u0456\u0442\u044C \u0446\u0435\u0439 \u0447\u0430\u0442",
"chat.rename": "\u041F\u0435\u0440\u0435\u0439\u043C\u0435\u043D\u0443\u0432\u0430\u0442\u0438 \u0447\u0430\u0442 (\u043B\u0438\u0448\u0435 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E)",
"chat.renameHint": "\u0414\u0432\u0456\u0447\u0456 \u043A\u043B\u0430\u0446\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u043F\u0435\u0440\u0435\u0439\u043C\u0435\u043D\u0443\u0432\u0430\u0442\u0438",
"chat.localLabel": "\u041B\u043E\u043A\u0430\u043B\u044C\u043D\u0430 \u043D\u0430\u0437\u0432\u0430 \xB7 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0454\u0442\u044C\u0441\u044F \u043B\u0438\u0448\u0435 \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457",
"chat.setStatus": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0456\u0442\u044C \u0441\u0432\u0456\u0439 \u0441\u0442\u0430\u0442\u0443\u0441",
"chat.yourStatusPrefix": "\u0412\u0430\u0448 \u0441\u0442\u0430\u0442\u0443\u0441 - ",
"chat.meshHint": "\u0414\u043E 8 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0456\u0432 \xB7 P2P-\u043C\u0435\u0440\u0435\u0436\u0430",
"chat.offline": "\u041E\u0444\u043B\u0430\u0439\u043D",
"chat.noNetwork": "\u041D\u0435\u043C\u0430\u0454 \u043C\u0435\u0440\u0435\u0436\u0456 \xB7 \u043F\u0435\u0440\u0435\u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F",
"chat.startVoiceCall": "\u041F\u043E\u0447\u0430\u0442\u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \u0434\u0437\u0432\u0456\u043D\u043E\u043A",
"chat.startVideoCall": "\u041F\u043E\u0447\u0430\u0442\u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \u0432\u0456\u0434\u0435\u043E\u0434\u0437\u0432\u0456\u043D\u043E\u043A",
"chat.verifyForCalls": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0441\u0435\u0430\u043D\u0441, \u0449\u043E\u0431 \u0443\u0432\u0456\u043C\u043A\u043D\u0443\u0442\u0438 \u0434\u0437\u0432\u0456\u043D\u043A\u0438",
"chat.e2eeNote": "\u041A\u043E\u0436\u043D\u0435 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u0448\u0438\u0444\u0440\u0443\u0454\u0442\u044C\u0441\u044F \u043D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u043E \u043D\u0430 \u0432\u0430\u0448\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457, \u043F\u0435\u0440\u0448 \u043D\u0456\u0436 \u043F\u0456\u0434\u0435.",
"chat.peersOnly": "\u041D\u0430\u0434\u0441\u0438\u043B\u0430\u0454\u0442\u044C\u0441\u044F \u043D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u043E \u043B\u0438\u0448\u0435 \u043F\u0456\u0434'\u0454\u0434\u043D\u0430\u043D\u0438\u043C \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0430\u043C - \u043D\u0456\u043A\u043E\u043B\u0438 \u043D\u0435 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0454\u0442\u044C\u0441\u044F \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0456.",
"flow.invitationCreated": "\u0417\u0430\u0445\u0438\u0449\u0435\u043D\u0435 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043E",
"flow.invitationCreatedBang": "\u0417\u0430\u0445\u0438\u0449\u0435\u043D\u0435 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043E \u0439 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E.",
"flow.responseCreated": "\u0417\u0430\u0445\u0438\u0449\u0435\u043D\u0443 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043E",
"flow.responseCreatedBang": "\u0417\u0430\u0445\u0438\u0449\u0435\u043D\u0443 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043E.",
"flow.sendInvitation": "\u041D\u0430\u0434\u0456\u0448\u043B\u0456\u0442\u044C \u043A\u043E\u0434 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0443 \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u043C \u043A\u0430\u043D\u0430\u043B\u043E\u043C (\u0434\u0437\u0432\u0456\u043D\u043E\u043A, SMS \u0442\u043E\u0449\u043E).",
"flow.sendResponse": "\u041D\u0430\u0434\u0456\u0448\u043B\u0456\u0442\u044C \u043A\u043E\u0434 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0456 \u0456\u043D\u0456\u0446\u0456\u0430\u0442\u043E\u0440\u0443 \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u043C \u043A\u0430\u043D\u0430\u043B\u043E\u043C \u0430\u0431\u043E \u0434\u0430\u0439\u0442\u0435 \u0439\u043E\u043C\u0443 \u0432\u0456\u0434\u0441\u043A\u0430\u043D\u0443\u0432\u0430\u0442\u0438 QR-\u043A\u043E\u0434 \u043D\u0438\u0436\u0447\u0435.",
"flow.sendEncryptedCode": "\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \u043A\u043E\u0434",
"flow.sendTheResponse": "\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C",
"flow.pasteOrWrite": "\u0412\u0441\u0442\u0430\u0432\u0442\u0435 \u0430\u0431\u043E \u0432\u0432\u0435\u0434\u0456\u0442\u044C \u043A\u043E\u0434\u2026",
"flow.processingInvitation": "\u041E\u0431\u0440\u043E\u0431\u043A\u0430 \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u043E\u0433\u043E \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F\u2026",
"flow.processingResponse": "\u041E\u0431\u0440\u043E\u0431\u043A\u0430 \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u043E\u0457 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0456\u2026",
"flow.finalizing": "\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u044F \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u043E\u0433\u043E \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F\u2026",
"flow.channelEstablished": "\u0417\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u0439 \u043A\u0430\u043D\u0430\u043B \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E",
"flow.channelReady": "\u0417\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u0439 \u043A\u0430\u043D\u0430\u043B \u0433\u043E\u0442\u043E\u0432\u0438\u0439",
"flow.restoring": "\u0412\u0456\u0434\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F\u2026",
"flow.invitationCaptured": "\u0417\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0437\u0447\u0438\u0442\u0430\u043D\u043E.",
"err.needInvitation": "\u041F\u043E\u0442\u0440\u0456\u0431\u043D\u043E \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043A\u043E\u0434 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0432\u0456\u0434 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430.",
"err.needResponse": "\u041F\u043E\u0442\u0440\u0456\u0431\u043D\u043E \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043A\u043E\u0434 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0456 \u0432\u0456\u0434 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430.",
"err.responseFormat": "\u0425\u0438\u0431\u043D\u0438\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0456 - \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u043A\u043E\u0434",
"err.responseNoKey": "\u0425\u0438\u0431\u043D\u0438\u0439 \u043A\u043E\u0434 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0456 - \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0456\u0447\u043D\u0438\u0439 \u043A\u043B\u044E\u0447 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 \u0430\u0431\u043E \u043F\u043E\u0448\u043A\u043E\u0434\u0436\u0435\u043D\u0438\u0439. \u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u043A\u043E\u0434 \u0456 \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0449\u0435 \u0440\u0430\u0437.",
"err.responseNoSignKey": "\u0425\u0438\u0431\u043D\u0438\u0439 \u043A\u043E\u0434 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0456 - \u0431\u0440\u0430\u043A\u0443\u0454 \u043A\u043B\u044E\u0447\u0430 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438 \u043F\u0456\u0434\u043F\u0438\u0441\u0443. \u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u043A\u043E\u0434 \u0456 \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0449\u0435 \u0440\u0430\u0437.",
"err.responseOutdated": "\u0414\u0430\u043D\u0456 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0456 \u0437\u0430\u0441\u0442\u0430\u0440\u0456\u043B\u0438 - \u0441\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435\u0441\u044F \u043D\u043E\u0432\u0438\u043C \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F\u043C",
"err.setupError": "\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F",
"err.notReady": "\u0417'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0449\u0435 \u043D\u0435 \u0433\u043E\u0442\u043E\u0432\u0435",
"err.securityBreach": "\u0412\u0438\u044F\u0432\u043B\u0435\u043D\u043E \u043F\u043E\u0440\u0443\u0448\u0435\u043D\u043D\u044F \u0431\u0435\u0437\u043F\u0435\u043A\u0438 - \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0432\u0456\u0434\u0445\u0438\u043B\u0435\u043D\u043E",
"err.securityValidation": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u043D\u0435 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u0430 - \u043C\u043E\u0436\u043B\u0438\u0432\u0430 \u0430\u0442\u0430\u043A\u0430",
"err.retiredQr": "\u0426\u0435\u0439 QR-\u043A\u043E\u0434 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454 \u0437\u0430\u0441\u0442\u0430\u0440\u0456\u043B\u0438\u0439 \u0444\u043E\u0440\u043C\u0430\u0442, \u044F\u043A\u0438\u043C \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u0438 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F. \u041F\u043E\u043F\u0440\u043E\u0441\u0456\u0442\u044C \u043D\u043E\u0432\u0438\u0439 \u0430\u0431\u043E \u0441\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435\u0441\u044F \u043A\u043E\u043F\u0456\u044E\u0432\u0430\u043D\u043D\u044F\u043C.",
"err.compressedQrNote": "\u0421\u0442\u0438\u0441\u043D\u0435\u043D\u0438\u0439 QR \u043C\u043E\u0436\u0435 \u043E\u043F\u0443\u0441\u0442\u0438\u0442\u0438 SDP \u0437\u0430\u0434\u043B\u044F \u0441\u0442\u0438\u0441\u043B\u043E\u0441\u0442\u0456. \u042F\u043A\u0449\u043E \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u043D\u0435 \u0432\u0434\u0430\u0454\u0442\u044C\u0441\u044F, \u0441\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435\u0441\u044F \u043A\u043E\u043F\u0456\u044E\u0432\u0430\u043D\u043D\u044F\u043C.",
"err.inviteNotConnected": "\u0417\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438. \u0422\u043E\u0439 \u0447\u0430\u0442 \u0437\u0430\u0440\u0430\u0437 \u043D\u0435 \u0437'\u0454\u0434\u043D\u0430\u043D\u043E.",
"err.inviteNotConnectedRetry": "\u0417\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438. \u0422\u043E\u0439 \u0447\u0430\u0442 \u0437\u0430\u0440\u0430\u0437 \u043D\u0435 \u0437'\u0454\u0434\u043D\u0430\u043D\u043E - \u0432\u0456\u0434\u043A\u0440\u0438\u0439\u0442\u0435 \u0439\u043E\u0433\u043E \u0437\u043D\u043E\u0432\u0443 \u0439 \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0449\u0435 \u0440\u0430\u0437.",
"err.nobodyAccepted": "\u041D\u0456\u0445\u0442\u043E \u043D\u0435 \u043F\u0440\u0438\u0439\u043D\u044F\u0432 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F. \u0413\u0440\u0443\u043F\u0430 \u043B\u0438\u0448\u0438\u043B\u0430\u0441\u044F \u0431\u0435\u0437 \u0437\u043C\u0456\u043D.",
"err.noAudio": "\u0417\u0432\u0443\u043A \u043D\u0435 \u0437\u0430\u043F\u0438\u0441\u0430\u043D\u043E - \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0434\u043E\u0437\u0432\u0456\u043B \u043D\u0430 \u043C\u0456\u043A\u0440\u043E\u0444\u043E\u043D \u0456 \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0449\u0435 \u0440\u0430\u0437.",
"err.voiceNeedsConnection": "\u0414\u043B\u044F \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u043E\u0433\u043E \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u0435 \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u0435 \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F. \u041F\u0435\u0440\u0435\u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0456\u0442\u044C\u0441\u044F \u0439 \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0449\u0435 \u0440\u0430\u0437.",
"err.voiceRestoring": "\u0412\u0456\u0434\u043D\u043E\u0432\u043B\u044E\u0454\u043C\u043E \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F - \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u0435 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u0437\u0430 \u043C\u0438\u0442\u044C.",
"err.fileTooLarge": "\u0424\u0430\u0439\u043B \u0437\u0430\u0432\u0435\u043B\u0438\u043A\u0438\u0439",
"sas.safetyNumber": "\u041D\u043E\u043C\u0435\u0440 \u0431\u0435\u0437\u043F\u0435\u043A\u0438",
"sas.incorrect": "\u0425\u0438\u0431\u043D\u0438\u0439 \u043A\u043E\u0434. \u0417\u0432\u0456\u0440\u0442\u0435 \u0439\u043E\u0433\u043E \u0437\u0456 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u043E\u043C \u0456 \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0449\u0435 \u0440\u0430\u0437.",
"sas.noMatch": "\u041A\u043E\u0434\u0438 \u043D\u0435 \u0437\u0431\u0456\u0433\u0430\u044E\u0442\u044C\u0441\u044F",
"sas.makeSure": "\u041F\u0435\u0440\u0435\u043A\u043E\u043D\u0430\u0439\u0442\u0435\u0441\u044F, \u0449\u043E \u043A\u043E\u0434\u0438 \u0437\u0431\u0456\u0433\u0430\u044E\u0442\u044C\u0441\u044F \u0442\u043E\u0447\u043D\u043E.",
"sas.tooManyAttempts": "\u0417\u0430\u0431\u0430\u0433\u0430\u0442\u043E \u043D\u0435\u0432\u0434\u0430\u043B\u0438\u0445 \u0441\u043F\u0440\u043E\u0431. \u0421\u0435\u0430\u043D\u0441 \u0441\u043A\u0438\u043D\u0443\u0442\u043E \u0437\u0430\u0434\u043B\u044F \u0431\u0435\u0437\u043F\u0435\u043A\u0438.",
"sas.verificationFailed": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u043D\u0435 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u043E",
"sas.verified": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E \xB7 \u0434\u043E\u0441\u043A\u043E\u043D\u0430\u043B\u0430 \u043F\u0440\u044F\u043C\u0430 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u0456\u0441\u0442\u044C",
"sas.runVerification": "\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u0431\u0435\u0437\u043F\u0435\u043A\u0438",
"sec.panelTitle": "\u0414\u0435\u0442\u0430\u043B\u0456 \u043C\u0435\u0440\u0435\u0436\u0456 \u0442\u0430 \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0456\u0457",
"sec.security": "\u0411\u0435\u0437\u043F\u0435\u043A\u0430",
"sec.transport": "\u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442",
"sec.keyExchange": "\u041E\u0431\u043C\u0456\u043D \u043A\u043B\u044E\u0447\u0430\u043C\u0438",
"sec.allEnabled": "\u0423\u0441\u0456 \u0444\u0443\u043D\u043A\u0446\u0456\u0457 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E \u0442\u0438\u043F\u043E\u0432\u043E",
"sec.realTimeNote": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0432 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u0447\u0430\u0441\u0456 \u0441\u043F\u0440\u0430\u0432\u0436\u043D\u0456\u043C\u0438 \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0456\u0447\u043D\u0438\u043C\u0438 \u0444\u0443\u043D\u043A\u0446\u0456\u044F\u043C\u0438 - \u0431\u0435\u0437 \u0432\u0438\u0433\u0430\u0434\u0430\u043D\u0438\u0445 \u0434\u0430\u043D\u0438\u0445.",
"sec.simulatedWarning": "\u0423\u0432\u0430\u0433\u0430: \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u043D\u0435 \u043F\u043E\u0432\u043D\u0456\u0441\u0442\u044E \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0435 - \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u043C\u043E\u0436\u0443\u0442\u044C \u0431\u0443\u0442\u0438 \u0437\u043C\u043E\u0434\u0435\u043B\u044C\u043E\u0432\u0430\u043D\u0456.",
"dl.title": "\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 SecureBit",
"dl.free": "\u0411\u0435\u0437\u043A\u043E\u0448\u0442\u043E\u0432\u043D\u043E \xB7 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u0439 \u043A\u043E\u0434",
"dl.soon": "\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043A\u0438 \u0434\u043B\u044F iOS \u0442\u0430 Android \u0456 \u0440\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u043D\u044F \u0434\u043B\u044F Chrome, Firefox \u0456 Opera \u0437'\u044F\u0432\u043B\u044F\u0442\u044C\u0441\u044F \u043D\u0435\u0437\u0430\u0431\u0430\u0440\u043E\u043C.",
"chatHdr.chat": "\u0427\u0430\u0442",
"chatHdr.chats": "\u0427\u0430\u0442\u0438",
"chatHdr.newChat": "+ \u041D\u043E\u0432\u0438\u0439",
"chatHdr.secure": "\u0417\u0430\u0445\u0438\u0449\u0435\u043D\u043E",
"chatHdr.p2pSub": "P2P \xB7 \u043D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u0435 \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F",
"chatHdr.save": "\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438",
"chatHdr.close": "\u0417\u0430\u043A\u0440\u0438\u0442\u0438",
"chatHdr.expand": "\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438",
"chatHdr.you": "\u0412\u0438",
"chatHdr.qrCode": "QR-\u043A\u043E\u0434",
"chat.disconnected": "\u0420\u043E\u0437'\u0454\u0434\u043D\u0430\u043D\u043E",
"call.mute": "\u0412\u0438\u043C\u043A\u043D\u0443\u0442\u0438 \u043C\u0456\u043A\u0440\u043E\u0444\u043E\u043D",
"call.endShort": "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0438",
"group.add": "\u0414\u043E\u0434\u0430\u0442\u0438",
"group.send": "\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438",
"sec.pfsShort": "\u0414\u043E\u0441\u043A\u043E\u043D\u0430\u043B\u0430 \u043F\u0440\u044F\u043C\u0430 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u0456\u0441\u0442\u044C",
"sec.cipher": "\u0428\u0438\u0444\u0440",
"chat.close": "\u0417\u0430\u043A\u0440\u0438\u0442\u0438",
"file.needConnection": "\u0414\u043B\u044F \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043D\u043D\u044F \u0444\u0430\u0439\u043B\u0456\u0432 \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u0435 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0435 \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F",
"presence.available": "\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439",
"presence.away": "\u0412\u0456\u0434\u0456\u0439\u0448\u043E\u0432",
"presence.busy": "\u0417\u0430\u0439\u043D\u044F\u0442\u0438\u0439",
"presence.offline": "\u041D\u0435 \u0432 \u043C\u0435\u0440\u0435\u0436\u0456",
"presence.invisible": "\u041D\u0435\u0432\u0438\u0434\u0438\u043C\u0438\u0439",
"presence.availableDesc": "\u0423 \u043C\u0435\u0440\u0435\u0436\u0456 \u0439 \u043D\u0430 \u0437\u0432'\u044F\u0437\u043A\u0443",
"presence.awayDesc": "\u041D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439 \xB7 \u0432\u0456\u0434\u0456\u0439\u0448\u043E\u0432",
"presence.busyDesc": "\u041D\u0435 \u0442\u0443\u0440\u0431\u0443\u0432\u0430\u0442\u0438",
"presence.invisibleDesc": "\u0412\u0438\u0433\u043B\u044F\u0434\u0430\u0442\u0438 \u043E\u0444\u043B\u0430\u0439\u043D \u0434\u043B\u044F \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0456\u0432",
"presence.online": "\u0423 \u043C\u0435\u0440\u0435\u0436\u0456",
"conn.p2p": "P2P \xB7 \u0437'\u0454\u0434\u043D\u0430\u043D\u043E",
"conn.verifying": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430\u2026",
"conn.connecting": "\u0417'\u0454\u0434\u043D\u0430\u043D\u043D\u044F\u2026",
"conn.reconnecting": "\u041F\u0435\u0440\u0435\u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F\u2026",
"conn.peerDisconnected": "\u0421\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A \u0432\u0456\u0434'\u0454\u0434\u043D\u0430\u0432\u0441\u044F",
"conn.disconnected": "\u0420\u043E\u0437'\u0454\u0434\u043D\u0430\u043D\u043E",
"chat.defaultLabel": "\u0427\u0430\u0442",
"groupPhase.forming": "\u0424\u043E\u0440\u043C\u0443\u0432\u0430\u043D\u043D\u044F\u2026",
"groupPhase.commitments": "\u041E\u0431\u043C\u0456\u043D \u0437\u043E\u0431\u043E\u0432'\u044F\u0437\u0430\u043D\u043D\u044F\u043C\u0438\u2026",
"groupPhase.revealing": "\u0420\u043E\u0437\u043A\u0440\u0438\u0442\u0442\u044F\u2026",
"groupPhase.compare": "\u0417\u0432\u0456\u0440\u0442\u0435 \u043A\u043E\u0434 \u0433\u0440\u0443\u043F\u0438",
"groupPhase.ready": "\u0413\u0440\u0443\u043F\u0430 \u0433\u043E\u0442\u043E\u0432\u0430",
"groupPhase.failed": "\u0413\u0440\u0443\u043F\u0443 \u043D\u0435 \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043E",
"call.qualityGood": "\u0414\u043E\u0431\u0440\u0430",
"call.qualityFair": "\u041F\u043E\u0441\u0435\u0440\u0435\u0434\u043D\u044F",
"call.qualityWeak": "\u0421\u043B\u0430\u0431\u043A\u0430",
"msg.code": "\u041A\u043E\u0434",
"msg.timer": "\u0422\u0430\u0439\u043C\u0435\u0440",
"msg.voice": "\u0413\u043E\u043B\u043E\u0441",
"msg.play": "\u0412\u0456\u0434\u0442\u0432\u043E\u0440\u0438\u0442\u0438",
"msg.sent": "\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u043D\u043E",
"msg.read": "\u041F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043E",
"report.title": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u0432 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u0447\u0430\u0441\u0456",
"report.active": "\u0410\u043A\u0442\u0438\u0432\u043D\u043E",
"report.testsPassed": "\u041F\u0440\u043E\u0439\u0434\u0435\u043D\u043E \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043E\u043A",
"report.verifiedAt": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E",
"report.source": "\u0414\u0436\u0435\u0440\u0435\u043B\u043E",
"secTest.verifyECDHKeyExchange": "\u041E\u0431\u043C\u0456\u043D \u043A\u043B\u044E\u0447\u0430\u043C\u0438 ECDH",
"secTest.verifyECDSASignatures": "\u0426\u0438\u0444\u0440\u043E\u0432\u0456 \u043F\u0456\u0434\u043F\u0438\u0441\u0438 ECDSA",
"secTest.verifyEncryption": "\u0428\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F AES-GCM",
"secTest.verifyMessageIntegrity": "\u0426\u0456\u043B\u0456\u0441\u043D\u0456\u0441\u0442\u044C \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u044C",
"secTest.verifyPerfectForwardSecrecy": "\u0414\u043E\u0441\u043A\u043E\u043D\u0430\u043B\u0430 \u043F\u0440\u044F\u043C\u0430 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u0456\u0441\u0442\u044C",
"secTest.verifyPFS": "\u0414\u043E\u0441\u043A\u043E\u043D\u0430\u043B\u0430 \u043F\u0440\u044F\u043C\u0430 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u0456\u0441\u0442\u044C",
"secTest.verifyReplayProtection": "\u0417\u0430\u0445\u0438\u0441\u0442 \u0432\u0456\u0434 \u043F\u043E\u0432\u0442\u043E\u0440\u0456\u0432",
"secTest.verifyDTLSFingerprint": "\u0412\u0456\u0434\u0431\u0438\u0442\u043E\u043A DTLS",
"secTest.verifySASVerification": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 SAS",
"secTest.verifyMetadataProtection": "\u0417\u0430\u0445\u0438\u0441\u0442 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u0438\u0445",
"secTest.verifyTrafficObfuscation": "\u041C\u0430\u0441\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0442\u0440\u0430\u0444\u0456\u043A\u0443",
"secTest.verifyPacketPadding": "\u0414\u043E\u043F\u043E\u0432\u043D\u0435\u043D\u043D\u044F \u043F\u0430\u043A\u0435\u0442\u0456\u0432",
"secTest.verifyNestedEncryption": "\u0412\u043A\u043B\u0430\u0434\u0435\u043D\u0435 \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F",
"secTest.verifyNonExtractableKeys": "\u041A\u043B\u044E\u0447\u0456, \u044F\u043A\u0456 \u043D\u0435 \u043C\u043E\u0436\u043D\u0430 \u0432\u0438\u0442\u044F\u0433\u0442\u0438",
"secTest.verifyRateLimiting": "\u041E\u0431\u043C\u0435\u0436\u0435\u043D\u043D\u044F \u0447\u0430\u0441\u0442\u043E\u0442\u0438",
"secTest.verifyMutualAuth": "\u0412\u0437\u0430\u0454\u043C\u043D\u0430 \u0430\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0446\u0456\u044F",
"secTest.verifyAuthProof": "\u0414\u043E\u043A\u0430\u0437 \u0430\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0446\u0456\u0457",
"secTest.verifyEnhancedValidation": "\u041F\u043E\u0441\u0438\u043B\u0435\u043D\u0430 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430",
"secTest.verifyAdvancedFeatures": "\u0420\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u0456 \u043C\u043E\u0436\u043B\u0438\u0432\u043E\u0441\u0442\u0456",
"secTest.verifySignature": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u043F\u0456\u0434\u043F\u0438\u0441\u0443",
"secDetail.Security system initializing...": "\u0421\u0438\u0441\u0442\u0435\u043C\u0430 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0454\u0442\u044C\u0441\u044F\u2026",
"secDetail.Nested encryption active": "\u0412\u043A\u043B\u0430\u0434\u0435\u043D\u0435 \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u0435",
"secDetail.Nested encryption failed": "\u0412\u043A\u043B\u0430\u0434\u0435\u043D\u0435 \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F",
"secDetail.Packet padding active": "\u0414\u043E\u043F\u043E\u0432\u043D\u0435\u043D\u043D\u044F \u043F\u0430\u043A\u0435\u0442\u0456\u0432 \u0430\u043A\u0442\u0438\u0432\u043D\u0435",
"secDetail.Packet padding failed": "\u0414\u043E\u043F\u043E\u0432\u043D\u0435\u043D\u043D\u044F \u043F\u0430\u043A\u0435\u0442\u0456\u0432 \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F",
"secDetail.Advanced features active": "\u0420\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u0456 \u043C\u043E\u0436\u043B\u0438\u0432\u043E\u0441\u0442\u0456 \u0430\u043A\u0442\u0438\u0432\u043D\u0456",
"secDetail.Advanced features failed": "\u0420\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u0456 \u043C\u043E\u0436\u043B\u0438\u0432\u043E\u0441\u0442\u0456 \u043D\u0435 \u043F\u0440\u0430\u0446\u044E\u044E\u0442\u044C",
"secDetail.No encryption key available": "\u041A\u043B\u044E\u0447 \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439",
"secDetail.AES-GCM encryption/decryption working correctly": "\u0428\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0442\u0430 \u0440\u043E\u0437\u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F AES-GCM \u043F\u0440\u0430\u0446\u044E\u044E\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E",
"secDetail.No ECDH key pair available": "\u041F\u0430\u0440\u0430 \u043A\u043B\u044E\u0447\u0456\u0432 ECDH \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430",
"secDetail.Key derivation failed": "\u041E\u0431\u0447\u0438\u0441\u043B\u0435\u043D\u043D\u044F \u043A\u043B\u044E\u0447\u0430 \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F",
"secDetail.No ECDSA key pair available": "\u041F\u0430\u0440\u0430 \u043A\u043B\u044E\u0447\u0456\u0432 ECDSA \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430",
"secDetail.ECDSA digital signatures working correctly": "\u0426\u0438\u0444\u0440\u043E\u0432\u0456 \u043F\u0456\u0434\u043F\u0438\u0441\u0438 ECDSA \u043F\u0440\u0430\u0446\u044E\u044E\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E",
"secDetail.MAC key not available or invalid": "\u041A\u043B\u044E\u0447 MAC \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 \u0430\u0431\u043E \u0445\u0438\u0431\u043D\u0438\u0439",
"secDetail.Rate limiter did not block a message over the limit": "\u041E\u0431\u043C\u0435\u0436\u0443\u0432\u0430\u0447 \u043D\u0435 \u0437\u0430\u0431\u043B\u043E\u043A\u0443\u0432\u0430\u0432 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043F\u043E\u043D\u0430\u0434 \u043B\u0456\u043C\u0456\u0442",
"secDetail.Rate limiter is not available": "\u041E\u0431\u043C\u0435\u0436\u0443\u0432\u0430\u0447 \u0447\u0430\u0441\u0442\u043E\u0442\u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439",
"secDetail.Replay protection is working correctly": "\u0417\u0430\u0445\u0438\u0441\u0442 \u0432\u0456\u0434 \u043F\u043E\u0432\u0442\u043E\u0440\u0456\u0432 \u043F\u0440\u0430\u0446\u044E\u0454 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E",
"secDetail.Replay protection not enabled": "\u0417\u0430\u0445\u0438\u0441\u0442 \u0432\u0456\u0434 \u043F\u043E\u0432\u0442\u043E\u0440\u0456\u0432 \u043D\u0435 \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E",
"secDetail.SAS code not available": "\u041A\u043E\u0434 SAS \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439",
"secDetail.SAS verification code is valid and available": "\u041A\u043E\u0434 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438 SAS \u0434\u0456\u0439\u0441\u043D\u0438\u0439 \u0456 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439",
"secDetail.Traffic obfuscation is working correctly": "\u041C\u0430\u0441\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0442\u0440\u0430\u0444\u0456\u043A\u0443 \u043F\u0440\u0430\u0446\u044E\u0454 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E",
"secDetail.Traffic obfuscation not enabled": "\u041C\u0430\u0441\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0442\u0440\u0430\u0444\u0456\u043A\u0443 \u043D\u0435 \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "\u0414\u043B\u044F \u0446\u044C\u043E\u0433\u043E \u0441\u0435\u0430\u043D\u0441\u0443 \u043D\u0435\u043C\u0430\u0454 \u0435\u0444\u0435\u043C\u0435\u0440\u043D\u043E\u0457 \u043F\u0430\u0440\u0438 \u043A\u043B\u044E\u0447\u0456\u0432 ECDH, \u044F\u043A\u0443 \u043D\u0435 \u043C\u043E\u0436\u043D\u0430 \u0432\u0438\u0442\u044F\u0433\u0442\u0438",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "\u041B\u0438\u0448\u0435 \u0441\u0435\u0430\u043D\u0441\u043E\u0432\u0430 \u043F\u0440\u044F\u043C\u0430 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u0456\u0441\u0442\u044C: \u043A\u043B\u044E\u0447\u0456 \u0435\u0444\u0435\u043C\u0435\u0440\u043D\u0456 \u0434\u043B\u044F \u043A\u043E\u0436\u043D\u043E\u0433\u043E \u0441\u0435\u0430\u043D\u0441\u0443, \u0430\u043B\u0435 Double Ratchet \u0434\u043B\u044F \u0446\u044C\u043E\u0433\u043E \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439 (\u0443 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430 \u0441\u0442\u0430\u0440\u0456\u0448\u0430 \u0432\u0435\u0440\u0441\u0456\u044F), \u0442\u043E\u0436 \u0441\u043A\u043E\u043C\u043F\u0440\u043E\u043C\u0435\u0442\u043E\u0432\u0430\u043D\u0438\u0439 \u0441\u0435\u0430\u043D\u0441\u043E\u0432\u0438\u0439 \u043A\u043B\u044E\u0447 \u0432\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0454 \u0432\u0441\u044E \u0440\u043E\u0437\u043C\u043E\u0432\u0443.",
"msg.pause": "\u041F\u0430\u0443\u0437\u0430",
"msg.failed": "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F",
"groupErr.timeout": "\u0423\u0447\u0430\u0441\u043D\u0438\u043A \u043F\u0435\u0440\u0435\u0441\u0442\u0430\u0432 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u0442\u0438, \u043F\u0435\u0440\u0448 \u043D\u0456\u0436 \u043A\u043E\u0434 \u0431\u0443\u0432 \u0433\u043E\u0442\u043E\u0432\u0438\u0439.",
"groupErr.keyMismatch": "\u041A\u043B\u044E\u0447 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0430 \u043D\u0435 \u0437\u0431\u0456\u0433\u0441\u044F \u0437 \u043E\u0441\u043E\u0431\u043E\u044E, \u044F\u043A\u0443 \u0434\u043B\u044F \u043D\u044C\u043E\u0433\u043E \u0437\u0430\u044F\u0432\u0438\u043B\u0438.",
"groupErr.revealMismatch": "\u0420\u043E\u0437\u043A\u0440\u0438\u0442\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0430 \u043D\u0435 \u0437\u0431\u0456\u0433\u043B\u043E\u0441\u044F \u0437 \u0439\u043E\u0433\u043E \u0437\u043E\u0431\u043E\u0432'\u044F\u0437\u0430\u043D\u043D\u044F\u043C.",
"groupErr.commitChanged": "\u0423\u0447\u0430\u0441\u043D\u0438\u043A \u0437\u043C\u0456\u043D\u0438\u0432 \u0441\u0432\u043E\u0454 \u0437\u043E\u0431\u043E\u0432'\u044F\u0437\u0430\u043D\u043D\u044F \u043F\u043E\u0441\u0435\u0440\u0435\u0434 \u043F\u0440\u043E\u0446\u0435\u0441\u0443.",
"groupErr.missingKey": "\u0423 \u0441\u043F\u0438\u0441\u043A\u0443 \u0431\u0443\u0432 \u0443\u0447\u0430\u0441\u043D\u0438\u043A, \u0447\u0438\u0439 \u043A\u043B\u044E\u0447 \u0442\u0430\u043A \u0456 \u043D\u0435 \u043D\u0430\u0434\u0456\u0439\u0448\u043E\u0432.",
"groupErr.outsider": "\u041D\u0430\u0434\u0456\u0439\u0448\u043E\u0432 \u043A\u0430\u0434\u0440 \u0432\u0456\u0434 \u043A\u043E\u0433\u043E\u0441\u044C \u043F\u043E\u0437\u0430 \u0433\u0440\u0443\u043F\u043E\u044E.",
"groupErr.limit": "\u0413\u0440\u0443\u043F\u0430 \u043E\u0431\u043C\u0435\u0436\u0435\u043D\u0430 \u0432\u0456\u0441\u044C\u043C\u043E\u043C\u0430 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0430\u043C\u0438.",
"groupErr.tooLarge": "\u041F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u0431\u0443\u043B\u043E \u0437\u0430\u0432\u0435\u043B\u0438\u043A\u0435, \u0449\u043E\u0431 \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 \u0439\u043E\u0433\u043E \u0433\u0440\u0443\u043F\u0456.",
"fileType.text": "\u0417\u0432\u0438\u0447\u0430\u0439\u043D\u0438\u0439 \u0442\u0435\u043A\u0441\u0442",
"fileType.images": "\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F",
"fileType.archives": "\u0410\u0440\u0445\u0456\u0432\u0438",
"fileType.voice": "\u0413\u043E\u043B\u043E\u0441\u043E\u0432\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F",
"fileType.unsupported": "\u041D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F",
"qrScan.title": "\u0421\u043A\u0430\u043D\u0443\u0432\u0430\u0442\u0438 QR-\u043A\u043E\u0434",
"qrScan.auto": "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E",
"qrScan.reset": "\u0421\u043A\u0438\u043D\u0443\u0442\u0438",
"qrScan.autoScroll": "\u0410\u0432\u0442\u043E\u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0443\u0432\u0430\u043D\u043D\u044F \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E",
"qrScan.starting": "\u0417\u0430\u043F\u0443\u0441\u043A \u043A\u0430\u043C\u0435\u0440\u0438\u2026",
"qrScan.point": "\u041D\u0430\u0432\u0435\u0434\u0456\u0442\u044C \u043A\u0430\u043C\u0435\u0440\u0443 \u043D\u0430 QR-\u043A\u043E\u0434",
"qrScan.tapFocus": "\u0422\u043E\u0440\u043A\u043D\u0456\u0442\u044C\u0441\u044F \u0435\u043A\u0440\u0430\u043D\u0430, \u0449\u043E\u0431 \u0441\u0444\u043E\u043A\u0443\u0441\u0443\u0432\u0430\u0442\u0438",
"qrScan.focusing": "\u0424\u043E\u043A\u0443\u0441\u0443\u0432\u0430\u043D\u043D\u044F\u2026",
"iceErr.notArray": "\u0421\u043F\u0438\u0441\u043E\u043A \u0441\u0435\u0440\u0432\u0435\u0440\u0456\u0432 \u043C\u0430\u0454 \u0431\u0443\u0442\u0438 \u043C\u0430\u0441\u0438\u0432\u043E\u043C",
"iceErr.invalidJson": "\u0425\u0438\u0431\u043D\u0438\u0439 JSON",
"iceErr.tooMany": "\u0417\u0430\u0431\u0430\u0433\u0430\u0442\u043E \u0441\u0435\u0440\u0432\u0435\u0440\u0456\u0432 (\u0449\u043E\u043D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0435 {max})",
"iceErr.invalidEntry": "{label}: \u0445\u0438\u0431\u043D\u0438\u0439 \u0437\u0430\u043F\u0438\u0441",
"iceErr.urlCount": "{label}: \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u043E \u0432\u0456\u0434 1 \u0434\u043E {max} URL",
"iceErr.turnCreds": "{label}: TURN-\u0441\u0435\u0440\u0432\u0435\u0440\u0438 \u0437\u0430\u0437\u0432\u0438\u0447\u0430\u0439 \u043F\u043E\u0442\u0440\u0435\u0431\u0443\u044E\u0442\u044C \u0456\u043C\u0435\u043D\u0456 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430 \u0442\u0430 \u043E\u0431\u043B\u0456\u043A\u043E\u0432\u0438\u0445 \u0434\u0430\u043D\u0438\u0445",
"iceUrl.notString": "URL \u043C\u0430\u0454 \u0431\u0443\u0442\u0438 \u0440\u044F\u0434\u043A\u043E\u043C",
"iceUrl.empty": "URL \u043F\u043E\u0440\u043E\u0436\u043D\u0456\u0439",
"iceUrl.tooLong": "URL \u0437\u0430\u0434\u043E\u0432\u0433\u0438\u0439",
"iceUrl.badChars": "URL \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043D\u0435\u043F\u0440\u0438\u043F\u0443\u0441\u0442\u0438\u043C\u0456 \u0441\u0438\u043C\u0432\u043E\u043B\u0438",
"iceUrl.badScheme": "URL \u043C\u0430\u0454 \u043F\u043E\u0447\u0438\u043D\u0430\u0442\u0438\u0441\u044F \u0437 stun:, stuns:, turn: \u0430\u0431\u043E turns:",
"iceUrl.badQuery": "URL \u043C\u0430\u0454 \u0445\u0438\u0431\u043D\u0438\u0439 \u0437\u0430\u043F\u0438\u0442",
"iceUrl.noHost": "\u0412 URL \u0431\u0440\u0430\u043A\u0443\u0454 \u0445\u043E\u0441\u0442\u0430",
"iceUrl.badHost": "URL \u043C\u0430\u0454 \u0445\u0438\u0431\u043D\u0438\u0439 \u0445\u043E\u0441\u0442 \u0430\u0431\u043E \u043F\u043E\u0440\u0442",
"iceUrl.badTransport": "\u0417\u0430\u043F\u0438\u0442 URL \u043C\u0430\u0454 \u0431\u0443\u0442\u0438 transport=udp \u0430\u0431\u043E transport=tcp",
"msg.off": "\u0412\u0438\u043C\u043A\u043D\u0435\u043D\u043E",
"file.consentUnavailable": "\u041D\u0435\u043C\u0430\u0454 \u0437\u043C\u043E\u0433\u0438 \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u0437\u0433\u043E\u0434\u0443",
"secLevel.MAXIMUM": "\u041C\u0410\u041A\u0421\u0418\u041C\u0423\u041C",
"secLevel.INITIALIZING": "\u0417\u0410\u041F\u0423\u0421\u041A",
"secLevel.ERROR": "\u041F\u041E\u041C\u0418\u041B\u041A\u0410",
"secLevel.UNKNOWN": "\u041D\u0415\u0412\u0406\u0414\u041E\u041C\u041E",
"status.error": "\u041F\u043E\u043C\u0438\u043B\u043A\u0430",
"offline.disconnect": "\u0412\u0456\u0434'\u0454\u0434\u043D\u0430\u0442\u0438\u0441\u044F",
"offline.learnMore": "\u0414\u043E\u043A\u043B\u0430\u0434\u043D\u0456\u0448\u0435",
"pwa.installApp": "\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438 \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043E\u043A",
"chat.onWeb": "\u0412\u0438 \u0443 \u0432\u0435\u0431\u0432\u0435\u0440\u0441\u0456\u0457",
"groupCall.startVoice": "\u041F\u043E\u0447\u0430\u0442\u0438 \u0433\u0440\u0443\u043F\u043E\u0432\u0438\u0439 \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u0438\u0439 \u0434\u0437\u0432\u0456\u043D\u043E\u043A",
"groupCall.startVideo": "\u041F\u043E\u0447\u0430\u0442\u0438 \u0433\u0440\u0443\u043F\u043E\u0432\u0438\u0439 \u0432\u0456\u0434\u0435\u043E\u0434\u0437\u0432\u0456\u043D\u043E\u043A",
"groupCall.join": "\u041F\u0440\u0438\u0454\u0434\u043D\u0430\u0442\u0438\u0441\u044F",
"groupCall.dismiss": "\u041D\u0435 \u0437\u0430\u0440\u0430\u0437",
"groupCall.leave": "\u0412\u0438\u0439\u0442\u0438 \u0437 \u0434\u0437\u0432\u0456\u043D\u043A\u0430",
"groupCall.you": "\u0412\u0438",
"groupCall.connecting": "\u0417'\u0454\u0434\u043D\u0430\u043D\u043D\u044F\u2026",
"groupCall.waitingLink": "\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0440\u044F\u043C\u043E\u0433\u043E \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F\u2026",
"groupCall.legFailed": "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0437'\u0454\u0434\u043D\u0430\u0442\u0438\u0441\u044F",
"groupCall.startedVoice": "{name} \u043F\u043E\u0447\u0430\u0432 \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u0438\u0439 \u0434\u0437\u0432\u0456\u043D\u043E\u043A",
"groupCall.startedVideo": "{name} \u043F\u043E\u0447\u0430\u0432 \u0432\u0456\u0434\u0435\u043E\u0434\u0437\u0432\u0456\u043D\u043E\u043A",
"groupCall.inCall": "{count} \u0443 \u0434\u0437\u0432\u0456\u043D\u043A\u0443",
"groupCall.err.permission_denied": "\u0414\u0437\u0432\u0456\u043D\u043E\u043A \u043D\u0435 \u043F\u043E\u0447\u0430\u0432\u0441\u044F - \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043E \u043C\u0456\u043A\u0440\u043E\u0444\u043E\u043D\u0430 \u0439 \u043A\u0430\u043C\u0435\u0440\u0438 \u0437\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E. \u0414\u043E\u0437\u0432\u043E\u043B\u044C\u0442\u0435 \u0439\u043E\u0433\u043E \u0434\u043B\u044F \u0446\u044C\u043E\u0433\u043E \u0441\u0430\u0439\u0442\u0443 \u0439 \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0449\u0435 \u0440\u0430\u0437.",
"groupCall.err.device_not_found": "\u0414\u0437\u0432\u0456\u043D\u043E\u043A \u043D\u0435 \u043F\u043E\u0447\u0430\u0432\u0441\u044F - \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457 \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043C\u0456\u043A\u0440\u043E\u0444\u043E\u043D\u0430.",
"groupCall.err.device_busy": "\u0414\u0437\u0432\u0456\u043D\u043E\u043A \u043D\u0435 \u043F\u043E\u0447\u0430\u0432\u0441\u044F - \u043C\u0456\u043A\u0440\u043E\u0444\u043E\u043D \u0437\u0430\u0439\u043D\u044F\u0442\u0438\u0439 \u0456\u043D\u0448\u0438\u043C \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043A\u043E\u043C. \u0417\u0430\u043A\u0440\u0438\u0439\u0442\u0435 \u0439\u043E\u0433\u043E \u0439 \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0449\u0435 \u0440\u0430\u0437.",
"groupCall.err.media_failed": "\u0414\u0437\u0432\u0456\u043D\u043E\u043A \u043D\u0435 \u043F\u043E\u0447\u0430\u0432\u0441\u044F - \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u043C\u0456\u043A\u0440\u043E\u0444\u043E\u043D.",
"groupCall.err.call_in_progress": "\u0423 \u0446\u0456\u0439 \u0433\u0440\u0443\u043F\u0456 \u0432\u0436\u0435 \u0442\u0440\u0438\u0432\u0430\u0454 \u0434\u0437\u0432\u0456\u043D\u043E\u043A. \u041F\u0440\u0438\u0454\u0434\u043D\u0430\u0439\u0442\u0435\u0441\u044F \u0434\u043E \u043D\u044C\u043E\u0433\u043E, \u0430 \u043D\u0435 \u043F\u043E\u0447\u0438\u043D\u0430\u0439\u0442\u0435 \u043D\u043E\u0432\u0438\u0439.",
"groupCall.err.not_ready": "\u0421\u043F\u0435\u0440\u0448\u0443 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043A\u043E\u0434 \u0433\u0440\u0443\u043F\u0438.",
"groupCall.speaking": "{name} \u0433\u043E\u0432\u043E\u0440\u0438\u0442\u044C",
"groupCall.pin": "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 {name} \u0432\u0435\u043B\u0438\u043A\u0438\u043C",
"groupCall.unpin": "\u041F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u0438\u0441\u044F \u0434\u043E \u0432\u0441\u0456\u0445",
"groupCall.showEveryone": "\u0423\u0441\u0456",
"msg.after5s": "5 \u0441 \u043F\u0456\u0441\u043B\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044F",
"msg.after15s": "15 \u0441 \u043F\u0456\u0441\u043B\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044F",
"msg.after30s": "30 \u0441 \u043F\u0456\u0441\u043B\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044F",
"msg.after1m": "1 \u0445\u0432 \u043F\u0456\u0441\u043B\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044F",
"msg.sec30": "30 \u0441\u0435\u043A\u0443\u043D\u0434",
"msg.min5": "5 \u0445\u0432\u0438\u043B\u0438\u043D",
"msg.hour1": "1 \u0433\u043E\u0434\u0438\u043D\u0430",
"desktop.shareDesc": "\u041D\u0430\u0434\u0456\u0448\u043B\u0456\u0442\u044C \u043A\u043E\u0434 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0443. \u0412\u0456\u043D \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u0438\u0439 \u0456 \u0448\u0432\u0438\u0434\u043A\u043E \u0432\u0442\u0440\u0430\u0447\u0430\u0454 \u0447\u0438\u043D\u043D\u0456\u0441\u0442\u044C.",
"desktop.invitationCreated": "\u0417\u0430\u0445\u0438\u0449\u0435\u043D\u0435 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043E - \u043D\u0430\u0434\u0456\u0448\u043B\u0456\u0442\u044C \u0439\u043E\u0433\u043E \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0443.",
"desktop.joinDesc": "\u0412\u0441\u0442\u0430\u0432\u0442\u0435 \u043A\u043E\u0434 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430, \u0449\u043E\u0431 \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u0443 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C.",
"desktop.offerTag": "\u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \xB7 \u043A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0442\u0435\u043A\u0441\u0442",
"desktop.answerTag": "\u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \xB7 \u043A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0442\u0435\u043A\u0441\u0442",
"desktop.offerPlaceholder": "\u0422\u0443\u0442 \u0437\u2019\u044F\u0432\u0438\u0442\u044C\u0441\u044F \u043A\u043E\u0434 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F\u2026",
"desktop.answerPlaceholder": "\u0422\u0443\u0442 \u0437\u2019\u044F\u0432\u0438\u0442\u044C\u0441\u044F \u043A\u043E\u0434 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0456\u2026",
"desktop.backToChats": "\u041D\u0430\u0437\u0430\u0434 \u0434\u043E \u0447\u0430\u0442\u0456\u0432",
"desktop.sendFeedback": "\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 \u0432\u0456\u0434\u0433\u0443\u043A",
"desktop.callsNeedVerified": "\u0414\u0437\u0432\u0456\u043D\u043A\u0438 \u043F\u043E\u0442\u0440\u0435\u0431\u0443\u044E\u0442\u044C \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E\u0433\u043E \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u043E\u0433\u043E \u043A\u0430\u043D\u0430\u043B\u0443.",
"desktop.noOpenChannel": "\u041D\u0435\u043C\u0430\u0454 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u043E\u0433\u043E \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u043E\u0433\u043E \u043A\u0430\u043D\u0430\u043B\u0443.",
"desktop.chatCarriesCall": "\u0426\u0435\u0439 \u0447\u0430\u0442 \u043D\u0435\u0441\u0435 \u0433\u0440\u0443\u043F\u043E\u0432\u0438\u0439 \u0434\u0437\u0432\u0456\u043D\u043E\u043A. \u0412\u0438\u0439\u0434\u0456\u0442\u044C \u0456\u0437 \u0433\u0440\u0443\u043F\u043E\u0432\u043E\u0433\u043E \u0434\u0437\u0432\u0456\u043D\u043A\u0430, \u043F\u0435\u0440\u0448 \u043D\u0456\u0436 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443\u0432\u0430\u0442\u0438 \u043E\u0434\u0438\u043D \u043D\u0430 \u043E\u0434\u0438\u043D.",
"desktop.err.permission_denied": "\u0414\u0437\u0432\u0456\u043D\u043E\u043A \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043F\u043E\u0447\u0430\u0442\u0438 - \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043E \u043C\u0456\u043A\u0440\u043E\u0444\u043E\u043D\u0430 \u0439 \u043A\u0430\u043C\u0435\u0440\u0438 \u0437\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E. \u0414\u043E\u0437\u0432\u043E\u043B\u044C\u0442\u0435 \u0439\u043E\u0433\u043E \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0438\u0445 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F\u0445 \u0456 \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0449\u0435 \u0440\u0430\u0437.",
"desktop.language": "\u041C\u043E\u0432\u0430",
"desktop.languageHint": "\u0417\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F \u043E\u0434\u0440\u0430\u0437\u0443. \u0423\u0436\u0435 \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u043D\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043B\u0438\u0448\u0430\u044E\u0442\u044C\u0441\u044F \u0442\u0456\u0454\u044E \u043C\u043E\u0432\u043E\u044E, \u044F\u043A\u043E\u044E \u0457\u0445 \u043D\u0430\u043F\u0438\u0441\u0430\u043B\u0438.",
"desktop.compareCode": "\u041F\u043E\u0440\u0456\u0432\u043D\u044F\u0439\u0442\u0435 \u043A\u043E\u0434 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u0437\u0456 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u043E\u043C \u0456 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u044F\u043A\u0449\u043E \u0432\u0456\u043D \u0437\u0431\u0456\u0433\u0430\u0454\u0442\u044C\u0441\u044F.",
"desktop.verifyBeforeFiles": "\u0417\u0430\u0432\u0435\u0440\u0448\u0456\u0442\u044C \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443, \u043F\u0435\u0440\u0448 \u043D\u0456\u0436 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438 \u0444\u0430\u0439\u043B\u0438.",
"desktop.verifyBeforeSending": "\u0417\u0430\u0432\u0435\u0440\u0448\u0456\u0442\u044C \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443, \u043F\u0435\u0440\u0448 \u043D\u0456\u0436 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F.",
"desktop.disconnectedByBackend": "\u0417\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0431\u0435\u0437\u043F\u0435\u0447\u043D\u043E \u0440\u043E\u0437\u0456\u0440\u0432\u0430\u043D\u043E.",
"desktop.restoreFailed": "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0432\u0456\u0434\u043D\u043E\u0432\u0438\u0442\u0438 \u0437\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F. \u0426\u0435\u0439 \u0447\u0430\u0442 \u0431\u0443\u0434\u0435 \u0437\u0430\u043A\u0440\u0438\u0442\u043E.",
"desktop.channelNotReady": "\u041A\u0430\u043D\u0430\u043B \u0434\u0430\u043D\u0438\u0445 \u0449\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439. \u0417\u0430\u0447\u0435\u043A\u0430\u0439\u0442\u0435, \u0434\u043E\u043A\u0438 \u0437\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C\u0441\u044F.",
"desktop.enterCode": "\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u043A\u043E\u0434 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F.",
"desktop.noOffer": "\u0417\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E. \u0421\u043F\u0435\u0440\u0448\u0443 \u0441\u0442\u0432\u043E\u0440\u0456\u0442\u044C \u0439\u043E\u0433\u043E.",
"desktop.notInitiator": "\u0412\u0438 \u043D\u0435 \u0441\u0442\u0432\u043E\u0440\u044E\u0432\u0430\u043B\u0438 \u0446\u0435 \u0437\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F, \u0442\u043E\u0436 \u0437\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \u043D\u0456\u0447\u043E\u043C\u0443.",
"desktop.decryptFailed": "\u041F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0440\u043E\u0437\u0448\u0438\u0444\u0440\u0443\u0432\u0430\u0442\u0438, \u0439\u043E\u0433\u043E \u0432\u0456\u0434\u043A\u0438\u043D\u0443\u0442\u043E.",
"desktop.badMessageFormat": "\u041D\u0430\u0434\u0456\u0439\u0448\u043E\u0432 \u043F\u043E\u0448\u043A\u043E\u0434\u0436\u0435\u043D\u0438\u0439 \u043A\u0430\u0434\u0440, \u0439\u043E\u0433\u043E \u0432\u0456\u0434\u043A\u0438\u043D\u0443\u0442\u043E.",
"desktop.notSentNotReady": "\u041F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043D\u0435 \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u043D\u043E: \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u0439 \u043A\u0430\u043D\u0430\u043B \u043D\u0435 \u0433\u043E\u0442\u043E\u0432\u0438\u0439. \u0417\u0430\u0447\u0435\u043A\u0430\u0439\u0442\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u044F \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438 \u0430\u0431\u043E \u043F\u0435\u0440\u0435\u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0456\u0442\u044C\u0441\u044F.",
"desktop.micDenied": "\u0414\u043E\u0441\u0442\u0443\u043F \u0434\u043E \u043C\u0456\u043A\u0440\u043E\u0444\u043E\u043D\u0430 \u0432\u0456\u0434\u0445\u0438\u043B\u0435\u043D\u043E.",
"desktop.noChannelWait": "\u041D\u0435\u043C\u0430\u0454 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u043E\u0433\u043E \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u043E\u0433\u043E \u043A\u0430\u043D\u0430\u043B\u0443 - \u0437\u0430\u0447\u0435\u043A\u0430\u0439\u0442\u0435, \u0434\u043E\u043A\u0438 \u0437\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C\u0441\u044F.",
"desktop.sasFailed": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u043D\u0435 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u043E. \u041C\u043E\u0436\u043B\u0438\u0432\u0430 \u043F\u0440\u0438\u0441\u0443\u0442\u043D\u0456\u0441\u0442\u044C \u043F\u043E\u0441\u0435\u0440\u0435\u0434\u043D\u0438\u043A\u0430, \u0442\u043E\u0436 \u0437\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u043F\u0435\u0440\u0435\u0440\u0432\u0430\u043D\u043E.",
"desktop.sasOk": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u043E. \u0426\u0435\u0439 \u043A\u0430\u043D\u0430\u043B \u0430\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u043E\u0432\u0430\u043D\u043E \u043D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u043E.",
"desktop.iceForgotten": "\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456 \u0441\u0435\u0440\u0432\u0435\u0440\u0438 \u0437\u0430\u0431\u0443\u0442\u043E. \u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u044E\u0442\u044C\u0441\u044F \u043F\u0443\u0431\u043B\u0456\u0447\u043D\u0456 \u0441\u0435\u0440\u0432\u0435\u0440\u0438 ICE.",
"desktop.icePublic": "\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u044E\u0442\u044C\u0441\u044F \u043F\u0443\u0431\u043B\u0456\u0447\u043D\u0456 \u0441\u0435\u0440\u0432\u0435\u0440\u0438 ICE.",
"desktop.verificationInProgress": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u0449\u0435 \u0442\u0440\u0438\u0432\u0430\u0454. \u0417\u0430\u0447\u0435\u043A\u0430\u0439\u0442\u0435 \u043D\u0430 \u0457\u0457 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u044F.",
"desktop.fileGone": "\u0426\u0435\u0439 \u0444\u0430\u0439\u043B \u0431\u0456\u043B\u044C\u0448\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 \u0434\u043B\u044F \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F.",
"desktop.codeMismatch": "\u041A\u043E\u0434\u0438 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u043D\u0435 \u0437\u0431\u0456\u0433\u0430\u044E\u0442\u044C\u0441\u044F. \u0420\u043E\u0437\u2019\u0454\u0434\u043D\u0443\u0454\u043C\u043E \u0437\u0430\u0434\u043B\u044F \u0431\u0435\u0437\u043F\u0435\u043A\u0438.",
"desktop.noLocalCode": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u043D\u0435 \u0432\u0434\u0430\u043B\u0430\u0441\u044F: \u043D\u0435\u043C\u0430\u0454 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u043E\u0431\u0447\u0438\u0441\u043B\u0435\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0443 \u0434\u043B\u044F \u043F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u044F. \u0420\u043E\u0437\u2019\u0454\u0434\u043D\u0443\u0454\u043C\u043E \u0437\u0430\u0434\u043B\u044F \u0431\u0435\u0437\u043F\u0435\u043A\u0438.",
"desktop.protocolViolation": "\u0421\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A \u0437\u0430\u044F\u0432\u0438\u0432 \u043F\u0440\u043E \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u043A\u043E\u0434\u0443 \u0440\u0430\u043D\u0456\u0448\u0435, \u043D\u0456\u0436 \u0432\u0438 \u0439\u043E\u0433\u043E \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438. \u0420\u043E\u0437\u2019\u0454\u0434\u043D\u0443\u0454\u043C\u043E \u0437\u0430\u0434\u043B\u044F \u0431\u0435\u0437\u043F\u0435\u043A\u0438.",
"desktop.verificationRejected": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u0432\u0456\u0434\u0445\u0438\u043B\u0435\u043D\u043E. \u0417\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u043F\u0435\u0440\u0435\u0440\u0432\u0430\u043D\u043E \u0437\u0430\u0434\u043B\u044F \u0431\u0435\u0437\u043F\u0435\u043A\u0438.",
"secLevel.HIGH": "\u0412\u0418\u0421\u041E\u041A\u0418\u0419",
"secLevel.MEDIUM": "\u0421\u0415\u0420\u0415\u0414\u041D\u0406\u0419",
"secLevel.LOW": "\u041D\u0418\u0417\u042C\u041A\u0418\u0419",
"desktop.rerun": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0438\u0442\u0438 \u0437\u043D\u043E\u0432\u0443",
"desktop.ice.customDesc": "\u0414\u043E {max} \u0441\u0435\u0440\u0432\u0435\u0440\u0456\u0432, \u043F\u043E \u043E\u0434\u043D\u0456\u0439 URL-\u0430\u0434\u0440\u0435\u0441\u0456 \u043D\u0430 \u0440\u044F\u0434\u043E\u043A \u0430\u0431\u043E JSON.",
"desktop.ice.persistDesc": "\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0454\u0442\u044C\u0441\u044F \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457. \u041B\u0438\u0448\u0456\u0442\u044C \u0432\u0438\u043C\u043A\u043D\u0435\u043D\u0438\u043C, \u0449\u043E\u0431 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0442\u0438 \u043B\u0438\u0448\u0435 \u0432 \u0446\u044C\u043E\u043C\u0443 \u0441\u0435\u0430\u043D\u0441\u0456.",
"desktop.group.leaveNote": "\u0406\u043D\u0448\u0456 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0438 \u0434\u0456\u0437\u043D\u0430\u044E\u0442\u044C\u0441\u044F, \u0449\u043E \u0432\u0438 \u0432\u0438\u0439\u0448\u043B\u0438. \u041F\u0456\u0441\u043B\u044F \u0446\u044C\u043E\u0433\u043E \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457 \u043D\u0435 \u043B\u0438\u0448\u0430\u0454\u0442\u044C\u0441\u044F \u043D\u0456\u0447\u043E\u0433\u043E \u043F\u0440\u043E \u0446\u044E \u0433\u0440\u0443\u043F\u0443 - \u0436\u043E\u0434\u0435\u043D \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u0442\u0440\u0438\u043C\u0430\u0454 \u043A\u043E\u043F\u0456\u0457, \u0437 \u044F\u043A\u043E\u0457 \u043C\u043E\u0436\u043D\u0430 \u043F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u0438\u0441\u044F, \u0442\u043E\u0436 \u0437\u043D\u0430\u0434\u043E\u0431\u0438\u0442\u044C\u0441\u044F \u043D\u043E\u0432\u0435 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F.",
"desktop.sec.ecdsaOk": "\u041F\u0456\u0434\u043F\u0438\u0441 \u043F\u0430\u043A\u0435\u0442\u0430 \u043A\u043B\u044E\u0447\u0456\u0432 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E \u043F\u0456\u0434 \u0447\u0430\u0441 \u0440\u0443\u043A\u043E\u0441\u0442\u0438\u0441\u043A\u0430\u043D\u043D\u044F (ECDSA P-384 / SHA-384)",
"desktop.sec.ecdsaNone": "\u0420\u0443\u043A\u043E\u0441\u0442\u0438\u0441\u043A\u0430\u043D\u043D\u044F \u043D\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E",
"desktop.sec.ecdhOk": "\u041A\u043B\u044E\u0447\u0456 \u0441\u0435\u0430\u043D\u0441\u0443 \u0432\u0438\u0432\u0435\u0434\u0435\u043D\u043E \u0437 \u0442\u0438\u043C\u0447\u0430\u0441\u043E\u0432\u043E\u0433\u043E \u043E\u0431\u043C\u0456\u043D\u0443 ECDH P-384 \u0447\u0435\u0440\u0435\u0437 HKDF-SHA-256",
"desktop.sec.ecdhNone": "\u041A\u043B\u044E\u0447\u0456 \u0441\u0435\u0430\u043D\u0441\u0443 \u043D\u0435 \u0432\u0438\u0432\u0435\u0434\u0435\u043D\u043E",
"desktop.sec.encryptionOk": "\u0428\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0439 \u0440\u043E\u0437\u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F AES-GCM \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E \u0432 \u044F\u0434\u0440\u0456",
"desktop.sec.encryptionNa": "\u0421\u0430\u043C\u043E\u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 AES-GCM \u0432\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F",
"desktop.sec.integrityOk": "\u0426\u0456\u043B\u0456\u0441\u043D\u0456\u0441\u0442\u044C \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u044C \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E (\u0430\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0446\u0456\u044F AES-GCM)",
"desktop.sec.integrityNa": "\u0421\u0430\u043C\u043E\u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u0446\u0456\u043B\u0456\u0441\u043D\u043E\u0441\u0442\u0456 \u0432\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F",
"desktop.sec.pfsOk": "Double Ratchet \u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439 - \u043A\u043E\u0436\u043D\u0435 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043C\u0430\u0454 \u0432\u043B\u0430\u0441\u043D\u0438\u0439 \u043A\u043B\u044E\u0447",
"desktop.sec.pfsNa": "\u041D\u0435 \u0432\u0438\u043C\u0456\u0440\u044F\u043D\u043E",
"desktop.sec.replayOk": "\u041A\u043B\u044E\u0447\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u044C \u0440\u0430\u0442\u0447\u0435\u0442\u0430 \u0437\u043D\u0438\u0449\u0443\u044E\u0442\u044C\u0441\u044F \u043F\u0456\u0441\u043B\u044F \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u043D\u043D\u044F, \u0442\u043E\u0436 \u043F\u0435\u0440\u0435\u0445\u043E\u043F\u043B\u0435\u043D\u0438\u0439 \u043A\u0430\u0434\u0440 \u043D\u0435 \u043C\u043E\u0436\u043D\u0430 \u0432\u0456\u0434\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u043E",
"desktop.sec.replayNa": "\u041D\u0435 \u0432\u0438\u043C\u0456\u0440\u044F\u043D\u043E",
"desktop.sec.dtlsPinned": "\u0412\u0456\u0434\u0431\u0438\u0442\u043E\u043A DTLS \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430 \u0437\u0430\u043A\u0440\u0456\u043F\u043B\u0435\u043D\u043E: {fp}",
"desktop.sec.dtlsNone": "\u0412\u0456\u0434\u0431\u0438\u0442\u043A\u0430 DTLS \u0432\u0456\u0434\u0434\u0430\u043B\u0435\u043D\u043E\u0457 \u0441\u0442\u043E\u0440\u043E\u043D\u0438 \u043D\u0435\u043C\u0430\u0454",
"desktop.sec.sasBoth": "\u041E\u0431\u0438\u0434\u0432\u0456 \u0441\u0442\u043E\u0440\u043E\u043D\u0438 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438 \u043A\u043E\u0434 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u043F\u043E\u0437\u0430 \u043A\u0430\u043D\u0430\u043B\u043E\u043C",
"desktop.sec.sasIncomplete": "\u041A\u043E\u0434 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438 \u043D\u0435 \u043E\u0431\u0438\u0434\u0432\u0456 \u0441\u0442\u043E\u0440\u043E\u043D\u0438",
"desktop.sec.metadataOk": "\u0412\u0438\u0432\u0435\u0434\u0435\u043D\u043E \u043E\u043A\u0440\u0435\u043C\u0438\u0439 \u043A\u043B\u044E\u0447 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u0438\u0445 (HKDF metadata-protection-v4)",
"desktop.sec.metadataNone": "\u041A\u043B\u044E\u0447\u0430 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u0438\u0445 \u043D\u0435\u043C\u0430\u0454",
"desktop.sec.coverOn": "\u041F\u0440\u0438\u043A\u0440\u0438\u0432\u0430\u044E\u0447\u0438\u0439 \u0442\u0440\u0430\u0444\u0456\u043A \u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439: \u0432\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u0456 \u0444\u0430\u043B\u044C\u0448\u0438\u0432\u0456 \u043A\u0430\u0434\u0440\u0438 (32-128 \u0411 \u043A\u043E\u0436\u043D\u0456 15-30 \u0441) \u0443 \u043A\u0430\u043D\u0430\u043B\u0456 \u0437 \u0440\u0430\u0442\u0447\u0435\u0442\u043E\u043C",
"desktop.sec.coverOff": "\u0413\u0435\u043D\u0435\u0440\u0430\u0442\u043E\u0440 \u043F\u0440\u0438\u043A\u0440\u0438\u0432\u0430\u044E\u0447\u043E\u0433\u043E \u0442\u0440\u0430\u0444\u0456\u043A\u0443 \u043D\u0435 \u043F\u0440\u0430\u0446\u044E\u0454",
"desktop.sec.coverUnsupported": "\u041F\u0440\u0438\u043A\u0440\u0438\u0432\u0430\u044E\u0447\u0438\u0439 \u0442\u0440\u0430\u0444\u0456\u043A \u043F\u043E\u0442\u0440\u0435\u0431\u0443\u0454 \u0441\u0435\u0430\u043D\u0441\u0443 Double Ratchet (\u0443 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430 \u0441\u0442\u0430\u0440\u0456\u0448\u0430 \u0432\u0435\u0440\u0441\u0456\u044F)",
"desktop.tagline": "\u041D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u0430 \u0441\u0432\u043E\u0431\u043E\u0434\u0430"
},
"ru": {
"language.label": "\u042F\u0437\u044B\u043A",
"language.suggest.text": "\u042D\u0442\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u0442\u0430\u043A\u0436\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u043D\u0430 \u0440\u0443\u0441\u0441\u043A\u043E\u043C.",
"language.suggest.cta": "\u0427\u0438\u0442\u0430\u0442\u044C \u043F\u043E-\u0440\u0443\u0441\u0441\u043A\u0438",
"language.suggest.dismiss": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
"community.title": "\u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u044F\u0439\u0442\u0435\u0441\u044C \u043A \u0431\u0443\u0434\u0443\u0449\u0435\u043C\u0443 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0438",
"community.description": "SecureBit \u0440\u0430\u0441\u0442\u0451\u0442 \u0431\u043B\u0430\u0433\u043E\u0434\u0430\u0440\u044F \u0441\u043E\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0443. \u0412\u0430\u0448\u0438 \u0438\u0434\u0435\u0438 \u0438 \u043E\u0442\u0437\u044B\u0432\u044B \u0444\u043E\u0440\u043C\u0438\u0440\u0443\u044E\u0442 \u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0433\u043E \u043E\u0431\u0449\u0435\u043D\u0438\u044F - \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u0432\u0435\u0434\u0451\u0442\u0441\u044F \u043E\u0442\u043A\u0440\u044B\u0442\u043E, \u0441 \u043F\u043E\u043B\u043D\u043E\u0439 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u043E\u0439 ASN.1 \u043D\u0430 \u0432\u0441\u0451\u043C \u043F\u0443\u0442\u0438.",
"community.github": "\u0420\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u0439 \u043D\u0430 GitHub",
"community.feedback": "\u041E\u0431\u0440\u0430\u0442\u043D\u0430\u044F \u0441\u0432\u044F\u0437\u044C",
"unique.eyebrow": "\u0427\u0435\u043C \u043C\u044B \u043E\u0442\u043B\u0438\u0447\u0430\u0435\u043C\u0441\u044F",
"unique.heading": "\u041F\u043E\u0447\u0435\u043C\u0443 SecureBit \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u044B\u0439",
"unique.s1.titleTop": "\u041C\u043D\u043E\u0433\u043E\u0441\u043B\u043E\u0439\u043D\u043E\u0435",
"unique.s1.titleBottom": "\u044F\u0434\u0440\u043E \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
"unique.s1.collapsed": "\u042F\u0434\u0440\u043E \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
"unique.s1.desc": "\u041E\u0431\u043C\u0435\u043D \u043A\u043B\u044E\u0447\u0430\u043C\u0438 ECDH P-384, \u043F\u043E\u043B\u0435\u0437\u043D\u0430\u044F \u043D\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0432 AES-256-GCM, \u043F\u043E\u0434\u043F\u0438\u0441\u0438 ECDSA \u0438 \u043F\u043E\u043B\u043D\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 ASN.1 - \u0441\u043E\u0431\u0440\u0430\u043D\u043D\u044B\u0435 \u0432 \u043E\u0434\u0438\u043D \u0443\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u044B\u0439 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440.",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "\u0427\u0438\u0441\u0442\u044B\u0439 P2P",
"unique.s2.titleBottom": "\u0447\u0435\u0440\u0435\u0437 WebRTC",
"unique.s2.collapsed": "\u0427\u0438\u0441\u0442\u044B\u0439 P2P \u0447\u0435\u0440\u0435\u0437 WebRTC",
"unique.s2.desc": "\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0438\u0434\u0443\u0442 \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E \u043C\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430\u043C\u0438 \u043F\u043E WebRTC. \u041D\u0438\u043A\u0430\u043A\u043E\u0439 relay \u043D\u0435 \u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0430\u0448\u0438 \u0434\u0430\u043D\u043D\u044B\u0435 - \u0441\u0435\u0440\u0432\u0435\u0440 \u043B\u0438\u0448\u044C \u043F\u043E\u043C\u043E\u0433\u0430\u0435\u0442 \u0434\u0432\u0443\u043C \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430\u043C \u043D\u0430\u0439\u0442\u0438 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.",
"unique.s2.tags": [
"DTLS 1.3",
"\u0411\u0435\u0437 relay"
],
"unique.s3.titleTop": "\u0421\u043E\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u0430\u044F",
"unique.s3.titleBottom": "\u043F\u0440\u044F\u043C\u0430\u044F \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u044C",
"unique.s3.collapsed": "\u041F\u0440\u044F\u043C\u0430\u044F \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u044C",
"unique.s3.desc": "\u0421\u0435\u0430\u043D\u0441\u043E\u0432\u044B\u0435 \u043A\u043B\u044E\u0447\u0438 \u043C\u0435\u043D\u044F\u044E\u0442\u0441\u044F \u043D\u0435\u043F\u0440\u0435\u0440\u044B\u0432\u043D\u043E \u0438 \u043E\u0442\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u044E\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043E\u0434\u0438\u043D \u0441\u043A\u043E\u043C\u043F\u0440\u043E\u043C\u0435\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u043A\u043B\u044E\u0447 \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u043E\u0442\u043A\u0440\u043E\u0435\u0442 \u043F\u0440\u043E\u0448\u043B\u044B\u0435 \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u044B.",
"unique.s3.tags": [
"\u042D\u0444\u0435\u043C\u0435\u0440\u043D\u044B\u0435 \u043A\u043B\u044E\u0447\u0438",
"\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0441\u043C\u0435\u043D\u0430"
],
"unique.s4.titleTop": "\u041C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0430",
"unique.s4.titleBottom": "\u0442\u0440\u0430\u0444\u0438\u043A\u0430",
"unique.s4.collapsed": "\u041C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0442\u0440\u0430\u0444\u0438\u043A\u0430",
"unique.s4.desc": "\u0420\u0430\u0437\u043C\u0435\u0440\u044B \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u0438 \u043F\u0430\u0443\u0437\u044B \u043C\u0435\u0436\u0434\u0443 \u043D\u0438\u043C\u0438 \u0434\u043E\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u0438 \u0440\u0430\u043D\u0434\u043E\u043C\u0438\u0437\u0438\u0440\u0443\u044E\u0442\u0441\u044F, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u0435 \u043D\u0435 \u0441\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u044E\u0442\u0441\u044F \u0432 \u0443\u0437\u043D\u0430\u0432\u0430\u0435\u043C\u044B\u0439 \u0440\u0438\u0441\u0443\u043D\u043E\u043A \u0434\u0430\u0436\u0435 \u0434\u043B\u044F \u0442\u043E\u0433\u043E, \u043A\u0442\u043E \u0441\u043B\u0435\u0434\u0438\u0442 \u0437\u0430 \u043A\u0430\u043D\u0430\u043B\u043E\u043C.",
"unique.s4.tags": [
"\u0414\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043F\u0430\u043A\u0435\u0442\u043E\u0432",
"\u0420\u0430\u0437\u0431\u0440\u043E\u0441 \u0432\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0438"
],
"unique.s5.titleTop": "\u041D\u0438\u043A\u0430\u043A\u043E\u0433\u043E",
"unique.s5.titleBottom": "\u0441\u0431\u043E\u0440\u0430 \u0434\u0430\u043D\u043D\u044B\u0445",
"unique.s5.collapsed": "\u041D\u0438\u043A\u0430\u043A\u043E\u0433\u043E \u0441\u0431\u043E\u0440\u0430 \u0434\u0430\u043D\u043D\u044B\u0445",
"unique.s5.desc": "\u0411\u0435\u0437 \u0443\u0447\u0451\u0442\u043D\u044B\u0445 \u0437\u0430\u043F\u0438\u0441\u0435\u0439, \u0431\u0435\u0437 \u0436\u0443\u0440\u043D\u0430\u043B\u043E\u0432, \u0431\u0435\u0437 \u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439. \u041D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043D\u0435\u0442 \u043D\u0438\u0447\u0435\u0433\u043E, \u0447\u0442\u043E \u043C\u043E\u0436\u043D\u043E \u0443\u0442\u0435\u0447\u044C, \u0438\u0437\u044A\u044F\u0442\u044C \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443 \u0438\u043B\u0438 \u043F\u0440\u043E\u0434\u0430\u0442\u044C.",
"unique.s5.tags": [
"\u0411\u0435\u0437 \u0443\u0447\u0451\u0442\u043D\u044B\u0445 \u0437\u0430\u043F\u0438\u0441\u0435\u0439",
"\u0411\u0435\u0437 \u0436\u0443\u0440\u043D\u0430\u043B\u043E\u0432"
],
"partners.eyebrow": "\u041F\u0430\u0440\u0442\u043D\u0451\u0440\u044B \u0438 \u044D\u043A\u043E\u0441\u0438\u0441\u0442\u0435\u043C\u0430",
"partners.heading": "\u041D\u0430\u043C \u0434\u043E\u0432\u0435\u0440\u044F\u044E\u0442 \u043D\u0430\u0448\u0438 \u043F\u0430\u0440\u0442\u043D\u0451\u0440\u044B",
"partners.aegis.desc": "\u0418\u043D\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u043E\u043D\u043D\u044B\u0439 \u043F\u0430\u0440\u0442\u043D\u0451\u0440, \u0437\u0430\u0449\u0438\u0449\u0430\u044E\u0449\u0438\u0439 \u043A\u043E\u043D\u0444\u0438\u0434\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u0444\u0438\u043D\u0430\u043D\u0441\u043E\u0432\u044B\u0435 \u043A\u043E\u043C\u043C\u0443\u043D\u0438\u043A\u0430\u0446\u0438\u0438 \u0432\u043E \u0432\u0441\u0451\u043C \u0441\u0432\u043E\u0451\u043C \u043F\u043E\u0440\u0442\u0444\u0435\u043B\u0435.",
"partners.aegis.role": "\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0438\u043D\u0432\u0435\u0441\u0442\u043E\u0440",
"partners.furilabs.desc": "Linux-\u0442\u0435\u043B\u0435\u0444\u043E\u043D\u044B \u0441 \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442\u043E\u043C \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0438, \u043F\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 SecureBit \u043A\u0430\u043A \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u043A\u0430\u043D\u0430\u043B \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.",
"partners.furilabs.role": "\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043F\u0430\u0440\u0442\u043D\u0451\u0440",
"partners.inviteTitle": "\u0421\u0442\u0430\u0442\u044C \u043F\u0430\u0440\u0442\u043D\u0451\u0440\u043E\u043C",
"partners.inviteDesc": "\u0421\u043E\u0437\u0434\u0430\u0451\u0442\u0435 \u043E\u0431\u043E\u0440\u0443\u0434\u043E\u0432\u0430\u043D\u0438\u0435 \u0438\u043B\u0438 \u0438\u043D\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u0434\u043B\u044F \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0438? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u043D\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043C SecureBit.",
"partners.inviteCta": "\u041D\u0430\u0447\u0430\u0442\u044C \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440",
"roadmap.eyebrow": "\u0414\u043E\u0440\u043E\u0436\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u0430",
"roadmap.heading": "\u041A\u0430\u043A \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043B\u0441\u044F SecureBit",
"roadmap.subheading": "\u041E\u0442 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u043F\u0440\u043E\u0442\u043E\u0442\u0438\u043F\u0430 \u0434\u043E \u0434\u0435\u0446\u0435\u043D\u0442\u0440\u0430\u043B\u0438\u0437\u043E\u0432\u0430\u043D\u043D\u043E\u0439 \u0441\u0435\u0442\u0438, \u0443\u0441\u0442\u043E\u0439\u0447\u0438\u0432\u043E\u0439 \u043A \u043A\u0432\u0430\u043D\u0442\u043E\u0432\u044B\u043C \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F\u043C, \u0441 \u043F\u043E\u043B\u043D\u043E\u0439 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u043E\u0439 ASN.1 \u043D\u0430 \u043A\u0430\u0436\u0434\u043E\u043C \u0443\u0440\u043E\u0432\u043D\u0435.",
"roadmap.progress": "\u041F\u0440\u043E\u0439\u0434\u0435\u043D\u043E {shipped} \u0438\u0437 {total} \u044D\u0442\u0430\u043F\u043E\u0432",
"roadmap.upcoming": "{upcoming} \u0432\u043F\u0435\u0440\u0435\u0434\u0438",
"roadmap.keyFeatures": "\u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0438",
"roadmap.status.released": "\u0412\u044B\u043F\u0443\u0449\u0435\u043D\u043E",
"roadmap.status.current": "\u0422\u0435\u043A\u0443\u0449\u0438\u0439",
"roadmap.status.dev": "\u0412 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0435",
"roadmap.status.planned": "\u0417\u0430\u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043E",
"roadmap.status.research": "\u0418\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u0435",
"hero.headlineTop": "\u041F\u0440\u044F\u043C\u0430\u044F \u043B\u0438\u043D\u0438\u044F,",
"hero.headlineBottom": "\u043A\u043E\u0442\u043E\u0440\u0443\u044E \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u044B \u0434\u0432\u043E\u0435.",
"hero.subheading": "\u041A\u043B\u044E\u0447\u0438 \u0441\u043E\u0437\u0434\u0430\u044E\u0442\u0441\u044F \u043D\u0430 \u0432\u0430\u0448\u0435\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435 \u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u044E\u0442\u0441\u044F \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E \u043C\u0435\u0436\u0434\u0443 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430\u043C\u0438. \u0411\u0435\u0437 \u0443\u0447\u0451\u0442\u043D\u044B\u0445 \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u0438 \u0431\u0435\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u0432, \u0445\u0440\u0430\u043D\u044F\u0449\u0438\u0445 \u0432\u0430\u0448\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F.",
"hero.diagramAlt": "\u041F\u0440\u044F\u043C\u0430\u044F \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u0430\u044F \u043B\u0438\u043D\u0438\u044F \u043A \u043E\u0434\u043D\u043E\u043C\u0443 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0443, \u043A \u043A\u043E\u0442\u043E\u0440\u043E\u0439 \u043F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u044F\u044E\u0442\u0441\u044F \u0435\u0449\u0451 \u0434\u0432\u043E\u0435",
"intro.createTitle": "\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u043A\u0430\u043D\u0430\u043B",
"intro.createDesc": "\u0412\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E \u0441\u043E\u0437\u0434\u0430\u0451\u0442 \u043A\u043B\u044E\u0447\u0438 \u0438 \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u043E\u0435 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435. \u041D\u0438\u0447\u0442\u043E \u0438\u0437 \u044D\u0442\u043E\u0433\u043E \u043D\u0435 \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.",
"intro.createCta": "\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043A\u043B\u044E\u0447\u0438 \u0438 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435",
"intro.joinTitle": "\u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C\u0441\u044F \u043A \u043A\u0430\u043D\u0430\u043B\u0443",
"intro.scanTitle": "\u0421\u043A\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C QR \u043A\u0430\u043C\u0435\u0440\u043E\u0439",
"intro.scanSubtitle": "\u0411\u044B\u0441\u0442\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043E - \u043D\u0430\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u0430 \u044D\u043A\u0440\u0430\u043D \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430",
"intro.orPasteCode": "\u0438\u043B\u0438 \u0432\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043A\u043E\u0434",
"intro.pastePlaceholder": "\u0412\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043A\u043E\u0434 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u044F \u0441\u044E\u0434\u0430\u2026",
"intro.connect": "\u0421\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C\u0441\u044F",
"intro.connecting": "\u041E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430\u2026",
"roadmap.r1.title": "\u041D\u0430\u0447\u0430\u043B\u043E \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438",
"roadmap.r1.sub": "\u0418\u0434\u0435\u044F, \u043F\u0440\u043E\u0442\u043E\u0442\u0438\u043F \u0438 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0438\u043D\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u044B",
"roadmap.r1.date": "\u041D\u0430\u0447\u0430\u043B\u043E 2025",
"roadmap.r1.features": [
"\u0424\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043A\u043E\u043D\u0446\u0435\u043F\u0446\u0438\u0438 \u0438 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u0439",
"\u0412\u044B\u0431\u043E\u0440 \u0441\u0442\u0435\u043A\u0430: WebRTC, P2P, \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u044F",
"\u041F\u0435\u0440\u0432\u044B\u0435 \u043F\u0440\u043E\u0442\u043E\u0442\u0438\u043F\u044B \u043E\u0431\u043C\u0435\u043D\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\u043C\u0438",
"\u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F \u0438 CI",
"\u0411\u0430\u0437\u043E\u0432\u0430\u044F \u0430\u0440\u0445\u0438\u0442\u0435\u043A\u0442\u0443\u0440\u0430 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
"\u0414\u0438\u0437\u0430\u0439\u043D UX/UI"
],
"roadmap.r2.title": "\u0410\u043B\u044C\u0444\u0430-\u0432\u0435\u0440\u0441\u0438\u044F",
"roadmap.r2.sub": "\u041F\u0435\u0440\u0432\u0430\u044F \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u0430\u044F \u0430\u043B\u044C\u0444\u0430: \u0431\u0430\u0437\u043E\u0432\u044B\u0439 \u0447\u0430\u0442 \u0438 \u043E\u0431\u043C\u0435\u043D \u043A\u043B\u044E\u0447\u0430\u043C\u0438",
"roadmap.r2.date": "\u0412\u0435\u0441\u043D\u0430 2025",
"roadmap.r2.features": [
"\u0411\u0430\u0437\u043E\u0432\u044B\u0439 \u043E\u0431\u043C\u0435\u043D \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\u043C\u0438 P2P \u0447\u0435\u0440\u0435\u0437 WebRTC",
"\u041F\u0440\u043E\u0441\u0442\u043E\u0435 \u0441\u043A\u0432\u043E\u0437\u043D\u043E\u0435 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435 (\u0434\u0435\u043C\u043E\u043D\u0441\u0442\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u0430\u044F \u0441\u0445\u0435\u043C\u0430)",
"\u0421\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u044B\u0439 \u0441\u0438\u0433\u043D\u0430\u043B\u0438\u043D\u0433 \u0438 \u043F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435",
"\u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043B\u044F \u0442\u0435\u0441\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
"\u0421\u0431\u043E\u0440 \u043E\u0442\u0437\u044B\u0432\u043E\u0432 \u043E\u0442 \u043F\u0435\u0440\u0432\u044B\u0445 \u0442\u0435\u0441\u0442\u0438\u0440\u043E\u0432\u0449\u0438\u043A\u043E\u0432"
],
"roadmap.r3.title": "\u0423\u0441\u0438\u043B\u0435\u043D\u043D\u0430\u044F \u0437\u0430\u0449\u0438\u0442\u0430",
"roadmap.r3.sub": "\u0423\u043A\u0440\u0435\u043F\u043B\u0435\u043D\u0438\u0435 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u0438 \u0432\u044B\u043F\u0443\u0441\u043A \u0441\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u043E\u0439 \u0432\u0435\u0442\u043A\u0438",
"roadmap.r3.date": "\u041B\u0435\u0442\u043E 2025",
"roadmap.r3.features": [
"ECDH/ECDSA \u0432 \u043F\u0440\u043E\u043C\u044B\u0448\u043B\u0435\u043D\u043D\u043E\u0439 \u044D\u043A\u0441\u043F\u043B\u0443\u0430\u0442\u0430\u0446\u0438\u0438",
"\u041F\u0440\u044F\u043C\u0430\u044F \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u044C \u0438 \u0441\u043C\u0435\u043D\u0430 \u043A\u043B\u044E\u0447\u0435\u0439",
"\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u043D\u044B\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0438",
"\u0428\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u043E\u0432 \u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0431\u043E\u043B\u044C\u0448\u0438\u0445 \u043E\u0431\u044A\u0451\u043C\u043E\u0432",
"\u0410\u0443\u0434\u0438\u0442 \u0431\u0430\u0437\u043E\u0432\u044B\u0445 \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u043E\u0432"
],
"roadmap.r4.title": "\u041C\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0438 \u0441\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u043E\u0441\u0442\u044C",
"roadmap.r4.sub": "\u041C\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0441\u0435\u0442\u0438 \u0438 \u043F\u043E\u0432\u044B\u0448\u0435\u043D\u0438\u0435 \u0441\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u043E\u0441\u0442\u0438",
"roadmap.r4.date": "\u041E\u0441\u0435\u043D\u044C 2025",
"roadmap.r4.features": [
"\u041E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u044F P2P-\u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0439 \u0438 \u043F\u0440\u043E\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F NAT",
"\u041C\u0435\u0445\u0430\u043D\u0438\u0437\u043C\u044B \u043F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0438 \u043E\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439",
"\u041C\u0435\u043D\u044C\u0448\u0438\u0439 \u0440\u0430\u0441\u0445\u043E\u0434 \u0431\u0430\u0442\u0430\u0440\u0435\u0438 \u043D\u0430 \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u0445",
"\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u043C\u0435\u0436\u0434\u0443 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u043C\u0438 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430\u043C\u0438",
"\u0418\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B \u043C\u043E\u043D\u0438\u0442\u043E\u0440\u0438\u043D\u0433\u0430 \u0438 \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432"
],
"roadmap.r5.title": "\u041F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u044C \u043F\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043E",
"roadmap.r5.sub": "\u0424\u043E\u043A\u0443\u0441 \u043D\u0430 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0438: \u0443\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u0445",
"roadmap.r5.date": "\u0417\u0438\u043C\u0430 2025",
"roadmap.r5.features": [
"\u0417\u0430\u0449\u0438\u0442\u0430 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u0445 \u0438 \u0441\u043D\u0438\u0436\u0435\u043D\u0438\u0435 \u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u0430",
"\u042D\u043A\u0441\u043F\u0435\u0440\u0438\u043C\u0435\u043D\u0442\u044B \u0441 \u043B\u0443\u043A\u043E\u0432\u043E\u0439 \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 DHT",
"\u0412\u0430\u0440\u0438\u0430\u043D\u0442\u044B \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u044B\u0445 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0439",
"\u041F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u043A\u0430 \u043A \u043E\u0442\u043A\u0440\u044B\u0442\u043E\u043C\u0443 \u0430\u0443\u0434\u0438\u0442\u0443 \u043A\u043E\u0434\u0430",
"\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u043D\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432"
],
"roadmap.r6.title": "Enhanced Security Edition",
"roadmap.r6.sub": "18-\u0441\u043B\u043E\u0439\u043D\u0430\u044F \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u044F \u0432\u043E\u0435\u043D\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u0432\u043D\u044F \u0441 \u043F\u043E\u043B\u043D\u043E\u0439 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u043E\u0439 ASN.1",
"roadmap.r6.date": "\u041A\u043E\u043D\u0435\u0446 2025",
"roadmap.r6.features": [
"\u0422\u0440\u043E\u0439\u043D\u0430\u044F \u0437\u0430\u0449\u0438\u0442\u0430: ECDH + DTLS + SAS",
"\u0428\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435 ECDH P-384 \u0438 AES-GCM 256 \u0431\u0438\u0442",
"\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u0430 DTLS",
"\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 SAS (\u043A\u043E\u0440\u043E\u0442\u043A\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0438)",
"\u041F\u0440\u044F\u043C\u0430\u044F \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u044C \u0441\u043E \u0441\u043C\u0435\u043D\u043E\u0439 \u043A\u043B\u044E\u0447\u0435\u0439",
"\u0423\u0441\u0438\u043B\u0435\u043D\u043D\u0430\u044F \u0437\u0430\u0449\u0438\u0442\u0430 \u043E\u0442 \u0430\u0442\u0430\u043A \xAB\u0447\u0435\u043B\u043E\u0432\u0435\u043A \u043F\u043E\u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0435\xBB",
"\u041F\u043E\u043B\u043D\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 ASN.1 DER",
"\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 OID \u0438 \u0442\u043E\u0447\u0435\u043A EC",
"\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u044B SPKI",
"\u0410\u0440\u0445\u0438\u0442\u0435\u043A\u0442\u0443\u0440\u0430 P2P \u043D\u0430 WebRTC",
"\u0417\u0430\u0449\u0438\u0442\u0430 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u0445",
"100 % \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0439 \u043A\u043E\u0434"
],
"roadmap.r7.title": "Desktop Edition",
"roadmap.r7.sub": "\u041E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0434\u043B\u044F Windows, macOS \u0438 Linux",
"roadmap.r7.date": "\u041D\u0430\u0447\u0430\u043B\u043E 2026",
"roadmap.r7.features": [
"\u041F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0434\u043B\u044F Windows (Tauri v2)",
"\u041F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0434\u043B\u044F macOS (Tauri v2)",
"AppImage \u0434\u043B\u044F Linux (Tauri v2)",
"\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u0432 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438",
"\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u043F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435",
"\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u043C\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430\u043C\u0438",
"\u041E\u0431\u043D\u043E\u0432\u043B\u0451\u043D\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441",
"\u0424\u0430\u0439\u043B\u044B \u0434\u043E 100 \u041C\u0411"
],
"roadmap.r8.title": "\u0417\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u0433\u043E\u043B\u043E\u0441 \u0438 \u0437\u0432\u043E\u043D\u043A\u0438",
"roadmap.r8.sub": "\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F, \u0430\u0443\u0434\u0438\u043E- \u0438 \u0432\u0438\u0434\u0435\u043E\u0437\u0432\u043E\u043D\u043A\u0438",
"roadmap.r8.date": "\u041D\u0430\u0447\u0430\u043B\u043E 2026",
"roadmap.r8.features": [
"\u0413\u043E\u043B\u043E\u0441\u043E\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0441\u043E \u0441\u043A\u0432\u043E\u0437\u043D\u044B\u043C \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C",
"\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0430\u0443\u0434\u0438\u043E\u0437\u0432\u043E\u043D\u043A\u0438 \u043E\u0434\u0438\u043D \u043D\u0430 \u043E\u0434\u0438\u043D (WebRTC)",
"\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0432\u0438\u0434\u0435\u043E\u0437\u0432\u043E\u043D\u043A\u0438 \u043E\u0434\u0438\u043D \u043D\u0430 \u043E\u0434\u0438\u043D (WebRTC)",
"\u041F\u0440\u044F\u043C\u0430\u044F \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u044C \u0434\u043B\u044F \u0436\u0438\u0432\u043E\u0433\u043E \u043F\u043E\u0442\u043E\u043A\u0430",
"\u041C\u0435\u0434\u0438\u0430\u043F\u043E\u0442\u043E\u043A\u0438 \u043F\u043E\u0434 \u0437\u0430\u0449\u0438\u0442\u043E\u0439 SRTP/DTLS",
"\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 SAS \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0437\u0432\u043E\u043D\u043A\u0430",
"\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E \u0437\u0432\u043E\u043D\u043A\u0430\u0445 \u0438 \u0430\u0432\u0442\u043E\u043F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435",
"\u041C\u0435\u0434\u0438\u0430 P2P \u0441 \u043D\u0438\u0437\u043A\u043E\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u043E\u0439"
],
"roadmap.r9.title": "\u0413\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0435 \u043E\u0431\u0449\u0435\u043D\u0438\u0435",
"roadmap.r9.sub": "\u0413\u0440\u0443\u043F\u043F\u043E\u0432\u044B\u0435 \u0447\u0430\u0442\u044B \u0431\u0435\u0437 \u043F\u043E\u0442\u0435\u0440\u0438 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0438",
"roadmap.r9.date": "\u0421\u0435\u0439\u0447\u0430\u0441",
"roadmap.r9.features": [
"\u0413\u0440\u0443\u043F\u043F\u043E\u0432\u044B\u0435 \u0447\u0430\u0442\u044B P2P \u0434\u043E 8 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432",
"\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u043E \u0441\u0435\u0442\u0438 \u0441 \u043F\u043E\u0434\u043F\u0438\u0441\u0430\u043D\u043D\u044B\u043C relay \u043A\u0430\u043A \u0437\u0430\u043F\u0430\u0441\u043D\u044B\u043C \u043F\u0443\u0442\u0451\u043C",
"\u041E\u0434\u0438\u043D \u043A\u043E\u0434 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u0433\u0440\u0443\u043F\u043F\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0441\u0432\u0435\u0440\u044F\u044E\u0442 \u0432\u0441\u0435",
"\u0426\u0435\u0440\u0435\u043C\u043E\u043D\u0438\u044F \xAB\u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u043E, \u043F\u043E\u0442\u043E\u043C \u0440\u0430\u0441\u043A\u0440\u044B\u0442\u0438\u0435\xBB \u043F\u0440\u043E\u0442\u0438\u0432 \u043F\u043E\u0434\u0431\u043E\u0440\u0430 \u043A\u043E\u0434\u043E\u0432",
"\u0421\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u043A\u043B\u044E\u0447\u0438 \u043B\u0438\u0447\u043D\u043E\u0441\u0442\u0438 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435, \u044D\u0444\u0435\u043C\u0435\u0440\u043D\u044B\u0435 \u043F\u043E \u0437\u0430\u043C\u044B\u0441\u043B\u0443",
"\u041F\u043E\u0434\u043F\u0438\u0441\u0430\u043D\u043D\u043E\u0435 \u0447\u043B\u0435\u043D\u0441\u0442\u0432\u043E \u0441 \u0443\u043F\u043E\u0440\u044F\u0434\u043E\u0447\u0438\u0432\u0430\u043D\u0438\u0435\u043C \u043F\u043E \u044D\u043F\u043E\u0445\u0430\u043C",
"\u041F\u043E\u0434\u043F\u0438\u0441\u0430\u043D\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F - \u0440\u0430\u0441\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u0435 \u0432 \u0441\u0442\u0435\u043D\u043E\u0433\u0440\u0430\u043C\u043C\u0435 \u043C\u043E\u0436\u043D\u043E \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u044C",
"\u0411\u0435\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0431\u0435\u0437 \u043E\u0431\u0449\u0435\u0433\u043E \u043A\u043B\u044E\u0447\u0430 \u0433\u0440\u0443\u043F\u043F\u044B, \u0431\u0435\u0437 \u0438\u0441\u0442\u043E\u0440\u0438\u0438"
],
"roadmap.r10.title": "Mobile Edition",
"roadmap.r10.sub": "\u041E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0434\u043B\u044F iOS \u0438 Android",
"roadmap.r10.date": "II \u043A\u0432\u0430\u0440\u0442\u0430\u043B 2027",
"roadmap.r10.features": [
"\u041F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0434\u043B\u044F iOS (Swift/SwiftUI)",
"\u041F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0434\u043B\u044F Android (Kotlin/Jetpack Compose)",
"\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0430 PWA \u0432 \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u0445 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u0445",
"Push-\u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u0432 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438",
"\u041E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u044F \u0440\u0430\u0441\u0445\u043E\u0434\u0430 \u0431\u0430\u0442\u0430\u0440\u0435\u0438",
"\u0418\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043F\u0440\u0438\u0441\u043F\u043E\u0441\u043E\u0431\u043B\u0435\u043D\u043D\u044B\u0439 \u043A \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C",
"\u041E\u0447\u0435\u0440\u0435\u0434\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u043E\u0444\u043B\u0430\u0439\u043D",
"\u0411\u0438\u043E\u043C\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F"
],
"roadmap.r11.title": "\u0421\u0442\u043E\u0439\u043A\u043E\u0441\u0442\u044C \u043A \u043A\u0432\u0430\u043D\u0442\u043E\u0432\u044B\u043C \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F\u043C",
"roadmap.r11.sub": "\u0417\u0430\u0449\u0438\u0442\u0430 \u043E\u0442 \u043A\u0432\u0430\u043D\u0442\u043E\u0432\u044B\u0445 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u043E\u0432",
"roadmap.r11.date": "IV \u043A\u0432\u0430\u0440\u0442\u0430\u043B 2027",
"roadmap.r11.features": [
"\u041F\u043E\u0441\u0442\u043A\u0432\u0430\u043D\u0442\u043E\u0432\u0430\u044F \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u044F CRYSTALS-Kyber",
"\u0426\u0438\u0444\u0440\u043E\u0432\u044B\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u0438 SPHINCS+",
"\u0413\u0438\u0431\u0440\u0438\u0434\u043D\u0430\u044F \u0441\u0445\u0435\u043C\u0430: \u043A\u043B\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0438 \u043F\u043E\u0441\u0442\u043A\u0432\u0430\u043D\u0442\u043E\u0432\u0430\u044F",
"\u041A\u0432\u0430\u043D\u0442\u043E\u0432\u043E \u0441\u0442\u043E\u0439\u043A\u0438\u0439 \u043E\u0431\u043C\u0435\u043D \u043A\u043B\u044E\u0447\u0430\u043C\u0438",
"\u041E\u0431\u043D\u043E\u0432\u043B\u0451\u043D\u043D\u044B\u0435 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u044B \u0445\u0435\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
"\u041C\u0438\u0433\u0440\u0430\u0446\u0438\u044F \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0445 \u0441\u0435\u0430\u043D\u0441\u043E\u0432",
"\u0421\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C \u0441 v5.x",
"\u041A\u0432\u0430\u043D\u0442\u043E\u0432\u043E \u0441\u0442\u043E\u0439\u043A\u0438\u0435 \u043F\u0440\u043E\u0442\u043E\u043A\u043E\u043B\u044B"
],
"roadmap.r12.title": "\u0414\u0435\u0446\u0435\u043D\u0442\u0440\u0430\u043B\u0438\u0437\u043E\u0432\u0430\u043D\u043D\u0430\u044F \u0441\u0435\u0442\u044C",
"roadmap.r12.sub": "\u041F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E \u0434\u0435\u0446\u0435\u043D\u0442\u0440\u0430\u043B\u0438\u0437\u043E\u0432\u0430\u043D\u043D\u0430\u044F \u0441\u0435\u0442\u044C",
"roadmap.r12.date": "2028",
"roadmap.r12.features": [
"\u042F\u0447\u0435\u0438\u0441\u0442\u0430\u044F \u0441\u0435\u0442\u044C \u0443\u0437\u043B\u043E\u0432",
"DHT \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432",
"\u0412\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u0430\u044F \u043B\u0443\u043A\u043E\u0432\u0430\u044F \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044F",
"\u0422\u043E\u043A\u0435\u043D\u043E\u043C\u0438\u043A\u0430 \u0438 \u0441\u0442\u0438\u043C\u0443\u043B\u044B \u0434\u043B\u044F \u0443\u0437\u043B\u043E\u0432",
"\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 DAO",
"\u0412\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u0441\u0435\u0442\u044F\u043C\u0438",
"\u0421\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C \u043C\u0435\u0436\u0434\u0443 \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u0430\u043C\u0438",
"\u0421\u0430\u043C\u043E\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u044E\u0449\u0430\u044F\u0441\u044F \u0441\u0435\u0442\u044C"
],
"roadmap.r13.title": "\u0418\u0418-\u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A \u043F\u043E \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0438",
"roadmap.r13.sub": "\u0418\u0441\u043A\u0443\u0441\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u043B\u043B\u0435\u043A\u0442 \u0434\u043B\u044F \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u0438 \u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438",
"roadmap.r13.date": "2028+",
"roadmap.r13.features": [
"\u041B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0439 \u0430\u043D\u0430\u043B\u0438\u0437 \u0443\u0433\u0440\u043E\u0437 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0418\u0418",
"\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u0438\u0435 \u0430\u0442\u0430\u043A \xAB\u0447\u0435\u043B\u043E\u0432\u0435\u043A \u043F\u043E\u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0435\xBB",
"\u0410\u0434\u0430\u043F\u0442\u0438\u0432\u043D\u0430\u044F \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u044F",
"\u041F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u0441\u043E\u0432\u0435\u0442\u044B \u043F\u043E \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438",
"\u041C\u0430\u0448\u0438\u043D\u043D\u043E\u0435 \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435 \u0441 \u043D\u0443\u043B\u0435\u0432\u044B\u043C \u0440\u0430\u0437\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435\u043C",
"\u041F\u0440\u0438\u0432\u0430\u0442\u043D\u044B\u0439 \u0418\u0418-\u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A",
"\u041F\u0440\u0435\u0434\u0441\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u044C",
"\u0410\u0432\u0442\u043E\u043D\u043E\u043C\u043D\u0430\u044F \u0437\u0430\u0449\u0438\u0442\u0430 \u043E\u0442 \u0430\u0442\u0430\u043A"
],
"handshake.step1": "\u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u043F\u0430\u0440\u044B \u043A\u043B\u044E\u0447\u0435\u0439 ECDH P-384",
"handshake.step2": "\u0412\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u0435 \u043A\u043E\u0434\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438",
"handshake.step3": "\u0417\u0430\u043A\u0440\u0435\u043F\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u044F\u043C\u043E\u0439 \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u0438",
"handshake.securingTitle": "\u0417\u0430\u0449\u0438\u0449\u0430\u0435\u043C \u0432\u0430\u0448 \u043A\u0430\u043D\u0430\u043B",
"handshake.answerTitle": "\u0413\u043E\u0442\u043E\u0432\u0438\u043C \u0432\u0430\u0448 \u043E\u0442\u0432\u0435\u0442",
"handshake.securingDesc": "\u0421\u043E\u0437\u0434\u0430\u0451\u043C \u043A\u043B\u044E\u0447\u0438, \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u044B\u0435 \u0432\u044B\u0434\u0435\u0440\u0436\u0430\u0442\u044C \u0432\u043C\u0435\u0448\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u043E.",
"handshake.shareTitle": "\u041F\u043E\u0434\u0435\u043B\u0438\u0442\u0435\u0441\u044C \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435\u043C",
"handshake.sendAnswerTitle": "\u041E\u0442\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u043E\u0442\u0432\u0435\u0442 \u043E\u0431\u0440\u0430\u0442\u043D\u043E",
"handshake.shareDesc": "\u041F\u043E\u043A\u0430\u0436\u0438\u0442\u0435 QR-\u043A\u043E\u0434 \u0438\u043B\u0438 \u043E\u0442\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u043A\u043E\u0434 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0443. \u041E\u043D \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u044B\u0439 \u0438 \u0441\u043A\u043E\u0440\u043E \u0441\u0442\u0430\u043D\u0435\u0442 \u043D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u043C.",
"handshake.sendAnswerDesc": "\u041F\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 \u044D\u0442\u043E\u0442 \u043E\u0442\u0432\u0435\u0442 \u0441\u043E\u0437\u0434\u0430\u0442\u0435\u043B\u044E \u043A\u0430\u043D\u0430\u043B\u0430, \u0447\u0442\u043E\u0431\u044B \u043E\u043D \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B \u0440\u0443\u043A\u043E\u043F\u043E\u0436\u0430\u0442\u0438\u0435.",
"handshake.establish": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435",
"handshake.thenReceive": "\u0417\u0430\u0442\u0435\u043C \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u0435 \u043E\u0442\u0432\u0435\u0442, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043F\u0440\u0438\u0448\u043B\u0451\u0442 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A",
"handshake.pasteAnswerPlaceholder": "\u0412\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043A\u043E\u0434 \u043E\u0442\u0432\u0435\u0442\u0430 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430\u2026",
"handshake.answerSentNote": "\u041E\u0442\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u044D\u0442\u043E\u0442 \u043E\u0442\u0432\u0435\u0442 \u0441\u043E\u0437\u0434\u0430\u0442\u0435\u043B\u044E \u0438 \u043F\u043E\u0434\u043E\u0436\u0434\u0438\u0442\u0435 - \u0447\u0430\u0442 \u043E\u0442\u043A\u0440\u043E\u0435\u0442\u0441\u044F, \u043A\u0430\u043A \u0442\u043E\u043B\u044C\u043A\u043E \u043E\u043D \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0441\u044F.",
"handshake.qrHint": "\u0414\u0435\u0440\u0436\u0438\u0442\u0435 \u044D\u0442\u043E \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C, \u043F\u043E\u043A\u0430 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A \u043D\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043A\u043E\u0434.",
"handshake.qrHintFrames": "\u0420\u0443\u043A\u043E\u043F\u043E\u0436\u0430\u0442\u0438\u0435 \u0440\u0430\u0437\u0431\u0438\u0442\u043E \u043D\u0430 {frames} \u043A\u0430\u0434\u0440\u043E\u0432 - \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u044D\u0442\u043E \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C, \u043F\u043E\u043A\u0430 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A \u043D\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0432\u0441\u0435.",
"verify.title": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438",
"verify.desc": "\u0421\u0432\u0435\u0440\u044C\u0442\u0435 \u044D\u0442\u043E\u0442 \u043A\u043E\u0434 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u0441 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u043E\u043C \u043F\u043E \u0434\u0440\u0443\u0433\u043E\u043C\u0443 \u043A\u0430\u043D\u0430\u043B\u0443 (\u0433\u043E\u043B\u043E\u0441\u043E\u043C \u0438\u043B\u0438 \u043B\u0438\u0447\u043D\u043E), \u0437\u0430\u0442\u0435\u043C \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0435\u0433\u043E, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442.",
"verify.enterLabel": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u0432\u0435\u0440\u0435\u043D\u043D\u044B\u0439 \u043A\u043E\u0434",
"verify.placeholder": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u0434 \u0437\u0434\u0435\u0441\u044C",
"verify.confirm": "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u043A\u043E\u0434",
"verify.confirmed": "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u043E",
"verify.mismatch": "\u041D\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0442",
"verify.yours": "\u0412\u0430\u0448\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435",
"verify.peer": "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430",
"verify.pending": "\u041E\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044F",
"verify.waiting": "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043A\u043E\u0434\u0430\u2026",
"verify.verified": "\u041A\u0430\u043D\u0430\u043B \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D",
"verify.bothConfirmed": "\u041E\u0431\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438. \u041E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u043C \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u0447\u0430\u0442\u2026",
"pwa.bannerTitle": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0435 SecureBit.chat",
"pwa.bannerDesc": "\u041E\u043F\u044B\u0442 \u043F\u043E\u043B\u043D\u043E\u0446\u0435\u043D\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0441 \u0443\u0441\u0438\u043B\u0435\u043D\u043D\u043E\u0439 \u0437\u0430\u0449\u0438\u0442\u043E\u0439",
"pwa.install": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C",
"pwa.dismiss": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
"pwa.close": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
"pwa.iosTitle": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u043D\u0430 iOS",
"pwa.iosStep1": "\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043D\u043E\u043F\u043A\u0443 \xAB\u041F\u043E\u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F\xBB",
"pwa.iosStep1Hint": "\u041E\u0431\u044B\u0447\u043D\u043E \u0432\u043D\u0438\u0437\u0443 Safari",
"pwa.iosStep2": "\u041D\u0430\u0439\u0434\u0438\u0442\u0435 \xAB\u041D\u0430 \u044D\u043A\u0440\u0430\u043D \xAB\u0414\u043E\u043C\u043E\u0439\xBB\xBB",
"pwa.iosStep2Hint": "\u041F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u0435 \u043C\u0435\u043D\u044E \xAB\u041F\u043E\u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F\xBB \u0432\u043D\u0438\u0437",
"pwa.iosStep3": "\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \xAB\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C\xBB",
"pwa.iosStep3Hint": "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C SecureBit.chat",
"pwa.genericTitle": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C SecureBit",
"pwa.genericDesc": "\u041A\u0430\u0436\u0434\u044B\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0443\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442 \u043F\u043E-\u0441\u0432\u043E\u0435\u043C\u0443. \u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0433\u0438, \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0432\u0430\u0448\u0435\u043C\u0443.",
"pwa.gotIt": "\u041F\u043E\u043D\u044F\u0442\u043D\u043E",
"pwa.installedTitle": "\u041F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E!",
"pwa.installedIos": "\u041F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0434\u043B\u044F iOS \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! \u041E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u0435\u0433\u043E \u0441 \u044D\u043A\u0440\u0430\u043D\u0430 \xAB\u0414\u043E\u043C\u043E\u0439\xBB.",
"pwa.installedGeneric": "SecureBit.chat \u0442\u0435\u043F\u0435\u0440\u044C \u043D\u0430 \u0432\u0430\u0448\u0435\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435",
"pwa.anytimeTitle": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0432 \u043B\u044E\u0431\u043E\u0439 \u043C\u043E\u043C\u0435\u043D\u0442",
"pwa.anytimeDesc": "\u0412\u044B \u0432\u0441\u0435\u0433\u0434\u0430 \u043C\u043E\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C SecureBit.chat \u0438\u0437 \u043C\u0435\u043D\u044E \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 - \u0442\u0430\u043A \u043E\u043D \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043B\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043E.",
"pwa.ok": "\u0425\u043E\u0440\u043E\u0448\u043E",
"step.open": "\u0428\u0430\u0433 1 \xB7 \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043A\u0430\u043D\u0430\u043B",
"step.exchange": "\u0428\u0430\u0433 2 \xB7 \u043E\u0431\u043C\u0435\u043D",
"step.verification": "\u0428\u0430\u0433 3 \xB7 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430",
"action.create": "\u0421\u043E\u0437\u0434\u0430\u0442\u044C",
"action.join": "\u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C\u0441\u044F",
"action.back": "\u041D\u0430\u0437\u0430\u0434",
"action.copy": "\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
"action.copied": "\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E",
"action.scan": "\u0421\u043A\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
"action.downloadDesktop": "\u0421\u043A\u0430\u0447\u0430\u0442\u044C \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435",
"action.advancedSettings": "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",
"cred.offerTag": "\u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \xB7 \u0438\u043B\u0438 \u0441\u043A\u043E\u043F\u0438\u0440\u0443\u0439\u0442\u0435 \u0442\u0435\u043A\u0441\u0442",
"cred.answerTag": "\u043E\u0442\u0432\u0435\u0442 \xB7 \u0438\u043B\u0438 \u0441\u043A\u043E\u043F\u0438\u0440\u0443\u0439\u0442\u0435 \u0442\u0435\u043A\u0441\u0442",
"cred.reveal": "\u041D\u0430\u0436\u043C\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C - \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u044D\u0442\u043E\u0442 \u043A\u043E\u0434 \u0432 \u0442\u0430\u0439\u043D\u0435",
"qr.title": "\u0421\u043A\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C QR-\u043A\u043E\u0434",
"qr.subtitle": "\u041D\u0430\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u0443 \u043D\u0430 \u0438\u0445 QR-\u043A\u043E\u0434",
"qr.scanning": "\u0421\u043A\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u2026",
"qr.hint": "\u0414\u0435\u0440\u0436\u0438\u0442\u0435 \u0440\u043E\u0432\u043D\u043E, \u043F\u043E\u043A\u0430 \u043D\u0435 \u0441\u0447\u0438\u0442\u0430\u044E\u0442\u0441\u044F \u0432\u0441\u0435 \u0447\u0430\u0441\u0442\u0438. \u041A\u0430\u043C\u0435\u0440\u0430 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E - \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F.",
"mesh.you": "\u0432\u044B",
"mesh.peer": "\u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A \xB7 \u0441\u0435\u0430\u043D\u0441 1",
"mesh.joined2": "\u043B\u0435\u043D\u0430 \u043F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u043B\u0430\u0441\u044C \xB7 +2",
"mesh.joined3": "\u043C\u0438\u0448\u0430 \u043F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u043B\u0441\u044F \xB7 +3",
"ice.title": "\u0421\u0435\u0442\u0435\u0432\u044B\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",
"ice.subtitle": "\u041D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E - \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u043F\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044F \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0443",
"ice.intro": "\u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E SecureBit \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 STUN-\u0441\u0435\u0440\u0432\u0435\u0440\u044B, \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u0442\u044C \u043F\u0440\u044F\u043C\u043E\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435. \u0415\u0441\u043B\u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0441\u0432\u043E\u0438, \u0443\u043A\u0430\u0436\u0438\u0442\u0435 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 STUN/TURN.",
"ice.publicTitle": "\u041F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044B (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E)",
"ice.publicDesc": "\u0411\u0435\u0437 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438. \u041F\u043E\u0434\u0445\u043E\u0434\u0438\u0442 \u0431\u043E\u043B\u044C\u0448\u0438\u043D\u0441\u0442\u0432\u0443.",
"ice.customTitle": "\u0421\u0432\u043E\u0438 STUN/TURN-\u0441\u0435\u0440\u0432\u0435\u0440\u044B",
"ice.customDesc": "\u0414\u043E {max} \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u0432.",
"ice.turnNote": "TURN-relay \u0432\u0438\u0434\u0438\u0442 IP \u043E\u0431\u0435\u0438\u0445 \u0441\u0442\u043E\u0440\u043E\u043D \u0438 \u0440\u0438\u0442\u043C \u0442\u0440\u0430\u0444\u0438\u043A\u0430 - \u043D\u043E \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u043C \u0441\u043A\u0432\u043E\u0437\u043D\u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C. \u041B\u0443\u0447\u0448\u0435 ",
"ice.turnNoteTls": " (TLS).",
"ice.test": "\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u0441\u0435\u0440\u0432\u0435\u0440\u044B",
"ice.testing": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430\u2026",
"ice.relayTitle": "\u0420\u0435\u0436\u0438\u043C \u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0435\u0440\u0435\u0437 relay",
"ice.relayBadge": "\u041C\u0410\u041A\u0421\u0418\u041C\u0423\u041C \u041F\u0420\u0418\u0412\u0410\u0422\u041D\u041E\u0421\u0422\u0418",
"ice.relayDesc": "\u041F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442 \u0432\u0435\u0441\u044C \u0442\u0440\u0430\u0444\u0438\u043A \u0447\u0435\u0440\u0435\u0437 TURN, \u0442\u0430\u043A \u0447\u0442\u043E \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 \u0432\u0430\u0448\u0435\u0433\u043E IP. \u041D\u0443\u0436\u0435\u043D TURN-\u0441\u0435\u0440\u0432\u0435\u0440.",
"ice.relayWarning": "\u0420\u0435\u0436\u0438\u043C \u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0435\u0440\u0435\u0437 relay \u0432\u043A\u043B\u044E\u0447\u0451\u043D, \u043D\u043E TURN-\u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D. \u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043D\u0435 \u0441\u043C\u043E\u0436\u0435\u0442 \u043D\u0430\u0447\u0430\u0442\u044C\u0441\u044F.",
"ice.persist": "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u043D\u0430 \u044D\u0442\u043E\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435",
"ice.persistDesc": "\u0425\u0440\u0430\u043D\u0438\u0442\u0441\u044F \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u043E \u0432 \u044D\u0442\u043E\u043C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435. \u041E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u0434\u0435\u0439\u0441\u0442\u0432\u043E\u0432\u0430\u043B\u043E \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u044D\u0442\u043E\u043C \u0441\u0435\u0430\u043D\u0441\u0435.",
"ice.forget": "\u0417\u0430\u0431\u044B\u0442\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u043E\u0435",
"ice.cancel": "\u041E\u0442\u043C\u0435\u043D\u0430",
"ice.apply": "\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C",
"ice.errUnavailable": "WebRTC \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0432 \u044D\u0442\u043E\u043C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435",
"ice.errInvalid": "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u0441\u0435\u0440\u0432\u0435\u0440\u0430",
"update.title": "\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435",
"update.desc": "\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u0430 \u0431\u043E\u043B\u0435\u0435 \u043D\u043E\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F SecureBit.",
"update.currentVersion": "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F",
"update.newVersion": "\u041D\u043E\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F",
"update.now": "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0441\u0435\u0439\u0447\u0430\u0441",
"update.later": "\u041F\u043E\u0437\u0436\u0435",
"update.unknown": "\u043D/\u0434",
"update.stepSaving": "\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u0434\u0430\u043D\u043D\u044B\u0445\u2026",
"update.stepSwCaches": "\u041E\u0447\u0438\u0441\u0442\u043A\u0430 \u043A\u0435\u0448\u0435\u0439 Service Worker\u2026",
"update.stepSwUnregister": "\u041E\u0442\u043C\u0435\u043D\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 Service Worker\u2026",
"update.stepBrowserCache": "\u041E\u0447\u0438\u0441\u0442\u043A\u0430 \u043A\u0435\u0448\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u2026",
"update.stepVersion": "\u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438\u2026",
"update.stepReload": "\u041F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u2026",
"update.error": "\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F. \u041F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0432\u0440\u0443\u0447\u043D\u0443\u044E (Ctrl+F5 \u0438\u043B\u0438 Cmd+Shift+R)",
"update.confirmSkip": "\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u043D\u043E\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F. \u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F \u0434\u043B\u044F \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u0438 \u0441\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u043E\u0441\u0442\u0438. \u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0431\u0435\u0437 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F?",
"offline.backOnline": "\u0421\u043D\u043E\u0432\u0430 \u043E\u043D\u043B\u0430\u0439\u043D",
"offline.mode": "\u0420\u0435\u0436\u0438\u043C \u043E\u0444\u043B\u0430\u0439\u043D",
"offline.dismiss": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
"offline.lostTitle": "\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043F\u043E\u0442\u0435\u0440\u044F\u043D\u043E",
"offline.lostDesc": "SecureBit \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043E\u0444\u043B\u0430\u0439\u043D. \u041A\u043E\u0435-\u0447\u0442\u043E \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u043E, \u043D\u043E \u0432\u0430\u0448\u0438 \u0434\u0430\u043D\u043D\u044B\u0435 \u0432 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438.",
"offline.point1": "\u0412\u0430\u0448 \u0441\u0435\u0430\u043D\u0441 \u0438 \u043A\u043B\u044E\u0447\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u044B",
"offline.point2": "\u041D\u0438\u043A\u0430\u043A\u0438\u0445 \u0434\u0430\u043D\u043D\u044B\u0445 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445",
"offline.point3": "\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0438 \u0444\u0430\u0439\u043B\u044B \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u044F\u0437\u0438",
"offline.continue": "\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u043E\u0444\u043B\u0430\u0439\u043D",
"offline.restoredTitle": "\u041A\u043E\u0433\u0434\u0430 \u0441\u0432\u044F\u0437\u044C \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0441\u044F",
"offline.restoredDesc": "\u041E\u0431\u0440\u044B\u0432 \u0441\u0432\u044F\u0437\u0438 \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u0441\u0442\u043E\u0438\u0442. SecureBit \u0441\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u0432\u0441\u0451 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u0432 \u043E\u0447\u0435\u0440\u0435\u0434\u044C \u0438 \u0432\u043E\u0437\u043E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0441\u0435\u0430\u043D\u0441, \u043A\u0430\u043A \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u044B \u0441\u043D\u043E\u0432\u0430 \u043E\u043D\u043B\u0430\u0439\u043D.",
"offline.r1Title": "\u0412\u0430\u0448\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0434\u043E\u0439\u0434\u0443\u0442",
"offline.r1Desc": "\u0412\u0441\u0451, \u0447\u0442\u043E \u0432\u044B \u043D\u0430\u043F\u0438\u0441\u0430\u043B\u0438 \u043E\u0444\u043B\u0430\u0439\u043D, \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0443 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.",
"offline.r2Title": "\u0424\u0430\u0439\u043B\u044B \u0434\u043E\u0437\u0430\u0433\u0440\u0443\u0437\u044F\u0442\u0441\u044F",
"offline.r2Desc": "\u041F\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u0441\u044F \u0441 \u043C\u0435\u0441\u0442\u0430 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438 - \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u0437\u0430\u043D\u043E\u0432\u043E \u043D\u0435 \u043D\u0443\u0436\u043D\u043E.",
"offline.r3Title": "\u0418\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0438 \u0444\u0430\u0439\u043B\u044B \u043F\u0440\u0438\u0434\u0443\u0442",
"offline.r3Desc": "\u0412\u0441\u0451, \u0447\u0442\u043E \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u043B \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u0435\u0440\u0435\u0440\u044B\u0432\u0430, \u043F\u0440\u0438\u0434\u0451\u0442 \u0432\u0430\u043C \u043F\u043E \u043F\u043E\u0440\u044F\u0434\u043A\u0443.",
"offline.r4Title": "\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u0442\u0435\u0440\u044F\u0435\u0442\u0441\u044F",
"offline.r4Desc": "\u041F\u043E\u0441\u043B\u0435 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u044F\u0437\u0438 \u0440\u0430\u0437\u0440\u044B\u0432\u0430 \u043D\u0435 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F - \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0435\u0442\u0441\u044F \u0440\u043E\u0432\u043D\u043E \u0441 \u0442\u043E\u0433\u043E \u043C\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u043B\u0441\u044F.",
"offline.gotIt": "\u041F\u043E\u043D\u044F\u0442\u043D\u043E",
"qr.showTitle": "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C QR-\u043A\u043E\u0434",
"qr.showSubtitle": "\u041D\u0430 \u0432\u0435\u0441\u044C \u044D\u043A\u0440\u0430\u043D \xB7 \u043F\u0443\u0441\u0442\u044C \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A \u043E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0435\u0442",
"qr.showSubtitleFrames": "\u041D\u0430 \u0432\u0435\u0441\u044C \u044D\u043A\u0440\u0430\u043D \xB7 \u043F\u0443\u0441\u0442\u044C \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A \u043E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 {frames} \u043A\u0430\u0434\u0440\u043E\u0432",
"notify.enabledBody": "\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u044B. \u0412\u044B \u0431\u0443\u0434\u0435\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u043E\u043F\u043E\u0432\u0435\u0449\u0435\u043D\u0438\u044F \u043E \u043D\u043E\u0432\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\u0445.",
"notify.workingBody": "\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442. \u0412\u044B \u0431\u0443\u0434\u0435\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u043E\u043F\u043E\u0432\u0435\u0449\u0435\u043D\u0438\u044F \u043E \u043D\u043E\u0432\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\u0445.",
"pw.label": "\u041F\u043E\u043B\u0435 \u043F\u0430\u0440\u043E\u043B\u044F",
"pw.placeholder": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043F\u0430\u0440\u043E\u043B\u044C\u2026",
"pw.decrypt": "\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u0442\u044C",
"pw.cancel": "\u041E\u0442\u043C\u0435\u043D\u0430",
"file.title": "\u041F\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0444\u0430\u0439\u043B\u043E\u0432",
"file.drop": "\u041F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B\u044B \u0441\u044E\u0434\u0430",
"file.dropHint": "\u0428\u0438\u0444\u0440\u0443\u044E\u0442\u0441\u044F \u0441\u043A\u0432\u043E\u0437\u043D\u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C \u043F\u0435\u0440\u0435\u0434 \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \xB7 \u0434\u043E 100 \u041C\u0411",
"file.browse": "\u041E\u0431\u0437\u043E\u0440 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430",
"file.incoming": "\u0412\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u0444\u0430\u0439\u043B",
"file.accept": "\u041F\u0440\u0438\u043D\u044F\u0442\u044C",
"file.reject": "\u041E\u0442\u043A\u043B\u043E\u043D\u0438\u0442\u044C",
"file.download": "\u0421\u043A\u0430\u0447\u0430\u0442\u044C",
"file.notReady": "\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u0435\u0449\u0451 \u043D\u0435 \u0433\u043E\u0442\u043E\u0432\u043E",
"file.tooLarge": "\u0424\u0430\u0439\u043B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0439",
"file.typeNotAllowed": "\u0422\u0438\u043F \u0444\u0430\u0439\u043B\u0430 \u043D\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D",
"file.maxConcurrent": "\u0414\u043E\u0441\u0442\u0438\u0433\u043D\u0443\u0442 \u043F\u0440\u0435\u0434\u0435\u043B \u043E\u0434\u043D\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0445 \u043F\u0435\u0440\u0435\u0434\u0430\u0447",
"file.gone": "\u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0434\u043B\u044F \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u044F.",
"call.incoming": "\u0412\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u0437\u0432\u043E\u043D\u043E\u043A",
"call.incomingVideo": "\u0412\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u0432\u0438\u0434\u0435\u043E\u0437\u0432\u043E\u043D\u043E\u043A",
"call.encrypted": "\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0437\u0432\u043E\u043D\u043E\u043A",
"call.encryptedShort": "\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E",
"call.peer": "\u0417\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A",
"call.connecting": "\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435\u2026",
"call.ringing": "\u0412\u044B\u0437\u043E\u0432\u2026",
"call.accept": "\u041F\u0440\u0438\u043D\u044F\u0442\u044C",
"call.decline": "\u041E\u0442\u043A\u043B\u043E\u043D\u0438\u0442\u044C",
"call.end": "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u0437\u0432\u043E\u043D\u043E\u043A",
"call.camera": "\u041A\u0430\u043C\u0435\u0440\u0430",
"call.cameraOff": "\u041A\u0430\u043C\u0435\u0440\u0430 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0430",
"call.peerCameraOff": "\u041A\u0430\u043C\u0435\u0440\u0430 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0430",
"call.flipCamera": "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u0430\u043C\u0435\u0440\u0443",
"call.addVideo": "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432\u0438\u0434\u0435\u043E",
"call.video": "\u0412\u0438\u0434\u0435\u043E",
"call.muted": "\u0411\u0435\u0437 \u0437\u0432\u0443\u043A\u0430",
"call.expand": "\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C",
"call.minimize": "\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C",
"call.quality": "\u041A\u0430\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F",
"call.qualityExcellent": "\u041E\u0442\u043B\u0438\u0447\u043D\u043E\u0435",
"call.videoPrefix": "\u0412\u0438\u0434\u0435\u043E \xB7 ",
"call.voicePrefix": "\u0413\u043E\u043B\u043E\u0441 \xB7 ",
"group.new": "\u041D\u043E\u0432\u0430\u044F \u0433\u0440\u0443\u043F\u043F\u0430",
"group.create": "\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0433\u0440\u0443\u043F\u043F\u0443",
"group.join": "\u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C\u0441\u044F \u043A \u0433\u0440\u0443\u043F\u043F\u0435",
"group.name": "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B",
"group.nameTooLong": "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0434\u043B\u0438\u043D\u043D\u043E\u0435.",
"group.capacity": "\u0414\u043E {max} \u0447\u0435\u043B\u043E\u0432\u0435\u043A, \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E \u043C\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430\u043C\u0438. \u0412\u0441\u0435 \u0441\u0432\u0435\u0440\u044F\u0442 \u043E\u0434\u0438\u043D \u043A\u043E\u0434 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0433\u0440\u0443\u043F\u043F\u0430 \u043E\u0442\u043A\u0440\u043E\u0435\u0442\u0441\u044F.",
"group.invite": "\u041F\u0440\u0438\u0433\u043B\u0430\u0441\u0438\u0442\u044C",
"group.inviteMore": "\u041F\u0440\u0438\u0433\u043B\u0430\u0441\u0438\u0442\u044C \u0435\u0449\u0451 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432",
"group.invitePeople": "\u041F\u0440\u0438\u0433\u043B\u0430\u0441\u0438\u0442\u044C {count} \u0447\u0435\u043B\u043E\u0432\u0435\u043A",
"group.invitation": "\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u0432 \u0433\u0440\u0443\u043F\u043F\u0443",
"group.addMembers": "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432",
"group.roomFor": "\u0415\u0441\u0442\u044C \u043C\u0435\u0441\u0442\u043E \u0435\u0449\u0451 \u0434\u043B\u044F {remaining}. \u041F\u043E\u0441\u043B\u0435 \u043F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u0432\u0441\u0435 \u0441\u0432\u0435\u0440\u044F\u0442 \u043D\u043E\u0432\u044B\u0439 \u043A\u043E\u0434 \u0433\u0440\u0443\u043F\u043F\u044B.",
"group.membersCount": "{count} \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432",
"group.member": "\u0423\u0447\u0430\u0441\u0442\u043D\u0438\u043A",
"group.members": "\u0423\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438",
"group.remove": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C {name}",
"group.message": "\u041D\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0432 \xAB{name}\xBB",
"group.leave": "\u0412\u044B\u0439\u0442\u0438",
"group.leaveThis": "\u0412\u044B\u0439\u0442\u0438 \u0438\u0437 \u044D\u0442\u043E\u0439 \u0433\u0440\u0443\u043F\u043F\u044B",
"group.cancel": "\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0433\u0440\u0443\u043F\u043F\u0443",
"group.close": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
"group.cancelBtn": "\u041E\u0442\u043C\u0435\u043D\u0430",
"group.decline": "\u041E\u0442\u043A\u043B\u043E\u043D\u0438\u0442\u044C",
"group.working": "\u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F\u2026",
"group.sasTitle": "\u041A\u043E\u0434 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u0433\u0440\u0443\u043F\u043F\u044B",
"group.sasEveryone": "\u042D\u0442\u043E\u0442 \u043A\u043E\u0434 \u0432\u0438\u0434\u044F\u0442 \u0432\u0441\u0435",
"group.sasCompare": "\u0421\u0432\u0435\u0440\u044C\u0442\u0435 \u043A\u043E\u0434 \u0433\u0440\u0443\u043F\u043F\u044B \u0441 \u043A\u0430\u0436\u0434\u044B\u043C \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u043C, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0433\u0440\u0443\u043F\u043F\u0443.",
"group.sasReadAloud": "\u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u044D\u0442\u0438 \u0446\u0438\u0444\u0440\u044B \u0432\u0441\u043B\u0443\u0445 \u0434\u043B\u044F ",
"group.sasWarning": "\u0415\u0441\u043B\u0438 \u0445\u043E\u0442\u044F \u0431\u044B \u043E\u0434\u0438\u043D \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A \u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u043E\u0439 \u043A\u043E\u0434, \u043C\u0435\u0436\u0434\u0443 \u0432\u0430\u043C\u0438 \u043A\u0442\u043E-\u0442\u043E \u0435\u0441\u0442\u044C. \u041E\u0442\u043C\u0435\u043D\u0438\u0442\u0435 \u0433\u0440\u0443\u043F\u043F\u0443 - \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0439\u0442\u0435.",
"group.confirmFirst": "\u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043A\u043E\u0434 \u0433\u0440\u0443\u043F\u043F\u044B",
"group.codeSuffix": " \xB7 \u043A\u043E\u0434 {code}",
"group.exchangingNonces": "\u041E\u0431\u043C\u0435\u043D \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u044B\u043C\u0438 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F\u043C\u0438\u2026",
"group.waitingCommit": "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432 \u043E\u0442 \u0432\u0441\u0435\u0445 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432\u2026",
"group.waitingJoin": "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0445 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432\u2026",
"group.emptyChat": "\u0417\u0434\u0435\u0441\u044C \u043F\u043E\u043A\u0430 \u043D\u0438\u0447\u0435\u0433\u043E. \u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u0430\u043D\u044B \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u0435\u043B\u0435\u043C \u0438 \u0438\u0434\u0443\u0442 \u043F\u043E \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C\u0443 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u043C\u0443 \u043A\u0430\u043D\u0430\u043B\u0443 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430.",
"group.noVerified": "\u041F\u043E\u043A\u0430 \u043D\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043D\u044B\u0445 \u0447\u0430\u0442\u043E\u0432. \u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u0438 \u0441\u0432\u0435\u0440\u044C\u0442\u0435 \u0435\u0433\u043E \u043A\u043E\u0434 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 - \u0433\u0440\u0443\u043F\u043F\u0430 \u0441\u0442\u0440\u043E\u0438\u0442\u0441\u044F \u0438\u0437 \u0443\u0436\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043D\u044B\u0445 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0439.",
"group.noMoreToAdd": "\u0414\u0440\u0443\u0433\u0438\u0445 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043D\u044B\u0445 \u0447\u0430\u0442\u043E\u0432 \u043D\u0435\u0442. \u041E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u0438 \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0441\u0432\u0435\u0440\u044C\u0442\u0435 \u0435\u0433\u043E \u043A\u043E\u0434 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438.",
"group.directLink": "\u041F\u0440\u044F\u043C\u043E\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043C\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430\u043C\u0438",
"group.noDirectLink": "\u041F\u0440\u044F\u043C\u043E\u0433\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u0435\u0449\u0451 \u043D\u0435\u0442 - \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043F\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0434\u0440\u0443\u0433\u043E\u0439 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A, \u043F\u043E\u043A\u0430 \u043E\u043D\u043E \u0443\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442\u0441\u044F",
"group.relayNote": "\u0421 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u043C\u0438 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430\u043C\u0438 \u043F\u0440\u044F\u043C\u043E\u0433\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u0435\u0449\u0451 \u043D\u0435\u0442. \u0418\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0438\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 \u0434\u0440\u0443\u0433\u043E\u0433\u043E \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043E \u0432\u044B \u043E\u0431\u0449\u0430\u0435\u0442\u0435\u0441\u044C, \u043D\u043E \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u043D\u0438 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C, \u043D\u0438 \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0435. \u0413\u0440\u0443\u043F\u043F\u0430 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0435\u0442 \u0441\u043E\u0435\u0434\u0438\u043D\u044F\u0442\u044C \u0438\u0445 \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E.",
"group.relayOnlyOff": "\u0420\u0435\u0436\u0438\u043C \u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0435\u0440\u0435\u0437 relay \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043A\u0430\u0436\u0434\u044B\u0439 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A \u0441\u043E\u0435\u0434\u0438\u043D\u044F\u0435\u0442\u0441\u044F \u0441 \u0432\u0430\u043C\u0438 \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E \u0438 \u0443\u0437\u043D\u0430\u0451\u0442 \u0432\u0430\u0448 IP-\u0430\u0434\u0440\u0435\u0441 - \u0432 \u0442\u043E\u043C \u0447\u0438\u0441\u043B\u0435 \u0442\u0435, \u043A\u043E\u0433\u043E \u043F\u0440\u0438\u0433\u043B\u0430\u0441\u0438\u043B \u043A\u0442\u043E-\u0442\u043E \u0434\u0440\u0443\u0433\u043E\u0439. \u0412\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0435\u0433\u043E \u0432 \u0441\u0435\u0442\u0435\u0432\u044B\u0445 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445, \u0435\u0441\u043B\u0438 \u044D\u0442\u043E \u0432\u0430\u0436\u043D\u043E.",
"group.memberOffline": "{name} \u043E\u0444\u043B\u0430\u0439\u043D \u0438 \u043D\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439. \u0423\u0447\u0430\u0441\u0442\u0438\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F - \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u043F\u0435\u0440\u0435\u0432\u044B\u043F\u0443\u0441\u043A\u0430\u0435\u0442 \u043A\u043B\u044E\u0447\u0438 \u0433\u0440\u0443\u043F\u043F\u044B.",
"group.joinNote": "\u0414\u0440\u0443\u0433\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438 \u0443\u0437\u043D\u0430\u044E\u0442, \u0447\u0442\u043E \u0432\u044B \u0432 \u044D\u0442\u043E\u0439 \u0433\u0440\u0443\u043F\u043F\u0435. \u0418\u0441\u0442\u043E\u0440\u0438\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u043D\u0435\u0442 - \u0433\u0440\u0443\u043F\u043F\u0430 \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u043F\u0443\u0441\u0442\u043E\u0439.",
"group.inviteSentNote": "\u0413\u0440\u0443\u043F\u043F\u0430 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0434\u0430\u043B\u044C\u0448\u0435, \u043F\u043E\u043A\u0430 \u043E\u043D\u0438 \u043D\u0435 \u043F\u0440\u0438\u043C\u0443\u0442. \u0418\u0441\u0442\u043E\u0440\u0438\u0438 \u0434\u043B\u044F \u043D\u0438\u0445 \u043D\u0435\u0442 - \u043E\u043D\u0438 \u0443\u0432\u0438\u0434\u044F\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u043E, \u0447\u0442\u043E \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E \u0441 \u044D\u0442\u043E\u0433\u043E \u043C\u043E\u043C\u0435\u043D\u0442\u0430.",
"group.errNotCreated": "\u0413\u0440\u0443\u043F\u043F\u0430 \u043D\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u0430",
"group.errNobodyAccepted": "\u041D\u0438\u043A\u0442\u043E \u043D\u0435 \u043F\u0440\u0438\u043D\u044F\u043B \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u0432\u043E\u0432\u0440\u0435\u043C\u044F.",
"group.errNothingSent": "\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E \u0438 \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E. \u0417\u0430\u043A\u0440\u043E\u0439\u0442\u0435 \u044D\u0442\u043E \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0441\u043D\u043E\u0432\u0430, \u043A\u043E\u0433\u0434\u0430 \u0432\u0441\u0435 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0430\u0442\u0441\u044F.",
"group.errNotFormed": "\u042D\u0442\u0443 \u0433\u0440\u0443\u043F\u043F\u0443 \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u0442\u044C.",
"group.errFull": "\u042D\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0430.",
"group.errInviteFailed": "\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C - \u0442\u043E\u0442 \u0447\u0430\u0442 \u043D\u0435 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0451\u043D.",
"group.errNoMemberList": "\u0412\u043B\u0430\u0434\u0435\u043B\u0435\u0446 \u0433\u0440\u0443\u043F\u043F\u044B \u0442\u0430\u043A \u0438 \u043D\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u043B \u0441\u043F\u0438\u0441\u043E\u043A \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432.",
"group.errUnsignedList": "\u0421\u043F\u0438\u0441\u043E\u043A \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432 \u043D\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u0430\u043D \u0432\u043B\u0430\u0434\u0435\u043B\u044C\u0446\u0435\u043C \u0433\u0440\u0443\u043F\u043F\u044B. \u041D\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0439\u0442\u0435 - \u0441\u043A\u0430\u0436\u0438\u0442\u0435 \u0438\u043C.",
"group.errNotOwner": "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u043E\u0441\u0442\u0430\u0432 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432 \u043F\u044B\u0442\u0430\u043B\u0441\u044F \u043D\u0435 \u0432\u043B\u0430\u0434\u0435\u043B\u0435\u0446 \u0433\u0440\u0443\u043F\u043F\u044B.",
"hdr.tagline": "\u0421\u043A\u0432\u043E\u0437\u043D\u043E\u0435 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435",
"hdr.netSettings": "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0441\u0435\u0442\u0435\u0432\u044B\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",
"hdr.netSettingsTitle": "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0441\u0435\u0442\u0435\u0432\u044B\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 (STUN/TURN)",
"hdr.disconnect": "\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F",
"status.connected": "\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u043E",
"status.connecting": "\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435\u2026",
"status.notConnected": "\u041D\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u043E",
"status.reconnecting": "\u041F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435\u2026",
"status.retrying": "\u041F\u043E\u0432\u0442\u043E\u0440 \u043F\u043E\u043F\u044B\u0442\u043A\u0438\u2026",
"status.verifying": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430\u2026",
"status.peerDisconnected": "\u0421\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u043B\u0441\u044F",
"sec.replayProtection": "\u0417\u0430\u0449\u0438\u0442\u0430 \u043E\u0442 \u043F\u043E\u0432\u0442\u043E\u0440\u043E\u0432",
"sec.messageIntegrity": "\u0426\u0435\u043B\u043E\u0441\u0442\u043D\u043E\u0441\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 (HMAC)",
"sec.forwardSecrecy": "\u0421\u043E\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u0430\u044F \u043F\u0440\u044F\u043C\u0430\u044F \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u044C",
"sec.metadataProtection": "\u0417\u0430\u0449\u0438\u0442\u0430 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u0445",
"sec.trafficObfuscation": "\u041C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0442\u0440\u0430\u0444\u0438\u043A\u0430",
"sec.realTests": "\u041D\u0430\u0441\u0442\u043E\u044F\u0449\u0438\u0435 \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438",
"sec.simulatedData": "\u0421\u043C\u043E\u0434\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435",
"sec.testPassed": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u0430",
"sec.testFailed": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0435 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u0430 \u0438\u043B\u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430",
"sec.verificationDone": "\u041D\u0430\u0441\u0442\u043E\u044F\u0449\u0430\u044F \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430",
"sec.verificationInProgress": "\u0418\u0434\u0451\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438\u2026",
"sec.verificationWait": "\u0418\u0434\u0451\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438\u2026\n\u041F\u043E\u0434\u043E\u0436\u0434\u0438\u0442\u0435, \u043F\u043E\u043A\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044F \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0432 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438.",
"sec.verificationUnavailable": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430",
"chat.placeholder": "\u041D\u0430\u043F\u0438\u0448\u0438\u0442\u0435 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435\u2026",
"chat.send": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435",
"chat.sendFiles": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0444\u0430\u0439\u043B\u044B",
"chat.hideFiles": "\u0421\u043A\u0440\u044B\u0442\u044C \u0444\u0430\u0439\u043B\u044B",
"chat.recordVoice": "\u0417\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435",
"chat.sendVoice": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435",
"chat.discard": "\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C",
"chat.codeBlock": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u043A\u0430\u043A \u0431\u043B\u043E\u043A \u043A\u043E\u0434\u0430 (\u0440\u0430\u0441\u0448\u0438\u0440\u044F\u0435\u0442 \u043F\u043E\u043B\u0435)",
"chat.codeHint": "\u0424\u0440\u0430\u0433\u043C\u0435\u043D\u0442 \u043A\u043E\u0434\u0430 \xB7 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043E \xB7 \u2318\u21B5 \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C",
"chat.viewOnce": "\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u043E\u0434\u0438\u043D \u0440\u0430\u0437",
"chat.viewOnceTitle": "\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u043E\u0434\u0438\u043D \u0440\u0430\u0437 - \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442, \u043A\u0430\u043A \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0435\u0442",
"chat.viewOncePrefix": "\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u043E\u0434\u0438\u043D \u0440\u0430\u0437 \xB7 ",
"chat.viewOnceTap": "\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u043E\u0434\u0438\u043D \u0440\u0430\u0437 \xB7 \u043A\u043E\u0441\u043D\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C",
"chat.viewedOnce": "\u0423\u0436\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u043D\u043E",
"chat.disappearing": "\u0418\u0441\u0447\u0435\u0437\u0430\u044E\u0449\u0435\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 - \u0443\u0434\u0430\u043B\u044F\u0435\u0442\u0441\u044F \u0441 \u043E\u0431\u0435\u0438\u0445 \u0441\u0442\u043E\u0440\u043E\u043D",
"chat.disappearAfter": "\u0418\u0441\u0447\u0435\u0437\u043D\u0435\u0442 \u0447\u0435\u0440\u0435\u0437",
"chat.visibleFor": "\u0412\u0438\u0434\u043D\u043E",
"chat.timerPrefix": "\u0422\u0430\u0439\u043C\u0435\u0440 \xB7 ",
"chat.expired": "\u042D\u0442\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0438\u0441\u0442\u0435\u043A\u043B\u043E",
"chat.deleteForEveryone": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0443 \u0432\u0441\u0435\u0445",
"chat.sending": "\u041E\u0442\u043F\u0440\u0430\u0432\u043A\u0430",
"chat.delivered": "\u0414\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043E",
"chat.notSent": "\u041D\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E",
"chat.notSentReason": "\u041D\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E - \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u043A\u0430\u043D\u0430\u043B \u043D\u0435 \u0433\u043E\u0442\u043E\u0432. \u041F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C.",
"chat.encrypted": "\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E",
"chat.decrypted": "\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E",
"chat.encryptedOnDevice": "\u0417\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E \u043D\u0430 \u0432\u0430\u0448\u0435\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435",
"chat.uploading": "\u041E\u0442\u043F\u0440\u0430\u0432\u043A\u0430",
"chat.downloading": "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430",
"chat.transferring": "\u041F\u0435\u0440\u0435\u0434\u0430\u0447\u0430\u2026",
"chat.copied": "\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E!",
"chat.collapse": "\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C",
"chat.closeMenu": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u043C\u0435\u043D\u044E",
"chat.newChat": "\u041D\u043E\u0432\u044B\u0439 \u0447\u0430\u0442",
"chat.newGroup": "\u041D\u043E\u0432\u0430\u044F \u0433\u0440\u0443\u043F\u043F\u0430",
"chat.createGroup": "\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0433\u0440\u0443\u043F\u043F\u0443",
"chat.groupChats": "\u0413\u0440\u0443\u043F\u043F\u043E\u0432\u044B\u0435 \u0447\u0430\u0442\u044B",
"chat.secureChat": "\u0417\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u0447\u0430\u0442",
"chat.nameThis": "\u041D\u0430\u0437\u043E\u0432\u0438\u0442\u0435 \u044D\u0442\u043E\u0442 \u0447\u0430\u0442",
"chat.rename": "\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u0442\u044C \u0447\u0430\u0442 (\u0442\u043E\u043B\u044C\u043A\u043E \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E)",
"chat.renameHint": "\u0414\u0432\u0430\u0436\u0434\u044B \u0449\u0451\u043B\u043A\u043D\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u0442\u044C",
"chat.localLabel": "\u041B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \xB7 \u0445\u0440\u0430\u043D\u0438\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043D\u0430 \u044D\u0442\u043E\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435",
"chat.setStatus": "\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u0441\u0432\u043E\u0439 \u0441\u0442\u0430\u0442\u0443\u0441",
"chat.yourStatusPrefix": "\u0412\u0430\u0448 \u0441\u0442\u0430\u0442\u0443\u0441 - ",
"chat.meshHint": "\u0414\u043E 8 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432 \xB7 P2P-\u0441\u0435\u0442\u044C",
"chat.offline": "\u041E\u0444\u043B\u0430\u0439\u043D",
"chat.noNetwork": "\u041D\u0435\u0442 \u0441\u0435\u0442\u0438 \xB7 \u043F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435",
"chat.startVoiceCall": "\u041D\u0430\u0447\u0430\u0442\u044C \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0437\u0432\u043E\u043D\u043E\u043A",
"chat.startVideoCall": "\u041D\u0430\u0447\u0430\u0442\u044C \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0432\u0438\u0434\u0435\u043E\u0437\u0432\u043E\u043D\u043E\u043A",
"chat.verifyForCalls": "\u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u0441\u0435\u0430\u043D\u0441, \u0447\u0442\u043E\u0431\u044B \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0437\u0432\u043E\u043D\u043A\u0438",
"chat.e2eeNote": "\u041A\u0430\u0436\u0434\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044F \u0441\u043A\u0432\u043E\u0437\u043D\u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C \u043D\u0430 \u0432\u0430\u0448\u0435\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0443\u0439\u0442\u0438.",
"chat.peersOnly": "\u041E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0441\u043A\u0432\u043E\u0437\u043D\u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0451\u043D\u043D\u044B\u043C \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430\u043C - \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0445\u0440\u0430\u043D\u0438\u0442\u0441\u044F \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.",
"flow.invitationCreated": "\u0417\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0435 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u043E",
"flow.invitationCreatedBang": "\u0417\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0435 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u043E \u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E.",
"flow.responseCreated": "\u0417\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442 \u0441\u043E\u0437\u0434\u0430\u043D",
"flow.responseCreatedBang": "\u0417\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442 \u0441\u043E\u0437\u0434\u0430\u043D.",
"flow.sendInvitation": "\u041E\u0442\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u043A\u043E\u0434 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u044F \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0443 \u043F\u043E \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u043C\u0443 \u043A\u0430\u043D\u0430\u043B\u0443 (\u0437\u0432\u043E\u043D\u043E\u043A, SMS \u0438 \u0442. \u043F.).",
"flow.sendResponse": "\u041E\u0442\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u043A\u043E\u0434 \u043E\u0442\u0432\u0435\u0442\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u0442\u043E\u0440\u0443 \u043F\u043E \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u043C\u0443 \u043A\u0430\u043D\u0430\u043B\u0443 \u0438\u043B\u0438 \u0434\u0430\u0439\u0442\u0435 \u0435\u043C\u0443 \u043E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C QR-\u043A\u043E\u0434 \u043D\u0438\u0436\u0435.",
"flow.sendEncryptedCode": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u043A\u043E\u0434",
"flow.sendTheResponse": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u043E\u0442\u0432\u0435\u0442",
"flow.pasteOrWrite": "\u0412\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u0438\u043B\u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u0434\u2026",
"flow.processingInvitation": "\u041E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u044F\u2026",
"flow.processingResponse": "\u041E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0433\u043E \u043E\u0442\u0432\u0435\u0442\u0430\u2026",
"flow.finalizing": "\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u0435 \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\u2026",
"flow.channelEstablished": "\u0417\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u043A\u0430\u043D\u0430\u043B \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D",
"flow.channelReady": "\u0417\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u043A\u0430\u043D\u0430\u043B \u0433\u043E\u0442\u043E\u0432",
"flow.restoring": "\u0412\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\u2026",
"flow.invitationCaptured": "\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u043D\u043E.",
"err.needInvitation": "\u041D\u0443\u0436\u043D\u043E \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u043E\u0434 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u044F \u043E\u0442 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430.",
"err.needResponse": "\u041D\u0443\u0436\u043D\u043E \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u043E\u0434 \u043E\u0442\u0432\u0435\u0442\u0430 \u043E\u0442 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430.",
"err.responseFormat": "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430 - \u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u043A\u043E\u0434",
"err.responseNoKey": "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043A\u043E\u0434 \u043E\u0442\u0432\u0435\u0442\u0430 - \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043A\u043B\u044E\u0447 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043B\u0438 \u043F\u043E\u0432\u0440\u0435\u0436\u0434\u0451\u043D. \u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u043A\u043E\u0434 \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0441\u043D\u043E\u0432\u0430.",
"err.responseNoSignKey": "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043A\u043E\u0434 \u043E\u0442\u0432\u0435\u0442\u0430 - \u043D\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043A\u043B\u044E\u0447\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043F\u043E\u0434\u043F\u0438\u0441\u0438. \u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u043A\u043E\u0434 \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0441\u043D\u043E\u0432\u0430.",
"err.responseOutdated": "\u0414\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0432\u0435\u0442\u0430 \u0443\u0441\u0442\u0430\u0440\u0435\u043B\u0438 - \u0432\u043E\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435\u0441\u044C \u043D\u043E\u0432\u044B\u043C \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435\u043C",
"err.setupError": "\u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F",
"err.notReady": "\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u0435\u0449\u0451 \u043D\u0435 \u0433\u043E\u0442\u043E\u0432\u043E",
"err.securityBreach": "\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E \u043D\u0430\u0440\u0443\u0448\u0435\u043D\u0438\u0435 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 - \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u043E",
"err.securityValidation": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u043D\u0435 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u0430 - \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u0430 \u0430\u0442\u0430\u043A\u0430",
"err.retiredQr": "\u042D\u0442\u043E\u0442 QR-\u043A\u043E\u0434 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u0444\u043E\u0440\u043C\u0430\u0442, \u043A\u043E\u0442\u043E\u0440\u044B\u043C \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435. \u041F\u043E\u043F\u0440\u043E\u0441\u0438\u0442\u0435 \u043D\u043E\u0432\u044B\u0439 \u0438\u043B\u0438 \u0432\u043E\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435\u0441\u044C \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C.",
"err.compressedQrNote": "\u0421\u0436\u0430\u0442\u044B\u0439 QR \u043C\u043E\u0436\u0435\u0442 \u043E\u043F\u0443\u0441\u0442\u0438\u0442\u044C SDP \u0440\u0430\u0434\u0438 \u043A\u0440\u0430\u0442\u043A\u043E\u0441\u0442\u0438. \u0415\u0441\u043B\u0438 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043D\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044F, \u0432\u043E\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435\u0441\u044C \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C.",
"err.inviteNotConnected": "\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C. \u0422\u043E\u0442 \u0447\u0430\u0442 \u0441\u0435\u0439\u0447\u0430\u0441 \u043D\u0435 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0451\u043D.",
"err.inviteNotConnectedRetry": "\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C. \u0422\u043E\u0442 \u0447\u0430\u0442 \u0441\u0435\u0439\u0447\u0430\u0441 \u043D\u0435 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0451\u043D - \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u0435\u0433\u043E \u0441\u043D\u043E\u0432\u0430 \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437.",
"err.nobodyAccepted": "\u041D\u0438\u043A\u0442\u043E \u043D\u0435 \u043F\u0440\u0438\u043D\u044F\u043B \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435. \u0413\u0440\u0443\u043F\u043F\u0430 \u043E\u0441\u0442\u0430\u043B\u0430\u0441\u044C \u0431\u0435\u0437 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439.",
"err.noAudio": "\u0417\u0432\u0443\u043A \u043D\u0435 \u0437\u0430\u043F\u0438\u0441\u0430\u043D - \u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u043D\u0430 \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0441\u043D\u043E\u0432\u0430.",
"err.voiceNeedsConnection": "\u0414\u043B\u044F \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043D\u0443\u0436\u043D\u043E \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0435 \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435. \u041F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0435\u0441\u044C \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0441\u043D\u043E\u0432\u0430.",
"err.voiceRestoring": "\u0412\u043E\u0441\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u043C \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 - \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043C\u0433\u043D\u043E\u0432\u0435\u043D\u0438\u0435.",
"err.fileTooLarge": "\u0424\u0430\u0439\u043B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0439",
"sas.safetyNumber": "\u041D\u043E\u043C\u0435\u0440 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438",
"sas.incorrect": "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043A\u043E\u0434. \u0421\u0432\u0435\u0440\u044C\u0442\u0435 \u0435\u0433\u043E \u0441 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u043E\u043C \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0441\u043D\u043E\u0432\u0430.",
"sas.noMatch": "\u041A\u043E\u0434\u044B \u043D\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0442",
"sas.makeSure": "\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043A\u043E\u0434\u044B \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0442 \u0442\u043E\u0447\u043D\u043E.",
"sas.tooManyAttempts": "\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u043D\u043E\u0433\u043E \u043D\u0435\u0432\u0435\u0440\u043D\u044B\u0445 \u043F\u043E\u043F\u044B\u0442\u043E\u043A. \u0421\u0435\u0430\u043D\u0441 \u0441\u0431\u0440\u043E\u0448\u0435\u043D \u0440\u0430\u0434\u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438.",
"sas.verificationFailed": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0435 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u0430",
"sas.verified": "\u041F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E \xB7 \u0441\u043E\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u0430\u044F \u043F\u0440\u044F\u043C\u0430\u044F \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u044C",
"sas.runVerification": "\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438",
"sec.panelTitle": "\u0414\u0435\u0442\u0430\u043B\u0438 \u0441\u0435\u0442\u0438 \u0438 \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u0438",
"sec.security": "\u0411\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u044C",
"sec.transport": "\u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442",
"sec.keyExchange": "\u041E\u0431\u043C\u0435\u043D \u043A\u043B\u044E\u0447\u0430\u043C\u0438",
"sec.allEnabled": "\u0412\u0441\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u044B \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E",
"sec.realTimeNote": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0432 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0438\u043C\u0438 \u043A\u0440\u0438\u043F\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u0438\u043C\u0438 \u0444\u0443\u043D\u043A\u0446\u0438\u044F\u043C\u0438 - \u0431\u0435\u0437 \u0432\u044B\u0434\u0443\u043C\u0430\u043D\u043D\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445.",
"sec.simulatedWarning": "\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435: \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043D\u0435 \u043F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E - \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u0441\u043C\u043E\u0434\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u044B.",
"dl.title": "\u0421\u043A\u0430\u0447\u0430\u0442\u044C SecureBit",
"dl.free": "\u0411\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u043E \xB7 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0439 \u043A\u043E\u0434",
"dl.soon": "\u041F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0434\u043B\u044F iOS \u0438 Android \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F \u0434\u043B\u044F Chrome, Firefox \u0438 Opera \u043F\u043E\u044F\u0432\u044F\u0442\u0441\u044F \u0441\u043A\u043E\u0440\u043E.",
"chatHdr.chat": "\u0427\u0430\u0442",
"chatHdr.chats": "\u0427\u0430\u0442\u044B",
"chatHdr.newChat": "+ \u041D\u043E\u0432\u044B\u0439",
"chatHdr.secure": "\u0417\u0430\u0449\u0438\u0449\u0435\u043D\u043E",
"chatHdr.p2pSub": "P2P \xB7 \u0441\u043A\u0432\u043E\u0437\u043D\u043E\u0435 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435",
"chatHdr.save": "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C",
"chatHdr.close": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
"chatHdr.expand": "\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C",
"chatHdr.you": "\u0412\u044B",
"chatHdr.qrCode": "QR-\u043A\u043E\u0434",
"chat.disconnected": "\u0420\u0430\u0437\u044A\u0435\u0434\u0438\u043D\u0435\u043D\u043E",
"call.mute": "\u0412\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D",
"call.endShort": "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C",
"group.add": "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C",
"group.send": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C",
"sec.pfsShort": "\u0421\u043E\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u0430\u044F \u043F\u0440\u044F\u043C\u0430\u044F \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u044C",
"sec.cipher": "\u0428\u0438\u0444\u0440",
"chat.close": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
"file.needConnection": "\u0414\u043B\u044F \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0444\u0430\u0439\u043B\u043E\u0432 \u043D\u0443\u0436\u043D\u043E \u043E\u0442\u043A\u0440\u044B\u0442\u043E\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435",
"presence.available": "\u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D",
"presence.away": "\u041E\u0442\u043E\u0448\u0451\u043B",
"presence.busy": "\u0417\u0430\u043D\u044F\u0442",
"presence.offline": "\u041D\u0435 \u0432 \u0441\u0435\u0442\u0438",
"presence.invisible": "\u041D\u0435\u0432\u0438\u0434\u0438\u043C\u044B\u0439",
"presence.availableDesc": "\u0412 \u0441\u0435\u0442\u0438 \u0438 \u043D\u0430 \u0441\u0432\u044F\u0437\u0438",
"presence.awayDesc": "\u041D\u0435\u0430\u043A\u0442\u0438\u0432\u0435\u043D \xB7 \u043E\u0442\u043E\u0448\u0451\u043B",
"presence.busyDesc": "\u041D\u0435 \u0431\u0435\u0441\u043F\u043E\u043A\u043E\u0438\u0442\u044C",
"presence.invisibleDesc": "\u0412\u044B\u0433\u043B\u044F\u0434\u0435\u0442\u044C \u043E\u0444\u043B\u0430\u0439\u043D \u0434\u043B\u044F \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u043E\u0432",
"presence.online": "\u0412 \u0441\u0435\u0442\u0438",
"conn.p2p": "P2P \xB7 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u043E",
"conn.verifying": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430\u2026",
"conn.connecting": "\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435\u2026",
"conn.reconnecting": "\u041F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435\u2026",
"conn.peerDisconnected": "\u0421\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u043B\u0441\u044F",
"conn.disconnected": "\u0420\u0430\u0437\u044A\u0435\u0434\u0438\u043D\u0435\u043D\u043E",
"chat.defaultLabel": "\u0427\u0430\u0442",
"groupPhase.forming": "\u0424\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u2026",
"groupPhase.commitments": "\u041E\u0431\u043C\u0435\u043D \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430\u043C\u0438\u2026",
"groupPhase.revealing": "\u0420\u0430\u0441\u043A\u0440\u044B\u0442\u0438\u0435\u2026",
"groupPhase.compare": "\u0421\u0432\u0435\u0440\u044C\u0442\u0435 \u043A\u043E\u0434 \u0433\u0440\u0443\u043F\u043F\u044B",
"groupPhase.ready": "\u0413\u0440\u0443\u043F\u043F\u0430 \u0433\u043E\u0442\u043E\u0432\u0430",
"groupPhase.failed": "\u0413\u0440\u0443\u043F\u043F\u0430 \u043D\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u0430",
"call.qualityGood": "\u0425\u043E\u0440\u043E\u0448\u0435\u0435",
"call.qualityFair": "\u0421\u0440\u0435\u0434\u043D\u0435\u0435",
"call.qualityWeak": "\u0421\u043B\u0430\u0431\u043E\u0435",
"msg.code": "\u041A\u043E\u0434",
"msg.timer": "\u0422\u0430\u0439\u043C\u0435\u0440",
"msg.voice": "\u0413\u043E\u043B\u043E\u0441",
"msg.play": "\u0412\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438",
"msg.sent": "\u041E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E",
"msg.read": "\u041F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043E",
"report.title": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u0432 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438",
"report.active": "\u0410\u043A\u0442\u0438\u0432\u043D\u043E",
"report.testsPassed": "\u041F\u0440\u043E\u0439\u0434\u0435\u043D\u043E \u043F\u0440\u043E\u0432\u0435\u0440\u043E\u043A",
"report.verifiedAt": "\u041F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E",
"report.source": "\u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A",
"secTest.verifyECDHKeyExchange": "\u041E\u0431\u043C\u0435\u043D \u043A\u043B\u044E\u0447\u0430\u043C\u0438 ECDH",
"secTest.verifyECDSASignatures": "\u0426\u0438\u0444\u0440\u043E\u0432\u044B\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u0438 ECDSA",
"secTest.verifyEncryption": "\u0428\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435 AES-GCM",
"secTest.verifyMessageIntegrity": "\u0426\u0435\u043B\u043E\u0441\u0442\u043D\u043E\u0441\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439",
"secTest.verifyPerfectForwardSecrecy": "\u0421\u043E\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u0430\u044F \u043F\u0440\u044F\u043C\u0430\u044F \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u044C",
"secTest.verifyPFS": "\u0421\u043E\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u0430\u044F \u043F\u0440\u044F\u043C\u0430\u044F \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u044C",
"secTest.verifyReplayProtection": "\u0417\u0430\u0449\u0438\u0442\u0430 \u043E\u0442 \u043F\u043E\u0432\u0442\u043E\u0440\u043E\u0432",
"secTest.verifyDTLSFingerprint": "\u041E\u0442\u043F\u0435\u0447\u0430\u0442\u043E\u043A DTLS",
"secTest.verifySASVerification": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 SAS",
"secTest.verifyMetadataProtection": "\u0417\u0430\u0449\u0438\u0442\u0430 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u0445",
"secTest.verifyTrafficObfuscation": "\u041C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0442\u0440\u0430\u0444\u0438\u043A\u0430",
"secTest.verifyPacketPadding": "\u0414\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043F\u0430\u043A\u0435\u0442\u043E\u0432",
"secTest.verifyNestedEncryption": "\u0412\u043B\u043E\u0436\u0435\u043D\u043D\u043E\u0435 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435",
"secTest.verifyNonExtractableKeys": "\u041A\u043B\u044E\u0447\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043D\u0435\u043B\u044C\u0437\u044F \u0438\u0437\u0432\u043B\u0435\u0447\u044C",
"secTest.verifyRateLimiting": "\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u0435 \u0447\u0430\u0441\u0442\u043E\u0442\u044B",
"secTest.verifyMutualAuth": "\u0412\u0437\u0430\u0438\u043C\u043D\u0430\u044F \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F",
"secTest.verifyAuthProof": "\u0414\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u043E \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0438",
"secTest.verifyEnhancedValidation": "\u0423\u0441\u0438\u043B\u0435\u043D\u043D\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430",
"secTest.verifyAdvancedFeatures": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0438",
"secTest.verifySignature": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u0438",
"secDetail.Security system initializing...": "\u0421\u0438\u0441\u0442\u0435\u043C\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u0442\u0441\u044F\u2026",
"secDetail.Nested encryption active": "\u0412\u043B\u043E\u0436\u0435\u043D\u043D\u043E\u0435 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u043E",
"secDetail.Nested encryption failed": "\u0412\u043B\u043E\u0436\u0435\u043D\u043D\u043E\u0435 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C",
"secDetail.Packet padding active": "\u0414\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u0430\u043A\u0442\u0438\u0432\u043D\u043E",
"secDetail.Packet padding failed": "\u0414\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C",
"secDetail.Advanced features active": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0438 \u0430\u043A\u0442\u0438\u0432\u043D\u044B",
"secDetail.Advanced features failed": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0438 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442",
"secDetail.No encryption key available": "\u041A\u043B\u044E\u0447 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D",
"secDetail.AES-GCM encryption/decryption working correctly": "\u0428\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435 AES-GCM \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E",
"secDetail.No ECDH key pair available": "\u041F\u0430\u0440\u0430 \u043A\u043B\u044E\u0447\u0435\u0439 ECDH \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430",
"secDetail.Key derivation failed": "\u0412\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u0435 \u043A\u043B\u044E\u0447\u0430 \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C",
"secDetail.No ECDSA key pair available": "\u041F\u0430\u0440\u0430 \u043A\u043B\u044E\u0447\u0435\u0439 ECDSA \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430",
"secDetail.ECDSA digital signatures working correctly": "\u0426\u0438\u0444\u0440\u043E\u0432\u044B\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u0438 ECDSA \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E",
"secDetail.MAC key not available or invalid": "\u041A\u043B\u044E\u0447 MAC \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0438\u043B\u0438 \u043D\u0435\u0432\u0435\u0440\u0435\u043D",
"secDetail.Rate limiter did not block a message over the limit": "\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0442\u0435\u043B\u044C \u043D\u0435 \u0437\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043B \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0441\u0432\u0435\u0440\u0445 \u043B\u0438\u043C\u0438\u0442\u0430",
"secDetail.Rate limiter is not available": "\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0442\u0435\u043B\u044C \u0447\u0430\u0441\u0442\u043E\u0442\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D",
"secDetail.Replay protection is working correctly": "\u0417\u0430\u0449\u0438\u0442\u0430 \u043E\u0442 \u043F\u043E\u0432\u0442\u043E\u0440\u043E\u0432 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E",
"secDetail.Replay protection not enabled": "\u0417\u0430\u0449\u0438\u0442\u0430 \u043E\u0442 \u043F\u043E\u0432\u0442\u043E\u0440\u043E\u0432 \u043D\u0435 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430",
"secDetail.SAS code not available": "\u041A\u043E\u0434 SAS \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D",
"secDetail.SAS verification code is valid and available": "\u041A\u043E\u0434 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 SAS \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u0435\u043D \u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D",
"secDetail.Traffic obfuscation is working correctly": "\u041C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0442\u0440\u0430\u0444\u0438\u043A\u0430 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E",
"secDetail.Traffic obfuscation not enabled": "\u041C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0442\u0440\u0430\u0444\u0438\u043A\u0430 \u043D\u0435 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "\u0414\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0441\u0435\u0430\u043D\u0441\u0430 \u043D\u0435\u0442 \u044D\u0444\u0435\u043C\u0435\u0440\u043D\u043E\u0439 \u043F\u0430\u0440\u044B \u043A\u043B\u044E\u0447\u0435\u0439 ECDH, \u043A\u043E\u0442\u043E\u0440\u0443\u044E \u043D\u0435\u043B\u044C\u0437\u044F \u0438\u0437\u0432\u043B\u0435\u0447\u044C",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "\u0422\u043E\u043B\u044C\u043A\u043E \u0441\u0435\u0430\u043D\u0441\u043E\u0432\u0430\u044F \u043F\u0440\u044F\u043C\u0430\u044F \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u043E\u0441\u0442\u044C: \u043A\u043B\u044E\u0447\u0438 \u044D\u0444\u0435\u043C\u0435\u0440\u043D\u044B \u0434\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0441\u0435\u0430\u043D\u0441\u0430, \u043D\u043E Double Ratchet \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u0435\u043D (\u0443 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430 \u0431\u043E\u043B\u0435\u0435 \u0441\u0442\u0430\u0440\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F), \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0441\u043A\u043E\u043C\u043F\u0440\u043E\u043C\u0435\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0441\u0435\u0430\u043D\u0441\u043E\u0432\u044B\u0439 \u043A\u043B\u044E\u0447 \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0432\u0435\u0441\u044C \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440.",
"msg.pause": "\u041F\u0430\u0443\u0437\u0430",
"msg.failed": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C",
"groupErr.timeout": "\u0423\u0447\u0430\u0441\u0442\u043D\u0438\u043A \u043F\u0435\u0440\u0435\u0441\u0442\u0430\u043B \u043E\u0442\u0432\u0435\u0447\u0430\u0442\u044C, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u043A\u043E\u0434 \u0431\u044B\u043B \u0433\u043E\u0442\u043E\u0432.",
"groupErr.keyMismatch": "\u041A\u043B\u044E\u0447 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430 \u043D\u0435 \u0441\u043E\u0432\u043F\u0430\u043B \u0441 \u043B\u0438\u0447\u043D\u043E\u0441\u0442\u044C\u044E, \u043A\u043E\u0442\u043E\u0440\u0443\u044E \u0434\u043B\u044F \u043D\u0435\u0433\u043E \u0437\u0430\u044F\u0432\u0438\u043B\u0438.",
"groupErr.revealMismatch": "\u0420\u0430\u0441\u043A\u0440\u044B\u0442\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430 \u043D\u0435 \u0441\u043E\u0432\u043F\u0430\u043B\u043E \u0441 \u0435\u0433\u043E \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u043E\u043C.",
"groupErr.commitChanged": "\u0423\u0447\u0430\u0441\u0442\u043D\u0438\u043A \u0438\u0437\u043C\u0435\u043D\u0438\u043B \u0441\u0432\u043E\u0451 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u043E \u043F\u043E\u0441\u0440\u0435\u0434\u0438 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0430.",
"groupErr.missingKey": "\u0412 \u0441\u043F\u0438\u0441\u043A\u0435 \u0431\u044B\u043B \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A, \u0447\u0435\u0439 \u043A\u043B\u044E\u0447 \u0442\u0430\u043A \u0438 \u043D\u0435 \u043F\u0440\u0438\u0448\u0451\u043B.",
"groupErr.outsider": "\u041F\u0440\u0438\u0448\u0451\u043B \u043A\u0430\u0434\u0440 \u043E\u0442 \u043A\u043E\u0433\u043E-\u0442\u043E \u0432\u043D\u0435 \u0433\u0440\u0443\u043F\u043F\u044B.",
"groupErr.limit": "\u0413\u0440\u0443\u043F\u043F\u0430 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0430 \u0432\u043E\u0441\u0435\u043C\u044C\u044E \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430\u043C\u0438.",
"groupErr.tooLarge": "\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0431\u044B\u043B\u043E \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u0438\u043C, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0435\u0433\u043E \u0433\u0440\u0443\u043F\u043F\u0435.",
"fileType.text": "\u041E\u0431\u044B\u0447\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442",
"fileType.images": "\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",
"fileType.archives": "\u0410\u0440\u0445\u0438\u0432\u044B",
"fileType.voice": "\u0413\u043E\u043B\u043E\u0441\u043E\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F",
"fileType.unsupported": "\u041D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F",
"qrScan.title": "\u0421\u043A\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C QR-\u043A\u043E\u0434",
"qrScan.auto": "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438",
"qrScan.reset": "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C",
"qrScan.autoScroll": "\u0410\u0432\u0442\u043E\u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430",
"qrScan.starting": "\u0417\u0430\u043F\u0443\u0441\u043A \u043A\u0430\u043C\u0435\u0440\u044B\u2026",
"qrScan.point": "\u041D\u0430\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u0443 \u043D\u0430 QR-\u043A\u043E\u0434",
"qrScan.tapFocus": "\u041A\u043E\u0441\u043D\u0438\u0442\u0435\u0441\u044C \u044D\u043A\u0440\u0430\u043D\u0430, \u0447\u0442\u043E\u0431\u044B \u0441\u0444\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
"qrScan.focusing": "\u0424\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u043A\u0430\u2026",
"iceErr.notArray": "\u0421\u043F\u0438\u0441\u043E\u043A \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u0432 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043C\u0430\u0441\u0441\u0438\u0432\u043E\u043C",
"iceErr.invalidJson": "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 JSON",
"iceErr.tooMany": "\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u043D\u043E\u0433\u043E \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u0432 (\u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C {max})",
"iceErr.invalidEntry": "{label}: \u043D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0437\u0430\u043F\u0438\u0441\u044C",
"iceErr.urlCount": "{label}: \u043D\u0443\u0436\u043D\u043E \u043E\u0442 1 \u0434\u043E {max} URL",
"iceErr.turnCreds": "{label}: TURN-\u0441\u0435\u0440\u0432\u0435\u0440\u044B \u043E\u0431\u044B\u0447\u043D\u043E \u0442\u0440\u0435\u0431\u0443\u044E\u0442 \u0438\u043C\u0435\u043D\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u0438 \u0443\u0447\u0451\u0442\u043D\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445",
"iceUrl.notString": "URL \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u043E\u0439",
"iceUrl.empty": "URL \u043F\u0443\u0441\u0442\u043E\u0439",
"iceUrl.tooLong": "URL \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0434\u043B\u0438\u043D\u043D\u044B\u0439",
"iceUrl.badChars": "URL \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B",
"iceUrl.badScheme": "URL \u0434\u043E\u043B\u0436\u0435\u043D \u043D\u0430\u0447\u0438\u043D\u0430\u0442\u044C\u0441\u044F \u0441 stun:, stuns:, turn: \u0438\u043B\u0438 turns:",
"iceUrl.badQuery": "URL \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441",
"iceUrl.noHost": "\u0412 URL \u043D\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0445\u043E\u0441\u0442\u0430",
"iceUrl.badHost": "URL \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0445\u043E\u0441\u0442 \u0438\u043B\u0438 \u043F\u043E\u0440\u0442",
"iceUrl.badTransport": "\u0417\u0430\u043F\u0440\u043E\u0441 URL \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C transport=udp \u0438\u043B\u0438 transport=tcp",
"msg.off": "\u0412\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E",
"file.consentUnavailable": "\u041D\u0435\u0442 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0438 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0441\u043E\u0433\u043B\u0430\u0441\u0438\u0435",
"secLevel.MAXIMUM": "\u041C\u0410\u041A\u0421\u0418\u041C\u0423\u041C",
"secLevel.INITIALIZING": "\u0417\u0410\u041F\u0423\u0421\u041A",
"secLevel.ERROR": "\u041E\u0428\u0418\u0411\u041A\u0410",
"secLevel.UNKNOWN": "\u041D\u0415\u0418\u0417\u0412\u0415\u0421\u0422\u041D\u041E",
"status.error": "\u041E\u0448\u0438\u0431\u043A\u0430",
"offline.disconnect": "\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F",
"offline.learnMore": "\u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435",
"pwa.installApp": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435",
"chat.onWeb": "\u0412\u044B \u0432 \u0432\u0435\u0431-\u0432\u0435\u0440\u0441\u0438\u0438",
"groupCall.startVoice": "\u041D\u0430\u0447\u0430\u0442\u044C \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u043E\u0439 \u0437\u0432\u043E\u043D\u043E\u043A",
"groupCall.startVideo": "\u041D\u0430\u0447\u0430\u0442\u044C \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0432\u0438\u0434\u0435\u043E\u0437\u0432\u043E\u043D\u043E\u043A",
"groupCall.join": "\u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C\u0441\u044F",
"groupCall.dismiss": "\u041D\u0435 \u0441\u0435\u0439\u0447\u0430\u0441",
"groupCall.leave": "\u0412\u044B\u0439\u0442\u0438 \u0438\u0437 \u0437\u0432\u043E\u043D\u043A\u0430",
"groupCall.you": "\u0412\u044B",
"groupCall.connecting": "\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435\u2026",
"groupCall.waitingLink": "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043F\u0440\u044F\u043C\u043E\u0433\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\u2026",
"groupCall.legFailed": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C\u0441\u044F",
"groupCall.startedVoice": "{name} \u043D\u0430\u0447\u0430\u043B \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u043E\u0439 \u0437\u0432\u043E\u043D\u043E\u043A",
"groupCall.startedVideo": "{name} \u043D\u0430\u0447\u0430\u043B \u0432\u0438\u0434\u0435\u043E\u0437\u0432\u043E\u043D\u043E\u043A",
"groupCall.inCall": "{count} \u0432 \u0437\u0432\u043E\u043D\u043A\u0435",
"groupCall.err.permission_denied": "\u0417\u0432\u043E\u043D\u043E\u043A \u043D\u0435 \u043D\u0430\u0447\u0430\u043B\u0441\u044F - \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D\u0443 \u0438 \u043A\u0430\u043C\u0435\u0440\u0435 \u0437\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D. \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0435 \u0435\u0433\u043E \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0441\u0430\u0439\u0442\u0430 \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0441\u043D\u043E\u0432\u0430.",
"groupCall.err.device_not_found": "\u0417\u0432\u043E\u043D\u043E\u043A \u043D\u0435 \u043D\u0430\u0447\u0430\u043B\u0441\u044F - \u043D\u0430 \u044D\u0442\u043E\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D.",
"groupCall.err.device_busy": "\u0417\u0432\u043E\u043D\u043E\u043A \u043D\u0435 \u043D\u0430\u0447\u0430\u043B\u0441\u044F - \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D \u0437\u0430\u043D\u044F\u0442 \u0434\u0440\u0443\u0433\u0438\u043C \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C. \u0417\u0430\u043A\u0440\u043E\u0439\u0442\u0435 \u0435\u0433\u043E \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0441\u043D\u043E\u0432\u0430.",
"groupCall.err.media_failed": "\u0417\u0432\u043E\u043D\u043E\u043A \u043D\u0435 \u043D\u0430\u0447\u0430\u043B\u0441\u044F - \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D.",
"groupCall.err.call_in_progress": "\u0412 \u044D\u0442\u043E\u0439 \u0433\u0440\u0443\u043F\u043F\u0435 \u0443\u0436\u0435 \u0438\u0434\u0451\u0442 \u0437\u0432\u043E\u043D\u043E\u043A. \u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u0435\u0441\u044C \u043A \u043D\u0435\u043C\u0443, \u0430 \u043D\u0435 \u043D\u0430\u0447\u0438\u043D\u0430\u0439\u0442\u0435 \u043D\u043E\u0432\u044B\u0439.",
"groupCall.err.not_ready": "\u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043A\u043E\u0434 \u0433\u0440\u0443\u043F\u043F\u044B.",
"groupCall.speaking": "{name} \u0433\u043E\u0432\u043E\u0440\u0438\u0442",
"groupCall.pin": "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C {name} \u043A\u0440\u0443\u043F\u043D\u043E",
"groupCall.unpin": "\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A\u043E \u0432\u0441\u0435\u043C",
"groupCall.showEveryone": "\u0412\u0441\u0435",
"msg.after5s": "5 \u0441 \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u043E\u0447\u0442\u0435\u043D\u0438\u044F",
"msg.after15s": "15 \u0441 \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u043E\u0447\u0442\u0435\u043D\u0438\u044F",
"msg.after30s": "30 \u0441 \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u043E\u0447\u0442\u0435\u043D\u0438\u044F",
"msg.after1m": "1 \u043C\u0438\u043D \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u043E\u0447\u0442\u0435\u043D\u0438\u044F",
"msg.sec30": "30 \u0441\u0435\u043A\u0443\u043D\u0434",
"msg.min5": "5 \u043C\u0438\u043D\u0443\u0442",
"msg.hour1": "1 \u0447\u0430\u0441",
"desktop.shareDesc": "\u041E\u0442\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u043A\u043E\u0434 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0443. \u041E\u043D \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u044B\u0439 \u0438 \u0441\u043A\u043E\u0440\u043E \u0438\u0441\u0442\u0435\u0447\u0451\u0442.",
"desktop.invitationCreated": "\u0417\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0435 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u043E - \u043E\u0442\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u0435\u0433\u043E \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0443.",
"desktop.joinDesc": "\u0412\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043A\u043E\u0434 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u044F \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442.",
"desktop.offerTag": "\u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \xB7 \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0442\u0435\u043A\u0441\u0442",
"desktop.answerTag": "\u043E\u0442\u0432\u0435\u0442 \xB7 \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0442\u0435\u043A\u0441\u0442",
"desktop.offerPlaceholder": "\u0417\u0434\u0435\u0441\u044C \u043F\u043E\u044F\u0432\u0438\u0442\u0441\u044F \u043A\u043E\u0434 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u044F\u2026",
"desktop.answerPlaceholder": "\u0417\u0434\u0435\u0441\u044C \u043F\u043E\u044F\u0432\u0438\u0442\u0441\u044F \u043A\u043E\u0434 \u043E\u0442\u0432\u0435\u0442\u0430\u2026",
"desktop.backToChats": "\u041D\u0430\u0437\u0430\u0434 \u043A \u0447\u0430\u0442\u0430\u043C",
"desktop.sendFeedback": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u043E\u0442\u0437\u044B\u0432",
"desktop.callsNeedVerified": "\u0414\u043B\u044F \u0437\u0432\u043E\u043D\u043A\u043E\u0432 \u043D\u0443\u0436\u0435\u043D \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043D\u043D\u044B\u0439 \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u043A\u0430\u043D\u0430\u043B.",
"desktop.noOpenChannel": "\u041D\u0435\u0442 \u043E\u0442\u043A\u0440\u044B\u0442\u043E\u0433\u043E \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0433\u043E \u043A\u0430\u043D\u0430\u043B\u0430.",
"desktop.chatCarriesCall": "\u0427\u0435\u0440\u0435\u0437 \u044D\u0442\u043E\u0442 \u0447\u0430\u0442 \u0438\u0434\u0451\u0442 \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0437\u0432\u043E\u043D\u043E\u043A. \u0412\u044B\u0439\u0434\u0438\u0442\u0435 \u0438\u0437 \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0433\u043E \u0437\u0432\u043E\u043D\u043A\u0430, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0437\u0432\u043E\u043D\u0438\u0442\u044C \u043E\u0434\u0438\u043D \u043D\u0430 \u043E\u0434\u0438\u043D.",
"desktop.err.permission_denied": "\u0417\u0432\u043E\u043D\u043E\u043A \u043D\u0435 \u043D\u0430\u0447\u0430\u043B\u0441\u044F - \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D\u0443 \u0438 \u043A\u0430\u043C\u0435\u0440\u0435 \u0437\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D. \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0435 \u0435\u0433\u043E \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0445 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0441\u043D\u043E\u0432\u0430.",
"desktop.language": "\u042F\u0437\u044B\u043A",
"desktop.languageHint": "\u041F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u0441\u0440\u0430\u0437\u0443. \u0423\u0436\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043E\u0441\u0442\u0430\u044E\u0442\u0441\u044F \u043D\u0430 \u0442\u043E\u043C \u044F\u0437\u044B\u043A\u0435, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u0438\u0445 \u043D\u0430\u043F\u0438\u0441\u0430\u043B\u0438.",
"desktop.compareCode": "\u0421\u0432\u0435\u0440\u044C\u0442\u0435 \u043A\u043E\u0434 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u0441 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u043E\u043C \u0438 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0435\u0441\u043B\u0438 \u043E\u043D \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442.",
"desktop.verifyBeforeFiles": "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u0444\u0430\u0439\u043B\u044B.",
"desktop.verifyBeforeSending": "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F.",
"desktop.disconnectedByBackend": "\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E \u0440\u0430\u0437\u043E\u0440\u0432\u0430\u043D\u043E.",
"desktop.restoreFailed": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435. \u042D\u0442\u043E\u0442 \u0447\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043A\u0440\u044B\u0442.",
"desktop.channelNotReady": "\u041A\u0430\u043D\u0430\u043B \u0434\u0430\u043D\u043D\u044B\u0445 \u0435\u0449\u0451 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D. \u0414\u043E\u0436\u0434\u0438\u0442\u0435\u0441\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F.",
"desktop.enterCode": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u0434 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F.",
"desktop.noOffer": "\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E. \u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u0441\u043E\u0437\u0434\u0430\u0439\u0442\u0435 \u0435\u0433\u043E.",
"desktop.notInitiator": "\u0412\u044B \u043D\u0435 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u043B\u0438 \u044D\u0442\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u044C \u043E\u0442\u0432\u0435\u0442 \u043D\u0435 \u043A \u0447\u0435\u043C\u0443.",
"desktop.decryptFailed": "\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u0442\u044C, \u043E\u043D\u043E \u043E\u0442\u0431\u0440\u043E\u0448\u0435\u043D\u043E.",
"desktop.badMessageFormat": "\u041F\u0440\u0438\u0448\u0451\u043B \u043F\u043E\u0432\u0440\u0435\u0436\u0434\u0451\u043D\u043D\u044B\u0439 \u043A\u0430\u0434\u0440, \u043E\u043D \u043E\u0442\u0431\u0440\u043E\u0448\u0435\u043D.",
"desktop.notSentNotReady": "\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043D\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E: \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u043A\u0430\u043D\u0430\u043B \u043D\u0435 \u0433\u043E\u0442\u043E\u0432. \u0414\u043E\u0436\u0434\u0438\u0442\u0435\u0441\u044C \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0435\u0441\u044C.",
"desktop.micDenied": "\u0414\u043E\u0441\u0442\u0443\u043F \u043A \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D\u0443 \u043E\u0442\u043A\u043B\u043E\u043D\u0451\u043D.",
"desktop.noChannelWait": "\u041D\u0435\u0442 \u043E\u0442\u043A\u0440\u044B\u0442\u043E\u0433\u043E \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0433\u043E \u043A\u0430\u043D\u0430\u043B\u0430 - \u0434\u043E\u0436\u0434\u0438\u0442\u0435\u0441\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F.",
"desktop.sasFailed": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0435 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u0430. \u0412\u043E\u0437\u043C\u043E\u0436\u0435\u043D \u043F\u043E\u0441\u0440\u0435\u0434\u043D\u0438\u043A, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0440\u0432\u0430\u043D\u043E.",
"desktop.sasOk": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u0430. \u042D\u0442\u043E\u0442 \u043A\u0430\u043D\u0430\u043B \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u043D \u0441\u043A\u0432\u043E\u0437\u043D\u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C.",
"desktop.iceForgotten": "\u0421\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044B \u0437\u0430\u0431\u044B\u0442\u044B. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044B ICE.",
"desktop.icePublic": "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044B ICE.",
"desktop.verificationInProgress": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u0435\u0449\u0451 \u0438\u0434\u0451\u0442. \u0414\u043E\u0436\u0434\u0438\u0442\u0435\u0441\u044C \u0435\u0451 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F.",
"desktop.fileGone": "\u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0434\u043B\u044F \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438.",
"desktop.codeMismatch": "\u041A\u043E\u0434\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u043D\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0442. \u041E\u0442\u043A\u043B\u044E\u0447\u0430\u0435\u043C\u0441\u044F \u0440\u0430\u0434\u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438.",
"desktop.noLocalCode": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0435 \u0443\u0434\u0430\u043B\u0430\u0441\u044C: \u043D\u0435\u0442 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0434\u043B\u044F \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044F. \u041E\u0442\u043A\u043B\u044E\u0447\u0430\u0435\u043C\u0441\u044F \u0440\u0430\u0434\u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438.",
"desktop.protocolViolation": "\u0421\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A \u0437\u0430\u044F\u0432\u0438\u043B \u043E \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0438 \u043A\u043E\u0434\u0430 \u0440\u0430\u043D\u044C\u0448\u0435, \u0447\u0435\u043C \u0432\u044B \u0435\u0433\u043E \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438. \u041E\u0442\u043A\u043B\u044E\u0447\u0430\u0435\u043C\u0441\u044F \u0440\u0430\u0434\u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438.",
"desktop.verificationRejected": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u0430. \u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0440\u0432\u0430\u043D\u043E \u0440\u0430\u0434\u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438.",
"secLevel.HIGH": "\u0412\u042B\u0421\u041E\u041A\u0418\u0419",
"secLevel.MEDIUM": "\u0421\u0420\u0415\u0414\u041D\u0418\u0419",
"secLevel.LOW": "\u041D\u0418\u0417\u041A\u0418\u0419",
"desktop.rerun": "\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u0441\u043D\u043E\u0432\u0430",
"desktop.ice.customDesc": "\u0414\u043E {max} \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u0432, \u043F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 URL \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 \u0438\u043B\u0438 JSON.",
"desktop.ice.persistDesc": "\u0425\u0440\u0430\u043D\u0438\u0442\u0441\u044F \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u043D\u0430 \u044D\u0442\u043E\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435. \u041E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u044D\u0442\u043E\u043C \u0441\u0435\u0430\u043D\u0441\u0435.",
"desktop.group.leaveNote": "\u041E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u043C \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430\u043C \u0441\u043E\u043E\u0431\u0449\u0430\u0442, \u0447\u0442\u043E \u0432\u044B \u0432\u044B\u0448\u043B\u0438. \u041F\u043E\u0441\u043B\u0435 \u044D\u0442\u043E\u0433\u043E \u043D\u0430 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435 \u043D\u0435 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u043D\u0438\u0447\u0435\u0433\u043E \u043E\u0431 \u044D\u0442\u043E\u0439 \u0433\u0440\u0443\u043F\u043F\u0435 - \u043D\u0438 \u043E\u0434\u0438\u043D \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u0445\u0440\u0430\u043D\u0438\u0442 \u043A\u043E\u043F\u0438\u044E, \u0447\u0442\u043E\u0431\u044B \u0432\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F, \u0442\u0430\u043A \u0447\u0442\u043E \u043F\u043E\u043D\u0430\u0434\u043E\u0431\u0438\u0442\u0441\u044F \u043D\u043E\u0432\u043E\u0435 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435.",
"desktop.sec.ecdsaOk": "\u041F\u043E\u0434\u043F\u0438\u0441\u044C \u043F\u0430\u043A\u0435\u0442\u0430 \u043A\u043B\u044E\u0447\u0435\u0439 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u0430 \u043F\u0440\u0438 \u0440\u0443\u043A\u043E\u043F\u043E\u0436\u0430\u0442\u0438\u0438 (ECDSA P-384 / SHA-384)",
"desktop.sec.ecdsaNone": "\u0420\u0443\u043A\u043E\u043F\u043E\u0436\u0430\u0442\u0438\u0435 \u043D\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E",
"desktop.sec.ecdhOk": "\u041A\u043B\u044E\u0447\u0438 \u0441\u0435\u0430\u043D\u0441\u0430 \u0432\u044B\u0432\u0435\u0434\u0435\u043D\u044B \u0438\u0437 \u044D\u0444\u0435\u043C\u0435\u0440\u043D\u043E\u0433\u043E \u043E\u0431\u043C\u0435\u043D\u0430 ECDH P-384 \u0447\u0435\u0440\u0435\u0437 HKDF-SHA-256",
"desktop.sec.ecdhNone": "\u041A\u043B\u044E\u0447\u0438 \u0441\u0435\u0430\u043D\u0441\u0430 \u043D\u0435 \u0432\u044B\u0432\u0435\u0434\u0435\u043D\u044B",
"desktop.sec.encryptionOk": "\u0428\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435 AES-GCM \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u044B \u0432 \u044F\u0434\u0440\u0435",
"desktop.sec.encryptionNa": "\u0421\u0430\u043C\u043E\u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443 AES-GCM \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C",
"desktop.sec.integrityOk": "\u0426\u0435\u043B\u043E\u0441\u0442\u043D\u043E\u0441\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u0430 (\u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F AES-GCM)",
"desktop.sec.integrityNa": "\u0421\u0430\u043C\u043E\u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443 \u0446\u0435\u043B\u043E\u0441\u0442\u043D\u043E\u0441\u0442\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C",
"desktop.sec.pfsOk": "Double Ratchet \u0430\u043A\u0442\u0438\u0432\u0435\u043D - \u0443 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0441\u0432\u043E\u0439 \u043A\u043B\u044E\u0447",
"desktop.sec.pfsNa": "\u041D\u0435 \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u043E",
"desktop.sec.replayOk": "\u041A\u043B\u044E\u0447\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0440\u044D\u0442\u0447\u0435\u0442\u0430 \u0443\u043D\u0438\u0447\u0442\u043E\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043F\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043D\u043D\u044B\u0439 \u043A\u0430\u0434\u0440 \u043D\u0435\u043B\u044C\u0437\u044F \u0432\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u043E",
"desktop.sec.replayNa": "\u041D\u0435 \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u043E",
"desktop.sec.dtlsPinned": "\u041E\u0442\u043F\u0435\u0447\u0430\u0442\u043E\u043A DTLS \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430 \u0437\u0430\u043A\u0440\u0435\u043F\u043B\u0451\u043D: {fp}",
"desktop.sec.dtlsNone": "\u041E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u0430 DTLS \u0443\u0434\u0430\u043B\u0451\u043D\u043D\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u043D\u0435\u0442",
"desktop.sec.sasBoth": "\u041E\u0431\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438 \u043A\u043E\u0434 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u0432\u043D\u0435 \u043A\u0430\u043D\u0430\u043B\u0430",
"desktop.sec.sasIncomplete": "\u041A\u043E\u0434 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438 \u043D\u0435 \u043E\u0431\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B",
"desktop.sec.metadataOk": "\u0412\u044B\u0432\u0435\u0434\u0435\u043D \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u043A\u043B\u044E\u0447 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u0445 (HKDF metadata-protection-v4)",
"desktop.sec.metadataNone": "\u041A\u043B\u044E\u0447\u0430 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u0445 \u043D\u0435\u0442",
"desktop.sec.coverOn": "\u041F\u0440\u0438\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043A \u0430\u043A\u0442\u0438\u0432\u0435\u043D: \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u044B\u0435 \u0444\u0430\u043B\u044C\u0448\u0438\u0432\u044B\u0435 \u043A\u0430\u0434\u0440\u044B (32-128 \u0411 \u043A\u0430\u0436\u0434\u044B\u0435 15-30 \u0441) \u0432 \u043A\u0430\u043D\u0430\u043B\u0435 \u0441 \u0440\u044D\u0442\u0447\u0435\u0442\u043E\u043C",
"desktop.sec.coverOff": "\u0413\u0435\u043D\u0435\u0440\u0430\u0442\u043E\u0440 \u043F\u0440\u0438\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u0442\u0440\u0430\u0444\u0438\u043A\u0430 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442",
"desktop.sec.coverUnsupported": "\u041F\u0440\u0438\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u043C\u0443 \u0442\u0440\u0430\u0444\u0438\u043A\u0443 \u043D\u0443\u0436\u0435\u043D \u0441\u0435\u0430\u043D\u0441 Double Ratchet (\u0443 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430 \u0432\u0435\u0440\u0441\u0438\u044F \u043F\u043E\u0441\u0442\u0430\u0440\u0448\u0435)",
"desktop.tagline": "\u0421\u043A\u0432\u043E\u0437\u043D\u0430\u044F \u0441\u0432\u043E\u0431\u043E\u0434\u0430"
},
"zh": {
"language.label": "\u8BED\u8A00",
"language.suggest.text": "\u672C\u9875\u9762\u4E5F\u6709\u7B80\u4F53\u4E2D\u6587\u7248\u672C\u3002",
"language.suggest.cta": "\u9605\u8BFB\u7B80\u4F53\u4E2D\u6587",
"language.suggest.dismiss": "\u5173\u95ED",
"community.title": "\u4E00\u8D77\u6784\u7B51\u9690\u79C1\u7684\u672A\u6765",
"community.description": "SecureBit \u56E0\u793E\u533A\u800C\u6210\u957F\u3002\u4F60\u7684\u60F3\u6CD5\u4E0E\u53CD\u9988\u5851\u9020\u7740\u5B89\u5168\u901A\u8BAF\u7684\u672A\u6765 \u2014\u2014 \u5F00\u653E\u5F00\u53D1\uFF0C\u5168\u7A0B\u5B8C\u6574\u7684 ASN.1 \u6821\u9A8C\u3002",
"community.github": "GitHub \u4ED3\u5E93",
"community.feedback": "\u53CD\u9988",
"unique.eyebrow": "\u6211\u4EEC\u7684\u4E0D\u540C\u4E4B\u5904",
"unique.heading": "SecureBit \u4E3A\u4F55\u4E0E\u4F17\u4E0D\u540C",
"unique.s1.titleTop": "\u5206\u5C42\u7684",
"unique.s1.titleBottom": "\u52A0\u5BC6\u5185\u6838",
"unique.s1.collapsed": "\u52A0\u5BC6\u5185\u6838",
"unique.s1.desc": "ECDH P-384 \u5BC6\u94A5\u4EA4\u6362\u3001AES-256-GCM \u8F7D\u8377\u3001ECDSA \u7B7E\u540D\u4E0E\u5B8C\u6574\u7684 ASN.1 \u6821\u9A8C\uFF0C\u6C47\u6210\u4E00\u6761\u52A0\u56FA\u7684\u6D41\u6C34\u7EBF\u3002",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "\u7EAF\u7CB9\u7684 P2P",
"unique.s2.titleBottom": "\u57FA\u4E8E WebRTC",
"unique.s2.collapsed": "\u57FA\u4E8E WebRTC \u7684\u7EAF P2P",
"unique.s2.desc": "\u6D88\u606F\u901A\u8FC7 WebRTC \u5728\u8BBE\u5907\u4E4B\u95F4\u76F4\u63A5\u4F20\u9012\u3002\u6CA1\u6709\u4E2D\u7EE7\u4FDD\u5B58\u4F60\u7684\u6570\u636E \u2014\u2014 \u670D\u52A1\u5668\u53EA\u5E2E\u4E24\u7AEF\u5F7C\u6B64\u627E\u5230\u5BF9\u65B9\u3002",
"unique.s2.tags": [
"DTLS 1.3",
"\u65E0\u4E2D\u7EE7"
],
"unique.s3.titleTop": "\u5B8C\u7F8E\u7684",
"unique.s3.titleBottom": "\u524D\u5411\u4FDD\u5BC6",
"unique.s3.collapsed": "\u524D\u5411\u4FDD\u5BC6",
"unique.s3.desc": "\u4F1A\u8BDD\u5BC6\u94A5\u6301\u7EED\u8F6E\u6362\uFF0C\u7528\u540E\u5373\u5F03\uFF0C\u56E0\u6B64\u5355\u4E2A\u6CC4\u9732\u7684\u5BC6\u94A5\u6C38\u8FDC\u6253\u4E0D\u5F00\u6B64\u524D\u7684\u5BF9\u8BDD\u3002",
"unique.s3.tags": [
"\u4E34\u65F6\u5BC6\u94A5",
"\u81EA\u52A8\u8F6E\u6362"
],
"unique.s4.titleTop": "\u6D41\u91CF",
"unique.s4.titleBottom": "\u6DF7\u6DC6",
"unique.s4.collapsed": "\u6D41\u91CF\u6DF7\u6DC6",
"unique.s4.desc": "\u6570\u636E\u5305\u7684\u5927\u5C0F\u4E0E\u65F6\u95F4\u95F4\u9694\u4F1A\u88AB\u586B\u5145\u5E76\u968F\u673A\u5316\uFF0C\u5373\u4F7F\u6709\u4EBA\u76EF\u7740\u7EBF\u8DEF\uFF0C\u4E5F\u770B\u4E0D\u51FA\u5143\u6570\u636E\u7684\u89C4\u5F8B\u3002",
"unique.s4.tags": [
"\u6570\u636E\u5305\u586B\u5145",
"\u65F6\u95F4\u6296\u52A8"
],
"unique.s5.titleTop": "\u96F6\u6570\u636E",
"unique.s5.titleBottom": "\u6536\u96C6",
"unique.s5.collapsed": "\u96F6\u6570\u636E\u6536\u96C6",
"unique.s5.desc": "\u6CA1\u6709\u8D26\u53F7\uFF0C\u6CA1\u6709\u65E5\u5FD7\uFF0C\u4E0D\u4FDD\u5B58\u6D88\u606F\u3002\u670D\u52A1\u5668\u4E0A\u6CA1\u6709\u4EFB\u4F55\u53EF\u4EE5\u6CC4\u9732\u3001\u88AB\u8C03\u53D6\u6216\u88AB\u51FA\u552E\u7684\u4E1C\u897F\u3002",
"unique.s5.tags": [
"\u65E0\u9700\u8D26\u53F7",
"\u6CA1\u6709\u65E5\u5FD7"
],
"partners.eyebrow": "\u5408\u4F5C\u4F19\u4F34\u4E0E\u751F\u6001",
"partners.heading": "\u5408\u4F5C\u4F19\u4F34\u4FE1\u8D56\u6211\u4EEC",
"partners.aegis.desc": "\u8D44\u672C\u5408\u4F5C\u4F19\u4F34\uFF0C\u4E3A\u5176\u6295\u8D44\u7EC4\u5408\u4E2D\u7684\u673A\u5BC6\u91D1\u878D\u901A\u8BAF\u63D0\u4F9B\u4FDD\u969C\u3002",
"partners.aegis.role": "\u6218\u7565\u6295\u8D44\u65B9",
"partners.furilabs.desc": "\u4EE5\u9690\u79C1\u4E3A\u5148\u7684 Linux \u624B\u673A\uFF0C\u5185\u7F6E SecureBit \u4F5C\u4E3A\u9ED8\u8BA4\u5B89\u5168\u901A\u9053\u3002",
"partners.furilabs.role": "\u6280\u672F\u5408\u4F5C\u4F19\u4F34",
"partners.inviteTitle": "\u6210\u4E3A\u5408\u4F5C\u4F19\u4F34",
"partners.inviteDesc": "\u4F60\u5728\u505A\u9690\u79C1\u76F8\u5173\u7684\u786C\u4EF6\u6216\u57FA\u7840\u8BBE\u65BD\u5417\uFF1F\u6211\u4EEC\u4E00\u8D77\u96C6\u6210 SecureBit\u3002",
"partners.inviteCta": "\u5F00\u59CB\u6D3D\u8C08",
"roadmap.eyebrow": "\u5F00\u53D1\u8DEF\u7EBF\u56FE",
"roadmap.heading": "SecureBit \u7684\u6F14\u8FDB",
"roadmap.subheading": "\u4ECE\u7B2C\u4E00\u4E2A\u539F\u578B\u8D70\u5411\u6297\u91CF\u5B50\u7684\u53BB\u4E2D\u5FC3\u5316\u7F51\u7EDC\uFF0C\u6BCF\u4E00\u5C42\u90FD\u6709\u5B8C\u6574\u7684 ASN.1 \u6821\u9A8C\u3002",
"roadmap.progress": "\u5DF2\u5B8C\u6210 {total} \u4E2A\u91CC\u7A0B\u7891\u4E2D\u7684 {shipped} \u4E2A",
"roadmap.upcoming": "\u8FD8\u6709 {upcoming} \u4E2A",
"roadmap.keyFeatures": "\u6838\u5FC3\u529F\u80FD",
"roadmap.status.released": "\u5DF2\u53D1\u5E03",
"roadmap.status.current": "\u8FDB\u884C\u4E2D",
"roadmap.status.dev": "\u5F00\u53D1\u4E2D",
"roadmap.status.planned": "\u5DF2\u89C4\u5212",
"roadmap.status.research": "\u7814\u7A76\u4E2D",
"hero.headlineTop": "\u4E00\u6761\u53EA\u6709\u4F60\u4EEC\u4E24\u4EBA",
"hero.headlineBottom": "\u624D\u80FD\u8BFB\u61C2\u7684\u76F4\u8FDE\u7EBF\u8DEF\u3002",
"hero.subheading": "\u5BC6\u94A5\u5728\u4F60\u7684\u8BBE\u5907\u4E0A\u751F\u6210\uFF0C\u5E76\u5728\u4E24\u7AEF\u4E4B\u95F4\u76F4\u63A5\u4EA4\u6362\u3002\u65E0\u9700\u8D26\u53F7\uFF0C\u6CA1\u6709\u670D\u52A1\u5668\u4FDD\u5B58\u4F60\u7684\u6D88\u606F\u3002",
"hero.diagramAlt": "\u901A\u5411\u4E00\u4F4D\u8054\u7CFB\u4EBA\u7684\u76F4\u63A5\u52A0\u5BC6\u7EBF\u8DEF\uFF0C\u968F\u540E\u53C8\u6709\u4E24\u4F4D\u52A0\u5165",
"intro.createTitle": "\u521B\u5EFA\u65B0\u901A\u9053",
"intro.createDesc": "\u4F60\u7684\u8BBE\u5907\u4F1A\u751F\u6210\u5BC6\u94A5\u548C\u4E00\u6B21\u6027\u9080\u8BF7\u3002\u8FD9\u4E9B\u90FD\u4E0D\u4F1A\u7ECF\u8FC7\u4EFB\u4F55\u670D\u52A1\u5668\u3002",
"intro.createCta": "\u751F\u6210\u5BC6\u94A5\u4E0E\u9080\u8BF7",
"intro.joinTitle": "\u52A0\u5165\u901A\u9053",
"intro.scanTitle": "\u7528\u6444\u50CF\u5934\u626B\u63CF\u4E8C\u7EF4\u7801",
"intro.scanSubtitle": "\u6700\u5FEB\u7684\u65B9\u5F0F \u2014\u2014 \u5BF9\u51C6\u5BF9\u65B9\u7684\u5C4F\u5E55",
"intro.orPasteCode": "\u6216\u7C98\u8D34\u4EE3\u7801",
"intro.pastePlaceholder": "\u5728\u6B64\u7C98\u8D34\u9080\u8BF7\u7801\u2026",
"intro.connect": "\u8FDE\u63A5",
"intro.connecting": "\u5904\u7406\u4E2D\u2026",
"roadmap.r1.title": "\u5F00\u53D1\u542F\u52A8",
"roadmap.r1.sub": "\u6784\u60F3\u3001\u539F\u578B\u4E0E\u57FA\u7840\u8BBE\u65BD\u642D\u5EFA",
"roadmap.r1.date": "2025 \u5E74\u521D",
"roadmap.r1.features": [
"\u786E\u5B9A\u6982\u5FF5\u4E0E\u9700\u6C42",
"\u9009\u5B9A\u6280\u672F\u6808\uFF1AWebRTC\u3001P2P\u3001\u5BC6\u7801\u5B66",
"\u9996\u6279\u6D88\u606F\u6536\u53D1\u539F\u578B",
"\u5EFA\u7ACB\u4ED3\u5E93\u4E0E\u6301\u7EED\u96C6\u6210",
"\u57FA\u7840\u52A0\u5BC6\u67B6\u6784",
"UX/UI \u8BBE\u8BA1"
],
"roadmap.r2.title": "Alpha \u7248\u672C",
"roadmap.r2.sub": "\u9996\u4E2A\u516C\u5F00 Alpha\uFF1A\u57FA\u7840\u804A\u5929\u4E0E\u5BC6\u94A5\u4EA4\u6362",
"roadmap.r2.date": "2025 \u5E74\u6625",
"roadmap.r2.features": [
"\u57FA\u4E8E WebRTC \u7684\u57FA\u7840 P2P \u6D88\u606F",
"\u7B80\u6613\u7AEF\u5230\u7AEF\u52A0\u5BC6\uFF08\u6F14\u793A\u65B9\u6848\uFF09",
"\u7A33\u5B9A\u7684\u4FE1\u4EE4\u4E0E\u91CD\u8FDE",
"\u7528\u4E8E\u6D4B\u8BD5\u7684\u6700\u7B80\u754C\u9762",
"\u6536\u96C6\u65E9\u671F\u6D4B\u8BD5\u8005\u7684\u53CD\u9988"
],
"roadmap.r3.title": "\u5B89\u5168\u52A0\u56FA",
"roadmap.r3.sub": "\u5F3A\u5316\u5B89\u5168\u5E76\u53D1\u5E03\u7A33\u5B9A\u5206\u652F",
"roadmap.r3.date": "2025 \u5E74\u590F",
"roadmap.r3.features": [
"ECDH/ECDSA \u6295\u5165\u751F\u4EA7",
"\u524D\u5411\u4FDD\u5BC6\u4E0E\u5BC6\u94A5\u8F6E\u6362",
"\u6539\u8FDB\u7684\u8EAB\u4EFD\u9A8C\u8BC1\u68C0\u67E5",
"\u6587\u4EF6\u52A0\u5BC6\u4E0E\u5927\u8F7D\u8377\u4F20\u8F93",
"\u57FA\u7840\u5BC6\u7801\u6D41\u7A0B\u5BA1\u8BA1"
],
"roadmap.r4.title": "\u6269\u5C55\u4E0E\u7A33\u5B9A",
"roadmap.r4.sub": "\u7F51\u7EDC\u6269\u5C55\u4E0E\u7A33\u5B9A\u6027\u6539\u8FDB",
"roadmap.r4.date": "2025 \u5E74\u79CB",
"roadmap.r4.features": [
"\u4F18\u5316 P2P \u8FDE\u63A5\u4E0E NAT \u7A7F\u900F",
"\u91CD\u8FDE\u673A\u5236\u4E0E\u6D88\u606F\u961F\u5217",
"\u964D\u4F4E\u79FB\u52A8\u7AEF\u8017\u7535",
"\u591A\u8BBE\u5907\u540C\u6B65",
"\u9762\u5411\u5F00\u53D1\u8005\u7684\u76D1\u63A7\u4E0E\u65E5\u5FD7\u5DE5\u5177"
],
"roadmap.r5.title": "\u9690\u79C1\u4F18\u5148\u7248\u672C",
"roadmap.r5.sub": "\u805A\u7126\u9690\u79C1\uFF1A\u5C3D\u91CF\u51CF\u5C11\u5143\u6570\u636E",
"roadmap.r5.date": "2025 \u5E74\u51AC",
"roadmap.r5.features": [
"\u5143\u6570\u636E\u4FDD\u62A4\u4E0E\u6307\u7EB9\u524A\u51CF",
"\u6D0B\u8471\u8DEF\u7531\u4E0E DHT \u5B9E\u9A8C",
"\u533F\u540D\u8FDE\u63A5\u9009\u9879",
"\u4E3A\u5F00\u6E90\u4EE3\u7801\u5BA1\u8BA1\u505A\u51C6\u5907",
"\u6539\u8FDB\u7684\u7528\u6237\u6821\u9A8C\u6D41\u7A0B"
],
"roadmap.r6.title": "Enhanced Security Edition",
"roadmap.r6.sub": "18 \u5C42\u519B\u7528\u7EA7\u5BC6\u7801\u5B66\uFF0C\u914D\u5408\u5B8C\u6574\u7684 ASN.1 \u6821\u9A8C",
"roadmap.r6.date": "2025 \u5E74\u672B",
"roadmap.r6.features": [
"ECDH + DTLS + SAS \u4E09\u91CD\u9632\u62A4",
"ECDH P-384 \u4E0E AES-GCM 256 \u4F4D\u52A0\u5BC6",
"DTLS \u6307\u7EB9\u6821\u9A8C",
"SAS\uFF08\u77ED\u8BA4\u8BC1\u5B57\u7B26\u4E32\uFF09\u6821\u9A8C",
"\u5E26\u5BC6\u94A5\u8F6E\u6362\u7684\u524D\u5411\u4FDD\u5BC6",
"\u5F3A\u5316\u7684\u4E2D\u95F4\u4EBA\u653B\u51FB\u9632\u62A4",
"\u5B8C\u6574\u7684 ASN.1 DER \u6821\u9A8C",
"OID \u4E0E EC \u70B9\u6821\u9A8C",
"SPKI \u7ED3\u6784\u6821\u9A8C",
"P2P WebRTC \u67B6\u6784",
"\u5143\u6570\u636E\u4FDD\u62A4",
"100% \u5F00\u6E90\u4EE3\u7801"
],
"roadmap.r7.title": "Desktop Edition",
"roadmap.r7.sub": "\u9762\u5411 Windows\u3001macOS \u4E0E Linux \u7684\u539F\u751F\u684C\u9762\u5E94\u7528",
"roadmap.r7.date": "2026 \u5E74\u521D",
"roadmap.r7.features": [
"Windows \u684C\u9762\u5E94\u7528\uFF08Tauri v2\uFF09",
"macOS \u684C\u9762\u5E94\u7528\uFF08Tauri v2\uFF09",
"Linux AppImage\uFF08Tauri v2\uFF09",
"\u5B9E\u65F6\u901A\u77E5",
"\u81EA\u52A8\u91CD\u8FDE",
"\u8DE8\u8BBE\u5907\u540C\u6B65",
"\u6539\u8FDB\u7684\u754C\u9762",
"\u652F\u6301\u6700\u5927 100 MB \u7684\u6587\u4EF6"
],
"roadmap.r8.title": "\u5B89\u5168\u8BED\u97F3\u4E0E\u901A\u8BDD",
"roadmap.r8.sub": "\u52A0\u5BC6\u8BED\u97F3\u6D88\u606F\u3001\u8BED\u97F3\u901A\u8BDD\u4E0E\u89C6\u9891\u901A\u8BDD",
"roadmap.r8.date": "2026 \u5E74\u521D",
"roadmap.r8.features": [
"\u7AEF\u5230\u7AEF\u52A0\u5BC6\u7684\u8BED\u97F3\u6D88\u606F",
"\u4E00\u5BF9\u4E00\u52A0\u5BC6\u8BED\u97F3\u901A\u8BDD\uFF08WebRTC\uFF09",
"\u4E00\u5BF9\u4E00\u52A0\u5BC6\u89C6\u9891\u901A\u8BDD\uFF08WebRTC\uFF09",
"\u5B9E\u65F6\u5A92\u4F53\u7684\u524D\u5411\u4FDD\u5BC6",
"\u7531 SRTP/DTLS \u4FDD\u62A4\u7684\u5A92\u4F53\u6D41",
"\u901A\u8BDD\u4E2D\u7684 SAS \u6821\u9A8C",
"\u6765\u7535\u901A\u77E5\u4E0E\u81EA\u52A8\u91CD\u8FDE",
"\u4F4E\u5EF6\u8FDF\u7684 P2P \u5A92\u4F53"
],
"roadmap.r9.title": "\u7FA4\u7EC4\u901A\u8BAF",
"roadmap.r9.sub": "\u5728\u4E0D\u727A\u7272\u9690\u79C1\u7684\u524D\u63D0\u4E0B\u8FDB\u884C\u7FA4\u804A",
"roadmap.r9.date": "\u5F53\u524D",
"roadmap.r9.features": [
"\u6700\u591A 8 \u4EBA\u7684 P2P \u7FA4\u804A",
"\u7F51\u72B6\u6295\u9012\uFF0C\u5E76\u4EE5\u7B7E\u540D\u4E2D\u7EE7\u4F5C\u4E3A\u515C\u5E95",
"\u4E00\u4E2A\u7FA4\u7EC4\u5B89\u5168\u7801\uFF0C\u7531\u6240\u6709\u4EBA\u5171\u540C\u6838\u5BF9",
"\u5148\u627F\u8BFA\u540E\u63ED\u793A\u7684\u6D41\u7A0B\uFF0C\u62B5\u5FA1\u5BF9\u5B89\u5168\u7801\u7684\u66B4\u529B\u8BD5\u63A2",
"\u7FA4\u7EC4\u4E13\u5C5E\u8EAB\u4EFD\u5BC6\u94A5\uFF0C\u8BBE\u8BA1\u4E0A\u5373\u4E3A\u4E34\u65F6",
"\u5E26\u7EAA\u5143\u6392\u5E8F\u7684\u7B7E\u540D\u6210\u5458\u540D\u5355",
"\u6D88\u606F\u5E26\u7B7E\u540D\uFF0C\u56E0\u800C\u5206\u53C9\u7684\u8BB0\u5F55\u53EF\u88AB\u8BC1\u660E",
"\u6CA1\u6709\u670D\u52A1\u5668\uFF0C\u6CA1\u6709\u5171\u4EAB\u7FA4\u5BC6\u94A5\uFF0C\u6CA1\u6709\u5386\u53F2\u8BB0\u5F55"
],
"roadmap.r10.title": "Mobile Edition",
"roadmap.r10.sub": "\u9762\u5411 iOS \u4E0E Android \u7684\u539F\u751F\u79FB\u52A8\u5E94\u7528",
"roadmap.r10.date": "2027 \u5E74\u7B2C\u4E8C\u5B63\u5EA6",
"roadmap.r10.features": [
"iOS \u539F\u751F\u5E94\u7528\uFF08Swift/SwiftUI\uFF09",
"Android \u539F\u751F\u5E94\u7528\uFF08Kotlin/Jetpack Compose\uFF09",
"\u79FB\u52A8\u6D4F\u89C8\u5668\u7684 PWA \u652F\u6301",
"\u5B9E\u65F6\u63A8\u9001\u901A\u77E5",
"\u7535\u91CF\u4F18\u5316",
"\u4E3A\u79FB\u52A8\u7AEF\u4F18\u5316\u7684\u754C\u9762",
"\u79BB\u7EBF\u6D88\u606F\u961F\u5217",
"\u751F\u7269\u8BC6\u522B\u9A8C\u8BC1"
],
"roadmap.r11.title": "\u6297\u91CF\u5B50\u7248\u672C",
"roadmap.r11.sub": "\u62B5\u5FA1\u91CF\u5B50\u8BA1\u7B97\u673A",
"roadmap.r11.date": "2027 \u5E74\u7B2C\u56DB\u5B63\u5EA6",
"roadmap.r11.features": [
"\u540E\u91CF\u5B50\u5BC6\u7801\u5B66 CRYSTALS-Kyber",
"SPHINCS+ \u6570\u5B57\u7B7E\u540D",
"\u6DF7\u5408\u65B9\u6848\uFF1A\u7ECF\u5178\u4E0E\u540E\u91CF\u5B50\u5E76\u7528",
"\u6297\u91CF\u5B50\u7684\u5BC6\u94A5\u4EA4\u6362",
"\u66F4\u65B0\u7684\u54C8\u5E0C\u7B97\u6CD5",
"\u8FC1\u79FB\u73B0\u6709\u4F1A\u8BDD",
"\u517C\u5BB9 v5.x",
"\u6297\u91CF\u5B50\u534F\u8BAE"
],
"roadmap.r12.title": "\u53BB\u4E2D\u5FC3\u5316\u7F51\u7EDC",
"roadmap.r12.sub": "\u5B8C\u5168\u53BB\u4E2D\u5FC3\u5316\u7684\u7F51\u7EDC",
"roadmap.r12.date": "2028 \u5E74",
"roadmap.r12.features": [
"\u8282\u70B9\u7F51\u72B6\u7F51\u7EDC",
"\u7528\u4E8E\u53D1\u73B0\u5BF9\u7AEF\u7684 DHT",
"\u5185\u7F6E\u6D0B\u8471\u8DEF\u7531",
"\u4EE3\u5E01\u7ECF\u6D4E\u4E0E\u8282\u70B9\u6FC0\u52B1",
"\u901A\u8FC7 DAO \u6CBB\u7406",
"\u4E0E\u5176\u4ED6\u7F51\u7EDC\u4E92\u901A",
"\u8DE8\u5E73\u53F0\u517C\u5BB9",
"\u81EA\u6108\u7F51\u7EDC"
],
"roadmap.r13.title": "AI \u9690\u79C1\u52A9\u624B",
"roadmap.r13.sub": "\u7528\u4EBA\u5DE5\u667A\u80FD\u5B88\u62A4\u9690\u79C1\u4E0E\u5B89\u5168",
"roadmap.r13.date": "2028 \u5E74\u4EE5\u540E",
"roadmap.r13.features": [
"\u672C\u5730 AI \u5A01\u80C1\u5206\u6790",
"\u81EA\u52A8\u8BC6\u522B\u4E2D\u95F4\u4EBA\u653B\u51FB",
"\u81EA\u9002\u5E94\u5BC6\u7801\u5B66",
"\u4E2A\u6027\u5316\u5B89\u5168\u5EFA\u8BAE",
"\u96F6\u77E5\u8BC6\u673A\u5668\u5B66\u4E60",
"\u79C1\u6709 AI \u52A9\u624B",
"\u9884\u6D4B\u6027\u5B89\u5168",
"\u81EA\u4E3B\u7684\u653B\u51FB\u9632\u62A4"
],
"handshake.step1": "\u6B63\u5728\u751F\u6210 ECDH P-384 \u5BC6\u94A5\u5BF9",
"handshake.step2": "\u6B63\u5728\u63A8\u5BFC\u6821\u9A8C\u7801",
"handshake.step3": "\u6B63\u5728\u56FA\u5B9A\u524D\u5411\u4FDD\u5BC6",
"handshake.securingTitle": "\u6B63\u5728\u4FDD\u62A4\u4F60\u7684\u901A\u9053",
"handshake.answerTitle": "\u6B63\u5728\u751F\u6210\u4F60\u7684\u5E94\u7B54",
"handshake.securingDesc": "\u6B63\u5728\u953B\u9020\u8DB3\u4EE5\u62B5\u5FA1\u7BE1\u6539\u7684\u5BC6\u94A5\u3002",
"handshake.shareTitle": "\u5206\u4EAB\u4F60\u7684\u9080\u8BF7",
"handshake.sendAnswerTitle": "\u628A\u5E94\u7B54\u53D1\u56DE\u53BB",
"handshake.shareDesc": "\u628A\u4E8C\u7EF4\u7801\u7ED9\u5BF9\u65B9\u770B\uFF0C\u6216\u628A\u4EE3\u7801\u53D1\u7ED9\u5BF9\u65B9\u3002\u5B83\u53EA\u80FD\u7528\u4E00\u6B21\uFF0C\u800C\u4E14\u5F88\u5FEB\u8FC7\u671F\u3002",
"handshake.sendAnswerDesc": "\u628A\u8FD9\u6BB5\u5E94\u7B54\u4EA4\u7ED9\u521B\u5EFA\u901A\u9053\u7684\u4EBA\uFF0C\u8BA9\u5BF9\u65B9\u5B8C\u6210\u63E1\u624B\u3002",
"handshake.establish": "\u5EFA\u7ACB\u8FDE\u63A5",
"handshake.thenReceive": "\u7136\u540E\u63A5\u6536\u5BF9\u65B9\u53D1\u56DE\u7684\u5E94\u7B54",
"handshake.pasteAnswerPlaceholder": "\u7C98\u8D34\u5BF9\u65B9\u7684\u5E94\u7B54\u7801\u2026",
"handshake.answerSentNote": "\u628A\u8FD9\u6BB5\u5E94\u7B54\u53D1\u7ED9\u521B\u5EFA\u8005\uFF0C\u7136\u540E\u7B49\u5F85 \u2014\u2014 \u5BF9\u65B9\u4E00\u8FDE\u4E0A\uFF0C\u804A\u5929\u5C31\u4F1A\u6253\u5F00\u3002",
"handshake.qrHint": "\u5728\u5BF9\u65B9\u8BFB\u53D6\u5B8C\u4EE3\u7801\u4E4B\u524D\uFF0C\u8BF7\u4FDD\u6301\u6B64\u754C\u9762\u6253\u5F00\u3002",
"handshake.qrHintFrames": "\u63E1\u624B\u88AB\u62C6\u6210 {frames} \u5E27 \u2014\u2014 \u5728\u5BF9\u65B9\u8BFB\u5B8C\u5168\u90E8\u5E27\u4E4B\u524D\uFF0C\u8BF7\u4FDD\u6301\u6B64\u754C\u9762\u6253\u5F00\u3002",
"verify.title": "\u5B89\u5168\u6821\u9A8C",
"verify.desc": "\u901A\u8FC7\u53E6\u4E00\u6761\u6E20\u9053\uFF08\u901A\u8BDD\u6216\u5F53\u9762\uFF09\u4E0E\u5BF9\u65B9\u6838\u5BF9\u8FD9\u4E2A\u5B89\u5168\u7801\uFF0C\u7136\u540E\u8F93\u5165\u5B83\u4EE5\u89E3\u9501\u804A\u5929\u3002",
"verify.enterLabel": "\u8F93\u5165\u6838\u5BF9\u8FC7\u7684\u5B89\u5168\u7801",
"verify.placeholder": "\u5728\u6B64\u8F93\u5165\u5B89\u5168\u7801",
"verify.confirm": "\u786E\u8BA4\u5B89\u5168\u7801",
"verify.confirmed": "\u5DF2\u786E\u8BA4",
"verify.mismatch": "\u4E0D\u4E00\u81F4",
"verify.yours": "\u4F60\u7684\u786E\u8BA4",
"verify.peer": "\u5BF9\u65B9\u7684\u786E\u8BA4",
"verify.pending": "\u7B49\u5F85\u4E2D",
"verify.waiting": "\u7B49\u5F85\u5B89\u5168\u7801\u2026",
"verify.verified": "\u901A\u9053\u5DF2\u6821\u9A8C",
"verify.bothConfirmed": "\u53CC\u65B9\u5747\u5DF2\u786E\u8BA4\u3002\u6B63\u5728\u6253\u5F00\u5B89\u5168\u804A\u5929\u2026",
"pwa.bannerTitle": "\u5B89\u88C5 SecureBit.chat",
"pwa.bannerDesc": "\u83B7\u5F97\u539F\u751F\u5E94\u7528\u822C\u7684\u4F53\u9A8C\uFF0C\u5B89\u5168\u6027\u66F4\u8FDB\u4E00\u6B65",
"pwa.install": "\u5B89\u88C5",
"pwa.dismiss": "\u5173\u95ED",
"pwa.close": "\u5173\u95ED",
"pwa.iosTitle": "\u5728 iOS \u4E0A\u5B89\u88C5",
"pwa.iosStep1": "\u70B9\u6309\u300C\u5206\u4EAB\u300D\u6309\u94AE",
"pwa.iosStep1Hint": "\u901A\u5E38\u5728 Safari \u5E95\u90E8",
"pwa.iosStep2": "\u627E\u5230\u300C\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55\u300D",
"pwa.iosStep2Hint": "\u5728\u5206\u4EAB\u83DC\u5355\u4E2D\u5411\u4E0B\u6EDA\u52A8",
"pwa.iosStep3": "\u70B9\u6309\u300C\u6DFB\u52A0\u300D",
"pwa.iosStep3Hint": "\u786E\u8BA4\u4EE5\u5B89\u88C5 SecureBit.chat",
"pwa.genericTitle": "\u5B89\u88C5 SecureBit",
"pwa.genericDesc": "\u6BCF\u79CD\u6D4F\u89C8\u5668\u7684\u5B89\u88C5\u65B9\u5F0F\u90FD\u4E0D\u4E00\u6837\u3002\u8BF7\u9009\u62E9\u4E0E\u4F60\u7684\u6D4F\u89C8\u5668\u76F8\u7B26\u7684\u6B65\u9AA4\u3002",
"pwa.gotIt": "\u77E5\u9053\u4E86",
"pwa.installedTitle": "\u5E94\u7528\u5DF2\u5B89\u88C5\uFF01",
"pwa.installedIos": "iOS \u5E94\u7528\u5DF2\u5B89\u88C5\uFF01\u8BF7\u4ECE\u4E3B\u5C4F\u5E55\u6253\u5F00\u3002",
"pwa.installedGeneric": "SecureBit.chat \u5DF2\u5728\u4F60\u7684\u8BBE\u5907\u4E0A",
"pwa.anytimeTitle": "\u968F\u65F6\u90FD\u80FD\u5B89\u88C5",
"pwa.anytimeDesc": "\u4F60\u968F\u65F6\u53EF\u4EE5\u4ECE\u6D4F\u89C8\u5668\u83DC\u5355\u5B89\u88C5 SecureBit.chat\uFF0C\u90A3\u6837\u4F53\u9A8C\u6700\u597D\u3002",
"pwa.ok": "\u597D",
"step.open": "\u7B2C 1 \u6B65 \xB7 \u5F00\u901A\u901A\u9053",
"step.exchange": "\u7B2C 2 \u6B65 \xB7 \u4EA4\u6362",
"step.verification": "\u7B2C 3 \u6B65 \xB7 \u6821\u9A8C",
"action.create": "\u521B\u5EFA",
"action.join": "\u52A0\u5165",
"action.back": "\u8FD4\u56DE",
"action.copy": "\u590D\u5236",
"action.copied": "\u5DF2\u590D\u5236",
"action.scan": "\u626B\u63CF",
"action.downloadDesktop": "\u4E0B\u8F7D\u684C\u9762\u5E94\u7528",
"action.advancedSettings": "\u9AD8\u7EA7\u8BBE\u7F6E",
"cred.offerTag": "\u9080\u8BF7 \xB7 \u6216\u590D\u5236\u6587\u672C",
"cred.answerTag": "\u5E94\u7B54 \xB7 \u6216\u590D\u5236\u6587\u672C",
"cred.reveal": "\u70B9\u51FB\u663E\u793A - \u8BF7\u52FF\u6CC4\u9732\u6B64\u4EE3\u7801",
"qr.title": "\u626B\u63CF\u4E8C\u7EF4\u7801",
"qr.subtitle": "\u628A\u6444\u50CF\u5934\u5BF9\u51C6\u5BF9\u65B9\u7684\u4E8C\u7EF4\u7801",
"qr.scanning": "\u626B\u63CF\u4E2D\u2026",
"qr.hint": "\u8BF7\u62FF\u7A33\uFF0C\u76F4\u5230\u6240\u6709\u90E8\u5206\u90FD\u88AB\u8BFB\u53D6\u3002\u6444\u50CF\u5934\u4EC5\u5728\u672C\u5730\u4F7F\u7528 - \u4E0D\u4F1A\u4E0A\u4F20\u4EFB\u4F55\u5185\u5BB9\u3002",
"mesh.you": "\u4F60",
"mesh.peer": "\u5BF9\u65B9 \xB7 \u4F1A\u8BDD 1",
"mesh.joined2": "\u5C0F\u7EA2 \u52A0\u5165 \xB7 +2",
"mesh.joined3": "\u5C0F\u660E \u52A0\u5165 \xB7 +3",
"ice.title": "\u7F51\u7EDC\u8BBE\u7F6E",
"ice.subtitle": "\u4EC5\u5728\u672C\u5730\u914D\u7F6E - \u6C38\u8FDC\u4E0D\u4F1A\u53D1\u7ED9\u5BF9\u65B9",
"ice.intro": "SecureBit \u9ED8\u8BA4\u4F7F\u7528\u516C\u5171 STUN \u670D\u52A1\u5668\u6765\u534F\u5546\u70B9\u5BF9\u70B9\u8FDE\u63A5\u3002\u5982\u679C\u4F60\u81EA\u5EFA\u670D\u52A1\uFF0C\u53EF\u4EE5\u6307\u5411\u81EA\u5DF1\u7684 STUN/TURN\u3002",
"ice.publicTitle": "\u516C\u5171\u670D\u52A1\u5668\uFF08\u9ED8\u8BA4\uFF09",
"ice.publicDesc": "\u65E0\u9700\u914D\u7F6E\uFF0C\u9002\u5408\u5927\u591A\u6570\u4EBA\u3002",
"ice.customTitle": "\u6211\u81EA\u5DF1\u7684 STUN/TURN \u670D\u52A1\u5668",
"ice.customDesc": "\u6700\u591A {max} \u4E2A\u670D\u52A1\u5668\u3002",
"ice.turnNote": "TURN \u4E2D\u7EE7\u80FD\u770B\u5230\u53CC\u65B9\u7684 IP \u4E0E\u6D41\u91CF\u8282\u594F\uFF0C\u4F46\u6C38\u8FDC\u770B\u4E0D\u5230\u6D88\u606F\u5185\u5BB9\uFF0C\u5185\u5BB9\u59CB\u7EC8\u7AEF\u5230\u7AEF\u52A0\u5BC6\u3002\u5EFA\u8BAE\u4F7F\u7528 ",
"ice.turnNoteTls": "\uFF08TLS\uFF09\u3002",
"ice.test": "\u6D4B\u8BD5\u670D\u52A1\u5668",
"ice.testing": "\u6D4B\u8BD5\u4E2D\u2026",
"ice.relayTitle": "\u4EC5\u4E2D\u7EE7\u6A21\u5F0F",
"ice.relayBadge": "\u9690\u79C1\u6700\u5F3A",
"ice.relayDesc": "\u8BA9\u6240\u6709\u6D41\u91CF\u90FD\u7ECF\u8FC7 TURN\uFF0C\u5BF9\u65B9\u6C38\u8FDC\u770B\u4E0D\u5230\u4F60\u7684 IP\u3002\u9700\u8981\u4E00\u53F0 TURN \u670D\u52A1\u5668\u3002",
"ice.relayWarning": "\u5DF2\u542F\u7528\u4EC5\u4E2D\u7EE7\u6A21\u5F0F\uFF0C\u4F46\u6CA1\u6709\u914D\u7F6E TURN \u670D\u52A1\u5668\u3002\u8FDE\u63A5\u5C06\u65E0\u6CD5\u5EFA\u7ACB\u3002",
"ice.persist": "\u4FDD\u5B58\u5728\u672C\u8BBE\u5907",
"ice.persistDesc": "\u4EE5\u52A0\u5BC6\u5F62\u5F0F\u4FDD\u5B58\u5728\u6B64\u6D4F\u89C8\u5668\u4E2D\u3002\u4FDD\u6301\u5173\u95ED\u5219\u4EC5\u5728\u672C\u6B21\u4F1A\u8BDD\u4E2D\u751F\u6548\u3002",
"ice.forget": "\u5FD8\u8BB0\u5DF2\u4FDD\u5B58\u7684\u8BBE\u7F6E",
"ice.cancel": "\u53D6\u6D88",
"ice.apply": "\u5E94\u7528",
"ice.errUnavailable": "\u6B64\u6D4F\u89C8\u5668\u4E0D\u652F\u6301 WebRTC",
"ice.errInvalid": "\u670D\u52A1\u5668\u914D\u7F6E\u65E0\u6548",
"update.title": "\u6709\u53EF\u7528\u66F4\u65B0",
"update.desc": "\u68C0\u6D4B\u5230 SecureBit \u7684\u65B0\u7248\u672C\u3002",
"update.currentVersion": "\u5F53\u524D\u7248\u672C",
"update.newVersion": "\u65B0\u7248\u672C",
"update.now": "\u7ACB\u5373\u66F4\u65B0",
"update.later": "\u7A0D\u540E",
"update.unknown": "\u65E0",
"update.stepSaving": "\u6B63\u5728\u4FDD\u5B58\u6570\u636E\u2026",
"update.stepSwCaches": "\u6B63\u5728\u6E05\u7406 Service Worker \u7F13\u5B58\u2026",
"update.stepSwUnregister": "\u6B63\u5728\u6CE8\u9500 Service Worker\u2026",
"update.stepBrowserCache": "\u6B63\u5728\u6E05\u7406\u6D4F\u89C8\u5668\u7F13\u5B58\u2026",
"update.stepVersion": "\u6B63\u5728\u66F4\u65B0\u7248\u672C\u2026",
"update.stepReload": "\u6B63\u5728\u91CD\u65B0\u52A0\u8F7D\u5E94\u7528\u2026",
"update.error": "\u66F4\u65B0\u51FA\u9519\u3002\u8BF7\u624B\u52A8\u5237\u65B0\u9875\u9762\uFF08Ctrl+F5 \u6216 Cmd+Shift+R\uFF09",
"update.confirmSkip": "\u6709\u65B0\u7248\u672C\u53EF\u7528\u3002\u4E3A\u4E86\u5B89\u5168\u4E0E\u7A33\u5B9A\uFF0C\u5EFA\u8BAE\u66F4\u65B0\u3002\u8981\u4E0D\u66F4\u65B0\u7EE7\u7EED\u5417\uFF1F",
"offline.backOnline": "\u5DF2\u6062\u590D\u8054\u7F51",
"offline.mode": "\u79BB\u7EBF\u6A21\u5F0F",
"offline.dismiss": "\u5173\u95ED",
"offline.lostTitle": "\u8FDE\u63A5\u5DF2\u65AD\u5F00",
"offline.lostDesc": "SecureBit \u73B0\u5728\u5904\u4E8E\u79BB\u7EBF\u6A21\u5F0F\u3002\u90E8\u5206\u529F\u80FD\u53D7\u9650\uFF0C\u4F46\u4F60\u7684\u6570\u636E\u4F9D\u7136\u5B89\u5168\u3002",
"offline.point1": "\u4F60\u7684\u4F1A\u8BDD\u4E0E\u5BC6\u94A5\u90FD\u4F1A\u4FDD\u7559",
"offline.point2": "\u670D\u52A1\u5668\u4E0A\u4E0D\u5B58\u50A8\u4EFB\u4F55\u6570\u636E",
"offline.point3": "\u91CD\u65B0\u8054\u7F51\u540E\u6D88\u606F\u4E0E\u6587\u4EF6\u4F1A\u540C\u6B65",
"offline.continue": "\u7EE7\u7EED\u79BB\u7EBF\u4F7F\u7528",
"offline.restoredTitle": "\u91CD\u65B0\u8054\u7F51\u4E4B\u540E",
"offline.restoredDesc": "\u6389\u7EBF\u4E0D\u4F1A\u8BA9\u4F60\u635F\u5931\u4EC0\u4E48\u3002SecureBit \u4F1A\u628A\u4E00\u5207\u5148\u5728\u672C\u5730\u6392\u961F\uFF0C\u4E00\u65E6\u6062\u590D\u8054\u7F51\u5C31\u7EE7\u7EED\u52A0\u5BC6\u4F1A\u8BDD\u3002",
"offline.r1Title": "\u4F60\u7684\u6D88\u606F\u4F1A\u9001\u8FBE",
"offline.r1Desc": "\u4F60\u5728\u79BB\u7EBF\u65F6\u5199\u4E0B\u7684\u4E00\u5207\u90FD\u4F1A\u81EA\u52A8\u53D1\u7ED9\u5BF9\u65B9\u3002",
"offline.r2Title": "\u6587\u4EF6\u4F1A\u4F20\u5B8C",
"offline.r2Desc": "\u4E0A\u4F20\u4F1A\u4ECE\u4E2D\u65AD\u5904\u7EE7\u7EED - \u4E0D\u7528\u91CD\u65B0\u53D1\u9001\u3002",
"offline.r3Title": "\u5BF9\u65B9\u7684\u6D88\u606F\u4E0E\u6587\u4EF6\u4F1A\u5230\u8FBE",
"offline.r3Desc": "\u5BF9\u65B9\u5728\u4E2D\u65AD\u671F\u95F4\u53D1\u51FA\u7684\u5185\u5BB9\u4F1A\u6309\u987A\u5E8F\u9001\u5230\u4F60\u8FD9\u91CC\u3002",
"offline.r4Title": "\u4EC0\u4E48\u90FD\u4E0D\u4F1A\u4E22\u5931",
"offline.r4Desc": "\u91CD\u65B0\u8FDE\u4E0A\u540E\u4E0D\u4F1A\u7559\u4E0B\u7A7A\u6863 - \u5BF9\u8BDD\u4ECE\u4E2D\u65AD\u7684\u5730\u65B9\u63A5\u7740\u7EE7\u7EED\u3002",
"offline.gotIt": "\u77E5\u9053\u4E86",
"qr.showTitle": "\u663E\u793A\u4E8C\u7EF4\u7801",
"qr.showSubtitle": "\u5168\u5C4F \xB7 \u8BA9\u5BF9\u65B9\u626B\u63CF",
"qr.showSubtitleFrames": "\u5168\u5C4F \xB7 \u8BA9\u5BF9\u65B9\u626B\u63CF\u5168\u90E8 {frames} \u5E27",
"notify.enabledBody": "\u901A\u77E5\u5DF2\u5F00\u542F\u3002\u6709\u65B0\u6D88\u606F\u65F6\u4F60\u4F1A\u6536\u5230\u63D0\u9192\u3002",
"notify.workingBody": "\u901A\u77E5\u5DE5\u4F5C\u6B63\u5E38\u3002\u6709\u65B0\u6D88\u606F\u65F6\u4F60\u4F1A\u6536\u5230\u63D0\u9192\u3002",
"pw.label": "\u5BC6\u7801\u8F93\u5165\u6846",
"pw.placeholder": "\u8F93\u5165\u5BC6\u7801\u2026",
"pw.decrypt": "\u89E3\u5BC6",
"pw.cancel": "\u53D6\u6D88",
"file.title": "\u6587\u4EF6\u4F20\u8F93",
"file.drop": "\u628A\u6587\u4EF6\u62D6\u5230\u8FD9\u91CC",
"file.dropHint": "\u53D1\u9001\u524D\u5DF2\u7AEF\u5230\u7AEF\u52A0\u5BC6 \xB7 \u6700\u5927 100 MB",
"file.browse": "\u6D4F\u89C8\u8BBE\u5907",
"file.incoming": "\u6536\u5230\u6587\u4EF6\u8BF7\u6C42",
"file.accept": "\u63A5\u53D7",
"file.reject": "\u62D2\u7EDD",
"file.download": "\u4E0B\u8F7D",
"file.notReady": "\u8FDE\u63A5\u5C1A\u672A\u5C31\u7EEA",
"file.tooLarge": "\u6587\u4EF6\u8FC7\u5927",
"file.typeNotAllowed": "\u4E0D\u5141\u8BB8\u7684\u6587\u4EF6\u7C7B\u578B",
"file.maxConcurrent": "\u5DF2\u8FBE\u5230\u540C\u65F6\u4F20\u8F93\u7684\u4E0A\u9650",
"file.gone": "\u8BE5\u6587\u4EF6\u5DF2\u65E0\u6CD5\u4E0B\u8F7D\u3002",
"call.incoming": "\u6765\u7535",
"call.incomingVideo": "\u89C6\u9891\u6765\u7535",
"call.encrypted": "\u52A0\u5BC6\u901A\u8BDD",
"call.encryptedShort": "\u5DF2\u52A0\u5BC6",
"call.peer": "\u5B89\u5168\u5BF9\u7AEF",
"call.connecting": "\u8FDE\u63A5\u4E2D\u2026",
"call.ringing": "\u6B63\u5728\u547C\u53EB\u2026",
"call.accept": "\u63A5\u542C",
"call.decline": "\u62D2\u63A5",
"call.end": "\u6302\u65AD",
"call.camera": "\u6444\u50CF\u5934",
"call.cameraOff": "\u6444\u50CF\u5934\u5DF2\u5173\u95ED",
"call.peerCameraOff": "\u5BF9\u65B9\u7684\u6444\u50CF\u5934\u5DF2\u5173\u95ED",
"call.flipCamera": "\u5207\u6362\u6444\u50CF\u5934",
"call.addVideo": "\u52A0\u5165\u89C6\u9891",
"call.video": "\u89C6\u9891",
"call.muted": "\u5DF2\u9759\u97F3",
"call.expand": "\u653E\u5927",
"call.minimize": "\u7F29\u5C0F",
"call.quality": "\u8FDE\u63A5\u8D28\u91CF",
"call.qualityExcellent": "\u6781\u4F73",
"call.videoPrefix": "\u89C6\u9891 \xB7 ",
"call.voicePrefix": "\u8BED\u97F3 \xB7 ",
"group.new": "\u65B0\u5EFA\u7FA4\u7EC4",
"group.create": "\u521B\u5EFA\u7FA4\u7EC4",
"group.join": "\u52A0\u5165\u7FA4\u7EC4",
"group.name": "\u7FA4\u7EC4\u540D\u79F0",
"group.nameTooLong": "\u7FA4\u7EC4\u540D\u79F0\u8FC7\u957F\u3002",
"group.capacity": "\u6700\u591A {max} \u4EBA\uFF0C\u70B9\u5BF9\u70B9\u8FDE\u63A5\u3002\u7FA4\u7EC4\u5F00\u542F\u524D\uFF0C\u6240\u6709\u4EBA\u90FD\u4F1A\u6838\u5BF9\u540C\u4E00\u4E2A\u5B89\u5168\u7801\u3002",
"group.invite": "\u9080\u8BF7",
"group.inviteMore": "\u9080\u8BF7\u66F4\u591A\u6210\u5458",
"group.invitePeople": "\u9080\u8BF7 {count} \u4EBA",
"group.invitation": "\u7FA4\u7EC4\u9080\u8BF7",
"group.addMembers": "\u6DFB\u52A0\u6210\u5458",
"group.roomFor": "\u8FD8\u80FD\u518D\u52A0 {remaining} \u4EBA\u3002\u4ED6\u4EEC\u52A0\u5165\u540E\uFF0C\u6240\u6709\u4EBA\u4F1A\u6838\u5BF9\u4E00\u4E2A\u65B0\u7684\u7FA4\u7EC4\u5B89\u5168\u7801\u3002",
"group.membersCount": "{count} \u4F4D\u6210\u5458",
"group.member": "\u6210\u5458",
"group.members": "\u6210\u5458",
"group.remove": "\u79FB\u9664 {name}",
"group.message": "\u7ED9\u300C{name}\u300D\u53D1\u6D88\u606F",
"group.leave": "\u9000\u51FA",
"group.leaveThis": "\u9000\u51FA\u8BE5\u7FA4\u7EC4",
"group.cancel": "\u53D6\u6D88\u5EFA\u7FA4",
"group.close": "\u5173\u95ED",
"group.cancelBtn": "\u53D6\u6D88",
"group.decline": "\u62D2\u7EDD",
"group.working": "\u5904\u7406\u4E2D\u2026",
"group.sasTitle": "\u7FA4\u7EC4\u5B89\u5168\u7801",
"group.sasEveryone": "\u6240\u6709\u4EBA\u770B\u5230\u7684\u662F\u540C\u4E00\u4E2A\u5B89\u5168\u7801",
"group.sasCompare": "\u4E0E\u6BCF\u4F4D\u6210\u5458\u6838\u5BF9\u7FA4\u7EC4\u5B89\u5168\u7801\uFF0C\u624D\u80FD\u5F00\u542F\u8FD9\u4E2A\u7FA4\u7EC4\u3002",
"group.sasReadAloud": "\u628A\u8FD9\u4E9B\u6570\u5B57\u5FF5\u7ED9 ",
"group.sasWarning": "\u53EA\u8981\u6709\u4E00\u4F4D\u6210\u5458\u5FF5\u51FA\u4E0D\u540C\u7684\u5B89\u5168\u7801\uFF0C\u5C31\u8BF4\u660E\u6709\u4EBA\u5728\u4F60\u4EEC\u4E4B\u95F4\u3002\u8BF7\u53D6\u6D88\u5EFA\u7FA4 - \u4E0D\u8981\u786E\u8BA4\u3002",
"group.confirmFirst": "\u8BF7\u5148\u786E\u8BA4\u7FA4\u7EC4\u5B89\u5168\u7801",
"group.codeSuffix": " \xB7 \u5B89\u5168\u7801 {code}",
"group.exchangingNonces": "\u6B63\u5728\u4EA4\u6362\u4E00\u6B21\u6027\u968F\u673A\u6570\u2026",
"group.waitingCommit": "\u7B49\u5F85\u6BCF\u4F4D\u6210\u5458\u4F5C\u51FA\u627F\u8BFA\u2026",
"group.waitingJoin": "\u7B49\u5F85\u5176\u4ED6\u6210\u5458\u52A0\u5165\u2026",
"group.emptyChat": "\u8FD9\u91CC\u8FD8\u4EC0\u4E48\u90FD\u6CA1\u6709\u3002\u6BCF\u6761\u6D88\u606F\u90FD\u7531\u53D1\u9001\u8005\u7B7E\u540D\uFF0C\u5E76\u7ECF\u7531\u6BCF\u4F4D\u6210\u5458\u5404\u81EA\u7684\u52A0\u5BC6\u94FE\u8DEF\u4F20\u8F93\u3002",
"group.noVerified": "\u8FD8\u6CA1\u6709\u5DF2\u6821\u9A8C\u7684\u804A\u5929\u3002\u8BF7\u5148\u6253\u5F00\u4E00\u5BF9\u4E00\u804A\u5929\u5E76\u6838\u5BF9\u5176\u5B89\u5168\u7801 - \u7FA4\u7EC4\u662F\u7531\u4F60\u5DF2\u7ECF\u786E\u8BA4\u8FC7\u7684\u8FDE\u63A5\u642D\u8D77\u6765\u7684\u3002",
"group.noMoreToAdd": "\u6CA1\u6709\u5176\u4ED6\u5DF2\u6821\u9A8C\u7684\u804A\u5929\u53EF\u6DFB\u52A0\u3002\u8BF7\u5148\u6253\u5F00\u4E00\u5BF9\u4E00\u804A\u5929\u5E76\u6838\u5BF9\u5176\u5B89\u5168\u7801\u3002",
"group.directLink": "\u70B9\u5BF9\u70B9\u76F4\u63A5\u8FDE\u63A5",
"group.noDirectLink": "\u5C1A\u65E0\u76F4\u63A5\u8FDE\u63A5 - \u5728\u5EFA\u7ACB\u671F\u95F4\uFF0C\u6D88\u606F\u7531\u53E6\u4E00\u4F4D\u6210\u5458\u8F6C\u53D1",
"group.relayNote": "\u6709\u4E9B\u6210\u5458\u8FD8\u6CA1\u6709\u4E0E\u4F60\u5EFA\u7ACB\u76F4\u63A5\u8FDE\u63A5\u3002\u4ED6\u4EEC\u7684\u6D88\u606F\u7ECF\u7531\u53E6\u4E00\u4F4D\u6210\u5458\u8F6C\u53D1\uFF0C\u5BF9\u65B9\u80FD\u770B\u5230\u4F60\u4EEC\u5728\u4EA4\u8C08\uFF0C\u4F46\u65E2\u8BFB\u4E0D\u5230\u7B7E\u540D\u4E4B\u5916\u7684\u5185\u5BB9\uFF0C\u4E5F\u65E0\u6CD5\u6539\u52A8\u4F60\u8BF4\u8FC7\u7684\u8BDD\u3002\u7FA4\u7EC4\u4F1A\u6301\u7EED\u5C1D\u8BD5\u4E3A\u4ED6\u4EEC\u5EFA\u7ACB\u76F4\u8FDE\u3002",
"group.relayOnlyOff": "\u4EC5\u4E2D\u7EE7\u6A21\u5F0F\u5DF2\u5173\u95ED\uFF0C\u56E0\u6B64\u6BCF\u4F4D\u6210\u5458\u90FD\u4F1A\u76F4\u63A5\u8FDE\u5230\u4F60\uFF0C\u5E76\u5F97\u77E5\u4F60\u7684 IP \u5730\u5740 \u2014\u2014 \u5305\u62EC\u522B\u4EBA\u9080\u8BF7\u8FDB\u6765\u7684\u6210\u5458\u3002\u82E5\u8FD9\u4E00\u70B9\u5728\u6B64\u5904\u5F88\u91CD\u8981\uFF0C\u8BF7\u5728\u7F51\u7EDC\u8BBE\u7F6E\u4E2D\u5F00\u542F\u5B83\u3002",
"group.memberOffline": "{name} \u5904\u4E8E\u79BB\u7EBF\u72B6\u6001\uFF0C\u6536\u4E0D\u5230\u6D88\u606F\u3002\u5BF9\u65B9\u4ECD\u662F\u6210\u5458\uFF1A\u79FB\u9664\u4F1A\u8BA9\u7FA4\u7EC4\u91CD\u65B0\u751F\u6210\u5BC6\u94A5\u3002",
"group.joinNote": "\u5176\u4ED6\u6210\u5458\u4F1A\u77E5\u9053\u4F60\u5728\u8FD9\u4E2A\u7FA4\u91CC\u3002\u6CA1\u6709\u53EF\u4EE5\u8865\u770B\u7684\u5386\u53F2\u8BB0\u5F55 - \u7FA4\u7EC4\u4ECE\u7A7A\u767D\u5F00\u59CB\u3002",
"group.inviteSentNote": "\u5728\u5BF9\u65B9\u63A5\u53D7\u4E4B\u524D\uFF0C\u7FA4\u7EC4\u7167\u5E38\u8FD0\u4F5C\u3002\u4ED6\u4EEC\u6CA1\u6709\u5386\u53F2\u8BB0\u5F55\u53EF\u8865\u770B \u2014\u2014 \u53EA\u4F1A\u770B\u5230\u4ECE\u73B0\u5728\u8D77\u53D1\u9001\u7684\u5185\u5BB9\u3002",
"group.errNotCreated": "\u7FA4\u7EC4\u672A\u521B\u5EFA",
"group.errNobodyAccepted": "\u6CA1\u6709\u4EBA\u53CA\u65F6\u63A5\u53D7\u9080\u8BF7\u3002",
"group.errNothingSent": "\u4EC0\u4E48\u90FD\u6CA1\u6709\u53D1\u9001\uFF0C\u4E5F\u6CA1\u6709\u6821\u9A8C\u3002\u8BF7\u5173\u95ED\u6B64\u7A97\u53E3\uFF0C\u7B49\u6240\u6709\u4EBA\u90FD\u8FDE\u4E0A\u540E\u518D\u8BD5\u3002",
"group.errNotFormed": "\u65E0\u6CD5\u7EC4\u5EFA\u8FD9\u4E2A\u7FA4\u7EC4\u3002",
"group.errFull": "\u8FD9\u4E2A\u7FA4\u7EC4\u5DF2\u6EE1\u3002",
"group.errInviteFailed": "\u9080\u8BF7\u672A\u80FD\u53D1\u9001 - \u8BE5\u804A\u5929\u672A\u8FDE\u63A5\u3002",
"group.errNoMemberList": "\u7FA4\u4E3B\u59CB\u7EC8\u6CA1\u6709\u53D1\u9001\u6210\u5458\u540D\u5355\u3002",
"group.errUnsignedList": "\u6210\u5458\u540D\u5355\u6CA1\u6709\u7FA4\u4E3B\u7684\u7B7E\u540D\u3002\u8BF7\u4E0D\u8981\u91CD\u8BD5 - \u76F4\u63A5\u544A\u77E5\u5BF9\u65B9\u3002",
"group.errNotOwner": "\u6709\u975E\u7FA4\u4E3B\u7684\u4EBA\u8BD5\u56FE\u6539\u52A8\u6210\u5458\u540D\u5355\u3002",
"hdr.tagline": "\u7AEF\u5230\u7AEF\u52A0\u5BC6",
"hdr.netSettings": "\u9AD8\u7EA7\u7F51\u7EDC\u8BBE\u7F6E",
"hdr.netSettingsTitle": "\u9AD8\u7EA7\u7F51\u7EDC\u8BBE\u7F6E\uFF08STUN/TURN\uFF09",
"hdr.disconnect": "\u65AD\u5F00\u8FDE\u63A5",
"status.connected": "\u5DF2\u8FDE\u63A5",
"status.connecting": "\u8FDE\u63A5\u4E2D\u2026",
"status.notConnected": "\u672A\u8FDE\u63A5",
"status.reconnecting": "\u91CD\u65B0\u8FDE\u63A5\u4E2D\u2026",
"status.retrying": "\u91CD\u8BD5\u4E2D\u2026",
"status.verifying": "\u6821\u9A8C\u4E2D\u2026",
"status.peerDisconnected": "\u5BF9\u65B9\u5DF2\u65AD\u5F00",
"sec.replayProtection": "\u91CD\u653E\u653B\u51FB\u9632\u62A4",
"sec.messageIntegrity": "\u6D88\u606F\u5B8C\u6574\u6027\uFF08HMAC\uFF09",
"sec.forwardSecrecy": "\u5B8C\u7F8E\u524D\u5411\u4FDD\u5BC6",
"sec.metadataProtection": "\u5143\u6570\u636E\u4FDD\u62A4",
"sec.trafficObfuscation": "\u6D41\u91CF\u6DF7\u6DC6",
"sec.realTests": "\u771F\u5B9E\u7684\u5BC6\u7801\u5B66\u6D4B\u8BD5",
"sec.simulatedData": "\u6A21\u62DF\u6570\u636E",
"sec.testPassed": "\u6D4B\u8BD5\u901A\u8FC7",
"sec.testFailed": "\u6D4B\u8BD5\u5931\u8D25\u6216\u4E0D\u53EF\u7528",
"sec.verificationDone": "\u771F\u5B9E\u7684\u5BC6\u7801\u5B66\u6821\u9A8C\u5DF2\u5B8C\u6210",
"sec.verificationInProgress": "\u5B89\u5168\u6821\u9A8C\u8FDB\u884C\u4E2D\u2026",
"sec.verificationWait": "\u5B89\u5168\u6821\u9A8C\u8FDB\u884C\u4E2D\u2026\n\u8BF7\u7B49\u5F85\u5B9E\u65F6\u7684\u5BC6\u7801\u5B66\u6821\u9A8C\u5B8C\u6210\u3002",
"sec.verificationUnavailable": "\u65E0\u6CD5\u8FDB\u884C\u5B89\u5168\u6821\u9A8C",
"chat.placeholder": "\u5199\u4E00\u6761\u52A0\u5BC6\u6D88\u606F\u2026",
"chat.send": "\u53D1\u9001\u6D88\u606F",
"chat.sendFiles": "\u53D1\u9001\u6587\u4EF6",
"chat.hideFiles": "\u9690\u85CF\u6587\u4EF6",
"chat.recordVoice": "\u5F55\u5236\u8BED\u97F3\u6D88\u606F",
"chat.sendVoice": "\u53D1\u9001\u8BED\u97F3\u6D88\u606F",
"chat.discard": "\u653E\u5F03",
"chat.codeBlock": "\u4F5C\u4E3A\u4EE3\u7801\u5757\u53D1\u9001\uFF08\u4F1A\u5C55\u5F00\u8F93\u5165\u6846\uFF09",
"chat.codeHint": "\u4EE3\u7801\u7247\u6BB5 \xB7 \u4FDD\u7559\u683C\u5F0F \xB7 \u2318\u21B5 \u53D1\u9001",
"chat.viewOnce": "\u9605\u540E\u5373\u711A",
"chat.viewOnceTitle": "\u9605\u540E\u5373\u711A - \u5BF9\u65B9\u8BFB\u8FC7\u540E\u5373\u6D88\u5931",
"chat.viewOncePrefix": "\u9605\u540E\u5373\u711A \xB7 ",
"chat.viewOnceTap": "\u9605\u540E\u5373\u711A \xB7 \u8F7B\u89E6\u67E5\u770B",
"chat.viewedOnce": "\u5DF2\u67E5\u770B",
"chat.disappearing": "\u5B9A\u65F6\u6D88\u606F - \u53CC\u65B9\u90FD\u4F1A\u5220\u9664",
"chat.disappearAfter": "\u591A\u4E45\u540E\u6D88\u5931",
"chat.visibleFor": "\u53EF\u89C1\u65F6\u957F",
"chat.timerPrefix": "\u5B9A\u65F6 \xB7 ",
"chat.expired": "\u8FD9\u6761\u6D88\u606F\u5DF2\u8FC7\u671F",
"chat.deleteForEveryone": "\u4E3A\u6240\u6709\u4EBA\u5220\u9664",
"chat.sending": "\u53D1\u9001\u4E2D",
"chat.delivered": "\u5DF2\u9001\u8FBE",
"chat.notSent": "\u672A\u53D1\u9001",
"chat.notSentReason": "\u672A\u53D1\u9001 - \u5B89\u5168\u901A\u9053\u5C1A\u672A\u5C31\u7EEA\u3002\u8BF7\u91CD\u65B0\u8FDE\u63A5\u540E\u7EE7\u7EED\u3002",
"chat.encrypted": "\u5DF2\u52A0\u5BC6",
"chat.decrypted": "\u5DF2\u89E3\u5BC6",
"chat.encryptedOnDevice": "\u5DF2\u5728\u4F60\u7684\u8BBE\u5907\u4E0A\u52A0\u5BC6",
"chat.uploading": "\u4E0A\u4F20\u4E2D",
"chat.downloading": "\u4E0B\u8F7D\u4E2D",
"chat.transferring": "\u4F20\u8F93\u4E2D\u2026",
"chat.copied": "\u5DF2\u590D\u5236\uFF01",
"chat.collapse": "\u6536\u8D77",
"chat.closeMenu": "\u5173\u95ED\u83DC\u5355",
"chat.newChat": "\u65B0\u5EFA\u804A\u5929",
"chat.newGroup": "\u65B0\u5EFA\u7FA4\u7EC4",
"chat.createGroup": "\u521B\u5EFA\u7FA4\u7EC4",
"chat.groupChats": "\u7FA4\u804A",
"chat.secureChat": "\u5B89\u5168\u804A\u5929",
"chat.nameThis": "\u7ED9\u8FD9\u4E2A\u804A\u5929\u8D77\u4E2A\u540D\u5B57",
"chat.rename": "\u91CD\u547D\u540D\u804A\u5929\uFF08\u4EC5\u672C\u5730\uFF09",
"chat.renameHint": "\u53CC\u51FB\u53EF\u91CD\u547D\u540D",
"chat.localLabel": "\u672C\u5730\u540D\u79F0 \xB7 \u53EA\u4FDD\u5B58\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A",
"chat.setStatus": "\u8BBE\u7F6E\u4F60\u7684\u72B6\u6001",
"chat.yourStatusPrefix": "\u4F60\u7684\u72B6\u6001 - ",
"chat.meshHint": "\u6700\u591A 8 \u4EBA \xB7 P2P \u7F51\u72B6\u8FDE\u63A5",
"chat.offline": "\u79BB\u7EBF",
"chat.noNetwork": "\u65E0\u7F51\u7EDC \xB7 \u6B63\u5728\u91CD\u8FDE",
"chat.startVoiceCall": "\u53D1\u8D77\u52A0\u5BC6\u8BED\u97F3\u901A\u8BDD",
"chat.startVideoCall": "\u53D1\u8D77\u52A0\u5BC6\u89C6\u9891\u901A\u8BDD",
"chat.verifyForCalls": "\u5148\u6821\u9A8C\u4F1A\u8BDD\u624D\u80FD\u901A\u8BDD",
"chat.e2eeNote": "\u6BCF\u6761\u6D88\u606F\u5728\u79BB\u5F00\u4F60\u7684\u8BBE\u5907\u4E4B\u524D\u90FD\u4F1A\u88AB\u7AEF\u5230\u7AEF\u52A0\u5BC6\u3002",
"chat.peersOnly": "\u4EC5\u4EE5\u7AEF\u5230\u7AEF\u65B9\u5F0F\u53D1\u7ED9\u5DF2\u8FDE\u63A5\u7684\u5BF9\u7AEF - \u4ECE\u4E0D\u5B58\u653E\u5728\u670D\u52A1\u5668\u4E0A\u3002",
"flow.invitationCreated": "\u5DF2\u521B\u5EFA\u5B89\u5168\u9080\u8BF7",
"flow.invitationCreatedBang": "\u5B89\u5168\u9080\u8BF7\u5DF2\u521B\u5EFA\u5E76\u52A0\u5BC6\u3002",
"flow.responseCreated": "\u5DF2\u521B\u5EFA\u5B89\u5168\u5E94\u7B54",
"flow.responseCreatedBang": "\u5B89\u5168\u5E94\u7B54\u5DF2\u521B\u5EFA\u3002",
"flow.sendInvitation": "\u901A\u8FC7\u5B89\u5168\u6E20\u9053\uFF08\u901A\u8BDD\u3001\u77ED\u4FE1\u7B49\uFF09\u628A\u9080\u8BF7\u7801\u53D1\u7ED9\u5BF9\u65B9\u3002",
"flow.sendResponse": "\u901A\u8FC7\u5B89\u5168\u6E20\u9053\u628A\u5E94\u7B54\u7801\u53D1\u7ED9\u53D1\u8D77\u65B9\uFF0C\u6216\u8BA9\u5BF9\u65B9\u626B\u63CF\u4E0B\u65B9\u7684\u4E8C\u7EF4\u7801\u3002",
"flow.sendEncryptedCode": "\u53D1\u9001\u52A0\u5BC6\u4EE3\u7801",
"flow.sendTheResponse": "\u53D1\u9001\u5E94\u7B54",
"flow.pasteOrWrite": "\u7C98\u8D34\u6216\u8F93\u5165\u4EE3\u7801\u2026",
"flow.processingInvitation": "\u6B63\u5728\u5904\u7406\u5B89\u5168\u9080\u8BF7\u2026",
"flow.processingResponse": "\u6B63\u5728\u5904\u7406\u5B89\u5168\u5E94\u7B54\u2026",
"flow.finalizing": "\u6B63\u5728\u5B8C\u6210\u5B89\u5168\u8FDE\u63A5\u2026",
"flow.channelEstablished": "\u5B89\u5168\u901A\u9053\u5DF2\u5EFA\u7ACB",
"flow.channelReady": "\u5B89\u5168\u901A\u9053\u5DF2\u5C31\u7EEA",
"flow.restoring": "\u6B63\u5728\u6062\u590D\u8FDE\u63A5\u2026",
"flow.invitationCaptured": "\u5DF2\u8BFB\u53D6\u9080\u8BF7\u3002",
"err.needInvitation": "\u9700\u8981\u7C98\u8D34\u5BF9\u65B9\u7ED9\u4F60\u7684\u9080\u8BF7\u7801\u3002",
"err.needResponse": "\u9700\u8981\u7C98\u8D34\u5BF9\u65B9\u7ED9\u4F60\u7684\u5E94\u7B54\u7801\u3002",
"err.responseFormat": "\u5E94\u7B54\u683C\u5F0F\u65E0\u6548 - \u8BF7\u68C0\u67E5\u4EE3\u7801",
"err.responseNoKey": "\u5E94\u7B54\u7801\u65E0\u6548 - \u7F3A\u5C11\u6216\u635F\u574F\u4E86\u5BC6\u7801\u5B66\u5BC6\u94A5\u3002\u8BF7\u68C0\u67E5\u4EE3\u7801\u540E\u91CD\u8BD5\u3002",
"err.responseNoSignKey": "\u5E94\u7B54\u7801\u65E0\u6548 - \u7F3A\u5C11\u7B7E\u540D\u6821\u9A8C\u5BC6\u94A5\u3002\u8BF7\u68C0\u67E5\u4EE3\u7801\u540E\u91CD\u8BD5\u3002",
"err.responseOutdated": "\u5E94\u7B54\u6570\u636E\u5DF2\u8FC7\u671F - \u8BF7\u4F7F\u7528\u65B0\u7684\u9080\u8BF7",
"err.setupError": "\u5EFA\u7ACB\u8FDE\u63A5\u65F6\u51FA\u9519",
"err.notReady": "\u8FDE\u63A5\u5C1A\u672A\u5C31\u7EEA",
"err.securityBreach": "\u68C0\u6D4B\u5230\u5B89\u5168\u6F0F\u6D1E - \u8FDE\u63A5\u5DF2\u62D2\u7EDD",
"err.securityValidation": "\u5B89\u5168\u6821\u9A8C\u672A\u901A\u8FC7 - \u53EF\u80FD\u5B58\u5728\u653B\u51FB",
"err.retiredQr": "\u8FD9\u4E2A\u4E8C\u7EF4\u7801\u4F7F\u7528\u4E86\u5DF2\u5F03\u7528\u7684\u683C\u5F0F\uFF0C\u65E0\u6CD5\u4F20\u9012\u9080\u8BF7\u3002\u8BF7\u8BA9\u5BF9\u65B9\u91CD\u65B0\u751F\u6210\uFF0C\u6216\u6539\u7528\u590D\u5236\u7C98\u8D34\u3002",
"err.compressedQrNote": "\u538B\u7F29\u7684\u4E8C\u7EF4\u7801\u4E3A\u4E86\u7B80\u77ED\u53EF\u80FD\u7701\u7565 SDP\u3002\u5982\u679C\u8FDE\u63A5\u5931\u8D25\uFF0C\u8BF7\u6539\u7528\u590D\u5236\u7C98\u8D34\u3002",
"err.inviteNotConnected": "\u9080\u8BF7\u672A\u80FD\u53D1\u9001\u3002\u8BE5\u804A\u5929\u5F53\u524D\u672A\u8FDE\u63A5\u3002",
"err.inviteNotConnectedRetry": "\u9080\u8BF7\u672A\u80FD\u53D1\u9001\u3002\u8BE5\u804A\u5929\u5F53\u524D\u672A\u8FDE\u63A5 - \u8BF7\u91CD\u65B0\u6253\u5F00\u540E\u518D\u8BD5\u3002",
"err.nobodyAccepted": "\u6CA1\u6709\u4EBA\u63A5\u53D7\u9080\u8BF7\u3002\u7FA4\u7EC4\u4FDD\u6301\u4E0D\u53D8\u3002",
"err.noAudio": "\u6CA1\u6709\u5F55\u5230\u58F0\u97F3 - \u8BF7\u68C0\u67E5\u9EA6\u514B\u98CE\u6743\u9650\u540E\u91CD\u8BD5\u3002",
"err.voiceNeedsConnection": "\u53D1\u9001\u8BED\u97F3\u6D88\u606F\u9700\u8981\u5904\u4E8E\u6D3B\u52A8\u72B6\u6001\u7684\u5B89\u5168\u8FDE\u63A5\u3002\u8BF7\u91CD\u65B0\u8FDE\u63A5\u540E\u91CD\u8BD5\u3002",
"err.voiceRestoring": "\u6B63\u5728\u6062\u590D\u8FDE\u63A5 - \u8BF7\u7A0D\u540E\u518D\u8BD5\u7740\u53D1\u9001\u8BED\u97F3\u6D88\u606F\u3002",
"err.fileTooLarge": "\u6587\u4EF6\u8FC7\u5927",
"sas.safetyNumber": "\u5B89\u5168\u7801",
"sas.incorrect": "\u5B89\u5168\u7801\u4E0D\u6B63\u786E\u3002\u8BF7\u4E0E\u5BF9\u65B9\u6838\u5BF9\u540E\u91CD\u8BD5\u3002",
"sas.noMatch": "\u5B89\u5168\u7801\u4E0D\u4E00\u81F4",
"sas.makeSure": "\u8BF7\u786E\u8BA4\u4E24\u8FB9\u7684\u5B89\u5168\u7801\u5B8C\u5168\u4E00\u81F4\u3002",
"sas.tooManyAttempts": "\u9519\u8BEF\u6B21\u6570\u8FC7\u591A\u3002\u4E3A\u5B89\u5168\u8D77\u89C1\uFF0C\u4F1A\u8BDD\u5DF2\u91CD\u7F6E\u3002",
"sas.verificationFailed": "\u6821\u9A8C\u5931\u8D25",
"sas.verified": "\u5DF2\u6821\u9A8C \xB7 \u5B8C\u7F8E\u524D\u5411\u4FDD\u5BC6",
"sas.runVerification": "\u8FD0\u884C\u5B89\u5168\u6821\u9A8C",
"sec.panelTitle": "\u7F51\u7EDC\u4E0E\u5BC6\u7801\u5B66\u8BE6\u60C5",
"sec.security": "\u5B89\u5168",
"sec.transport": "\u4F20\u8F93",
"sec.keyExchange": "\u5BC6\u94A5\u4EA4\u6362",
"sec.allEnabled": "\u6240\u6709\u5B89\u5168\u529F\u80FD\u9ED8\u8BA4\u5F00\u542F",
"sec.realTimeNote": "\u4F7F\u7528\u771F\u5B9E\u5BC6\u7801\u5B66\u51FD\u6570\u8FDB\u884C\u5B9E\u65F6\u6821\u9A8C - \u6CA1\u6709\u4EFB\u4F55\u4F2A\u9020\u6570\u636E\u3002",
"sec.simulatedWarning": "\u6CE8\u610F\uFF1A\u8FDE\u63A5\u53EF\u80FD\u5C1A\u672A\u5B8C\u5168\u5EFA\u7ACB - \u8FD9\u4E9B\u6570\u503C\u53EF\u80FD\u662F\u6A21\u62DF\u7684\u3002",
"dl.title": "\u4E0B\u8F7D SecureBit",
"dl.free": "\u514D\u8D39 \xB7 \u5F00\u6E90",
"dl.soon": "\u79FB\u52A8\u7AEF\u5E94\u7528\uFF08iOS\u3001Android\uFF09\u4E0E\u6D4F\u89C8\u5668\u6269\u5C55\uFF08Chrome\u3001Firefox\u3001Opera\uFF09\u5373\u5C06\u63A8\u51FA\u3002",
"chatHdr.chat": "\u804A\u5929",
"chatHdr.chats": "\u804A\u5929",
"chatHdr.newChat": "+ \u65B0\u5EFA",
"chatHdr.secure": "\u5DF2\u52A0\u5BC6",
"chatHdr.p2pSub": "P2P \xB7 \u7AEF\u5230\u7AEF\u52A0\u5BC6",
"chatHdr.save": "\u4FDD\u5B58",
"chatHdr.close": "\u5173\u95ED",
"chatHdr.expand": "\u5C55\u5F00",
"chatHdr.you": "\u4F60",
"chatHdr.qrCode": "\u4E8C\u7EF4\u7801",
"chat.disconnected": "\u5DF2\u65AD\u5F00",
"call.mute": "\u9759\u97F3",
"call.endShort": "\u7ED3\u675F",
"group.add": "\u6DFB\u52A0",
"group.send": "\u53D1\u9001",
"sec.pfsShort": "\u5B8C\u7F8E\u524D\u5411\u4FDD\u5BC6",
"sec.cipher": "\u52A0\u5BC6\u7B97\u6CD5",
"chat.close": "\u5173\u95ED",
"file.needConnection": "\u6587\u4EF6\u4F20\u8F93\u9700\u8981\u5DF2\u5EFA\u7ACB\u7684\u8FDE\u63A5",
"presence.available": "\u5728\u7EBF",
"presence.away": "\u79BB\u5F00",
"presence.busy": "\u5FD9\u788C",
"presence.offline": "\u79BB\u7EBF",
"presence.invisible": "\u9690\u8EAB",
"presence.availableDesc": "\u5728\u7EBF\u4E14\u53EF\u8054\u7CFB",
"presence.awayDesc": "\u7A7A\u95F2 \xB7 \u6682\u65F6\u79BB\u5F00",
"presence.busyDesc": "\u8BF7\u52FF\u6253\u6270",
"presence.invisibleDesc": "\u5BF9\u4ED6\u4EBA\u663E\u793A\u4E3A\u79BB\u7EBF",
"presence.online": "\u5728\u7EBF",
"conn.p2p": "P2P \xB7 \u5DF2\u8FDE\u63A5",
"conn.verifying": "\u6821\u9A8C\u4E2D\u2026",
"conn.connecting": "\u8FDE\u63A5\u4E2D\u2026",
"conn.reconnecting": "\u91CD\u65B0\u8FDE\u63A5\u4E2D\u2026",
"conn.peerDisconnected": "\u5BF9\u65B9\u5DF2\u65AD\u5F00",
"conn.disconnected": "\u5DF2\u65AD\u5F00",
"chat.defaultLabel": "\u804A\u5929",
"groupPhase.forming": "\u6B63\u5728\u7EC4\u5EFA\u2026",
"groupPhase.commitments": "\u6B63\u5728\u4EA4\u6362\u627F\u8BFA\u2026",
"groupPhase.revealing": "\u6B63\u5728\u63ED\u793A\u2026",
"groupPhase.compare": "\u8BF7\u6838\u5BF9\u7FA4\u7EC4\u5B89\u5168\u7801",
"groupPhase.ready": "\u7FA4\u7EC4\u5DF2\u5C31\u7EEA",
"groupPhase.failed": "\u7FA4\u7EC4\u672A\u521B\u5EFA",
"call.qualityGood": "\u826F\u597D",
"call.qualityFair": "\u4E00\u822C",
"call.qualityWeak": "\u8F83\u5DEE",
"msg.code": "\u4EE3\u7801",
"msg.timer": "\u5B9A\u65F6",
"msg.voice": "\u8BED\u97F3",
"msg.play": "\u64AD\u653E",
"msg.sent": "\u5DF2\u53D1\u9001",
"msg.read": "\u5DF2\u8BFB",
"report.title": "\u5B9E\u65F6\u5B89\u5168\u6821\u9A8C",
"report.active": "\u8FD0\u884C\u4E2D",
"report.testsPassed": "\u901A\u8FC7\u7684\u6D4B\u8BD5",
"report.verifiedAt": "\u6821\u9A8C\u4E8E",
"report.source": "\u6765\u6E90",
"secTest.verifyECDHKeyExchange": "ECDH \u5BC6\u94A5\u4EA4\u6362",
"secTest.verifyECDSASignatures": "ECDSA \u6570\u5B57\u7B7E\u540D",
"secTest.verifyEncryption": "AES-GCM \u52A0\u5BC6",
"secTest.verifyMessageIntegrity": "\u6D88\u606F\u5B8C\u6574\u6027",
"secTest.verifyPerfectForwardSecrecy": "\u5B8C\u7F8E\u524D\u5411\u4FDD\u5BC6",
"secTest.verifyPFS": "\u5B8C\u7F8E\u524D\u5411\u4FDD\u5BC6",
"secTest.verifyReplayProtection": "\u91CD\u653E\u653B\u51FB\u9632\u62A4",
"secTest.verifyDTLSFingerprint": "DTLS \u6307\u7EB9",
"secTest.verifySASVerification": "SAS \u6821\u9A8C",
"secTest.verifyMetadataProtection": "\u5143\u6570\u636E\u4FDD\u62A4",
"secTest.verifyTrafficObfuscation": "\u6D41\u91CF\u6DF7\u6DC6",
"secTest.verifyPacketPadding": "\u6570\u636E\u5305\u586B\u5145",
"secTest.verifyNestedEncryption": "\u5D4C\u5957\u52A0\u5BC6",
"secTest.verifyNonExtractableKeys": "\u4E0D\u53EF\u5BFC\u51FA\u7684\u5BC6\u94A5",
"secTest.verifyRateLimiting": "\u901F\u7387\u9650\u5236",
"secTest.verifyMutualAuth": "\u53CC\u5411\u8EAB\u4EFD\u9A8C\u8BC1",
"secTest.verifyAuthProof": "\u8EAB\u4EFD\u9A8C\u8BC1\u51ED\u8BC1",
"secTest.verifyEnhancedValidation": "\u5F3A\u5316\u6821\u9A8C",
"secTest.verifyAdvancedFeatures": "\u9AD8\u7EA7\u529F\u80FD",
"secTest.verifySignature": "\u7B7E\u540D\u68C0\u67E5",
"secDetail.Security system initializing...": "\u5B89\u5168\u7CFB\u7EDF\u6B63\u5728\u542F\u52A8\u2026",
"secDetail.Nested encryption active": "\u5D4C\u5957\u52A0\u5BC6\u5DF2\u542F\u7528",
"secDetail.Nested encryption failed": "\u5D4C\u5957\u52A0\u5BC6\u5931\u8D25",
"secDetail.Packet padding active": "\u6570\u636E\u5305\u586B\u5145\u5DF2\u542F\u7528",
"secDetail.Packet padding failed": "\u6570\u636E\u5305\u586B\u5145\u5931\u8D25",
"secDetail.Advanced features active": "\u9AD8\u7EA7\u529F\u80FD\u5DF2\u542F\u7528",
"secDetail.Advanced features failed": "\u9AD8\u7EA7\u529F\u80FD\u5931\u8D25",
"secDetail.No encryption key available": "\u6CA1\u6709\u53EF\u7528\u7684\u52A0\u5BC6\u5BC6\u94A5",
"secDetail.AES-GCM encryption/decryption working correctly": "AES-GCM \u52A0\u89E3\u5BC6\u5DE5\u4F5C\u6B63\u5E38",
"secDetail.No ECDH key pair available": "\u6CA1\u6709\u53EF\u7528\u7684 ECDH \u5BC6\u94A5\u5BF9",
"secDetail.Key derivation failed": "\u5BC6\u94A5\u63A8\u5BFC\u5931\u8D25",
"secDetail.No ECDSA key pair available": "\u6CA1\u6709\u53EF\u7528\u7684 ECDSA \u5BC6\u94A5\u5BF9",
"secDetail.ECDSA digital signatures working correctly": "ECDSA \u6570\u5B57\u7B7E\u540D\u5DE5\u4F5C\u6B63\u5E38",
"secDetail.MAC key not available or invalid": "MAC \u5BC6\u94A5\u7F3A\u5931\u6216\u65E0\u6548",
"secDetail.Rate limiter did not block a message over the limit": "\u901F\u7387\u9650\u5236\u5668\u672A\u62E6\u622A\u8D85\u51FA\u9650\u989D\u7684\u6D88\u606F",
"secDetail.Rate limiter is not available": "\u901F\u7387\u9650\u5236\u5668\u4E0D\u53EF\u7528",
"secDetail.Replay protection is working correctly": "\u91CD\u653E\u653B\u51FB\u9632\u62A4\u5DE5\u4F5C\u6B63\u5E38",
"secDetail.Replay protection not enabled": "\u672A\u542F\u7528\u91CD\u653E\u653B\u51FB\u9632\u62A4",
"secDetail.SAS code not available": "SAS \u5B89\u5168\u7801\u4E0D\u53EF\u7528",
"secDetail.SAS verification code is valid and available": "SAS \u6821\u9A8C\u7801\u6709\u6548\u4E14\u53EF\u7528",
"secDetail.Traffic obfuscation is working correctly": "\u6D41\u91CF\u6DF7\u6DC6\u5DE5\u4F5C\u6B63\u5E38",
"secDetail.Traffic obfuscation not enabled": "\u672A\u542F\u7528\u6D41\u91CF\u6DF7\u6DC6",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "\u672C\u6B21\u4F1A\u8BDD\u6CA1\u6709\u4E0D\u53EF\u5BFC\u51FA\u7684\u4E34\u65F6 ECDH \u5BC6\u94A5\u5BF9",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "\u4EC5\u6709\u4F1A\u8BDD\u7EA7\u524D\u5411\u4FDD\u5BC6\uFF1A\u5BC6\u94A5\u6309\u4F1A\u8BDD\u4E34\u65F6\u751F\u6210\uFF0C\u4F46\u6B64\u8FDE\u63A5\u672A\u542F\u7528 Double Ratchet\uFF08\u5BF9\u65B9\u4F7F\u7528\u8F83\u65E7\u7248\u672C\uFF09\uFF0C\u56E0\u6B64\u4E00\u65E6\u4F1A\u8BDD\u5BC6\u94A5\u6CC4\u9732\uFF0C\u6574\u6BB5\u5BF9\u8BDD\u90FD\u4F1A\u66B4\u9732\u3002",
"msg.pause": "\u6682\u505C",
"msg.failed": "\u5931\u8D25",
"groupErr.timeout": "\u6709\u6210\u5458\u5728\u5B89\u5168\u7801\u51C6\u5907\u597D\u4E4B\u524D\u5C31\u4E0D\u518D\u54CD\u5E94\u3002",
"groupErr.keyMismatch": "\u67D0\u4F4D\u6210\u5458\u7684\u5BC6\u94A5\u4E0E\u5176\u58F0\u79F0\u7684\u8EAB\u4EFD\u4E0D\u7B26\u3002",
"groupErr.revealMismatch": "\u67D0\u4F4D\u6210\u5458\u63ED\u793A\u7684\u503C\u4E0E\u5176\u5148\u524D\u7684\u627F\u8BFA\u4E0D\u7B26\u3002",
"groupErr.commitChanged": "\u6709\u6210\u5458\u4E2D\u9014\u66F4\u6539\u4E86\u81EA\u5DF1\u7684\u627F\u8BFA\u3002",
"groupErr.missingKey": "\u540D\u5355\u91CC\u6709\u4E00\u4F4D\u6210\u5458\uFF0C\u5176\u5BC6\u94A5\u59CB\u7EC8\u6CA1\u6709\u9001\u5230\u3002",
"groupErr.outsider": "\u6536\u5230\u4E86\u6765\u81EA\u7FA4\u7EC4\u4E4B\u5916\u7684\u6570\u636E\u5E27\u3002",
"groupErr.limit": "\u4E00\u4E2A\u7FA4\u7EC4\u6700\u591A\u516B\u4F4D\u6210\u5458\u3002",
"groupErr.tooLarge": "\u6709\u4E00\u6761\u6D88\u606F\u8FC7\u5927\uFF0C\u65E0\u6CD5\u53D1\u9001\u7ED9\u7FA4\u7EC4\u3002",
"fileType.text": "\u7EAF\u6587\u672C",
"fileType.images": "\u56FE\u7247",
"fileType.archives": "\u538B\u7F29\u5305",
"fileType.voice": "\u8BED\u97F3\u6D88\u606F",
"fileType.unsupported": "\u4E0D\u652F\u6301",
"qrScan.title": "\u626B\u63CF\u4E8C\u7EF4\u7801",
"qrScan.auto": "\u81EA\u52A8\u6A21\u5F0F",
"qrScan.reset": "\u91CD\u7F6E",
"qrScan.autoScroll": "\u5DF2\u542F\u7528\u81EA\u52A8\u6EDA\u52A8",
"qrScan.starting": "\u6B63\u5728\u542F\u52A8\u6444\u50CF\u5934\u2026",
"qrScan.point": "\u628A\u6444\u50CF\u5934\u5BF9\u51C6\u5BF9\u65B9\u7684\u4E8C\u7EF4\u7801",
"qrScan.tapFocus": "\u8F7B\u89E6\u5C4F\u5E55\u5BF9\u7126",
"qrScan.focusing": "\u5BF9\u7126\u4E2D\u2026",
"iceErr.notArray": "\u670D\u52A1\u5668\u5217\u8868\u5FC5\u987B\u662F\u6570\u7EC4",
"iceErr.invalidJson": "JSON \u65E0\u6548",
"iceErr.tooMany": "\u670D\u52A1\u5668\u8FC7\u591A\uFF08\u6700\u591A {max} \u4E2A\uFF09",
"iceErr.invalidEntry": "{label}\uFF1A\u6761\u76EE\u65E0\u6548",
"iceErr.urlCount": "{label}\uFF1A\u9700\u8981 1 \u5230 {max} \u4E2A URL",
"iceErr.turnCreds": "{label}\uFF1ATURN \u670D\u52A1\u5668\u901A\u5E38\u9700\u8981\u7528\u6237\u540D\u4E0E\u51ED\u636E",
"iceUrl.notString": "URL \u5FC5\u987B\u662F\u5B57\u7B26\u4E32",
"iceUrl.empty": "URL \u4E3A\u7A7A",
"iceUrl.tooLong": "URL \u8FC7\u957F",
"iceUrl.badChars": "URL \u542B\u6709\u65E0\u6548\u5B57\u7B26",
"iceUrl.badScheme": "URL \u5FC5\u987B\u4EE5 stun:\u3001stuns:\u3001turn: \u6216 turns: \u5F00\u5934",
"iceUrl.badQuery": "URL \u7684\u67E5\u8BE2\u90E8\u5206\u65E0\u6548",
"iceUrl.noHost": "URL \u7F3A\u5C11\u4E3B\u673A",
"iceUrl.badHost": "URL \u7684\u4E3B\u673A\u6216\u7AEF\u53E3\u65E0\u6548",
"iceUrl.badTransport": "URL \u7684\u67E5\u8BE2\u5FC5\u987B\u662F transport=udp \u6216 transport=tcp",
"msg.off": "\u5173\u95ED",
"file.consentUnavailable": "\u65E0\u6CD5\u5F81\u5F97\u540C\u610F",
"secLevel.MAXIMUM": "\u6700\u9AD8",
"secLevel.INITIALIZING": "\u542F\u52A8\u4E2D",
"secLevel.ERROR": "\u9519\u8BEF",
"secLevel.UNKNOWN": "\u672A\u77E5",
"status.error": "\u9519\u8BEF",
"offline.disconnect": "\u65AD\u5F00\u8FDE\u63A5",
"offline.learnMore": "\u4E86\u89E3\u66F4\u591A",
"pwa.installApp": "\u5B89\u88C5\u5E94\u7528",
"chat.onWeb": "\u4F60\u6B63\u5728\u4F7F\u7528\u7F51\u9875\u7248",
"groupCall.startVoice": "\u53D1\u8D77\u7FA4\u7EC4\u8BED\u97F3\u901A\u8BDD",
"groupCall.startVideo": "\u53D1\u8D77\u7FA4\u7EC4\u89C6\u9891\u901A\u8BDD",
"groupCall.join": "\u52A0\u5165",
"groupCall.dismiss": "\u6682\u4E0D\u52A0\u5165",
"groupCall.leave": "\u79BB\u5F00\u901A\u8BDD",
"groupCall.you": "\u4F60",
"groupCall.connecting": "\u8FDE\u63A5\u4E2D\u2026",
"groupCall.waitingLink": "\u6B63\u5728\u7B49\u5F85\u76F4\u8FDE\u2026",
"groupCall.legFailed": "\u65E0\u6CD5\u8FDE\u63A5",
"groupCall.startedVoice": "{name} \u53D1\u8D77\u4E86\u8BED\u97F3\u901A\u8BDD",
"groupCall.startedVideo": "{name} \u53D1\u8D77\u4E86\u89C6\u9891\u901A\u8BDD",
"groupCall.inCall": "{count} \u4EBA\u5728\u901A\u8BDD\u4E2D",
"groupCall.err.permission_denied": "\u901A\u8BDD\u65E0\u6CD5\u5F00\u59CB - \u9EA6\u514B\u98CE\u548C\u6444\u50CF\u5934\u6743\u9650\u88AB\u62D2\u7EDD\u3002\u8BF7\u4E3A\u672C\u7AD9\u70B9\u5141\u8BB8\u540E\u91CD\u8BD5\u3002",
"groupCall.err.device_not_found": "\u901A\u8BDD\u65E0\u6CD5\u5F00\u59CB - \u6B64\u8BBE\u5907\u4E0A\u672A\u627E\u5230\u9EA6\u514B\u98CE\u3002",
"groupCall.err.device_busy": "\u901A\u8BDD\u65E0\u6CD5\u5F00\u59CB - \u9EA6\u514B\u98CE\u6B63\u88AB\u5176\u4ED6\u5E94\u7528\u5360\u7528\u3002\u8BF7\u5173\u95ED\u540E\u91CD\u8BD5\u3002",
"groupCall.err.media_failed": "\u901A\u8BDD\u65E0\u6CD5\u5F00\u59CB - \u65E0\u6CD5\u6253\u5F00\u9EA6\u514B\u98CE\u3002",
"groupCall.err.call_in_progress": "\u8BE5\u7FA4\u7EC4\u5DF2\u6709\u901A\u8BDD\u6B63\u5728\u8FDB\u884C\u3002\u8BF7\u52A0\u5165\uFF0C\u800C\u4E0D\u662F\u53E6\u5F00\u4E00\u4E2A\u3002",
"groupCall.err.not_ready": "\u8BF7\u5148\u786E\u8BA4\u7FA4\u7EC4\u5B89\u5168\u7801\u518D\u901A\u8BDD\u3002",
"groupCall.speaking": "{name} \u6B63\u5728\u8BB2\u8BDD",
"groupCall.pin": "\u653E\u5927\u663E\u793A {name}",
"groupCall.unpin": "\u8FD4\u56DE\u6240\u6709\u4EBA",
"groupCall.showEveryone": "\u6240\u6709\u4EBA",
"msg.after5s": "\u9605\u540E 5 \u79D2",
"msg.after15s": "\u9605\u540E 15 \u79D2",
"msg.after30s": "\u9605\u540E 30 \u79D2",
"msg.after1m": "\u9605\u540E 1 \u5206\u949F",
"msg.sec30": "30 \u79D2",
"msg.min5": "5 \u5206\u949F",
"msg.hour1": "1 \u5C0F\u65F6",
"desktop.shareDesc": "\u628A\u4EE3\u7801\u53D1\u7ED9\u5BF9\u65B9\u3002\u5B83\u53EA\u80FD\u4F7F\u7528\u4E00\u6B21\uFF0C\u5E76\u4F1A\u5F88\u5FEB\u8FC7\u671F\u3002",
"desktop.invitationCreated": "\u5B89\u5168\u9080\u8BF7\u5DF2\u521B\u5EFA - \u53D1\u9001\u7ED9\u5BF9\u65B9\u3002",
"desktop.joinDesc": "\u7C98\u8D34\u5BF9\u65B9\u7684\u9080\u8BF7\u7801\uFF0C\u4EE5\u751F\u6210\u4F60\u7684\u5B89\u5168\u5E94\u7B54\u3002",
"desktop.offerTag": "\u9080\u8BF7 \xB7 \u590D\u5236\u6587\u672C",
"desktop.answerTag": "\u5E94\u7B54 \xB7 \u590D\u5236\u6587\u672C",
"desktop.offerPlaceholder": "\u9080\u8BF7\u7801\u5C06\u663E\u793A\u5728\u8FD9\u91CC\u2026",
"desktop.answerPlaceholder": "\u5E94\u7B54\u7801\u5C06\u663E\u793A\u5728\u8FD9\u91CC\u2026",
"desktop.backToChats": "\u8FD4\u56DE\u804A\u5929",
"desktop.sendFeedback": "\u53D1\u9001\u53CD\u9988",
"desktop.callsNeedVerified": "\u901A\u8BDD\u9700\u8981\u5DF2\u9A8C\u8BC1\u7684\u5B89\u5168\u901A\u9053\u3002",
"desktop.noOpenChannel": "\u6CA1\u6709\u5DF2\u6253\u5F00\u7684\u5B89\u5168\u901A\u9053\u3002",
"desktop.chatCarriesCall": "\u6B64\u804A\u5929\u6B63\u5728\u627F\u8F7D\u4E00\u573A\u7FA4\u7EC4\u901A\u8BDD\u3002\u8BF7\u5148\u79BB\u5F00\u7FA4\u7EC4\u901A\u8BDD\uFF0C\u518D\u53D1\u8D77\u4E00\u5BF9\u4E00\u901A\u8BDD\u3002",
"desktop.err.permission_denied": "\u901A\u8BDD\u65E0\u6CD5\u5F00\u59CB - \u9EA6\u514B\u98CE\u548C\u6444\u50CF\u5934\u6743\u9650\u88AB\u963B\u6B62\u3002\u8BF7\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u4E2D\u5141\u8BB8\u540E\u91CD\u8BD5\u3002",
"desktop.language": "\u8BED\u8A00",
"desktop.languageHint": "\u7ACB\u5373\u751F\u6548\u3002\u5DF2\u53D1\u9001\u7684\u6D88\u606F\u4FDD\u6301\u539F\u672C\u7684\u6587\u5B57\u3002",
"desktop.compareCode": "\u4E0E\u5BF9\u65B9\u6838\u5BF9\u9A8C\u8BC1\u7801\uFF0C\u4E00\u81F4\u5219\u786E\u8BA4\u3002",
"desktop.verifyBeforeFiles": "\u53D1\u9001\u6587\u4EF6\u524D\u8BF7\u5148\u5B8C\u6210\u9A8C\u8BC1\u3002",
"desktop.verifyBeforeSending": "\u53D1\u9001\u6D88\u606F\u524D\u8BF7\u5148\u5B8C\u6210\u9A8C\u8BC1\u3002",
"desktop.disconnectedByBackend": "\u8FDE\u63A5\u5DF2\u5B89\u5168\u65AD\u5F00\u3002",
"desktop.restoreFailed": "\u65E0\u6CD5\u6062\u590D\u8FDE\u63A5\uFF0C\u6B63\u5728\u5173\u95ED\u6B64\u804A\u5929\u3002",
"desktop.channelNotReady": "\u6570\u636E\u901A\u9053\u5C1A\u4E0D\u53EF\u7528\uFF0C\u8BF7\u7B49\u5F85\u8FDE\u63A5\u5EFA\u7ACB\u3002",
"desktop.enterCode": "\u8F93\u5165\u9A8C\u8BC1\u7801\u4EE5\u786E\u8BA4\u3002",
"desktop.noOffer": "\u672A\u627E\u5230\u9080\u8BF7\uFF0C\u8BF7\u5148\u521B\u5EFA\u4E00\u4E2A\u3002",
"desktop.notInitiator": "\u6B64\u8FDE\u63A5\u4E0D\u662F\u4F60\u521B\u5EFA\u7684\uFF0C\u56E0\u6B64\u6CA1\u6709\u53EF\u5E94\u7528\u7684\u5E94\u7B54\u3002",
"desktop.decryptFailed": "\u4E00\u6761\u6D88\u606F\u65E0\u6CD5\u89E3\u5BC6\uFF0C\u5DF2\u4E22\u5F03\u3002",
"desktop.badMessageFormat": "\u6536\u5230\u683C\u5F0F\u9519\u8BEF\u7684\u6570\u636E\u5E27\uFF0C\u5DF2\u4E22\u5F03\u3002",
"desktop.notSentNotReady": "\u6D88\u606F\u672A\u53D1\u9001\uFF1A\u5B89\u5168\u901A\u9053\u5C1A\u672A\u5C31\u7EEA\u3002\u8BF7\u7B49\u5F85\u9A8C\u8BC1\u5B8C\u6210\u6216\u91CD\u65B0\u8FDE\u63A5\u3002",
"desktop.micDenied": "\u9EA6\u514B\u98CE\u6743\u9650\u88AB\u62D2\u7EDD\u3002",
"desktop.noChannelWait": "\u6CA1\u6709\u5DF2\u6253\u5F00\u7684\u5B89\u5168\u901A\u9053 - \u8BF7\u7B49\u5F85\u8FDE\u63A5\u5EFA\u7ACB\u3002",
"desktop.sasFailed": "\u9A8C\u8BC1\u5931\u8D25\u3002\u53EF\u80FD\u5B58\u5728\u4E2D\u95F4\u4EBA\uFF0C\u8FDE\u63A5\u5DF2\u4E2D\u6B62\u3002",
"desktop.sasOk": "\u9A8C\u8BC1\u6210\u529F\u3002\u6B64\u901A\u9053\u5DF2\u7AEF\u5230\u7AEF\u8BA4\u8BC1\u3002",
"desktop.iceForgotten": "\u5DF2\u5FD8\u8BB0\u4FDD\u5B58\u7684\u670D\u52A1\u5668\uFF0C\u6539\u7528\u516C\u5171 ICE \u670D\u52A1\u5668\u3002",
"desktop.icePublic": "\u6B63\u5728\u4F7F\u7528\u516C\u5171 ICE \u670D\u52A1\u5668\u3002",
"desktop.verificationInProgress": "\u5B89\u5168\u9A8C\u8BC1\u4ECD\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u3002",
"desktop.fileGone": "\u6B64\u6587\u4EF6\u5DF2\u65E0\u6CD5\u4E0B\u8F7D\u3002",
"desktop.codeMismatch": "\u9A8C\u8BC1\u7801\u4E0D\u4E00\u81F4\uFF0C\u4E3A\u5B89\u5168\u8D77\u89C1\u6B63\u5728\u65AD\u5F00\u8FDE\u63A5\u3002",
"desktop.noLocalCode": "\u9A8C\u8BC1\u5931\u8D25\uFF1A\u672C\u5730\u6CA1\u6709\u53EF\u6BD4\u5BF9\u7684\u6D3E\u751F\u9A8C\u8BC1\u7801\u3002\u4E3A\u5B89\u5168\u8D77\u89C1\u6B63\u5728\u65AD\u5F00\u8FDE\u63A5\u3002",
"desktop.protocolViolation": "\u5BF9\u65B9\u5728\u4F60\u786E\u8BA4\u9A8C\u8BC1\u7801\u4E4B\u524D\u5C31\u58F0\u79F0\u5DF2\u786E\u8BA4\u3002\u4E3A\u5B89\u5168\u8D77\u89C1\u6B63\u5728\u65AD\u5F00\u8FDE\u63A5\u3002",
"desktop.verificationRejected": "\u9A8C\u8BC1\u88AB\u62D2\u7EDD\u3002\u4E3A\u5B89\u5168\u8D77\u89C1\u5DF2\u4E2D\u6B62\u8FDE\u63A5\u3002",
"secLevel.HIGH": "\u9AD8",
"secLevel.MEDIUM": "\u4E2D",
"secLevel.LOW": "\u4F4E",
"desktop.rerun": "\u91CD\u65B0\u68C0\u6D4B",
"desktop.ice.customDesc": "\u6700\u591A {max} \u4E2A\u670D\u52A1\u5668\uFF0C\u6BCF\u884C\u4E00\u4E2A URL \u6216\u4F7F\u7528 JSON\u3002",
"desktop.ice.persistDesc": "\u4FDD\u5B58\u5728\u672C\u8BBE\u5907\u4E0A\u3002\u5173\u95ED\u5219\u4EC5\u5728\u672C\u6B21\u4F1A\u8BDD\u4E2D\u4F7F\u7528\u3002",
"desktop.group.leaveNote": "\u5176\u4ED6\u6210\u5458\u4F1A\u5F97\u77E5\u4F60\u5DF2\u79BB\u5F00\u3002\u6B64\u540E\u672C\u8BBE\u5907\u4E0A\u4E0D\u4F1A\u7559\u4E0B\u8FD9\u4E2A\u7FA4\u7EC4\u7684\u4EFB\u4F55\u5185\u5BB9\u2014\u2014\u6CA1\u6709\u670D\u52A1\u5668\u4FDD\u5B58\u526F\u672C\u53EF\u4F9B\u91CD\u65B0\u52A0\u5165\uFF0C\u4F60\u9700\u8981\u4E00\u4EFD\u65B0\u7684\u9080\u8BF7\u3002",
"desktop.sec.ecdsaOk": "\u63E1\u624B\u671F\u95F4\u5DF2\u9A8C\u8BC1\u5BF9\u65B9\u5BC6\u94A5\u5305\u7684\u7B7E\u540D\uFF08ECDSA P-384 / SHA-384\uFF09",
"desktop.sec.ecdsaNone": "\u6CA1\u6709\u5B8C\u6210\u7684\u63E1\u624B",
"desktop.sec.ecdhOk": "\u4F1A\u8BDD\u5BC6\u94A5\u7531\u4E34\u65F6 ECDH P-384 \u4EA4\u6362\u7ECF HKDF-SHA-256 \u6D3E\u751F",
"desktop.sec.ecdhNone": "\u672A\u6D3E\u751F\u4F1A\u8BDD\u5BC6\u94A5",
"desktop.sec.encryptionOk": "\u5DF2\u5728\u6838\u5FC3\u4E2D\u9A8C\u8BC1 AES-GCM \u52A0\u89E3\u5BC6",
"desktop.sec.encryptionNa": "\u65E0\u6CD5\u8FD0\u884C AES-GCM \u81EA\u68C0",
"desktop.sec.integrityOk": "\u5DF2\u9A8C\u8BC1\u6D88\u606F\u5B8C\u6574\u6027\uFF08AES-GCM \u8BA4\u8BC1\uFF09",
"desktop.sec.integrityNa": "\u65E0\u6CD5\u8FD0\u884C\u5B8C\u6574\u6027\u81EA\u68C0",
"desktop.sec.pfsOk": "Double Ratchet \u5DF2\u542F\u7528\u2014\u2014\u6BCF\u6761\u6D88\u606F\u90FD\u6709\u81EA\u5DF1\u7684\u5BC6\u94A5",
"desktop.sec.pfsNa": "\u672A\u6D4B\u91CF",
"desktop.sec.replayOk": "\u68D8\u8F6E\u6D88\u606F\u5BC6\u94A5\u7528\u540E\u5373\u9500\u6BC1\uFF0C\u88AB\u622A\u83B7\u7684\u5E27\u65E0\u6CD5\u91CD\u653E",
"desktop.sec.replayNa": "\u672A\u6D4B\u91CF",
"desktop.sec.dtlsPinned": "\u5DF2\u56FA\u5B9A\u5BF9\u65B9 DTLS \u6307\u7EB9\uFF1A{fp}",
"desktop.sec.dtlsNone": "\u6CA1\u6709\u53EF\u7528\u7684\u8FDC\u7AEF DTLS \u6307\u7EB9",
"desktop.sec.sasBoth": "\u53CC\u65B9\u5DF2\u5728\u5E26\u5916\u786E\u8BA4\u5B89\u5168\u7801",
"desktop.sec.sasIncomplete": "\u5B89\u5168\u7801\u5C1A\u672A\u7531\u53CC\u65B9\u786E\u8BA4",
"desktop.sec.metadataOk": "\u5DF2\u6D3E\u751F\u4E13\u7528\u7684\u5143\u6570\u636E\u5BC6\u94A5\uFF08HKDF metadata-protection-v4\uFF09",
"desktop.sec.metadataNone": "\u6CA1\u6709\u5143\u6570\u636E\u5BC6\u94A5",
"desktop.sec.coverOn": "\u63A9\u62A4\u6D41\u91CF\u5DF2\u542F\u7528\uFF1A\u5728\u68D8\u8F6E\u901A\u9053\u4E0A\u53D1\u9001\u968F\u673A\u4F2A\u5E27\uFF08\u6BCF 15-30 \u79D2 32-128 \u5B57\u8282\uFF09",
"desktop.sec.coverOff": "\u63A9\u62A4\u6D41\u91CF\u751F\u6210\u5668\u672A\u8FD0\u884C",
"desktop.sec.coverUnsupported": "\u63A9\u62A4\u6D41\u91CF\u9700\u8981 Double Ratchet \u4F1A\u8BDD\uFF08\u5BF9\u65B9\u4F7F\u7528\u8F83\u65E7\u7248\u672C\uFF09",
"desktop.tagline": "\u7AEF\u5230\u7AEF\u7684\u81EA\u7531"
},
"ko": {
"language.label": "\uC5B8\uC5B4",
"language.suggest.text": "\uC774 \uD398\uC774\uC9C0\uB294 \uD55C\uAD6D\uC5B4\uB85C\uB3C4 \uBCFC \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
"language.suggest.cta": "\uD55C\uAD6D\uC5B4\uB85C \uBCF4\uAE30",
"language.suggest.dismiss": "\uB2EB\uAE30",
"community.title": "\uD504\uB77C\uC774\uBC84\uC2DC\uC758 \uBBF8\uB798\uB97C \uD568\uAED8 \uB9CC\uB4ED\uB2C8\uB2E4",
"community.description": "SecureBit\uC740 \uCEE4\uBBA4\uB2C8\uD2F0 \uB355\uBD84\uC5D0 \uC790\uB78D\uB2C8\uB2E4. \uC5EC\uB7EC\uBD84\uC758 \uC544\uC774\uB514\uC5B4\uC640 \uC758\uACAC\uC774 \uC548\uC804\uD55C \uC18C\uD1B5\uC758 \uBBF8\uB798\uB97C \uB9CC\uB4ED\uB2C8\uB2E4 - \uBAA8\uB4E0 \uACFC\uC815\uC774 \uACF5\uAC1C\uB418\uC5B4 \uC788\uACE0, \uC804 \uAD6C\uAC04\uC5D0\uC11C ASN.1 \uAC80\uC99D\uC744 \uC218\uD589\uD569\uB2C8\uB2E4.",
"community.github": "GitHub \uC800\uC7A5\uC18C",
"community.feedback": "\uC758\uACAC \uBCF4\uB0B4\uAE30",
"unique.eyebrow": "\uBB34\uC5C7\uC774 \uB2E4\uB978\uAC00",
"unique.heading": "SecureBit\uC774 \uD2B9\uBCC4\uD55C \uC774\uC720",
"unique.s1.titleTop": "\uACC4\uCE35\uC73C\uB85C \uC313\uC740",
"unique.s1.titleBottom": "\uC554\uD638\uD654 \uCF54\uC5B4",
"unique.s1.collapsed": "\uC554\uD638\uD654 \uCF54\uC5B4",
"unique.s1.desc": "ECDH P-384 \uD0A4 \uAD50\uD658, AES-256-GCM \uD398\uC774\uB85C\uB4DC, ECDSA \uC11C\uBA85, \uADF8\uB9AC\uACE0 \uC644\uC804\uD55C ASN.1 \uAC80\uC99D\uC744 \uD558\uB098\uC758 \uACAC\uACE0\uD55C \uD30C\uC774\uD504\uB77C\uC778\uC73C\uB85C \uBB36\uC5C8\uC2B5\uB2C8\uB2E4.",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "\uC21C\uC218 P2P",
"unique.s2.titleBottom": "WebRTC \uAE30\uBC18",
"unique.s2.collapsed": "WebRTC \uAE30\uBC18 \uC21C\uC218 P2P",
"unique.s2.desc": "\uBA54\uC2DC\uC9C0\uB294 WebRTC\uB97C \uD1B5\uD574 \uAE30\uAE30\uC5D0\uC11C \uAE30\uAE30\uB85C \uACE7\uC7A5 \uC624\uAC11\uB2C8\uB2E4. \uB370\uC774\uD130\uB97C \uBD99\uB4E4\uACE0 \uC788\uB294 \uB9B4\uB808\uC774\uB294 \uC5C6\uACE0, \uC11C\uBC84\uB294 \uB450 \uC0AC\uB78C\uC774 \uC11C\uB85C\uB97C \uCC3E\uB3C4\uB85D \uB3D5\uAE30\uB9CC \uD569\uB2C8\uB2E4.",
"unique.s2.tags": [
"DTLS 1.3",
"\uB9B4\uB808\uC774 \uC5C6\uC74C"
],
"unique.s3.titleTop": "\uC644\uC804\uD55C",
"unique.s3.titleBottom": "\uC21C\uBC29\uD5A5 \uBE44\uBC00\uC131",
"unique.s3.collapsed": "\uC21C\uBC29\uD5A5 \uBE44\uBC00\uC131",
"unique.s3.desc": "\uC138\uC158 \uD0A4\uB294 \uB04A\uC784\uC5C6\uC774 \uAD50\uCCB4\uB418\uACE0 \uC0AC\uC6A9 \uD6C4 \uD3D0\uAE30\uB429\uB2C8\uB2E4. \uADF8\uB798\uC11C \uD0A4 \uD558\uB098\uAC00 \uC720\uCD9C\uB418\uC5B4\uB3C4 \uC9C0\uB09C \uB300\uD654\uB294 \uC5F4\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
"unique.s3.tags": [
"\uC77C\uD68C\uC6A9 \uD0A4",
"\uC790\uB3D9 \uAD50\uCCB4"
],
"unique.s4.titleTop": "\uD2B8\uB798\uD53D",
"unique.s4.titleBottom": "\uB09C\uB3C5\uD654",
"unique.s4.collapsed": "\uD2B8\uB798\uD53D \uB09C\uB3C5\uD654",
"unique.s4.desc": "\uD328\uD0B7 \uD06C\uAE30\uC640 \uC804\uC1A1 \uAC04\uACA9\uC744 \uCC44\uC6B0\uACE0 \uBB34\uC791\uC704\uB85C \uD750\uD2B8\uB7EC\uB728\uB824, \uD68C\uC120\uC744 \uB4E4\uC5EC\uB2E4\uBCF4\uB294 \uCABD\uC5D0\uC11C\uB3C4 \uBA54\uD0C0\uB370\uC774\uD130\uC758 \uADDC\uCE59\uC774 \uB4DC\uB7EC\uB098\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
"unique.s4.tags": [
"\uD328\uD0B7 \uD328\uB529",
"\uC2DC\uAC04 \uC9C0\uD130"
],
"unique.s5.titleTop": "\uB370\uC774\uD130 \uC218\uC9D1",
"unique.s5.titleBottom": "\uC804\uD600 \uC5C6\uC74C",
"unique.s5.collapsed": "\uB370\uC774\uD130 \uC218\uC9D1 \uC5C6\uC74C",
"unique.s5.desc": "\uACC4\uC815\uB3C4, \uB85C\uADF8\uB3C4, \uC800\uC7A5\uB41C \uBA54\uC2DC\uC9C0\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4. \uC11C\uBC84\uC5D0\uB294 \uC720\uCD9C\uB418\uAC70\uB098 \uC555\uC218\uB418\uAC70\uB098 \uD314\uB9B4 \uAC83\uC774 \uC544\uBB34\uAC83\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4.",
"unique.s5.tags": [
"\uACC4\uC815 \uC5C6\uC74C",
"\uB85C\uADF8 \uC5C6\uC74C"
],
"partners.eyebrow": "\uD30C\uD2B8\uB108\uC640 \uC0DD\uD0DC\uACC4",
"partners.heading": "\uD30C\uD2B8\uB108\uB4E4\uC774 \uC2E0\uB8B0\uD569\uB2C8\uB2E4",
"partners.aegis.desc": "\uD3EC\uD2B8\uD3F4\uB9AC\uC624 \uC804\uBC18\uC758 \uAE30\uBC00 \uAE08\uC735 \uC18C\uD1B5\uC744 \uC9C0\uD0A4\uB294 \uC790\uBCF8 \uD30C\uD2B8\uB108\uC785\uB2C8\uB2E4.",
"partners.aegis.role": "\uC804\uB7B5\uC801 \uD22C\uC790\uC790",
"partners.furilabs.desc": "\uD504\uB77C\uC774\uBC84\uC2DC\uB97C \uC55E\uC138\uC6B4 \uB9AC\uB205\uC2A4 \uD3F0\uC73C\uB85C, SecureBit\uC744 \uAE30\uBCF8 \uBCF4\uC548 \uCC44\uB110\uB85C \uD568\uAED8 \uC81C\uACF5\uD569\uB2C8\uB2E4.",
"partners.furilabs.role": "\uAE30\uC220 \uD30C\uD2B8\uB108",
"partners.inviteTitle": "\uD30C\uD2B8\uB108 \uB418\uAE30",
"partners.inviteDesc": "\uD504\uB77C\uC774\uBC84\uC2DC\uB97C \uC704\uD55C \uD558\uB4DC\uC6E8\uC5B4\uB098 \uC778\uD504\uB77C\uB97C \uB9CC\uB4E4\uACE0 \uACC4\uC2E0\uAC00\uC694? SecureBit\uC744 \uD568\uAED8 \uBD99\uC5EC\uBD05\uC2DC\uB2E4.",
"partners.inviteCta": "\uC774\uC57C\uAE30 \uC2DC\uC791\uD558\uAE30",
"roadmap.eyebrow": "\uAC1C\uBC1C \uB85C\uB4DC\uB9F5",
"roadmap.heading": "SecureBit\uC758 \uBC1C\uC790\uCDE8",
"roadmap.subheading": "\uCCAB \uD504\uB85C\uD1A0\uD0C0\uC785\uC5D0\uC11C \uC591\uC790 \uB0B4\uC131 \uBD84\uC0B0 \uB124\uD2B8\uC6CC\uD06C\uAE4C\uC9C0, \uBAA8\uB4E0 \uACC4\uCE35\uC5D0\uC11C \uC644\uC804\uD55C ASN.1 \uAC80\uC99D\uACFC \uD568\uAED8.",
"roadmap.progress": "{total}\uAC1C \uC911 {shipped}\uAC1C \uC644\uB8CC",
"roadmap.upcoming": "{upcoming}\uAC1C \uB0A8\uC74C",
"roadmap.keyFeatures": "\uC8FC\uC694 \uAE30\uB2A5",
"roadmap.status.released": "\uCD9C\uC2DC\uB428",
"roadmap.status.current": "\uC9C4\uD589 \uC911",
"roadmap.status.dev": "\uAC1C\uBC1C \uC911",
"roadmap.status.planned": "\uC608\uC815",
"roadmap.status.research": "\uC5F0\uAD6C",
"hero.headlineTop": "\uB450 \uC0AC\uB78C\uB9CC \uC77D\uC744 \uC218 \uC788\uB294",
"hero.headlineBottom": "\uC9C1\uD1B5 \uD68C\uC120.",
"hero.subheading": "\uD0A4\uB294 \uC5EC\uB7EC\uBD84\uC758 \uAE30\uAE30\uC5D0\uC11C \uB9CC\uB4E4\uC5B4\uC9C0\uACE0 \uB450 \uAE30\uAE30 \uC0AC\uC774\uC5D0\uC11C \uACE7\uBC14\uB85C \uAD50\uD658\uB429\uB2C8\uB2E4. \uACC4\uC815\uB3C4 \uC5C6\uACE0 \uBA54\uC2DC\uC9C0\uB97C \uBCF4\uAD00\uD558\uB294 \uC11C\uBC84\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4.",
"hero.diagramAlt": "\uD55C \uC0C1\uB300\uC640 \uC774\uC5B4\uC9C4 \uC9C1\uD1B5 \uC554\uD638\uD654 \uD68C\uC120, \uADF8\uB9AC\uACE0 \uB4A4\uC774\uC5B4 \uD569\uB958\uD558\uB294 \uB450 \uC0AC\uB78C",
"intro.createTitle": "\uC0C8 \uCC44\uB110 \uB9CC\uB4E4\uAE30",
"intro.createDesc": "\uC5EC\uB7EC\uBD84\uC758 \uAE30\uAE30\uAC00 \uD0A4\uC640 \uC77C\uD68C\uC6A9 \uCD08\uB300\uC7A5\uC744 \uB9CC\uB4ED\uB2C8\uB2E4. \uADF8 \uC5B4\uB290 \uAC83\uB3C4 \uC11C\uBC84\uB97C \uAC70\uCE58\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
"intro.createCta": "\uD0A4\uC640 \uCD08\uB300\uC7A5 \uB9CC\uB4E4\uAE30",
"intro.joinTitle": "\uCC44\uB110 \uCC38\uC5EC\uD558\uAE30",
"intro.scanTitle": "\uCE74\uBA54\uB77C\uB85C QR \uC2A4\uCE94",
"intro.scanSubtitle": "\uAC00\uC7A5 \uBE60\uB985\uB2C8\uB2E4 - \uC0C1\uB300\uC758 \uD654\uBA74\uC744 \uBE44\uCD94\uC138\uC694",
"intro.orPasteCode": "\uB610\uB294 \uCF54\uB4DC \uBD99\uC5EC\uB123\uAE30",
"intro.pastePlaceholder": "\uC5EC\uAE30\uC5D0 \uCD08\uB300 \uCF54\uB4DC\uB97C \uBD99\uC5EC\uB123\uC73C\uC138\uC694\u2026",
"intro.connect": "\uC5F0\uACB0",
"intro.connecting": "\uCC98\uB9AC \uC911\u2026",
"roadmap.r1.title": "\uAC1C\uBC1C \uC2DC\uC791",
"roadmap.r1.sub": "\uC544\uC774\uB514\uC5B4, \uD504\uB85C\uD1A0\uD0C0\uC785, \uC778\uD504\uB77C \uAD6C\uCD95",
"roadmap.r1.date": "2025\uB144 \uCD08",
"roadmap.r1.features": [
"\uAC1C\uB150\uACFC \uC694\uAD6C\uC0AC\uD56D \uC815\uB9AC",
"\uAE30\uC220 \uC2A4\uD0DD \uC120\uC815: WebRTC, P2P, \uC554\uD638\uD559",
"\uCCAB \uBA54\uC2DC\uC9D5 \uD504\uB85C\uD1A0\uD0C0\uC785",
"\uC800\uC7A5\uC18C\uC640 CI \uAD6C\uCD95",
"\uAE30\uBCF8 \uC554\uD638\uD654 \uAD6C\uC870",
"UX/UI \uC124\uACC4"
],
"roadmap.r2.title": "\uC54C\uD30C \uACF5\uAC1C",
"roadmap.r2.sub": "\uCCAB \uACF5\uAC1C \uC54C\uD30C: \uAE30\uBCF8 \uCC44\uD305\uACFC \uD0A4 \uAD50\uD658",
"roadmap.r2.date": "2025\uB144 \uBD04",
"roadmap.r2.features": [
"WebRTC \uAE30\uBC18 \uAE30\uBCF8 P2P \uBA54\uC2DC\uC9D5",
"\uAC04\uB2E8\uD55C \uC885\uB2E8 \uAC04 \uC554\uD638\uD654 (\uC2DC\uC5F0\uC6A9 \uBC29\uC2DD)",
"\uC548\uC815\uC801\uC778 \uC2DC\uADF8\uB110\uB9C1\uACFC \uC7AC\uC5F0\uACB0",
"\uD14C\uC2A4\uD2B8\uB97C \uC704\uD55C \uCD5C\uC18C \uD654\uBA74",
"\uCD08\uAE30 \uD14C\uC2A4\uD130 \uC758\uACAC \uC218\uC9D1"
],
"roadmap.r3.title": "\uBCF4\uC548 \uAC15\uD654",
"roadmap.r3.sub": "\uBCF4\uC548\uC744 \uB2E4\uC9C0\uACE0 \uC548\uC815 \uBE0C\uB79C\uCE58 \uACF5\uAC1C",
"roadmap.r3.date": "2025\uB144 \uC5EC\uB984",
"roadmap.r3.features": [
"ECDH/ECDSA \uC2E4\uC0AC\uC6A9 \uC801\uC6A9",
"\uC21C\uBC29\uD5A5 \uBE44\uBC00\uC131\uACFC \uD0A4 \uAD50\uCCB4",
"\uC778\uC99D \uAC80\uC0AC \uAC1C\uC120",
"\uD30C\uC77C \uC554\uD638\uD654\uC640 \uB300\uC6A9\uB7C9 \uC804\uC1A1",
"\uAE30\uBCF8 \uC554\uD638 \uCC98\uB9AC \uAC10\uC0AC"
],
"roadmap.r4.title": "\uD655\uC7A5\uACFC \uC548\uC815\uC131",
"roadmap.r4.sub": "\uB124\uD2B8\uC6CC\uD06C \uD655\uC7A5\uACFC \uC548\uC815\uC131 \uAC1C\uC120",
"roadmap.r4.date": "2025\uB144 \uAC00\uC744",
"roadmap.r4.features": [
"P2P \uC5F0\uACB0\uACFC NAT \uD1B5\uACFC \uCD5C\uC801\uD654",
"\uC7AC\uC5F0\uACB0 \uAD6C\uC870\uC640 \uBA54\uC2DC\uC9C0 \uB300\uAE30\uC5F4",
"\uBAA8\uBC14\uC77C \uBC30\uD130\uB9AC \uC18C\uBAA8 \uAC10\uC18C",
"\uC5EC\uB7EC \uAE30\uAE30 \uAC04 \uB3D9\uAE30\uD654",
"\uAC1C\uBC1C\uC790\uB97C \uC704\uD55C \uBAA8\uB2C8\uD130\uB9C1\uACFC \uB85C\uAE45 \uB3C4\uAD6C"
],
"roadmap.r5.title": "\uD504\uB77C\uC774\uBC84\uC2DC \uC6B0\uC120",
"roadmap.r5.sub": "\uD504\uB77C\uC774\uBC84\uC2DC\uC5D0 \uC9D1\uC911: \uBA54\uD0C0\uB370\uC774\uD130 \uCD5C\uC18C\uD654",
"roadmap.r5.date": "2025\uB144 \uACA8\uC6B8",
"roadmap.r5.features": [
"\uBA54\uD0C0\uB370\uC774\uD130 \uBCF4\uD638\uC640 \uC9C0\uBB38 \uCD95\uC18C",
"\uC5B4\uB2C8\uC5B8 \uB77C\uC6B0\uD305\uACFC DHT \uC2E4\uD5D8",
"\uC775\uBA85 \uC5F0\uACB0 \uC635\uC158",
"\uACF5\uAC1C \uCF54\uB4DC \uAC10\uC0AC \uC900\uBE44",
"\uC0AC\uC6A9\uC790 \uD655\uC778 \uC808\uCC28 \uAC1C\uC120"
],
"roadmap.r6.title": "Enhanced Security Edition",
"roadmap.r6.sub": "\uC644\uC804\uD55C ASN.1 \uAC80\uC99D\uC744 \uAC16\uCD98 18\uACB9 \uAD70\uC6A9 \uC218\uC900 \uC554\uD638\uD654",
"roadmap.r6.date": "2025\uB144 \uB9D0",
"roadmap.r6.features": [
"ECDH + DTLS + SAS \uC0BC\uC911 \uBCF4\uC548",
"ECDH P-384\uC640 AES-GCM 256\uBE44\uD2B8 \uC554\uD638\uD654",
"DTLS \uC9C0\uBB38 \uD655\uC778",
"SAS(\uC9E7\uC740 \uC778\uC99D \uBB38\uC790\uC5F4) \uD655\uC778",
"\uD0A4 \uAD50\uCCB4\uB97C \uB3D9\uBC18\uD55C \uC21C\uBC29\uD5A5 \uBE44\uBC00\uC131",
"\uC911\uAC04\uC790 \uACF5\uACA9 \uBC29\uC5B4 \uAC15\uD654",
"\uC644\uC804\uD55C ASN.1 DER \uAC80\uC99D",
"OID\uC640 EC \uC810 \uD655\uC778",
"SPKI \uAD6C\uC870 \uAC80\uC99D",
"P2P WebRTC \uAD6C\uC870",
"\uBA54\uD0C0\uB370\uC774\uD130 \uBCF4\uD638",
"100% \uACF5\uAC1C \uC18C\uC2A4"
],
"roadmap.r7.title": "Desktop Edition",
"roadmap.r7.sub": "Windows, macOS, Linux\uC6A9 \uB124\uC774\uD2F0\uBE0C \uB370\uC2A4\uD06C\uD1B1 \uC571",
"roadmap.r7.date": "2026\uB144 \uCD08",
"roadmap.r7.features": [
"Windows \uB370\uC2A4\uD06C\uD1B1 \uC571 (Tauri v2)",
"macOS \uB370\uC2A4\uD06C\uD1B1 \uC571 (Tauri v2)",
"Linux AppImage (Tauri v2)",
"\uC2E4\uC2DC\uAC04 \uC54C\uB9BC",
"\uC790\uB3D9 \uC7AC\uC5F0\uACB0",
"\uAE30\uAE30 \uAC04 \uB3D9\uAE30\uD654",
"\uAC1C\uC120\uB41C \uD654\uBA74",
"\uCD5C\uB300 100MB \uD30C\uC77C \uC9C0\uC6D0"
],
"roadmap.r8.title": "\uC548\uC804\uD55C \uC74C\uC131\uACFC \uD1B5\uD654",
"roadmap.r8.sub": "\uC554\uD638\uD654\uB41C \uC74C\uC131 \uBA54\uC2DC\uC9C0, \uC74C\uC131 \uD1B5\uD654, \uC601\uC0C1 \uD1B5\uD654",
"roadmap.r8.date": "2026\uB144 \uCD08",
"roadmap.r8.features": [
"\uC885\uB2E8 \uAC04 \uC554\uD638\uD654\uB41C \uC74C\uC131 \uBA54\uC2DC\uC9C0",
"1:1 \uC554\uD638\uD654 \uC74C\uC131 \uD1B5\uD654 (WebRTC)",
"1:1 \uC554\uD638\uD654 \uC601\uC0C1 \uD1B5\uD654 (WebRTC)",
"\uC2E4\uC2DC\uAC04 \uBBF8\uB514\uC5B4\uC758 \uC21C\uBC29\uD5A5 \uBE44\uBC00\uC131",
"SRTP/DTLS\uB85C \uBCF4\uD638\uB418\uB294 \uBBF8\uB514\uC5B4 \uC2A4\uD2B8\uB9BC",
"\uD1B5\uD654 \uC911 SAS \uD655\uC778",
"\uD1B5\uD654 \uC54C\uB9BC\uACFC \uC790\uB3D9 \uC7AC\uC5F0\uACB0",
"\uC9C0\uC5F0\uC774 \uC801\uC740 P2P \uBBF8\uB514\uC5B4"
],
"roadmap.r9.title": "\uADF8\uB8F9 \uC18C\uD1B5",
"roadmap.r9.sub": "\uD504\uB77C\uC774\uBC84\uC2DC\uB97C \uC9C0\uD0A4\uB294 \uADF8\uB8F9 \uCC44\uD305",
"roadmap.r9.date": "\uC9C0\uAE08",
"roadmap.r9.features": [
"\uCD5C\uB300 8\uBA85\uAE4C\uC9C0 P2P \uADF8\uB8F9 \uCC44\uD305",
"\uBA54\uC2DC \uC804\uB2EC\uACFC \uC11C\uBA85\uB41C \uB9B4\uB808\uC774 \uB300\uCCB4 \uACBD\uB85C",
"\uBAA8\uB450\uAC00 \uD568\uAED8 \uB300\uC870\uD558\uB294 \uD558\uB098\uC758 \uADF8\uB8F9 \uC548\uC804 \uCF54\uB4DC",
"\uCF54\uB4DC \uCD94\uCE21\uC744 \uB9C9\uB294 \uCEE4\uBC0B \uD6C4 \uACF5\uAC1C \uC808\uCC28",
"\uC124\uACC4\uC0C1 \uC77C\uD68C\uC6A9\uC778 \uADF8\uB8F9 \uC804\uC6A9 \uC2E0\uC6D0 \uD0A4",
"\uC5D0\uD3EC\uD06C \uC21C\uC11C\uB97C \uAC16\uCD98 \uC11C\uBA85\uB41C \uAD6C\uC131\uC6D0 \uBA85\uB2E8",
"\uC11C\uBA85\uB41C \uBA54\uC2DC\uC9C0 - \uAE30\uB85D\uC774 \uAC08\uB77C\uC9C0\uBA74 \uC99D\uBA85\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4",
"\uC11C\uBC84 \uC5C6\uC74C, \uACF5\uC720 \uADF8\uB8F9 \uD0A4 \uC5C6\uC74C, \uAE30\uB85D \uC5C6\uC74C"
],
"roadmap.r10.title": "Mobile Edition",
"roadmap.r10.sub": "iOS\uC640 Android\uC6A9 \uB124\uC774\uD2F0\uBE0C \uBAA8\uBC14\uC77C \uC571",
"roadmap.r10.date": "2027\uB144 2\uBD84\uAE30",
"roadmap.r10.features": [
"iOS \uB124\uC774\uD2F0\uBE0C \uC571 (Swift/SwiftUI)",
"Android \uB124\uC774\uD2F0\uBE0C \uC571 (Kotlin/Jetpack Compose)",
"\uBAA8\uBC14\uC77C \uBE0C\uB77C\uC6B0\uC800 PWA \uC9C0\uC6D0",
"\uC2E4\uC2DC\uAC04 \uD478\uC2DC \uC54C\uB9BC",
"\uBC30\uD130\uB9AC \uCD5C\uC801\uD654",
"\uBAA8\uBC14\uC77C\uC5D0 \uB9DE\uCD98 \uD654\uBA74",
"\uC624\uD504\uB77C\uC778 \uBA54\uC2DC\uC9C0 \uB300\uAE30\uC5F4",
"\uC0DD\uCCB4 \uC778\uC99D"
],
"roadmap.r11.title": "\uC591\uC790 \uB0B4\uC131 \uC5D0\uB514\uC158",
"roadmap.r11.sub": "\uC591\uC790 \uCEF4\uD4E8\uD130\uC5D0 \uB300\uD55C \uB300\uBE44",
"roadmap.r11.date": "2027\uB144 4\uBD84\uAE30",
"roadmap.r11.features": [
"\uD3EC\uC2A4\uD2B8 \uC591\uC790 \uC554\uD638 CRYSTALS-Kyber",
"SPHINCS+ \uC804\uC790 \uC11C\uBA85",
"\uACE0\uC804\uACFC \uD3EC\uC2A4\uD2B8 \uC591\uC790\uB97C \uD568\uAED8 \uC4F0\uB294 \uD63C\uD569 \uBC29\uC2DD",
"\uC591\uC790\uC5D0 \uC548\uC804\uD55C \uD0A4 \uAD50\uD658",
"\uAC31\uC2E0\uB41C \uD574\uC2DC \uC54C\uACE0\uB9AC\uC998",
"\uAE30\uC874 \uC138\uC158 \uC774\uC804",
"v5.x \uD638\uD658",
"\uC591\uC790 \uB0B4\uC131 \uD504\uB85C\uD1A0\uCF5C"
],
"roadmap.r12.title": "\uBD84\uC0B0 \uB124\uD2B8\uC6CC\uD06C",
"roadmap.r12.sub": "\uC644\uC804\uD788 \uBD84\uC0B0\uB41C \uB124\uD2B8\uC6CC\uD06C",
"roadmap.r12.date": "2028\uB144",
"roadmap.r12.features": [
"\uB178\uB4DC \uBA54\uC2DC \uB124\uD2B8\uC6CC\uD06C",
"\uD53C\uC5B4 \uD0D0\uC0C9\uC744 \uC704\uD55C DHT",
"\uB0B4\uC7A5 \uC5B4\uB2C8\uC5B8 \uB77C\uC6B0\uD305",
"\uD1A0\uD06C\uB178\uBBF9\uC2A4\uC640 \uB178\uB4DC \uBCF4\uC0C1",
"DAO\uB97C \uD1B5\uD55C \uAC70\uBC84\uB10C\uC2A4",
"\uB2E4\uB978 \uB124\uD2B8\uC6CC\uD06C\uC640\uC758 \uC0C1\uD638 \uC6B4\uC6A9",
"\uD50C\uB7AB\uD3FC \uAC04 \uD638\uD658",
"\uC2A4\uC2A4\uB85C \uBCF5\uAD6C\uD558\uB294 \uB124\uD2B8\uC6CC\uD06C"
],
"roadmap.r13.title": "AI \uD504\uB77C\uC774\uBC84\uC2DC \uB3C4\uC6B0\uBBF8",
"roadmap.r13.sub": "\uD504\uB77C\uC774\uBC84\uC2DC\uC640 \uBCF4\uC548\uC744 \uC704\uD55C \uC778\uACF5\uC9C0\uB2A5",
"roadmap.r13.date": "2028\uB144 \uC774\uD6C4",
"roadmap.r13.features": [
"\uAE30\uAE30 \uC548\uC5D0\uC11C \uC774\uB8E8\uC5B4\uC9C0\uB294 AI \uC704\uD611 \uBD84\uC11D",
"\uC911\uAC04\uC790 \uACF5\uACA9 \uC790\uB3D9 \uAC10\uC9C0",
"\uC801\uC751\uD615 \uC554\uD638\uD654",
"\uB9DE\uCDA4\uD615 \uBCF4\uC548 \uAD8C\uACE0",
"\uC601\uC9C0\uC2DD \uAE30\uACC4 \uD559\uC2B5",
"\uAC1C\uC778\uC6A9 AI \uB3C4\uC6B0\uBBF8",
"\uC608\uCE21 \uAE30\uBC18 \uBCF4\uC548",
"\uC790\uC728\uC801\uC778 \uACF5\uACA9 \uBC29\uC5B4"
],
"handshake.step1": "ECDH P-384 \uD0A4 \uC30D \uC0DD\uC131 \uC911",
"handshake.step2": "\uD655\uC778 \uCF54\uB4DC \uC720\uB3C4 \uC911",
"handshake.step3": "\uC21C\uBC29\uD5A5 \uBE44\uBC00\uC131 \uACE0\uC815 \uC911",
"handshake.securingTitle": "\uCC44\uB110\uC744 \uBCF4\uD638\uD558\uB294 \uC911",
"handshake.answerTitle": "\uC751\uB2F5\uC744 \uB9CC\uB4DC\uB294 \uC911",
"handshake.securingDesc": "\uBCC0\uC870\uB97C \uACAC\uB51C \uB9CC\uD07C \uB2E8\uB2E8\uD55C \uD0A4\uB97C \uBCBC\uB9AC\uB294 \uC911\uC785\uB2C8\uB2E4.",
"handshake.shareTitle": "\uCD08\uB300\uC7A5 \uACF5\uC720\uD558\uAE30",
"handshake.sendAnswerTitle": "\uC751\uB2F5 \uB3CC\uB824\uBCF4\uB0B4\uAE30",
"handshake.shareDesc": "QR\uC744 \uBCF4\uC5EC\uC8FC\uAC70\uB098 \uCF54\uB4DC\uB97C \uC0C1\uB300\uC5D0\uAC8C \uBCF4\uB0B4\uC138\uC694. \uD55C \uBC88\uB9CC \uC4F8 \uC218 \uC788\uACE0 \uACE7 \uB9CC\uB8CC\uB429\uB2C8\uB2E4.",
"handshake.sendAnswerDesc": "\uCC44\uB110\uC744 \uB9CC\uB4E0 \uC0AC\uB78C\uC5D0\uAC8C \uC774 \uC751\uB2F5\uC744 \uC804\uD574 \uC545\uC218\uB97C \uB9C8\uCE58\uB3C4\uB85D \uD558\uC138\uC694.",
"handshake.establish": "\uC5F0\uACB0 \uB9FA\uAE30",
"handshake.thenReceive": "\uADF8\uB2E4\uC74C \uC0C1\uB300\uAC00 \uBCF4\uB0B4\uB294 \uC751\uB2F5\uC744 \uBC1B\uC73C\uC138\uC694",
"handshake.pasteAnswerPlaceholder": "\uC0C1\uB300\uC758 \uC751\uB2F5 \uCF54\uB4DC\uB97C \uBD99\uC5EC\uB123\uC73C\uC138\uC694\u2026",
"handshake.answerSentNote": "\uC774 \uC751\uB2F5\uC744 \uB9CC\uB4E0 \uC0AC\uB78C\uC5D0\uAC8C \uBCF4\uB0B4\uACE0 \uAE30\uB2E4\uB9AC\uC138\uC694 - \uC0C1\uB300\uAC00 \uC5F0\uACB0\uB418\uBA74 \uB300\uD654\uAC00 \uC5F4\uB9BD\uB2C8\uB2E4.",
"handshake.qrHint": "\uC0C1\uB300\uAC00 \uCF54\uB4DC\uB97C \uB2E4 \uC77D\uC744 \uB54C\uAE4C\uC9C0 \uC774 \uD654\uBA74\uC744 \uC5F4\uC5B4 \uB450\uC138\uC694.",
"handshake.qrHintFrames": "\uC545\uC218\uAC00 {frames}\uAC1C \uD654\uBA74\uC73C\uB85C \uB098\uB258\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 - \uC0C1\uB300\uAC00 \uC804\uBD80 \uC77D\uC744 \uB54C\uAE4C\uC9C0 \uC5F4\uC5B4 \uB450\uC138\uC694.",
"verify.title": "\uBCF4\uC548 \uD655\uC778",
"verify.desc": "\uB2E4\uB978 \uACBD\uB85C(\uD1B5\uD654\uB098 \uB300\uBA74)\uB85C \uC0C1\uB300\uC640 \uC774 \uC548\uC804 \uCF54\uB4DC\uB97C \uB300\uC870\uD55C \uB4A4, \uC785\uB825\uD574\uC11C \uB300\uD654\uB97C \uC5EC\uC138\uC694.",
"verify.enterLabel": "\uB300\uC870\uD55C \uCF54\uB4DC\uB97C \uC785\uB825\uD558\uC138\uC694",
"verify.placeholder": "\uC5EC\uAE30\uC5D0 \uCF54\uB4DC \uC785\uB825",
"verify.confirm": "\uCF54\uB4DC \uD655\uC778",
"verify.confirmed": "\uD655\uC778\uB428",
"verify.mismatch": "\uC77C\uCE58\uD558\uC9C0 \uC54A\uC74C",
"verify.yours": "\uB0B4 \uD655\uC778",
"verify.peer": "\uC0C1\uB300\uC758 \uD655\uC778",
"verify.pending": "\uB300\uAE30 \uC911",
"verify.waiting": "\uCF54\uB4DC \uB300\uAE30 \uC911\u2026",
"verify.verified": "\uCC44\uB110 \uD655\uC778 \uC644\uB8CC",
"verify.bothConfirmed": "\uC591\uCABD \uBAA8\uB450 \uD655\uC778\uD588\uC2B5\uB2C8\uB2E4. \uC548\uC804\uD55C \uB300\uD654\uB97C \uC5EC\uB294 \uC911\u2026",
"pwa.bannerTitle": "SecureBit.chat \uC124\uCE58",
"pwa.bannerDesc": "\uBCF4\uC548\uC774 \uAC15\uD654\uB41C \uB124\uC774\uD2F0\uBE0C \uC571 \uACBD\uD5D8\uC744 \uB204\uB9AC\uC138\uC694",
"pwa.install": "\uC124\uCE58",
"pwa.dismiss": "\uB2EB\uAE30",
"pwa.close": "\uB2EB\uAE30",
"pwa.iosTitle": "iOS\uC5D0 \uC124\uCE58\uD558\uAE30",
"pwa.iosStep1": "\uACF5\uC720 \uBC84\uD2BC\uC744 \uB204\uB974\uC138\uC694",
"pwa.iosStep1Hint": "\uBCF4\uD1B5 Safari \uC544\uB798\uCABD\uC5D0 \uC788\uC2B5\uB2C8\uB2E4",
"pwa.iosStep2": "'\uD648 \uD654\uBA74\uC5D0 \uCD94\uAC00'\uB97C \uCC3E\uC73C\uC138\uC694",
"pwa.iosStep2Hint": "\uACF5\uC720 \uBA54\uB274\uB97C \uC544\uB798\uB85C \uB0B4\uB824\uBCF4\uC138\uC694",
"pwa.iosStep3": "'\uCD94\uAC00'\uB97C \uB204\uB974\uC138\uC694",
"pwa.iosStep3Hint": "\uD655\uC778\uD558\uBA74 SecureBit.chat\uC774 \uC124\uCE58\uB429\uB2C8\uB2E4",
"pwa.genericTitle": "SecureBit \uC124\uCE58",
"pwa.genericDesc": "\uBE0C\uB77C\uC6B0\uC800\uB9C8\uB2E4 \uC124\uCE58 \uBC29\uBC95\uC774 \uB2E4\uB985\uB2C8\uB2E4. \uC4F0\uC2DC\uB294 \uBE0C\uB77C\uC6B0\uC800\uC5D0 \uB9DE\uB294 \uC21C\uC11C\uB97C \uACE0\uB974\uC138\uC694.",
"pwa.gotIt": "\uC54C\uACA0\uC2B5\uB2C8\uB2E4",
"pwa.installedTitle": "\uC571\uC774 \uC124\uCE58\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
"pwa.installedIos": "iOS \uC571\uC774 \uC124\uCE58\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uD648 \uD654\uBA74\uC5D0\uC11C \uC5F4\uC5B4\uBCF4\uC138\uC694.",
"pwa.installedGeneric": "\uC774\uC81C SecureBit.chat\uC774 \uAE30\uAE30\uC5D0 \uC788\uC2B5\uB2C8\uB2E4",
"pwa.anytimeTitle": "\uC5B8\uC81C\uB4E0 \uC124\uCE58\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4",
"pwa.anytimeDesc": "\uAC00\uC7A5 \uC88B\uC740 \uACBD\uD5D8\uC744 \uC704\uD574, \uBE0C\uB77C\uC6B0\uC800 \uBA54\uB274\uC5D0\uC11C \uC5B8\uC81C\uB4E0 SecureBit.chat\uC744 \uC124\uCE58\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
"pwa.ok": "\uD655\uC778",
"step.open": "1\uB2E8\uACC4 \xB7 \uCC44\uB110 \uC5F4\uAE30",
"step.exchange": "2\uB2E8\uACC4 \xB7 \uAD50\uD658",
"step.verification": "3\uB2E8\uACC4 \xB7 \uD655\uC778",
"action.create": "\uB9CC\uB4E4\uAE30",
"action.join": "\uCC38\uC5EC",
"action.back": "\uB4A4\uB85C",
"action.copy": "\uBCF5\uC0AC",
"action.copied": "\uBCF5\uC0AC\uB428",
"action.scan": "\uC2A4\uCE94",
"action.downloadDesktop": "\uB370\uC2A4\uD06C\uD1B1 \uC571 \uB0B4\uB824\uBC1B\uAE30",
"action.advancedSettings": "\uACE0\uAE09 \uC124\uC815",
"cred.offerTag": "\uCD08\uB300 \xB7 \uB610\uB294 \uD14D\uC2A4\uD2B8 \uBCF5\uC0AC",
"cred.answerTag": "\uC751\uB2F5 \xB7 \uB610\uB294 \uD14D\uC2A4\uD2B8 \uBCF5\uC0AC",
"cred.reveal": "\uB20C\uB7EC\uC11C \uBCF4\uAE30 - \uC774 \uCF54\uB4DC\uB294 \uB0A8\uC5D0\uAC8C \uC54C\uB9AC\uC9C0 \uB9C8\uC138\uC694",
"qr.title": "QR \uCF54\uB4DC \uC2A4\uCE94",
"qr.subtitle": "\uC0C1\uB300\uC758 QR\uC5D0 \uCE74\uBA54\uB77C\uB97C \uB9DE\uCD94\uC138\uC694",
"qr.scanning": "\uC77D\uB294 \uC911\u2026",
"qr.hint": "\uBAA8\uB4E0 \uC870\uAC01\uC744 \uC77D\uC744 \uB54C\uAE4C\uC9C0 \uD754\uB4E4\uB9AC\uC9C0 \uC54A\uAC8C \uC720\uC9C0\uD558\uC138\uC694. \uCE74\uBA54\uB77C\uB294 \uAE30\uAE30 \uC548\uC5D0\uC11C\uB9CC \uC4F0\uC774\uBA70 - \uC544\uBB34\uAC83\uB3C4 \uC804\uC1A1\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
"mesh.you": "\uB098",
"mesh.peer": "\uC0C1\uB300 \xB7 \uC138\uC158 1",
"mesh.joined2": "\uC9C0\uBBFC \uD569\uB958 \xB7 +2",
"mesh.joined3": "\uBBFC\uC900 \uD569\uB958 \xB7 +3",
"ice.title": "\uB124\uD2B8\uC6CC\uD06C \uC124\uC815",
"ice.subtitle": "\uAE30\uAE30 \uC548\uC5D0\uC11C\uB9CC \uC124\uC815\uB429\uB2C8\uB2E4 - \uC0C1\uB300\uC5D0\uAC8C \uC804\uB2EC\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
"ice.intro": "SecureBit\uC740 \uAE30\uBCF8\uC801\uC73C\uB85C \uACF5\uAC1C STUN \uC11C\uBC84\uB85C P2P \uC5F0\uACB0\uC744 \uB9FA\uC2B5\uB2C8\uB2E4. \uC9C1\uC811 \uC6B4\uC601\uD558\uC2E0\uB2E4\uBA74 \uC790\uC2E0\uC758 STUN/TURN\uC744 \uC9C0\uC815\uD558\uC138\uC694.",
"ice.publicTitle": "\uACF5\uAC1C \uC11C\uBC84 (\uAE30\uBCF8\uAC12)",
"ice.publicDesc": "\uC124\uC815\uC774 \uD544\uC694 \uC5C6\uC2B5\uB2C8\uB2E4. \uB300\uBD80\uBD84\uC5D0\uAC8C \uCDA9\uBD84\uD569\uB2C8\uB2E4.",
"ice.customTitle": "\uB0B4 STUN/TURN \uC11C\uBC84",
"ice.customDesc": "\uCD5C\uB300 {max}\uAC1C\uAE4C\uC9C0.",
"ice.turnNote": "TURN \uB9B4\uB808\uC774\uB294 \uC591\uCABD\uC758 IP\uC640 \uD2B8\uB798\uD53D \uD750\uB984\uC740 \uBCFC \uC218 \uC788\uC9C0\uB9CC, \uC885\uB2E8 \uAC04 \uC554\uD638\uD654\uB41C \uBA54\uC2DC\uC9C0 \uB0B4\uC6A9\uC740 \uACB0\uCF54 \uBCFC \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uB418\uB3C4\uB85D ",
"ice.turnNoteTls": " (TLS)\uB97C \uC4F0\uC138\uC694.",
"ice.test": "\uC11C\uBC84 \uC2DC\uD5D8",
"ice.testing": "\uC2DC\uD5D8 \uC911\u2026",
"ice.relayTitle": "\uB9B4\uB808\uC774 \uC804\uC6A9 \uBAA8\uB4DC",
"ice.relayBadge": "\uCD5C\uB300 \uD504\uB77C\uC774\uBC84\uC2DC",
"ice.relayDesc": "\uBAA8\uB4E0 \uD2B8\uB798\uD53D\uC744 TURN\uC73C\uB85C \uBCF4\uB0B4 \uC0C1\uB300\uAC00 \uC5EC\uB7EC\uBD84\uC758 IP\uB97C \uACB0\uCF54 \uC54C \uC218 \uC5C6\uAC8C \uD569\uB2C8\uB2E4. TURN \uC11C\uBC84\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.",
"ice.relayWarning": "\uB9B4\uB808\uC774 \uC804\uC6A9 \uBAA8\uB4DC\uAC00 \uCF1C\uC838 \uC788\uC9C0\uB9CC TURN \uC11C\uBC84\uAC00 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uC5F0\uACB0\uC744 \uC2DC\uC791\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
"ice.persist": "\uC774 \uAE30\uAE30\uC5D0 \uC800\uC7A5",
"ice.persistDesc": "\uC774 \uBE0C\uB77C\uC6B0\uC800\uC5D0 \uC554\uD638\uD654\uB418\uC5B4 \uC800\uC7A5\uB429\uB2C8\uB2E4. \uAEBC\uB450\uBA74 \uC774\uBC88 \uC138\uC158\uC5D0\uB9CC \uC801\uC6A9\uB429\uB2C8\uB2E4.",
"ice.forget": "\uC800\uC7A5\uB41C \uC124\uC815 \uC9C0\uC6B0\uAE30",
"ice.cancel": "\uCDE8\uC18C",
"ice.apply": "\uC801\uC6A9",
"ice.errUnavailable": "\uC774 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C\uB294 WebRTC\uB97C \uC4F8 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
"ice.errInvalid": "\uC11C\uBC84 \uC124\uC815\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
"update.title": "\uC5C5\uB370\uC774\uD2B8\uAC00 \uC788\uC2B5\uB2C8\uB2E4",
"update.desc": "SecureBit\uC758 \uC0C8 \uBC84\uC804\uC774 \uD655\uC778\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
"update.currentVersion": "\uD604\uC7AC \uBC84\uC804",
"update.newVersion": "\uC0C8 \uBC84\uC804",
"update.now": "\uC9C0\uAE08 \uC5C5\uB370\uC774\uD2B8",
"update.later": "\uB098\uC911\uC5D0",
"update.unknown": "\uC5C6\uC74C",
"update.stepSaving": "\uB370\uC774\uD130\uB97C \uC800\uC7A5\uD558\uB294 \uC911\u2026",
"update.stepSwCaches": "Service Worker \uCE90\uC2DC\uB97C \uBE44\uC6B0\uB294 \uC911\u2026",
"update.stepSwUnregister": "Service Worker \uB4F1\uB85D\uC744 \uD574\uC81C\uD558\uB294 \uC911\u2026",
"update.stepBrowserCache": "\uBE0C\uB77C\uC6B0\uC800 \uCE90\uC2DC\uB97C \uBE44\uC6B0\uB294 \uC911\u2026",
"update.stepVersion": "\uBC84\uC804\uC744 \uAC31\uC2E0\uD558\uB294 \uC911\u2026",
"update.stepReload": "\uC571\uC744 \uB2E4\uC2DC \uBD88\uB7EC\uC624\uB294 \uC911\u2026",
"update.error": "\uC5C5\uB370\uC774\uD2B8 \uC624\uB958. \uD398\uC774\uC9C0\uB97C \uC9C1\uC811 \uC0C8\uB85C\uACE0\uCE68\uD558\uC138\uC694 (Ctrl+F5 \uB610\uB294 Cmd+Shift+R)",
"update.confirmSkip": "\uC0C8 \uBC84\uC804\uC774 \uC788\uC2B5\uB2C8\uB2E4. \uBCF4\uC548\uACFC \uC548\uC815\uC131\uC744 \uC704\uD574 \uC5C5\uB370\uC774\uD2B8\uB97C \uAD8C\uD569\uB2C8\uB2E4. \uC5C5\uB370\uC774\uD2B8 \uC5C6\uC774 \uACC4\uC18D\uD560\uAE4C\uC694?",
"offline.backOnline": "\uB2E4\uC2DC \uC5F0\uACB0\uB428",
"offline.mode": "\uC624\uD504\uB77C\uC778 \uBAA8\uB4DC",
"offline.dismiss": "\uB2EB\uAE30",
"offline.lostTitle": "\uC5F0\uACB0\uC774 \uB04A\uC5B4\uC84C\uC2B5\uB2C8\uB2E4",
"offline.lostDesc": "SecureBit\uC774 \uC624\uD504\uB77C\uC778 \uC0C1\uD0DC\uC785\uB2C8\uB2E4. \uC77C\uBD80 \uAE30\uB2A5\uC774 \uC81C\uD55C\uB418\uC9C0\uB9CC \uB370\uC774\uD130\uB294 \uC548\uC804\uD569\uB2C8\uB2E4.",
"offline.point1": "\uC138\uC158\uACFC \uD0A4\uB294 \uADF8\uB300\uB85C \uC720\uC9C0\uB429\uB2C8\uB2E4",
"offline.point2": "\uC11C\uBC84\uC5D0\uB294 \uC544\uBB34 \uB370\uC774\uD130\uB3C4 \uC800\uC7A5\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
"offline.point3": "\uB2E4\uC2DC \uC5F0\uACB0\uB418\uBA74 \uBA54\uC2DC\uC9C0\uC640 \uD30C\uC77C\uC774 \uB3D9\uAE30\uD654\uB429\uB2C8\uB2E4",
"offline.continue": "\uC624\uD504\uB77C\uC778\uC73C\uB85C \uACC4\uC18D",
"offline.restoredTitle": "\uB2E4\uC2DC \uC5F0\uACB0\uB418\uBA74",
"offline.restoredDesc": "\uC5F0\uACB0\uC774 \uB04A\uACA8\uB3C4 \uC783\uB294 \uAC83\uC740 \uC5C6\uC2B5\uB2C8\uB2E4. SecureBit\uC740 \uBAA8\uB4E0 \uAC83\uC744 \uAE30\uAE30 \uC548\uC5D0 \uB300\uAE30\uC2DC\uCF1C \uB450\uC5C8\uB2E4\uAC00, \uB2E4\uC2DC \uC628\uB77C\uC778\uC774 \uB418\uB294 \uC989\uC2DC \uC554\uD638\uD654\uB41C \uC138\uC158\uC744 \uC774\uC5B4\uAC11\uB2C8\uB2E4.",
"offline.r1Title": "\uBCF4\uB0B8 \uBA54\uC2DC\uC9C0\uB294 \uC804\uB2EC\uB429\uB2C8\uB2E4",
"offline.r1Desc": "\uC624\uD504\uB77C\uC778\uC77C \uB54C \uC4F4 \uB0B4\uC6A9\uC740 \uC790\uB3D9\uC73C\uB85C \uC0C1\uB300\uC5D0\uAC8C \uC804\uC1A1\uB429\uB2C8\uB2E4.",
"offline.r2Title": "\uD30C\uC77C \uC804\uC1A1\uC774 \uB9C8\uBB34\uB9AC\uB429\uB2C8\uB2E4",
"offline.r2Desc": "\uC804\uC1A1\uC740 \uBA48\uCD98 \uC9C0\uC810\uBD80\uD130 \uC774\uC5B4\uC9D1\uB2C8\uB2E4 - \uB2E4\uC2DC \uBCF4\uB0BC \uD544\uC694\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
"offline.r3Title": "\uC0C1\uB300\uC758 \uBA54\uC2DC\uC9C0\uC640 \uD30C\uC77C\uC774 \uB3C4\uCC29\uD569\uB2C8\uB2E4",
"offline.r3Desc": "\uB04A\uAE34 \uB3D9\uC548 \uC0C1\uB300\uAC00 \uBCF4\uB0B8 \uAC83\uB4E4\uC774 \uC21C\uC11C\uB300\uB85C \uB3C4\uCC29\uD569\uB2C8\uB2E4.",
"offline.r4Title": "\uC544\uBB34\uAC83\uB3C4 \uC0AC\uB77C\uC9C0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
"offline.r4Desc": "\uB2E4\uC2DC \uC5F0\uACB0\uB418\uC5B4\uB3C4 \uBE48\uD2C8\uC740 \uC5C6\uC2B5\uB2C8\uB2E4 - \uB300\uD654\uB294 \uBA48\uCD98 \uADF8 \uC790\uB9AC\uC5D0\uC11C \uC774\uC5B4\uC9D1\uB2C8\uB2E4.",
"offline.gotIt": "\uC54C\uACA0\uC2B5\uB2C8\uB2E4",
"qr.showTitle": "QR \uCF54\uB4DC \uBCF4\uC5EC\uC8FC\uAE30",
"qr.showSubtitle": "\uC804\uCCB4 \uD654\uBA74 \xB7 \uC0C1\uB300\uAC00 \uC2A4\uCE94\uD558\uB3C4\uB85D",
"qr.showSubtitleFrames": "\uC804\uCCB4 \uD654\uBA74 \xB7 \uC0C1\uB300\uAC00 {frames}\uAC1C \uD654\uBA74\uC744 \uBAA8\uB450 \uC2A4\uCE94\uD558\uB3C4\uB85D",
"notify.enabledBody": "\uC54C\uB9BC\uC774 \uCF1C\uC84C\uC2B5\uB2C8\uB2E4. \uC0C8 \uBA54\uC2DC\uC9C0\uAC00 \uC624\uBA74 \uC54C\uB824\uB4DC\uB9BD\uB2C8\uB2E4.",
"notify.workingBody": "\uC54C\uB9BC\uC774 \uC815\uC0C1 \uC791\uB3D9\uD569\uB2C8\uB2E4. \uC0C8 \uBA54\uC2DC\uC9C0\uAC00 \uC624\uBA74 \uC54C\uB824\uB4DC\uB9BD\uB2C8\uB2E4.",
"pw.label": "\uBE44\uBC00\uBC88\uD638 \uC785\uB825\uB780",
"pw.placeholder": "\uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD558\uC138\uC694\u2026",
"pw.decrypt": "\uBCF5\uD638\uD654",
"pw.cancel": "\uCDE8\uC18C",
"file.title": "\uD30C\uC77C \uC804\uC1A1",
"file.drop": "\uC5EC\uAE30\uC5D0 \uD30C\uC77C\uC744 \uB193\uC73C\uC138\uC694",
"file.dropHint": "\uBCF4\uB0B4\uAE30 \uC804\uC5D0 \uC885\uB2E8 \uAC04 \uC554\uD638\uD654 \xB7 \uCD5C\uB300 100MB",
"file.browse": "\uAE30\uAE30\uC5D0\uC11C \uCC3E\uAE30",
"file.incoming": "\uD30C\uC77C \uC694\uCCAD\uC774 \uC654\uC2B5\uB2C8\uB2E4",
"file.accept": "\uC218\uB77D",
"file.reject": "\uAC70\uC808",
"file.download": "\uB0B4\uB824\uBC1B\uAE30",
"file.notReady": "\uC5F0\uACB0\uC774 \uC544\uC9C1 \uC900\uBE44\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
"file.tooLarge": "\uD30C\uC77C\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4",
"file.typeNotAllowed": "\uD5C8\uC6A9\uB418\uC9C0 \uC54A\uB294 \uD30C\uC77C \uD615\uC2DD",
"file.maxConcurrent": "\uB3D9\uC2DC \uC804\uC1A1 \uD55C\uB3C4\uC5D0 \uB3C4\uB2EC\uD588\uC2B5\uB2C8\uB2E4",
"file.gone": "\uC774 \uD30C\uC77C\uC740 \uB354 \uC774\uC0C1 \uB0B4\uB824\uBC1B\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
"call.incoming": "\uAC78\uB824\uC628 \uC804\uD654",
"call.incomingVideo": "\uAC78\uB824\uC628 \uC601\uC0C1 \uD1B5\uD654",
"call.encrypted": "\uC554\uD638\uD654\uB41C \uD1B5\uD654",
"call.encryptedShort": "\uC554\uD638\uD654\uB428",
"call.peer": "\uBCF4\uC548 \uC0C1\uB300",
"call.connecting": "\uC5F0\uACB0 \uC911\u2026",
"call.ringing": "\uC2E0\uD638 \uAC00\uB294 \uC911\u2026",
"call.accept": "\uBC1B\uAE30",
"call.decline": "\uAC70\uC808",
"call.end": "\uD1B5\uD654 \uC885\uB8CC",
"call.camera": "\uCE74\uBA54\uB77C",
"call.cameraOff": "\uCE74\uBA54\uB77C \uAEBC\uC9D0",
"call.peerCameraOff": "\uC0C1\uB300\uC758 \uCE74\uBA54\uB77C\uAC00 \uAEBC\uC838 \uC788\uC2B5\uB2C8\uB2E4",
"call.flipCamera": "\uCE74\uBA54\uB77C \uC804\uD658",
"call.addVideo": "\uC601\uC0C1 \uCD94\uAC00",
"call.video": "\uC601\uC0C1",
"call.muted": "\uC74C\uC18C\uAC70\uB428",
"call.expand": "\uD06C\uAC8C",
"call.minimize": "\uC791\uAC8C",
"call.quality": "\uC5F0\uACB0 \uD488\uC9C8",
"call.qualityExcellent": "\uC544\uC8FC \uC88B\uC74C",
"call.videoPrefix": "\uC601\uC0C1 \xB7 ",
"call.voicePrefix": "\uC74C\uC131 \xB7 ",
"group.new": "\uC0C8 \uADF8\uB8F9",
"group.create": "\uADF8\uB8F9 \uB9CC\uB4E4\uAE30",
"group.join": "\uADF8\uB8F9 \uCC38\uC5EC",
"group.name": "\uADF8\uB8F9 \uC774\uB984",
"group.nameTooLong": "\uADF8\uB8F9 \uC774\uB984\uC774 \uB108\uBB34 \uAE41\uB2C8\uB2E4.",
"group.capacity": "\uCD5C\uB300 {max}\uBA85\uAE4C\uC9C0, \uAE30\uAE30\uC640 \uAE30\uAE30\uAC00 \uC9C1\uC811 \uC5F0\uACB0\uB429\uB2C8\uB2E4. \uADF8\uB8F9\uC774 \uC5F4\uB9AC\uAE30 \uC804\uC5D0 \uBAA8\uB450\uAC00 \uD558\uB098\uC758 \uC548\uC804 \uCF54\uB4DC\uB97C \uB300\uC870\uD569\uB2C8\uB2E4.",
"group.invite": "\uCD08\uB300",
"group.inviteMore": "\uAD6C\uC131\uC6D0 \uB354 \uCD08\uB300\uD558\uAE30",
"group.invitePeople": "{count}\uBA85 \uCD08\uB300",
"group.invitation": "\uADF8\uB8F9 \uCD08\uB300",
"group.addMembers": "\uAD6C\uC131\uC6D0 \uCD94\uAC00",
"group.roomFor": "{remaining}\uBA85 \uB354 \uB4E4\uC5B4\uC62C \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uADF8\uB4E4\uC774 \uD569\uB958\uD558\uBA74 \uBAA8\uB450\uAC00 \uC0C8 \uADF8\uB8F9 \uCF54\uB4DC\uB97C \uB300\uC870\uD569\uB2C8\uB2E4.",
"group.membersCount": "\uAD6C\uC131\uC6D0 {count}\uBA85",
"group.member": "\uAD6C\uC131\uC6D0",
"group.members": "\uAD6C\uC131\uC6D0",
"group.remove": "{name} \uB0B4\uBCF4\uB0B4\uAE30",
"group.message": "'{name}'\uC5D0 \uBA54\uC2DC\uC9C0 \uBCF4\uB0B4\uAE30",
"group.leave": "\uB098\uAC00\uAE30",
"group.leaveThis": "\uC774 \uADF8\uB8F9\uC5D0\uC11C \uB098\uAC00\uAE30",
"group.cancel": "\uADF8\uB8F9 \uCDE8\uC18C",
"group.close": "\uB2EB\uAE30",
"group.cancelBtn": "\uCDE8\uC18C",
"group.decline": "\uAC70\uC808",
"group.working": "\uCC98\uB9AC \uC911\u2026",
"group.sasTitle": "\uADF8\uB8F9 \uC548\uC804 \uCF54\uB4DC",
"group.sasEveryone": "\uBAA8\uB450\uC5D0\uAC8C \uAC19\uC740 \uCF54\uB4DC\uAC00 \uBCF4\uC785\uB2C8\uB2E4",
"group.sasCompare": "\uC774 \uADF8\uB8F9\uC744 \uC5F4\uB824\uBA74 \uBAA8\uB4E0 \uAD6C\uC131\uC6D0\uACFC \uADF8\uB8F9 \uCF54\uB4DC\uB97C \uB300\uC870\uD558\uC138\uC694.",
"group.sasReadAloud": "\uC774 \uC22B\uC790\uB4E4\uC744 \uC18C\uB9AC \uB0B4\uC5B4 \uC77D\uC5B4\uC8FC\uC138\uC694 - ",
"group.sasWarning": "\uD55C \uC0AC\uB78C\uC774\uB77C\uB3C4 \uB2E4\uB978 \uCF54\uB4DC\uB97C \uC77D\uB294\uB2E4\uBA74, \uB204\uAD70\uAC00 \uC0AC\uC774\uC5D0 \uB07C\uC5B4 \uC788\uB294 \uAC83\uC785\uB2C8\uB2E4. \uADF8\uB8F9\uC744 \uCDE8\uC18C\uD558\uC138\uC694 - \uD655\uC778\uD558\uC9C0 \uB9C8\uC138\uC694.",
"group.confirmFirst": "\uBA3C\uC800 \uADF8\uB8F9 \uCF54\uB4DC\uB97C \uD655\uC778\uD558\uC138\uC694",
"group.codeSuffix": " \xB7 \uCF54\uB4DC {code}",
"group.exchangingNonces": "\uC77C\uD68C\uC6A9 \uAC12\uC744 \uC8FC\uACE0\uBC1B\uB294 \uC911\u2026",
"group.waitingCommit": "\uBAA8\uB4E0 \uAD6C\uC131\uC6D0\uC758 \uD655\uC57D\uC744 \uAE30\uB2E4\uB9AC\uB294 \uC911\u2026",
"group.waitingJoin": "\uB2E4\uB978 \uAD6C\uC131\uC6D0\uC758 \uD569\uB958\uB97C \uAE30\uB2E4\uB9AC\uB294 \uC911\u2026",
"group.emptyChat": "\uC544\uC9C1 \uC544\uBB34\uAC83\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4. \uBAA8\uB4E0 \uBA54\uC2DC\uC9C0\uB294 \uBCF4\uB0B8 \uC0AC\uB78C\uC774 \uC11C\uBA85\uD558\uBA70, \uAD6C\uC131\uC6D0 \uAC01\uC790\uC758 \uC554\uD638\uD654\uB41C \uD68C\uC120\uC744 \uD1B5\uD574 \uC624\uAC11\uB2C8\uB2E4.",
"group.noVerified": "\uC544\uC9C1 \uD655\uC778\uB41C \uB300\uD654\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uBA3C\uC800 1:1 \uB300\uD654\uB97C \uC5F4\uC5B4 \uC548\uC804 \uCF54\uB4DC\uB97C \uB300\uC870\uD558\uC138\uC694 - \uADF8\uB8F9\uC740 \uC774\uBBF8 \uD655\uC778\uD55C \uC5F0\uACB0\uB85C \uB9CC\uB4E4\uC5B4\uC9D1\uB2C8\uB2E4.",
"group.noMoreToAdd": "\uCD94\uAC00\uD560 \uB2E4\uB978 \uD655\uC778\uB41C \uB300\uD654\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. 1:1 \uB300\uD654\uB97C \uC5F4\uC5B4 \uBA3C\uC800 \uC548\uC804 \uCF54\uB4DC\uB97C \uB300\uC870\uD558\uC138\uC694.",
"group.directLink": "\uAE30\uAE30 \uAC04 \uC9C1\uC811 \uC5F0\uACB0",
"group.noDirectLink": "\uC544\uC9C1 \uC9C1\uC811 \uC5F0\uACB0\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 - \uC5F0\uACB0\uC774 \uB9CC\uB4E4\uC5B4\uC9C0\uB294 \uB3D9\uC548 \uBA54\uC2DC\uC9C0\uB294 \uB2E4\uB978 \uAD6C\uC131\uC6D0\uC744 \uAC70\uCE69\uB2C8\uB2E4",
"group.relayNote": "\uC77C\uBD80 \uAD6C\uC131\uC6D0\uACFC\uB294 \uC544\uC9C1 \uC9C1\uC811 \uC5F0\uACB0\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uADF8\uB4E4\uC758 \uBA54\uC2DC\uC9C0\uB294 \uB2E4\uB978 \uAD6C\uC131\uC6D0\uC744 \uAC70\uCCD0 \uC624\uAC00\uB294\uB370, \uADF8 \uC0AC\uB78C\uC740 \uB300\uD654\uAC00 \uC624\uAC04\uB2E4\uB294 \uC0AC\uC2E4\uC740 \uC54C \uC218 \uC788\uC9C0\uB9CC \uC11C\uBA85 \uB108\uBA38\uC758 \uB0B4\uC6A9\uC744 \uC77D\uAC70\uB098 \uBC14\uAFC0 \uC218\uB294 \uC5C6\uC2B5\uB2C8\uB2E4. \uADF8\uB8F9\uC740 \uACC4\uC18D\uD574\uC11C \uC9C1\uC811 \uC5F0\uACB0\uC744 \uC2DC\uB3C4\uD569\uB2C8\uB2E4.",
"group.relayOnlyOff": "\uB9B4\uB808\uC774 \uC804\uC6A9 \uBAA8\uB4DC\uAC00 \uAEBC\uC838 \uC788\uC5B4, \uBAA8\uB4E0 \uAD6C\uC131\uC6D0\uC774 \uC5EC\uB7EC\uBD84\uC5D0\uAC8C \uC9C1\uC811 \uC5F0\uACB0\uB418\uBA70 IP \uC8FC\uC18C\uB97C \uC54C\uAC8C \uB429\uB2C8\uB2E4 - \uB2E4\uB978 \uC0AC\uB78C\uC774 \uCD08\uB300\uD55C \uAD6C\uC131\uC6D0\uB3C4 \uB9C8\uCC2C\uAC00\uC9C0\uC785\uB2C8\uB2E4. \uADF8\uAC83\uC774 \uC911\uC694\uD558\uB2E4\uBA74 \uB124\uD2B8\uC6CC\uD06C \uC124\uC815\uC5D0\uC11C \uCF1C\uC138\uC694.",
"group.memberOffline": "{name}\uB2D8\uC740 \uC624\uD504\uB77C\uC778\uC774\uB77C \uBA54\uC2DC\uC9C0\uB97C \uBC1B\uC9C0 \uBABB\uD569\uB2C8\uB2E4. \uC5EC\uC804\uD788 \uAD6C\uC131\uC6D0\uC774\uBA70, \uB0B4\uBCF4\uB0B4\uBA74 \uADF8\uB8F9 \uD0A4\uAC00 \uC0C8\uB85C \uB9CC\uB4E4\uC5B4\uC9D1\uB2C8\uB2E4.",
"group.joinNote": "\uB2E4\uB978 \uAD6C\uC131\uC6D0\uB4E4\uC774 \uC5EC\uB7EC\uBD84\uC774 \uC774 \uADF8\uB8F9\uC5D0 \uC788\uB2E4\uB294 \uAC83\uC744 \uC54C\uAC8C \uB429\uB2C8\uB2E4. \uB530\uB77C\uC7A1\uC744 \uB300\uD654 \uAE30\uB85D\uC740 \uC5C6\uC2B5\uB2C8\uB2E4 - \uADF8\uB8F9\uC740 \uBE44\uC5B4 \uC788\uB294 \uC0C1\uD0DC\uB85C \uC2DC\uC791\uD569\uB2C8\uB2E4.",
"group.inviteSentNote": "\uC0C1\uB300\uAC00 \uC218\uB77D\uD560 \uB54C\uAE4C\uC9C0 \uADF8\uB8F9\uC740 \uADF8\uB300\uB85C \uB3D9\uC791\uD569\uB2C8\uB2E4. \uADF8\uB4E4\uC774 \uB530\uB77C\uC7A1\uC744 \uAE30\uB85D\uC740 \uC5C6\uACE0, \uC9C0\uAE08\uBD80\uD130 \uBCF4\uB0B4\uB294 \uAC83\uB9CC \uBCF4\uAC8C \uB429\uB2C8\uB2E4.",
"group.errNotCreated": "\uADF8\uB8F9\uC774 \uB9CC\uB4E4\uC5B4\uC9C0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
"group.errNobodyAccepted": "\uC81C\uB54C \uCD08\uB300\uB97C \uC218\uB77D\uD55C \uC0AC\uB78C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
"group.errNothingSent": "\uC544\uBB34\uAC83\uB3C4 \uC804\uC1A1\uB418\uAC70\uB098 \uD655\uC778\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uC774 \uCC3D\uC744 \uB2EB\uACE0 \uBAA8\uB450\uAC00 \uC5F0\uACB0\uB41C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.",
"group.errNotFormed": "\uC774 \uADF8\uB8F9\uC744 \uB9CC\uB4E4 \uC218 \uC5C6\uC5C8\uC2B5\uB2C8\uB2E4.",
"group.errFull": "\uC774 \uADF8\uB8F9\uC740 \uAC00\uB4DD \uCC3C\uC2B5\uB2C8\uB2E4.",
"group.errInviteFailed": "\uCD08\uB300\uB97C \uBCF4\uB0B4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 - \uADF8 \uB300\uD654\uB294 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
"group.errNoMemberList": "\uADF8\uB8F9\uC744 \uB9CC\uB4E0 \uC0AC\uB78C\uC774 \uAD6C\uC131\uC6D0 \uBA85\uB2E8\uC744 \uB05D\uB0B4 \uBCF4\uB0B4\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
"group.errUnsignedList": "\uAD6C\uC131\uC6D0 \uBA85\uB2E8\uC5D0 \uADF8\uB8F9\uC744 \uB9CC\uB4E0 \uC0AC\uB78C\uC758 \uC11C\uBA85\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC9C0 \uB9D0\uACE0 - \uADF8 \uC0AC\uB78C\uC5D0\uAC8C \uC54C\uB9AC\uC138\uC694.",
"group.errNotOwner": "\uADF8\uB8F9 \uC18C\uC720\uC790\uAC00 \uC544\uB2CC \uB204\uAD70\uAC00\uAC00 \uAD6C\uC131\uC6D0\uC744 \uBC14\uAFB8\uB824 \uD588\uC2B5\uB2C8\uB2E4.",
"hdr.tagline": "\uC885\uB2E8 \uAC04 \uC554\uD638\uD654",
"hdr.netSettings": "\uACE0\uAE09 \uB124\uD2B8\uC6CC\uD06C \uC124\uC815",
"hdr.netSettingsTitle": "\uACE0\uAE09 \uB124\uD2B8\uC6CC\uD06C \uC124\uC815 (STUN/TURN)",
"hdr.disconnect": "\uC5F0\uACB0 \uB04A\uAE30",
"status.connected": "\uC5F0\uACB0\uB428",
"status.connecting": "\uC5F0\uACB0 \uC911\u2026",
"status.notConnected": "\uC5F0\uACB0\uB418\uC9C0 \uC54A\uC74C",
"status.reconnecting": "\uB2E4\uC2DC \uC5F0\uACB0 \uC911\u2026",
"status.retrying": "\uB2E4\uC2DC \uC2DC\uB3C4 \uC911\u2026",
"status.verifying": "\uD655\uC778 \uC911\u2026",
"status.peerDisconnected": "\uC0C1\uB300\uAC00 \uC5F0\uACB0\uC744 \uB04A\uC5C8\uC2B5\uB2C8\uB2E4",
"sec.replayProtection": "\uC7AC\uC804\uC1A1 \uACF5\uACA9 \uBC29\uC5B4",
"sec.messageIntegrity": "\uBA54\uC2DC\uC9C0 \uBB34\uACB0\uC131 (HMAC)",
"sec.forwardSecrecy": "\uC644\uC804 \uC21C\uBC29\uD5A5 \uBE44\uBC00\uC131",
"sec.metadataProtection": "\uBA54\uD0C0\uB370\uC774\uD130 \uBCF4\uD638",
"sec.trafficObfuscation": "\uD2B8\uB798\uD53D \uB09C\uB3C5\uD654",
"sec.realTests": "\uC2E4\uC81C \uC554\uD638\uD559 \uAC80\uC0AC",
"sec.simulatedData": "\uBAA8\uC758 \uB370\uC774\uD130",
"sec.testPassed": "\uAC80\uC0AC \uD1B5\uACFC",
"sec.testFailed": "\uAC80\uC0AC \uC2E4\uD328 \uB610\uB294 \uC0AC\uC6A9 \uBD88\uAC00",
"sec.verificationDone": "\uC2E4\uC81C \uC554\uD638\uD559 \uAC80\uC99D\uC774 \uB05D\uB0AC\uC2B5\uB2C8\uB2E4",
"sec.verificationInProgress": "\uBCF4\uC548 \uAC80\uC99D \uC9C4\uD589 \uC911\u2026",
"sec.verificationWait": "\uBCF4\uC548 \uAC80\uC99D \uC9C4\uD589 \uC911\u2026\n\uC2E4\uC2DC\uAC04 \uC554\uD638\uD559 \uAC80\uC99D\uC774 \uB05D\uB0A0 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB824 \uC8FC\uC138\uC694.",
"sec.verificationUnavailable": "\uBCF4\uC548 \uAC80\uC99D\uC744 \uC4F8 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
"chat.placeholder": "\uC554\uD638\uD654\uB41C \uBA54\uC2DC\uC9C0\uB97C \uC4F0\uC138\uC694\u2026",
"chat.send": "\uBA54\uC2DC\uC9C0 \uBCF4\uB0B4\uAE30",
"chat.sendFiles": "\uD30C\uC77C \uBCF4\uB0B4\uAE30",
"chat.hideFiles": "\uD30C\uC77C \uC228\uAE30\uAE30",
"chat.recordVoice": "\uC74C\uC131 \uBA54\uC2DC\uC9C0 \uB179\uC74C",
"chat.sendVoice": "\uC74C\uC131 \uBA54\uC2DC\uC9C0 \uBCF4\uB0B4\uAE30",
"chat.discard": "\uCDE8\uC18C",
"chat.codeBlock": "\uCF54\uB4DC \uBE14\uB85D\uC73C\uB85C \uBCF4\uB0B4\uAE30 (\uC785\uB825\uCC3D\uC774 \uB113\uC5B4\uC9D1\uB2C8\uB2E4)",
"chat.codeHint": "\uCF54\uB4DC \uC870\uAC01 \xB7 \uC11C\uC2DD \uC720\uC9C0 \xB7 \u2318\u21B5 \uB85C \uC804\uC1A1",
"chat.viewOnce": "\uD55C \uBC88\uB9CC \uBCF4\uAE30",
"chat.viewOnceTitle": "\uD55C \uBC88\uB9CC \uBCF4\uAE30 - \uC0C1\uB300\uAC00 \uC77D\uC73C\uBA74 \uC0AC\uB77C\uC9D1\uB2C8\uB2E4",
"chat.viewOncePrefix": "\uD55C \uBC88\uB9CC \uBCF4\uAE30 \xB7 ",
"chat.viewOnceTap": "\uD55C \uBC88\uB9CC \uBCF4\uAE30 \xB7 \uB20C\uB7EC\uC11C \uD655\uC778",
"chat.viewedOnce": "\uC774\uBBF8 \uD655\uC778\uD568",
"chat.disappearing": "\uC0AC\uB77C\uC9C0\uB294 \uBA54\uC2DC\uC9C0 - \uC591\uCABD\uC5D0\uC11C \uC0AD\uC81C\uB429\uB2C8\uB2E4",
"chat.disappearAfter": "\uC0AC\uB77C\uC9C0\uAE30\uAE4C\uC9C0",
"chat.visibleFor": "\uD45C\uC2DC \uC2DC\uAC04",
"chat.timerPrefix": "\uD0C0\uC774\uBA38 \xB7 ",
"chat.expired": "\uC774 \uBA54\uC2DC\uC9C0\uB294 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
"chat.deleteForEveryone": "\uBAA8\uB450\uC5D0\uAC8C\uC11C \uC0AD\uC81C",
"chat.sending": "\uBCF4\uB0B4\uB294 \uC911",
"chat.delivered": "\uC804\uB2EC\uB428",
"chat.notSent": "\uBCF4\uB0B4\uC9C0 \uBABB\uD568",
"chat.notSentReason": "\uBCF4\uB0B4\uC9C0 \uBABB\uD568 - \uBCF4\uC548 \uCC44\uB110\uC774 \uC544\uC9C1 \uC900\uBE44\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC5F0\uACB0\uD55C \uB4A4 \uACC4\uC18D\uD558\uC138\uC694.",
"chat.encrypted": "\uC554\uD638\uD654\uB428",
"chat.decrypted": "\uBCF5\uD638\uD654\uB428",
"chat.encryptedOnDevice": "\uAE30\uAE30\uC5D0\uC11C \uC554\uD638\uD654\uB428",
"chat.uploading": "\uC62C\uB9AC\uB294 \uC911",
"chat.downloading": "\uB0B4\uB824\uBC1B\uB294 \uC911",
"chat.transferring": "\uC804\uC1A1 \uC911\u2026",
"chat.copied": "\uBCF5\uC0AC\uD588\uC2B5\uB2C8\uB2E4",
"chat.collapse": "\uC811\uAE30",
"chat.closeMenu": "\uBA54\uB274 \uB2EB\uAE30",
"chat.newChat": "\uC0C8 \uB300\uD654",
"chat.newGroup": "\uC0C8 \uADF8\uB8F9",
"chat.createGroup": "\uADF8\uB8F9 \uB9CC\uB4E4\uAE30",
"chat.groupChats": "\uADF8\uB8F9 \uB300\uD654",
"chat.secureChat": "\uC548\uC804\uD55C \uB300\uD654",
"chat.nameThis": "\uC774 \uB300\uD654\uC5D0 \uC774\uB984 \uBD99\uC774\uAE30",
"chat.rename": "\uB300\uD654 \uC774\uB984 \uBC14\uAFB8\uAE30 (\uAE30\uAE30 \uC548\uC5D0\uC11C\uB9CC)",
"chat.renameHint": "\uB450 \uBC88 \uB20C\uB7EC \uC774\uB984 \uBC14\uAFB8\uAE30",
"chat.localLabel": "\uAE30\uAE30 \uC548 \uC774\uB984 \xB7 \uC774 \uAE30\uAE30\uC5D0\uB9CC \uC800\uC7A5\uB429\uB2C8\uB2E4",
"chat.setStatus": "\uC0C1\uD0DC \uC124\uC815",
"chat.yourStatusPrefix": "\uB0B4 \uC0C1\uD0DC - ",
"chat.meshHint": "\uCD5C\uB300 8\uBA85 \xB7 P2P \uBA54\uC2DC",
"chat.offline": "\uC624\uD504\uB77C\uC778",
"chat.noNetwork": "\uB124\uD2B8\uC6CC\uD06C \uC5C6\uC74C \xB7 \uC7AC\uC5F0\uACB0 \uC911",
"chat.startVoiceCall": "\uC554\uD638\uD654 \uC74C\uC131 \uD1B5\uD654 \uAC78\uAE30",
"chat.startVideoCall": "\uC554\uD638\uD654 \uC601\uC0C1 \uD1B5\uD654 \uAC78\uAE30",
"chat.verifyForCalls": "\uD1B5\uD654\uB97C \uC4F0\uB824\uBA74 \uBA3C\uC800 \uC138\uC158\uC744 \uD655\uC778\uD558\uC138\uC694",
"chat.e2eeNote": "\uBAA8\uB4E0 \uBA54\uC2DC\uC9C0\uB294 \uAE30\uAE30\uB97C \uB5A0\uB098\uAE30 \uC804\uC5D0 \uC885\uB2E8 \uAC04 \uC554\uD638\uD654\uB429\uB2C8\uB2E4.",
"chat.peersOnly": "\uC5F0\uACB0\uB41C \uC0C1\uB300\uC5D0\uAC8C\uB9CC \uC885\uB2E8 \uAC04\uC73C\uB85C \uC804\uC1A1\uB418\uBA70 - \uC11C\uBC84\uC5D0 \uC800\uC7A5\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
"flow.invitationCreated": "\uC548\uC804\uD55C \uCD08\uB300\uB97C \uB9CC\uB4E4\uC5C8\uC2B5\uB2C8\uB2E4",
"flow.invitationCreatedBang": "\uC548\uC804\uD55C \uCD08\uB300\uB97C \uB9CC\uB4E4\uACE0 \uC554\uD638\uD654\uD588\uC2B5\uB2C8\uB2E4.",
"flow.responseCreated": "\uC548\uC804\uD55C \uC751\uB2F5\uC744 \uB9CC\uB4E4\uC5C8\uC2B5\uB2C8\uB2E4",
"flow.responseCreatedBang": "\uC548\uC804\uD55C \uC751\uB2F5\uC744 \uB9CC\uB4E4\uC5C8\uC2B5\uB2C8\uB2E4.",
"flow.sendInvitation": "\uC548\uC804\uD55C \uACBD\uB85C(\uD1B5\uD654, \uBB38\uC790 \uB4F1)\uB85C \uCD08\uB300 \uCF54\uB4DC\uB97C \uC0C1\uB300\uC5D0\uAC8C \uBCF4\uB0B4\uC138\uC694.",
"flow.sendResponse": "\uC548\uC804\uD55C \uACBD\uB85C\uB85C \uC751\uB2F5 \uCF54\uB4DC\uB97C \uCC98\uC74C \uC5F0 \uC0AC\uB78C\uC5D0\uAC8C \uBCF4\uB0B4\uAC70\uB098, \uC544\uB798 QR\uC744 \uC2A4\uCE94\uD558\uAC8C \uD558\uC138\uC694.",
"flow.sendEncryptedCode": "\uC554\uD638\uD654\uB41C \uCF54\uB4DC \uBCF4\uB0B4\uAE30",
"flow.sendTheResponse": "\uC751\uB2F5 \uBCF4\uB0B4\uAE30",
"flow.pasteOrWrite": "\uCF54\uB4DC\uB97C \uBD99\uC5EC\uB123\uAC70\uB098 \uC785\uB825\uD558\uC138\uC694\u2026",
"flow.processingInvitation": "\uC548\uC804\uD55C \uCD08\uB300\uB97C \uCC98\uB9AC\uD558\uB294 \uC911\u2026",
"flow.processingResponse": "\uC548\uC804\uD55C \uC751\uB2F5\uC744 \uCC98\uB9AC\uD558\uB294 \uC911\u2026",
"flow.finalizing": "\uC548\uC804\uD55C \uC5F0\uACB0\uC744 \uB9C8\uBB34\uB9AC\uD558\uB294 \uC911\u2026",
"flow.channelEstablished": "\uC548\uC804\uD55C \uCC44\uB110\uC774 \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4",
"flow.channelReady": "\uC548\uC804\uD55C \uCC44\uB110\uC774 \uC900\uBE44\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
"flow.restoring": "\uC5F0\uACB0\uC744 \uB418\uC0B4\uB9AC\uB294 \uC911\u2026",
"flow.invitationCaptured": "\uCD08\uB300\uB97C \uC77D\uC5C8\uC2B5\uB2C8\uB2E4.",
"err.needInvitation": "\uC0C1\uB300\uAC00 \uC900 \uCD08\uB300 \uCF54\uB4DC\uB97C \uBD99\uC5EC\uB123\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
"err.needResponse": "\uC0C1\uB300\uAC00 \uC900 \uC751\uB2F5 \uCF54\uB4DC\uB97C \uBD99\uC5EC\uB123\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
"err.responseFormat": "\uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 - \uCF54\uB4DC\uB97C \uD655\uC778\uD558\uC138\uC694",
"err.responseNoKey": "\uC751\uB2F5 \uCF54\uB4DC\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 - \uC554\uD638 \uD0A4\uAC00 \uC5C6\uAC70\uB098 \uC190\uC0C1\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uCF54\uB4DC\uB97C \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.",
"err.responseNoSignKey": "\uC751\uB2F5 \uCF54\uB4DC\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 - \uC11C\uBA85 \uD655\uC778 \uD0A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uCF54\uB4DC\uB97C \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.",
"err.responseOutdated": "\uC751\uB2F5 \uB370\uC774\uD130\uAC00 \uC624\uB798\uB418\uC5C8\uC2B5\uB2C8\uB2E4 - \uC0C8 \uCD08\uB300\uB97C \uC0AC\uC6A9\uD558\uC138\uC694",
"err.setupError": "\uC5F0\uACB0\uC744 \uB9FA\uB294 \uC911 \uC624\uB958\uAC00 \uB0AC\uC2B5\uB2C8\uB2E4",
"err.notReady": "\uC5F0\uACB0\uC774 \uC544\uC9C1 \uC900\uBE44\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
"err.securityBreach": "\uBCF4\uC548 \uCE68\uD574\uAC00 \uAC10\uC9C0\uB418\uC5B4 \uC5F0\uACB0\uC744 \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4",
"err.securityValidation": "\uBCF4\uC548 \uAC80\uC99D\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 - \uACF5\uACA9\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4",
"err.retiredQr": "\uC774 QR\uC740 \uB354 \uC774\uC0C1 \uC4F0\uC9C0 \uC54A\uB294 \uD615\uC2DD\uC774\uB77C \uCD08\uB300\uB97C \uC804\uB2EC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC0C1\uB300\uC5D0\uAC8C \uC0C8\uB85C \uB9CC\uB4E4\uC5B4 \uB2EC\uB77C\uACE0 \uD558\uAC70\uB098 \uBCF5\uC0AC\xB7\uBD99\uC5EC\uB123\uAE30\uB97C \uC4F0\uC138\uC694.",
"err.compressedQrNote": "\uC555\uCD95\uB41C QR\uC740 \uAC04\uACB0\uD568\uC744 \uC704\uD574 SDP\uB97C \uC0DD\uB7B5\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC5F0\uACB0\uC5D0 \uC2E4\uD328\uD558\uBA74 \uBCF5\uC0AC\xB7\uBD99\uC5EC\uB123\uAE30\uB97C \uC4F0\uC138\uC694.",
"err.inviteNotConnected": "\uCD08\uB300\uB97C \uBCF4\uB0B4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uADF8 \uB300\uD654\uB294 \uC9C0\uAE08 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
"err.inviteNotConnectedRetry": "\uCD08\uB300\uB97C \uBCF4\uB0B4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uADF8 \uB300\uD654\uB294 \uC9C0\uAE08 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 - \uB2E4\uC2DC \uC5F4\uACE0 \uC2DC\uB3C4\uD558\uC138\uC694.",
"err.nobodyAccepted": "\uC544\uBB34\uB3C4 \uCD08\uB300\uB97C \uC218\uB77D\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uADF8\uB8F9\uC740 \uADF8\uB300\uB85C\uC785\uB2C8\uB2E4.",
"err.noAudio": "\uC18C\uB9AC\uAC00 \uB179\uC74C\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4 - \uB9C8\uC774\uD06C \uAD8C\uD55C\uC744 \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.",
"err.voiceNeedsConnection": "\uC74C\uC131 \uBA54\uC2DC\uC9C0\uB97C \uBCF4\uB0B4\uB824\uBA74 \uD65C\uC131\uD654\uB41C \uC548\uC804\uD55C \uC5F0\uACB0\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. \uB2E4\uC2DC \uC5F0\uACB0\uD55C \uB4A4 \uC2DC\uB3C4\uD558\uC138\uC694.",
"err.voiceRestoring": "\uC5F0\uACB0\uC744 \uB418\uC0B4\uB9AC\uB294 \uC911\uC785\uB2C8\uB2E4 - \uC7A0\uC2DC \uB4A4\uC5D0 \uC74C\uC131 \uBA54\uC2DC\uC9C0\uB97C \uB2E4\uC2DC \uBCF4\uB0B4\uBCF4\uC138\uC694.",
"err.fileTooLarge": "\uD30C\uC77C\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4",
"sas.safetyNumber": "\uC548\uC804 \uBC88\uD638",
"sas.incorrect": "\uCF54\uB4DC\uAC00 \uB9DE\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC0C1\uB300\uC640 \uB300\uC870\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.",
"sas.noMatch": "\uCF54\uB4DC\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
"sas.makeSure": "\uB450 \uCF54\uB4DC\uAC00 \uC815\uD655\uD788 \uAC19\uC740\uC9C0 \uD655\uC778\uD558\uC138\uC694.",
"sas.tooManyAttempts": "\uC798\uBABB\uB41C \uC2DC\uB3C4\uAC00 \uB108\uBB34 \uB9CE\uC2B5\uB2C8\uB2E4. \uC548\uC804\uC744 \uC704\uD574 \uC138\uC158\uC744 \uCD08\uAE30\uD654\uD588\uC2B5\uB2C8\uB2E4.",
"sas.verificationFailed": "\uD655\uC778 \uC2E4\uD328",
"sas.verified": "\uD655\uC778\uB428 \xB7 \uC644\uC804 \uC21C\uBC29\uD5A5 \uBE44\uBC00\uC131",
"sas.runVerification": "\uBCF4\uC548 \uAC80\uC99D \uC2E4\uD589",
"sec.panelTitle": "\uB124\uD2B8\uC6CC\uD06C\uC640 \uC554\uD638\uD559 \uC0C1\uC138",
"sec.security": "\uBCF4\uC548",
"sec.transport": "\uC804\uC1A1",
"sec.keyExchange": "\uD0A4 \uAD50\uD658",
"sec.allEnabled": "\uBAA8\uB4E0 \uBCF4\uC548 \uAE30\uB2A5\uC774 \uAE30\uBCF8\uC73C\uB85C \uCF1C\uC838 \uC788\uC2B5\uB2C8\uB2E4",
"sec.realTimeNote": "\uC2E4\uC81C \uC554\uD638\uD559 \uD568\uC218\uB85C \uC2E4\uC2DC\uAC04 \uAC80\uC99D\uD569\uB2C8\uB2E4 - \uAFB8\uBA70\uB0B8 \uB370\uC774\uD130\uB294 \uC5C6\uC2B5\uB2C8\uB2E4.",
"sec.simulatedWarning": "\uC8FC\uC758: \uC5F0\uACB0\uC774 \uC544\uC9C1 \uC644\uC804\uD788 \uB9FA\uC5B4\uC9C0\uC9C0 \uC54A\uC558\uC744 \uC218 \uC788\uC5B4 - \uAC12\uC774 \uBAA8\uC758\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
"dl.title": "SecureBit \uB0B4\uB824\uBC1B\uAE30",
"dl.free": "\uBB34\uB8CC \xB7 \uACF5\uAC1C \uC18C\uC2A4",
"dl.soon": "\uBAA8\uBC14\uC77C \uC571(iOS, Android)\uACFC \uBE0C\uB77C\uC6B0\uC800 \uD655\uC7A5(Chrome, Firefox, Opera)\uC774 \uACE7 \uB098\uC635\uB2C8\uB2E4.",
"chatHdr.chat": "\uB300\uD654",
"chatHdr.chats": "\uB300\uD654",
"chatHdr.newChat": "+ \uC0C8\uB85C",
"chatHdr.secure": "\uBCF4\uC548",
"chatHdr.p2pSub": "P2P \xB7 \uC885\uB2E8 \uAC04 \uC554\uD638\uD654",
"chatHdr.save": "\uC800\uC7A5",
"chatHdr.close": "\uB2EB\uAE30",
"chatHdr.expand": "\uB113\uAC8C \uBCF4\uAE30",
"chatHdr.you": "\uB098",
"chatHdr.qrCode": "QR \uCF54\uB4DC",
"chat.disconnected": "\uC5F0\uACB0 \uB04A\uAE40",
"call.mute": "\uC74C\uC18C\uAC70",
"call.endShort": "\uC885\uB8CC",
"group.add": "\uCD94\uAC00",
"group.send": "\uBCF4\uB0B4\uAE30",
"sec.pfsShort": "\uC644\uC804 \uC21C\uBC29\uD5A5 \uBE44\uBC00\uC131",
"sec.cipher": "\uC554\uD638",
"chat.close": "\uB2EB\uAE30",
"file.needConnection": "\uD30C\uC77C \uC804\uC1A1\uC5D0\uB294 \uC5F0\uACB0\uC774 \uD544\uC694\uD569\uB2C8\uB2E4",
"presence.available": "\uB300\uD654 \uAC00\uB2A5",
"presence.away": "\uC790\uB9AC \uBE44\uC6C0",
"presence.busy": "\uBC14\uC068",
"presence.offline": "\uC624\uD504\uB77C\uC778",
"presence.invisible": "\uC228\uAE40",
"presence.availableDesc": "\uC628\uB77C\uC778\uC774\uBA70 \uC5F0\uB77D \uAC00\uB2A5",
"presence.awayDesc": "\uC790\uB9AC \uBE44\uC6C0 \xB7 \uC7A0\uC2DC \uB098\uAC10",
"presence.busyDesc": "\uBC29\uD574 \uAE08\uC9C0",
"presence.invisibleDesc": "\uB2E4\uB978 \uC0AC\uB78C\uC5D0\uAC8C \uC624\uD504\uB77C\uC778\uC73C\uB85C \uBCF4\uC774\uAE30",
"presence.online": "\uC628\uB77C\uC778",
"conn.p2p": "P2P \xB7 \uC5F0\uACB0\uB428",
"conn.verifying": "\uD655\uC778 \uC911\u2026",
"conn.connecting": "\uC5F0\uACB0 \uC911\u2026",
"conn.reconnecting": "\uB2E4\uC2DC \uC5F0\uACB0 \uC911\u2026",
"conn.peerDisconnected": "\uC0C1\uB300\uAC00 \uC5F0\uACB0\uC744 \uB04A\uC5C8\uC2B5\uB2C8\uB2E4",
"conn.disconnected": "\uC5F0\uACB0 \uB04A\uAE40",
"chat.defaultLabel": "\uB300\uD654",
"groupPhase.forming": "\uAD6C\uC131\uD558\uB294 \uC911\u2026",
"groupPhase.commitments": "\uD655\uC57D\uC744 \uC8FC\uACE0\uBC1B\uB294 \uC911\u2026",
"groupPhase.revealing": "\uACF5\uAC1C\uD558\uB294 \uC911\u2026",
"groupPhase.compare": "\uADF8\uB8F9 \uCF54\uB4DC\uB97C \uB300\uC870\uD558\uC138\uC694",
"groupPhase.ready": "\uADF8\uB8F9 \uC900\uBE44 \uC644\uB8CC",
"groupPhase.failed": "\uADF8\uB8F9\uC774 \uB9CC\uB4E4\uC5B4\uC9C0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
"call.qualityGood": "\uC88B\uC74C",
"call.qualityFair": "\uBCF4\uD1B5",
"call.qualityWeak": "\uC57D\uD568",
"msg.code": "\uCF54\uB4DC",
"msg.timer": "\uD0C0\uC774\uBA38",
"msg.voice": "\uC74C\uC131",
"msg.play": "\uC7AC\uC0DD",
"msg.sent": "\uBCF4\uB0C4",
"msg.read": "\uC77D\uC74C",
"report.title": "\uC2E4\uC2DC\uAC04 \uBCF4\uC548 \uAC80\uC99D",
"report.active": "\uB3D9\uC791 \uC911",
"report.testsPassed": "\uD1B5\uACFC\uD55C \uAC80\uC0AC",
"report.verifiedAt": "\uAC80\uC99D \uC2DC\uAC01",
"report.source": "\uCD9C\uCC98",
"secTest.verifyECDHKeyExchange": "ECDH \uD0A4 \uAD50\uD658",
"secTest.verifyECDSASignatures": "ECDSA \uC804\uC790 \uC11C\uBA85",
"secTest.verifyEncryption": "AES-GCM \uC554\uD638\uD654",
"secTest.verifyMessageIntegrity": "\uBA54\uC2DC\uC9C0 \uBB34\uACB0\uC131",
"secTest.verifyPerfectForwardSecrecy": "\uC644\uC804 \uC21C\uBC29\uD5A5 \uBE44\uBC00\uC131",
"secTest.verifyPFS": "\uC644\uC804 \uC21C\uBC29\uD5A5 \uBE44\uBC00\uC131",
"secTest.verifyReplayProtection": "\uC7AC\uC804\uC1A1 \uACF5\uACA9 \uBC29\uC5B4",
"secTest.verifyDTLSFingerprint": "DTLS \uC9C0\uBB38",
"secTest.verifySASVerification": "SAS \uD655\uC778",
"secTest.verifyMetadataProtection": "\uBA54\uD0C0\uB370\uC774\uD130 \uBCF4\uD638",
"secTest.verifyTrafficObfuscation": "\uD2B8\uB798\uD53D \uB09C\uB3C5\uD654",
"secTest.verifyPacketPadding": "\uD328\uD0B7 \uD328\uB529",
"secTest.verifyNestedEncryption": "\uC911\uCCA9 \uC554\uD638\uD654",
"secTest.verifyNonExtractableKeys": "\uCD94\uCD9C \uBD88\uAC00 \uD0A4",
"secTest.verifyRateLimiting": "\uC18D\uB3C4 \uC81C\uD55C",
"secTest.verifyMutualAuth": "\uC0C1\uD638 \uC778\uC99D",
"secTest.verifyAuthProof": "\uC778\uC99D \uC99D\uBA85",
"secTest.verifyEnhancedValidation": "\uAC15\uD654\uB41C \uAC80\uC99D",
"secTest.verifyAdvancedFeatures": "\uACE0\uAE09 \uAE30\uB2A5",
"secTest.verifySignature": "\uC11C\uBA85 \uAC80\uC0AC",
"secDetail.Security system initializing...": "\uBCF4\uC548 \uC2DC\uC2A4\uD15C\uC744 \uC2DC\uC791\uD558\uB294 \uC911\u2026",
"secDetail.Nested encryption active": "\uC911\uCCA9 \uC554\uD638\uD654\uAC00 \uCF1C\uC838 \uC788\uC2B5\uB2C8\uB2E4",
"secDetail.Nested encryption failed": "\uC911\uCCA9 \uC554\uD638\uD654 \uC2E4\uD328",
"secDetail.Packet padding active": "\uD328\uD0B7 \uD328\uB529\uC774 \uCF1C\uC838 \uC788\uC2B5\uB2C8\uB2E4",
"secDetail.Packet padding failed": "\uD328\uD0B7 \uD328\uB529 \uC2E4\uD328",
"secDetail.Advanced features active": "\uACE0\uAE09 \uAE30\uB2A5\uC774 \uCF1C\uC838 \uC788\uC2B5\uB2C8\uB2E4",
"secDetail.Advanced features failed": "\uACE0\uAE09 \uAE30\uB2A5 \uC2E4\uD328",
"secDetail.No encryption key available": "\uC4F8 \uC218 \uC788\uB294 \uC554\uD638\uD654 \uD0A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4",
"secDetail.AES-GCM encryption/decryption working correctly": "AES-GCM \uC554\uD638\uD654\uC640 \uBCF5\uD638\uD654\uAC00 \uC815\uC0C1 \uB3D9\uC791\uD569\uB2C8\uB2E4",
"secDetail.No ECDH key pair available": "\uC4F8 \uC218 \uC788\uB294 ECDH \uD0A4 \uC30D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",
"secDetail.Key derivation failed": "\uD0A4 \uC720\uB3C4\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4",
"secDetail.No ECDSA key pair available": "\uC4F8 \uC218 \uC788\uB294 ECDSA \uD0A4 \uC30D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",
"secDetail.ECDSA digital signatures working correctly": "ECDSA \uC804\uC790 \uC11C\uBA85\uC774 \uC815\uC0C1 \uB3D9\uC791\uD569\uB2C8\uB2E4",
"secDetail.MAC key not available or invalid": "MAC \uD0A4\uAC00 \uC5C6\uAC70\uB098 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
"secDetail.Rate limiter did not block a message over the limit": "\uC18D\uB3C4 \uC81C\uD55C\uAE30\uAC00 \uD55C\uB3C4\uB97C \uB118\uC740 \uBA54\uC2DC\uC9C0\uB97C \uB9C9\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4",
"secDetail.Rate limiter is not available": "\uC18D\uB3C4 \uC81C\uD55C\uAE30\uB97C \uC4F8 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
"secDetail.Replay protection is working correctly": "\uC7AC\uC804\uC1A1 \uACF5\uACA9 \uBC29\uC5B4\uAC00 \uC815\uC0C1 \uB3D9\uC791\uD569\uB2C8\uB2E4",
"secDetail.Replay protection not enabled": "\uC7AC\uC804\uC1A1 \uACF5\uACA9 \uBC29\uC5B4\uAC00 \uAEBC\uC838 \uC788\uC2B5\uB2C8\uB2E4",
"secDetail.SAS code not available": "SAS \uCF54\uB4DC\uB97C \uC4F8 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
"secDetail.SAS verification code is valid and available": "SAS \uD655\uC778 \uCF54\uB4DC\uAC00 \uC720\uD6A8\uD558\uBA70 \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4",
"secDetail.Traffic obfuscation is working correctly": "\uD2B8\uB798\uD53D \uB09C\uB3C5\uD654\uAC00 \uC815\uC0C1 \uB3D9\uC791\uD569\uB2C8\uB2E4",
"secDetail.Traffic obfuscation not enabled": "\uD2B8\uB798\uD53D \uB09C\uB3C5\uD654\uAC00 \uAEBC\uC838 \uC788\uC2B5\uB2C8\uB2E4",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "\uC774 \uC138\uC158\uC5D0\uB294 \uCD94\uCD9C\uD560 \uC218 \uC5C6\uB294 \uC77C\uD68C\uC6A9 ECDH \uD0A4 \uC30D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "\uC138\uC158 \uB2E8\uC704 \uC21C\uBC29\uD5A5 \uBE44\uBC00\uC131\uB9CC \uC801\uC6A9\uB429\uB2C8\uB2E4. \uD0A4\uB294 \uC138\uC158\uB9C8\uB2E4 \uC77C\uD68C\uC6A9\uC774\uC9C0\uB9CC \uC774 \uC5F0\uACB0\uC5D0\uC11C\uB294 Double Ratchet\uC774 \uB3D9\uC791\uD558\uC9C0 \uC54A\uC544(\uC0C1\uB300\uAC00 \uC774\uC804 \uBC84\uC804 \uC0AC\uC6A9), \uC138\uC158 \uD0A4\uAC00 \uC720\uCD9C\uB418\uBA74 \uB300\uD654 \uC804\uCCB4\uAC00 \uB4DC\uB7EC\uB0A9\uB2C8\uB2E4.",
"msg.pause": "\uC77C\uC2DC\uC815\uC9C0",
"msg.failed": "\uC2E4\uD328",
"groupErr.timeout": "\uCF54\uB4DC\uAC00 \uC900\uBE44\uB418\uAE30 \uC804\uC5D0 \uC5B4\uB5A4 \uAD6C\uC131\uC6D0\uC774 \uC751\uB2F5\uC744 \uBA48\uCDC4\uC2B5\uB2C8\uB2E4.",
"groupErr.keyMismatch": "\uC5B4\uB5A4 \uAD6C\uC131\uC6D0\uC758 \uD0A4\uAC00 \uBC1D\uD78C \uC2E0\uC6D0\uACFC \uB9DE\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
"groupErr.revealMismatch": "\uC5B4\uB5A4 \uAD6C\uC131\uC6D0\uC774 \uACF5\uAC1C\uD55C \uAC12\uC774 \uC55E\uC11C \uD655\uC57D\uD55C \uAC83\uACFC \uB9DE\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
"groupErr.commitChanged": "\uC5B4\uB5A4 \uAD6C\uC131\uC6D0\uC774 \uB3C4\uC911\uC5D0 \uD655\uC57D\uC744 \uBC14\uAFE8\uC2B5\uB2C8\uB2E4.",
"groupErr.missingKey": "\uBA85\uB2E8\uC5D0 \uC788\uB358 \uAD6C\uC131\uC6D0\uC758 \uD0A4\uAC00 \uB05D\uB0B4 \uB3C4\uCC29\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
"groupErr.outsider": "\uADF8\uB8F9 \uBC16\uC758 \uB204\uAD70\uAC00\uC5D0\uAC8C\uC11C \uD504\uB808\uC784\uC774 \uB3C4\uCC29\uD588\uC2B5\uB2C8\uB2E4.",
"groupErr.limit": "\uADF8\uB8F9\uC740 \uCD5C\uB300 \uC5EC\uB35F \uBA85\uAE4C\uC9C0\uC785\uB2C8\uB2E4.",
"groupErr.tooLarge": "\uBA54\uC2DC\uC9C0\uAC00 \uB108\uBB34 \uCEE4\uC11C \uADF8\uB8F9\uC5D0 \uBCF4\uB0BC \uC218 \uC5C6\uC5C8\uC2B5\uB2C8\uB2E4.",
"fileType.text": "\uC77C\uBC18 \uD14D\uC2A4\uD2B8",
"fileType.images": "\uC774\uBBF8\uC9C0",
"fileType.archives": "\uC555\uCD95 \uD30C\uC77C",
"fileType.voice": "\uC74C\uC131 \uBA54\uC2DC\uC9C0",
"fileType.unsupported": "\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC74C",
"qrScan.title": "QR \uCF54\uB4DC \uC2A4\uCE94",
"qrScan.auto": "\uC790\uB3D9 \uBAA8\uB4DC",
"qrScan.reset": "\uCD08\uAE30\uD654",
"qrScan.autoScroll": "\uC790\uB3D9 \uC2A4\uD06C\uB864\uC774 \uCF1C\uC84C\uC2B5\uB2C8\uB2E4",
"qrScan.starting": "\uCE74\uBA54\uB77C\uB97C \uCF1C\uB294 \uC911\u2026",
"qrScan.point": "\uC0C1\uB300\uC758 QR\uC5D0 \uCE74\uBA54\uB77C\uB97C \uB9DE\uCD94\uC138\uC694",
"qrScan.tapFocus": "\uD654\uBA74\uC744 \uB20C\uB7EC \uCD08\uC810\uC744 \uB9DE\uCD94\uC138\uC694",
"qrScan.focusing": "\uCD08\uC810 \uB9DE\uCD94\uB294 \uC911\u2026",
"iceErr.notArray": "\uC11C\uBC84 \uBAA9\uB85D\uC740 \uBC30\uC5F4\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4",
"iceErr.invalidJson": "\uC62C\uBC14\uB974\uC9C0 \uC54A\uC740 JSON",
"iceErr.tooMany": "\uC11C\uBC84\uAC00 \uB108\uBB34 \uB9CE\uC2B5\uB2C8\uB2E4 (\uCD5C\uB300 {max}\uAC1C)",
"iceErr.invalidEntry": "{label}: \uC62C\uBC14\uB974\uC9C0 \uC54A\uC740 \uD56D\uBAA9",
"iceErr.urlCount": "{label}: URL\uC774 1\uAC1C\uC5D0\uC11C {max}\uAC1C \uC0AC\uC774\uC5EC\uC57C \uD569\uB2C8\uB2E4",
"iceErr.turnCreds": "{label}: TURN \uC11C\uBC84\uB294 \uBCF4\uD1B5 \uC0AC\uC6A9\uC790 \uC774\uB984\uACFC \uC790\uACA9 \uC99D\uBA85\uC774 \uD544\uC694\uD569\uB2C8\uB2E4",
"iceUrl.notString": "URL\uC740 \uBB38\uC790\uC5F4\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4",
"iceUrl.empty": "URL\uC774 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4",
"iceUrl.tooLong": "URL\uC774 \uB108\uBB34 \uAE41\uB2C8\uB2E4",
"iceUrl.badChars": "URL\uC5D0 \uC4F8 \uC218 \uC5C6\uB294 \uBB38\uC790\uAC00 \uC788\uC2B5\uB2C8\uB2E4",
"iceUrl.badScheme": "URL\uC740 stun:, stuns:, turn: \uB610\uB294 turns: \uB85C \uC2DC\uC791\uD574\uC57C \uD569\uB2C8\uB2E4",
"iceUrl.badQuery": "URL\uC758 \uC9C8\uC758\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
"iceUrl.noHost": "URL\uC5D0 \uD638\uC2A4\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4",
"iceUrl.badHost": "URL\uC758 \uD638\uC2A4\uD2B8\uB098 \uD3EC\uD2B8\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
"iceUrl.badTransport": "URL \uC9C8\uC758\uB294 transport=udp \uB610\uB294 transport=tcp \uC5EC\uC57C \uD569\uB2C8\uB2E4",
"msg.off": "\uB054",
"file.consentUnavailable": "\uB3D9\uC758\uB97C \uAD6C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
"secLevel.MAXIMUM": "\uCD5C\uACE0",
"secLevel.INITIALIZING": "\uC2DC\uC791 \uC911",
"secLevel.ERROR": "\uC624\uB958",
"secLevel.UNKNOWN": "\uC54C \uC218 \uC5C6\uC74C",
"status.error": "\uC624\uB958",
"offline.disconnect": "\uC5F0\uACB0 \uB04A\uAE30",
"offline.learnMore": "\uC790\uC138\uD788 \uBCF4\uAE30",
"pwa.installApp": "\uC571 \uC124\uCE58",
"chat.onWeb": "\uC6F9 \uBC84\uC804\uC744 \uC4F0\uACE0 \uC788\uC2B5\uB2C8\uB2E4",
"groupCall.startVoice": "\uADF8\uB8F9 \uC74C\uC131 \uD1B5\uD654 \uC2DC\uC791",
"groupCall.startVideo": "\uADF8\uB8F9 \uC601\uC0C1 \uD1B5\uD654 \uC2DC\uC791",
"groupCall.join": "\uCC38\uC5EC",
"groupCall.dismiss": "\uB098\uC911\uC5D0",
"groupCall.leave": "\uD1B5\uD654 \uB098\uAC00\uAE30",
"groupCall.you": "\uB098",
"groupCall.connecting": "\uC5F0\uACB0 \uC911\u2026",
"groupCall.waitingLink": "\uC9C1\uC811 \uC5F0\uACB0\uC744 \uAE30\uB2E4\uB9AC\uB294 \uC911\u2026",
"groupCall.legFailed": "\uC5F0\uACB0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4",
"groupCall.startedVoice": "{name} \uB2D8\uC774 \uC74C\uC131 \uD1B5\uD654\uB97C \uC2DC\uC791\uD588\uC2B5\uB2C8\uB2E4",
"groupCall.startedVideo": "{name} \uB2D8\uC774 \uC601\uC0C1 \uD1B5\uD654\uB97C \uC2DC\uC791\uD588\uC2B5\uB2C8\uB2E4",
"groupCall.inCall": "\uD1B5\uD654 \uC911 {count}\uBA85",
"groupCall.err.permission_denied": "\uD1B5\uD654\uB97C \uC2DC\uC791\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 - \uB9C8\uC774\uD06C\uC640 \uCE74\uBA54\uB77C \uC811\uADFC\uC774 \uCC28\uB2E8\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uC0AC\uC774\uD2B8\uC5D0 \uD5C8\uC6A9\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.",
"groupCall.err.device_not_found": "\uD1B5\uD654\uB97C \uC2DC\uC791\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 - \uC774 \uAE30\uAE30\uC5D0\uC11C \uB9C8\uC774\uD06C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
"groupCall.err.device_busy": "\uD1B5\uD654\uB97C \uC2DC\uC791\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 - \uB9C8\uC774\uD06C\uB97C \uB2E4\uB978 \uC571\uC774 \uC0AC\uC6A9 \uC911\uC785\uB2C8\uB2E4. \uC885\uB8CC\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.",
"groupCall.err.media_failed": "\uD1B5\uD654\uB97C \uC2DC\uC791\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 - \uB9C8\uC774\uD06C\uB97C \uC5F4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
"groupCall.err.call_in_progress": "\uC774 \uADF8\uB8F9\uC5D0\uC11C \uC774\uBBF8 \uD1B5\uD654\uAC00 \uC9C4\uD589 \uC911\uC785\uB2C8\uB2E4. \uC0C8\uB85C \uC2DC\uC791\uD558\uC9C0 \uB9D0\uACE0 \uCC38\uC5EC\uD558\uC138\uC694.",
"groupCall.err.not_ready": "\uD1B5\uD654\uD558\uAE30 \uC804\uC5D0 \uADF8\uB8F9 \uCF54\uB4DC\uB97C \uD655\uC778\uD558\uC138\uC694.",
"groupCall.speaking": "{name} \uB2D8\uC774 \uB9D0\uD558\uB294 \uC911",
"groupCall.pin": "{name} \uD06C\uAC8C \uBCF4\uAE30",
"groupCall.unpin": "\uC804\uCCB4 \uBCF4\uAE30\uB85C \uB3CC\uC544\uAC00\uAE30",
"groupCall.showEveryone": "\uC804\uCCB4",
"msg.after5s": "\uC77D\uC740 \uB4A4 5\uCD08",
"msg.after15s": "\uC77D\uC740 \uB4A4 15\uCD08",
"msg.after30s": "\uC77D\uC740 \uB4A4 30\uCD08",
"msg.after1m": "\uC77D\uC740 \uB4A4 1\uBD84",
"msg.sec30": "30\uCD08",
"msg.min5": "5\uBD84",
"msg.hour1": "1\uC2DC\uAC04",
"desktop.shareDesc": "\uC0C1\uB300\uC5D0\uAC8C \uCF54\uB4DC\uB97C \uBCF4\uB0B4\uC138\uC694. \uC77C\uD68C\uC6A9\uC774\uBA70 \uACE7 \uB9CC\uB8CC\uB429\uB2C8\uB2E4.",
"desktop.invitationCreated": "\uBCF4\uC548 \uCD08\uB300\uAC00 \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4 - \uC0C1\uB300\uC5D0\uAC8C \uBCF4\uB0B4\uC138\uC694.",
"desktop.joinDesc": "\uC0C1\uB300\uC758 \uCD08\uB300 \uCF54\uB4DC\uB97C \uBD99\uC5EC\uB123\uC5B4 \uBCF4\uC548 \uC751\uB2F5\uC744 \uB9CC\uB4DC\uC138\uC694.",
"desktop.offerTag": "\uCD08\uB300 \xB7 \uD14D\uC2A4\uD2B8 \uBCF5\uC0AC",
"desktop.answerTag": "\uC751\uB2F5 \xB7 \uD14D\uC2A4\uD2B8 \uBCF5\uC0AC",
"desktop.offerPlaceholder": "\uCD08\uB300 \uCF54\uB4DC\uAC00 \uC5EC\uAE30\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4\u2026",
"desktop.answerPlaceholder": "\uC751\uB2F5 \uCF54\uB4DC\uAC00 \uC5EC\uAE30\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4\u2026",
"desktop.backToChats": "\uCC44\uD305\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30",
"desktop.sendFeedback": "\uD53C\uB4DC\uBC31 \uBCF4\uB0B4\uAE30",
"desktop.callsNeedVerified": "\uD1B5\uD654\uD558\uB824\uBA74 \uAC80\uC99D\uB41C \uBCF4\uC548 \uCC44\uB110\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.",
"desktop.noOpenChannel": "\uC5F4\uB9B0 \uBCF4\uC548 \uCC44\uB110\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
"desktop.chatCarriesCall": "\uC774 \uCC44\uD305\uC774 \uADF8\uB8F9 \uD1B5\uD654\uB97C \uC804\uB2EC\uD558\uACE0 \uC788\uC2B5\uB2C8\uB2E4. 1:1 \uD1B5\uD654\uB97C \uAC78\uAE30 \uC804\uC5D0 \uADF8\uB8F9 \uD1B5\uD654\uC5D0\uC11C \uB098\uAC00\uC138\uC694.",
"desktop.err.permission_denied": "\uD1B5\uD654\uB97C \uC2DC\uC791\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 - \uB9C8\uC774\uD06C\uC640 \uCE74\uBA54\uB77C \uC811\uADFC\uC774 \uCC28\uB2E8\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uC2DC\uC2A4\uD15C \uC124\uC815\uC5D0\uC11C \uD5C8\uC6A9\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.",
"desktop.language": "\uC5B8\uC5B4",
"desktop.languageHint": "\uC989\uC2DC \uC801\uC6A9\uB429\uB2C8\uB2E4. \uC774\uBBF8 \uBCF4\uB0B8 \uBA54\uC2DC\uC9C0\uB294 \uC6D0\uB798 \uC5B8\uC5B4 \uADF8\uB300\uB85C \uB0A8\uC2B5\uB2C8\uB2E4.",
"desktop.compareCode": "\uC0C1\uB300\uC640 \uD655\uC778 \uCF54\uB4DC\uB97C \uBE44\uAD50\uD558\uACE0 \uC77C\uCE58\uD558\uBA74 \uD655\uC778\uD558\uC138\uC694.",
"desktop.verifyBeforeFiles": "\uD30C\uC77C\uC744 \uBCF4\uB0B4\uAE30 \uC804\uC5D0 \uAC80\uC99D\uC744 \uB9C8\uCE58\uC138\uC694.",
"desktop.verifyBeforeSending": "\uBA54\uC2DC\uC9C0\uB97C \uBCF4\uB0B4\uAE30 \uC804\uC5D0 \uAC80\uC99D\uC744 \uB9C8\uCE58\uC138\uC694.",
"desktop.disconnectedByBackend": "\uC5F0\uACB0\uC774 \uC548\uC804\uD558\uAC8C \uC885\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
"desktop.restoreFailed": "\uC5F0\uACB0\uC744 \uBCF5\uAD6C\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC774 \uCC44\uD305\uC744 \uB2EB\uC2B5\uB2C8\uB2E4.",
"desktop.channelNotReady": "\uB370\uC774\uD130 \uCC44\uB110\uC774 \uC544\uC9C1 \uC5C6\uC2B5\uB2C8\uB2E4. \uC5F0\uACB0\uC774 \uB9FA\uC5B4\uC9C8 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9AC\uC138\uC694.",
"desktop.enterCode": "\uD655\uC778 \uCF54\uB4DC\uB97C \uC785\uB825\uD558\uC138\uC694.",
"desktop.noOffer": "\uCD08\uB300\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uBA3C\uC800 \uB9CC\uB4DC\uC138\uC694.",
"desktop.notInitiator": "\uC774 \uC5F0\uACB0\uC744 \uB9CC\uB4E0 \uCABD\uC774 \uC544\uB2C8\uBBC0\uB85C \uC801\uC6A9\uD560 \uC751\uB2F5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
"desktop.decryptFailed": "\uBA54\uC2DC\uC9C0\uB97C \uBCF5\uD638\uD654\uD558\uC9C0 \uBABB\uD574 \uBC84\uB838\uC2B5\uB2C8\uB2E4.",
"desktop.badMessageFormat": "\uD615\uC2DD\uC774 \uC798\uBABB\uB41C \uD504\uB808\uC784\uC774 \uB3C4\uCC29\uD574 \uBC84\uB838\uC2B5\uB2C8\uB2E4.",
"desktop.notSentNotReady": "\uBA54\uC2DC\uC9C0\uB97C \uBCF4\uB0B4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4: \uBCF4\uC548 \uCC44\uB110\uC774 \uC900\uBE44\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uAC80\uC99D\uC774 \uB05D\uB098\uAE30\uB97C \uAE30\uB2E4\uB9AC\uAC70\uB098 \uB2E4\uC2DC \uC5F0\uACB0\uD558\uC138\uC694.",
"desktop.micDenied": "\uB9C8\uC774\uD06C \uC811\uADFC\uC774 \uAC70\uBD80\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
"desktop.noChannelWait": "\uC5F4\uB9B0 \uBCF4\uC548 \uCC44\uB110\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 - \uC5F0\uACB0\uC774 \uB9FA\uC5B4\uC9C8 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9AC\uC138\uC694.",
"desktop.sasFailed": "\uAC80\uC99D\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC911\uAC04\uC790\uAC00 \uC788\uC744 \uC218 \uC788\uC5B4 \uC5F0\uACB0\uC744 \uC911\uB2E8\uD588\uC2B5\uB2C8\uB2E4.",
"desktop.sasOk": "\uAC80\uC99D\uC5D0 \uC131\uACF5\uD588\uC2B5\uB2C8\uB2E4. \uC774 \uCC44\uB110\uC740 \uC885\uB2E8 \uAC04 \uC778\uC99D\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
"desktop.iceForgotten": "\uC800\uC7A5\uB41C \uC11C\uBC84\uB97C \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4. \uACF5\uAC1C ICE \uC11C\uBC84\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.",
"desktop.icePublic": "\uACF5\uAC1C ICE \uC11C\uBC84\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.",
"desktop.verificationInProgress": "\uBCF4\uC548 \uAC80\uC99D\uC774 \uC544\uC9C1 \uC9C4\uD589 \uC911\uC785\uB2C8\uB2E4. \uB05D\uB0A0 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9AC\uC138\uC694.",
"desktop.fileGone": "\uC774 \uD30C\uC77C\uC740 \uB354 \uC774\uC0C1 \uB0B4\uB824\uBC1B\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
"desktop.codeMismatch": "\uD655\uC778 \uCF54\uB4DC\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC548\uC804\uC744 \uC704\uD574 \uC5F0\uACB0\uC744 \uB04A\uC2B5\uB2C8\uB2E4.",
"desktop.noLocalCode": "\uAC80\uC99D \uC2E4\uD328: \uBE44\uAD50\uD560 \uB85C\uCEEC \uD30C\uC0DD \uCF54\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC548\uC804\uC744 \uC704\uD574 \uC5F0\uACB0\uC744 \uB04A\uC2B5\uB2C8\uB2E4.",
"desktop.protocolViolation": "\uC0C1\uB300\uAC00 \uB2F9\uC2E0\uC774 \uD655\uC778\uD558\uAE30 \uC804\uC5D0 \uCF54\uB4DC\uAC00 \uD655\uC778\uB418\uC5C8\uB2E4\uACE0 \uC8FC\uC7A5\uD588\uC2B5\uB2C8\uB2E4. \uC548\uC804\uC744 \uC704\uD574 \uC5F0\uACB0\uC744 \uB04A\uC2B5\uB2C8\uB2E4.",
"desktop.verificationRejected": "\uAC80\uC99D\uC774 \uAC70\uBD80\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC548\uC804\uC744 \uC704\uD574 \uC5F0\uACB0\uC744 \uC911\uB2E8\uD588\uC2B5\uB2C8\uB2E4.",
"secLevel.HIGH": "\uB192\uC74C",
"secLevel.MEDIUM": "\uBCF4\uD1B5",
"secLevel.LOW": "\uB0AE\uC74C",
"desktop.rerun": "\uB2E4\uC2DC \uAC80\uC0AC",
"desktop.ice.customDesc": "\uCD5C\uB300 {max}\uAC1C \uC11C\uBC84, \uD55C \uC904\uC5D0 URL \uD558\uB098 \uB610\uB294 JSON.",
"desktop.ice.persistDesc": "\uC774 \uAE30\uAE30\uC5D0 \uB85C\uCEEC\uB85C \uC800\uC7A5\uB429\uB2C8\uB2E4. \uC774\uBC88 \uC138\uC158\uC5D0\uB9CC \uC0AC\uC6A9\uD558\uB824\uBA74 \uAEBC \uB450\uC138\uC694.",
"desktop.group.leaveNote": "\uB2E4\uB978 \uAD6C\uC131\uC6D0\uC5D0\uAC8C \uB2F9\uC2E0\uC774 \uB098\uAC14\uB2E4\uACE0 \uC54C\uB9BD\uB2C8\uB2E4. \uC774\uD6C4 \uC774 \uAE30\uAE30\uC5D0\uB294 \uC774 \uADF8\uB8F9\uC5D0 \uB300\uD55C \uAC83\uC774 \uC544\uBB34\uAC83\uB3C4 \uB0A8\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 - \uB2E4\uC2DC \uB4E4\uC5B4\uAC08 \uC0AC\uBCF8\uC744 \uAC00\uC9C4 \uC11C\uBC84\uAC00 \uC5C6\uC73C\uBBC0\uB85C \uC0C8 \uCD08\uB300\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.",
"desktop.sec.ecdsaOk": "\uD578\uB4DC\uC170\uC774\uD06C \uC911 \uC0C1\uB300 \uD0A4 \uD328\uD0A4\uC9C0 \uC11C\uBA85\uC744 \uAC80\uC99D\uD588\uC2B5\uB2C8\uB2E4 (ECDSA P-384 / SHA-384)",
"desktop.sec.ecdsaNone": "\uC644\uB8CC\uB41C \uD578\uB4DC\uC170\uC774\uD06C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4",
"desktop.sec.ecdhOk": "\uC784\uC2DC ECDH P-384 \uAD50\uD658\uC5D0\uC11C HKDF-SHA-256\uC73C\uB85C \uC138\uC158 \uD0A4\uB97C \uD30C\uC0DD\uD588\uC2B5\uB2C8\uB2E4",
"desktop.sec.ecdhNone": "\uC138\uC158 \uD0A4\uAC00 \uD30C\uC0DD\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
"desktop.sec.encryptionOk": "\uCF54\uC5B4\uC5D0\uC11C AES-GCM \uC554\xB7\uBCF5\uD638\uD654\uB97C \uAC80\uC99D\uD588\uC2B5\uB2C8\uB2E4",
"desktop.sec.encryptionNa": "AES-GCM \uC790\uCCB4 \uAC80\uC0AC\uB97C \uC2E4\uD589\uD560 \uC218 \uC5C6\uC5C8\uC2B5\uB2C8\uB2E4",
"desktop.sec.integrityOk": "\uBA54\uC2DC\uC9C0 \uBB34\uACB0\uC131\uC744 \uAC80\uC99D\uD588\uC2B5\uB2C8\uB2E4 (AES-GCM \uC778\uC99D)",
"desktop.sec.integrityNa": "\uBB34\uACB0\uC131 \uC790\uCCB4 \uAC80\uC0AC\uB97C \uC2E4\uD589\uD560 \uC218 \uC5C6\uC5C8\uC2B5\uB2C8\uB2E4",
"desktop.sec.pfsOk": "Double Ratchet \uC791\uB3D9 \uC911 - \uBA54\uC2DC\uC9C0\uB9C8\uB2E4 \uACE0\uC720\uD55C \uD0A4\uAC00 \uC788\uC2B5\uB2C8\uB2E4",
"desktop.sec.pfsNa": "\uCE21\uC815\uB418\uC9C0 \uC54A\uC74C",
"desktop.sec.replayOk": "\uB798\uCE6B \uBA54\uC2DC\uC9C0 \uD0A4\uB294 \uC0AC\uC6A9 \uC989\uC2DC \uD30C\uAE30\uB418\uC5B4 \uAC00\uB85C\uCC48 \uD504\uB808\uC784\uC744 \uC7AC\uC0DD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
"desktop.sec.replayNa": "\uCE21\uC815\uB418\uC9C0 \uC54A\uC74C",
"desktop.sec.dtlsPinned": "\uC0C1\uB300 DTLS \uC9C0\uBB38 \uACE0\uC815: {fp}",
"desktop.sec.dtlsNone": "\uC6D0\uACA9 DTLS \uC9C0\uBB38\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",
"desktop.sec.sasBoth": "\uC591\uCABD \uBAA8\uB450 \uB300\uC5ED \uC678\uC5D0\uC11C \uC548\uC804 \uCF54\uB4DC\uB97C \uD655\uC778\uD588\uC2B5\uB2C8\uB2E4",
"desktop.sec.sasIncomplete": "\uC548\uC804 \uCF54\uB4DC\uAC00 \uC591\uCABD \uBAA8\uB450\uC5D0\uAC8C \uD655\uC778\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
"desktop.sec.metadataOk": "\uC804\uC6A9 \uBA54\uD0C0\uB370\uC774\uD130 \uD0A4\uB97C \uD30C\uC0DD\uD588\uC2B5\uB2C8\uB2E4 (HKDF metadata-protection-v4)",
"desktop.sec.metadataNone": "\uBA54\uD0C0\uB370\uC774\uD130 \uD0A4 \uC5C6\uC74C",
"desktop.sec.coverOn": "\uC704\uC7A5 \uD2B8\uB798\uD53D \uC791\uB3D9 \uC911: \uB798\uCE6B \uCC44\uB110\uC5D0 \uBB34\uC791\uC704 \uB354\uBBF8 \uD504\uB808\uC784 (15-30\uCD08\uB9C8\uB2E4 32-128 B)",
"desktop.sec.coverOff": "\uC704\uC7A5 \uD2B8\uB798\uD53D \uC0DD\uC131\uAE30\uAC00 \uC2E4\uD589\uB418\uACE0 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
"desktop.sec.coverUnsupported": "\uC704\uC7A5 \uD2B8\uB798\uD53D\uC5D0\uB294 Double Ratchet \uC138\uC158\uC774 \uD544\uC694\uD569\uB2C8\uB2E4 (\uC0C1\uB300\uAC00 \uAD6C\uBC84\uC804\uC785\uB2C8\uB2E4)",
"desktop.tagline": "\uC885\uB2E8 \uAC04 \uC790\uC720"
},
"hi": {
"language.label": "\u092D\u093E\u0937\u093E",
"language.suggest.text": "\u092F\u0939 \u092A\u0943\u0937\u094D\u0920 \u0939\u093F\u0928\u094D\u0926\u0940 \u092E\u0947\u0902 \u092D\u0940 \u0909\u092A\u0932\u092C\u094D\u0927 \u0939\u0948\u0964",
"language.suggest.cta": "\u0939\u093F\u0928\u094D\u0926\u0940 \u092E\u0947\u0902 \u092A\u0922\u093C\u0947\u0902",
"language.suggest.dismiss": "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
"community.title": "\u0928\u093F\u091C\u0924\u093E \u0915\u0947 \u092D\u0935\u093F\u0937\u094D\u092F \u092E\u0947\u0902 \u0936\u093E\u092E\u093F\u0932 \u0939\u094B\u0902",
"community.description": "SecureBit \u0905\u092A\u0928\u0947 \u0938\u092E\u0941\u0926\u093E\u092F \u0938\u0947 \u092C\u0922\u093C\u0924\u093E \u0939\u0948\u0964 \u0906\u092A\u0915\u0947 \u0935\u093F\u091A\u093E\u0930 \u0914\u0930 \u0938\u0941\u091D\u093E\u0935 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0938\u0902\u0935\u093E\u0926 \u0915\u093E \u092D\u0935\u093F\u0937\u094D\u092F \u0917\u0922\u093C\u0924\u0947 \u0939\u0948\u0902 - \u0916\u0941\u0932\u0947 \u092E\u0947\u0902 \u092C\u0928\u093E, \u0914\u0930 \u092A\u0942\u0930\u0947 \u0930\u093E\u0938\u094D\u0924\u0947 \u092A\u0942\u0930\u0940 ASN.1 \u091C\u093E\u0901\u091A \u0915\u0947 \u0938\u093E\u0925\u0964",
"community.github": "GitHub \u0930\u093F\u092A\u0949\u091C\u093C\u093F\u091F\u0930\u0940",
"community.feedback": "\u092A\u094D\u0930\u0924\u093F\u0915\u094D\u0930\u093F\u092F\u093E",
"unique.eyebrow": "\u0939\u092E \u0905\u0932\u0917 \u0915\u0948\u0938\u0947 \u0939\u0948\u0902",
"unique.heading": "SecureBit \u0916\u093C\u093E\u0938 \u0915\u094D\u092F\u094B\u0902 \u0939\u0948",
"unique.s1.titleTop": "\u092A\u0930\u0924\u0926\u093E\u0930",
"unique.s1.titleBottom": "\u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0915\u094B\u0930",
"unique.s1.collapsed": "\u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0915\u094B\u0930",
"unique.s1.desc": "ECDH P-384 \u0915\u0941\u0902\u091C\u0940 \u0935\u093F\u0928\u093F\u092E\u092F, AES-256-GCM \u092A\u0947\u0932\u094B\u0921, ECDSA \u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930 \u0914\u0930 \u092A\u0942\u0930\u0940 ASN.1 \u091C\u093E\u0901\u091A - \u0938\u092C \u090F\u0915 \u092E\u091C\u093C\u092C\u0942\u0924 \u0936\u094D\u0930\u0943\u0902\u0916\u0932\u093E \u092E\u0947\u0902 \u092A\u093F\u0930\u094B\u090F \u0939\u0941\u090F\u0964",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "\u0936\u0941\u0926\u094D\u0927 P2P",
"unique.s2.titleBottom": "WebRTC \u092A\u0930",
"unique.s2.collapsed": "WebRTC \u092A\u0930 \u0936\u0941\u0926\u094D\u0927 P2P",
"unique.s2.desc": "\u0938\u0902\u0926\u0947\u0936 WebRTC \u0915\u0947 \u091C\u093C\u0930\u093F\u090F \u0938\u0940\u0927\u0947 \u090F\u0915 \u0909\u092A\u0915\u0930\u0923 \u0938\u0947 \u0926\u0942\u0938\u0930\u0947 \u0924\u0915 \u091C\u093E\u0924\u0947 \u0939\u0948\u0902\u0964 \u0915\u094B\u0908 \u0930\u093F\u0932\u0947 \u0906\u092A\u0915\u093E \u0921\u0947\u091F\u093E \u0928\u0939\u0940\u0902 \u0930\u0916\u0924\u093E - \u0938\u0930\u094D\u0935\u0930 \u092C\u0938 \u0926\u094B\u0928\u094B\u0902 \u092A\u0915\u094D\u0937\u094B\u0902 \u0915\u094B \u090F\u0915-\u0926\u0942\u0938\u0930\u0947 \u0924\u0915 \u092A\u0939\u0941\u0901\u091A\u0928\u0947 \u092E\u0947\u0902 \u092E\u0926\u0926 \u0915\u0930\u0924\u093E \u0939\u0948\u0964",
"unique.s2.tags": [
"DTLS 1.3",
"\u0915\u094B\u0908 \u0930\u093F\u0932\u0947 \u0928\u0939\u0940\u0902"
],
"unique.s3.titleTop": "\u092A\u0942\u0930\u094D\u0923 \u0905\u0917\u094D\u0930\u0917\u093E\u092E\u0940",
"unique.s3.titleBottom": "\u0917\u094B\u092A\u0928\u0940\u092F\u0924\u093E",
"unique.s3.collapsed": "\u0905\u0917\u094D\u0930\u0917\u093E\u092E\u0940 \u0917\u094B\u092A\u0928\u0940\u092F\u0924\u093E",
"unique.s3.desc": "\u0938\u0924\u094D\u0930 \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901 \u0932\u0917\u093E\u0924\u093E\u0930 \u092C\u0926\u0932\u0924\u0940 \u0930\u0939\u0924\u0940 \u0939\u0948\u0902 \u0914\u0930 \u0909\u092A\u092F\u094B\u0917 \u0915\u0947 \u092C\u093E\u0926 \u0939\u091F\u093E \u0926\u0940 \u091C\u093E\u0924\u0940 \u0939\u0948\u0902, \u0907\u0938\u0932\u093F\u090F \u090F\u0915 \u0915\u0941\u0902\u091C\u0940 \u0932\u0940\u0915 \u0939\u094B\u0928\u0947 \u092A\u0930 \u092D\u0940 \u092A\u0941\u0930\u093E\u0928\u0940 \u092C\u093E\u0924\u091A\u0940\u0924 \u0928\u0939\u0940\u0902 \u0916\u0941\u0932\u0924\u0940\u0964",
"unique.s3.tags": [
"\u0915\u094D\u0937\u0923\u093F\u0915 \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901",
"\u0938\u094D\u0935\u0924\u0903 \u092C\u0926\u0932\u093E\u0935"
],
"unique.s4.titleTop": "\u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915",
"unique.s4.titleBottom": "\u0905\u0938\u094D\u092A\u0937\u094D\u091F\u0940\u0915\u0930\u0923",
"unique.s4.collapsed": "\u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u0905\u0938\u094D\u092A\u0937\u094D\u091F\u0940\u0915\u0930\u0923",
"unique.s4.desc": "\u092A\u0948\u0915\u0947\u091F \u0915\u093E \u0906\u0915\u093E\u0930 \u0914\u0930 \u0938\u092E\u092F \u092D\u0930\u093E \u0914\u0930 \u092F\u093E\u0926\u0943\u091A\u094D\u091B\u093F\u0915 \u0915\u093F\u092F\u093E \u091C\u093E\u0924\u093E \u0939\u0948, \u091C\u093F\u0938\u0938\u0947 \u0932\u093E\u0907\u0928 \u0926\u0947\u0916 \u0930\u0939\u0947 \u0915\u093F\u0938\u0940 \u092D\u0940 \u0935\u094D\u092F\u0915\u094D\u0924\u093F \u0915\u094B \u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0915\u093E \u0922\u0930\u094D\u0930\u093E \u0926\u093F\u0916\u093E\u0908 \u0928\u0939\u0940\u0902 \u0926\u0947\u0924\u093E\u0964",
"unique.s4.tags": [
"\u092A\u0948\u0915\u0947\u091F \u092A\u0948\u0921\u093F\u0902\u0917",
"\u0938\u092E\u092F \u092E\u0947\u0902 \u0909\u0924\u093E\u0930-\u091A\u0922\u093C\u093E\u0935"
],
"unique.s5.titleTop": "\u0936\u0942\u0928\u094D\u092F \u0921\u0947\u091F\u093E",
"unique.s5.titleBottom": "\u0938\u0902\u0917\u094D\u0930\u0939",
"unique.s5.collapsed": "\u0936\u0942\u0928\u094D\u092F \u0921\u0947\u091F\u093E \u0938\u0902\u0917\u094D\u0930\u0939",
"unique.s5.desc": "\u0928 \u0916\u093E\u0924\u0947, \u0928 \u0932\u0949\u0917, \u0928 \u0938\u0902\u0926\u0947\u0936\u094B\u0902 \u0915\u093E \u092D\u0902\u0921\u093E\u0930\u0923\u0964 \u0938\u0930\u094D\u0935\u0930 \u092A\u0930 \u0910\u0938\u093E \u0915\u0941\u091B \u0939\u0948 \u0939\u0940 \u0928\u0939\u0940\u0902 \u091C\u094B \u0932\u0940\u0915 \u0939\u094B, \u091C\u093C\u092C\u094D\u0924 \u0939\u094B \u092F\u093E \u092C\u0947\u091A\u093E \u091C\u093E \u0938\u0915\u0947\u0964",
"unique.s5.tags": [
"\u0915\u094B\u0908 \u0916\u093E\u0924\u093E \u0928\u0939\u0940\u0902",
"\u0915\u094B\u0908 \u0932\u0949\u0917 \u0928\u0939\u0940\u0902"
],
"partners.eyebrow": "\u0938\u093E\u091D\u0947\u0926\u093E\u0930 \u0914\u0930 \u092A\u0930\u093F\u0924\u0902\u0924\u094D\u0930",
"partners.heading": "\u0939\u092E\u093E\u0930\u0947 \u0938\u093E\u091D\u0947\u0926\u093E\u0930 \u0939\u092E \u092A\u0930 \u092D\u0930\u094B\u0938\u093E \u0915\u0930\u0924\u0947 \u0939\u0948\u0902",
"partners.aegis.desc": "\u092A\u0942\u0901\u091C\u0940 \u0938\u093E\u091D\u0947\u0926\u093E\u0930, \u091C\u094B \u0905\u092A\u0928\u0947 \u092A\u0942\u0930\u0947 \u092A\u094B\u0930\u094D\u091F\u092B\u093C\u094B\u0932\u093F\u092F\u094B \u092E\u0947\u0902 \u0917\u094B\u092A\u0928\u0940\u092F \u0935\u093F\u0924\u094D\u0924\u0940\u092F \u0938\u0902\u0935\u093E\u0926 \u0915\u0940 \u0930\u0915\u094D\u0937\u093E \u0915\u0930\u0924\u093E \u0939\u0948\u0964",
"partners.aegis.role": "\u0930\u0923\u0928\u0940\u0924\u093F\u0915 \u0928\u093F\u0935\u0947\u0936\u0915",
"partners.furilabs.desc": "\u0928\u093F\u091C\u0924\u093E \u0915\u094B \u092A\u0939\u0932\u0947 \u0930\u0916\u0928\u0947 \u0935\u093E\u0932\u0947 \u0932\u093F\u0928\u0915\u094D\u0938 \u092B\u093C\u094B\u0928, \u091C\u093F\u0928\u092E\u0947\u0902 SecureBit \u0921\u093F\u092B\u093C\u0949\u0932\u094D\u091F \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u0928\u0932 \u0915\u0947 \u0930\u0942\u092A \u092E\u0947\u0902 \u0906\u0924\u093E \u0939\u0948\u0964",
"partners.furilabs.role": "\u092A\u094D\u0930\u094C\u0926\u094D\u092F\u094B\u0917\u093F\u0915\u0940 \u0938\u093E\u091D\u0947\u0926\u093E\u0930",
"partners.inviteTitle": "\u0938\u093E\u091D\u0947\u0926\u093E\u0930 \u092C\u0928\u0947\u0902",
"partners.inviteDesc": "\u0915\u094D\u092F\u093E \u0906\u092A \u0928\u093F\u091C\u0924\u093E \u0915\u0947 \u0932\u093F\u090F \u0939\u093E\u0930\u094D\u0921\u0935\u0947\u092F\u0930 \u092F\u093E \u092C\u0941\u0928\u093F\u092F\u093E\u0926\u0940 \u0922\u093E\u0901\u091A\u093E \u092C\u0928\u093E \u0930\u0939\u0947 \u0939\u0948\u0902? \u0906\u0907\u090F SecureBit \u091C\u094B\u0921\u093C\u0947\u0902\u0964",
"partners.inviteCta": "\u092C\u093E\u0924\u091A\u0940\u0924 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
"roadmap.eyebrow": "\u0935\u093F\u0915\u093E\u0938 \u0915\u0940 \u0930\u0942\u092A\u0930\u0947\u0916\u093E",
"roadmap.heading": "SecureBit \u0915\u093E \u0938\u092B\u093C\u0930",
"roadmap.subheading": "\u092A\u0939\u0932\u0947 \u092A\u094D\u0930\u094B\u091F\u094B\u091F\u093E\u0907\u092A \u0938\u0947 \u0932\u0947\u0915\u0930 \u0915\u094D\u0935\u093E\u0902\u091F\u092E-\u092A\u094D\u0930\u0924\u093F\u0930\u094B\u0927\u0940, \u0935\u093F\u0915\u0947\u0902\u0926\u094D\u0930\u093F\u0924 \u0928\u0947\u091F\u0935\u0930\u094D\u0915 \u0924\u0915 - \u0939\u0930 \u092A\u0930\u0924 \u092A\u0930 \u092A\u0942\u0930\u0940 ASN.1 \u091C\u093E\u0901\u091A \u0915\u0947 \u0938\u093E\u0925\u0964",
"roadmap.progress": "{total} \u092E\u0947\u0902 \u0938\u0947 {shipped} \u092A\u0921\u093C\u093E\u0935 \u092A\u0942\u0930\u0947",
"roadmap.upcoming": "{upcoming} \u092C\u093E\u0915\u093C\u0940",
"roadmap.keyFeatures": "\u092E\u0941\u0916\u094D\u092F \u0935\u093F\u0936\u0947\u0937\u0924\u093E\u090F\u0901",
"roadmap.status.released": "\u091C\u093E\u0930\u0940",
"roadmap.status.current": "\u0905\u092D\u0940 \u091A\u093E\u0932\u0942",
"roadmap.status.dev": "\u0935\u093F\u0915\u093E\u0938 \u092E\u0947\u0902",
"roadmap.status.planned": "\u0928\u093F\u092F\u094B\u091C\u093F\u0924",
"roadmap.status.research": "\u0936\u094B\u0927",
"hero.headlineTop": "\u090F\u0915 \u0938\u0940\u0927\u0940 \u0932\u093E\u0907\u0928,",
"hero.headlineBottom": "\u091C\u093F\u0938\u0947 \u0938\u093F\u0930\u094D\u092B\u093C \u0906\u092A \u0926\u094B\u0928\u094B\u0902 \u092A\u0922\u093C \u0938\u0915\u0947\u0902\u0964",
"hero.subheading": "\u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901 \u0906\u092A\u0915\u0947 \u0909\u092A\u0915\u0930\u0923 \u092A\u0930 \u092C\u0928\u0924\u0940 \u0939\u0948\u0902 \u0914\u0930 \u0938\u0940\u0927\u0947 \u0926\u094B\u0928\u094B\u0902 \u092A\u0915\u094D\u0937\u094B\u0902 \u0915\u0947 \u092C\u0940\u091A \u092C\u0926\u0932\u0940 \u091C\u093E\u0924\u0940 \u0939\u0948\u0902\u0964 \u0928 \u0915\u094B\u0908 \u0916\u093E\u0924\u093E, \u0928 \u0915\u094B\u0908 \u0938\u0930\u094D\u0935\u0930 \u091C\u094B \u0906\u092A\u0915\u0947 \u0938\u0902\u0926\u0947\u0936 \u0930\u0916\u0947\u0964",
"hero.diagramAlt": "\u090F\u0915 \u0938\u093E\u0925\u0940 \u0924\u0915 \u0938\u0940\u0927\u0940 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0932\u093E\u0907\u0928, \u091C\u093F\u0938\u092E\u0947\u0902 \u0906\u0917\u0947 \u0926\u094B \u0914\u0930 \u0932\u094B\u0917 \u091C\u0941\u0921\u093C\u0924\u0947 \u0939\u0948\u0902",
"intro.createTitle": "\u0928\u092F\u093E \u091A\u0948\u0928\u0932 \u092C\u0928\u093E\u090F\u0901",
"intro.createDesc": "\u0906\u092A\u0915\u093E \u0909\u092A\u0915\u0930\u0923 \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901 \u0914\u0930 \u090F\u0915 \u092C\u093E\u0930 \u0915\u093E\u092E \u0906\u0928\u0947 \u0935\u093E\u0932\u093E \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u092C\u0928\u093E\u0924\u093E \u0939\u0948\u0964 \u0907\u0928\u092E\u0947\u0902 \u0938\u0947 \u0915\u0941\u091B \u092D\u0940 \u0915\u093F\u0938\u0940 \u0938\u0930\u094D\u0935\u0930 \u0924\u0915 \u0928\u0939\u0940\u0902 \u091C\u093E\u0924\u093E\u0964",
"intro.createCta": "\u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901 \u0914\u0930 \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u092C\u0928\u093E\u090F\u0901",
"intro.joinTitle": "\u091A\u0948\u0928\u0932 \u092E\u0947\u0902 \u0936\u093E\u092E\u093F\u0932 \u0939\u094B\u0902",
"intro.scanTitle": "\u0915\u0948\u092E\u0930\u0947 \u0938\u0947 QR \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
"intro.scanSubtitle": "\u0938\u092C\u0938\u0947 \u0924\u0947\u091C\u093C - \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u0940 \u0938\u094D\u0915\u094D\u0930\u0940\u0928 \u092A\u0930 \u0915\u0948\u092E\u0930\u093E \u0930\u0916\u0947\u0902",
"intro.orPasteCode": "\u092F\u093E \u0915\u094B\u0921 \u091A\u093F\u092A\u0915\u093E\u090F\u0901",
"intro.pastePlaceholder": "\u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0915\u094B\u0921 \u092F\u0939\u093E\u0901 \u091A\u093F\u092A\u0915\u093E\u090F\u0901\u2026",
"intro.connect": "\u091C\u094B\u0921\u093C\u0947\u0902",
"intro.connecting": "\u092A\u094D\u0930\u0915\u094D\u0930\u093F\u092F\u093E \u091C\u093E\u0930\u0940\u2026",
"roadmap.r1.title": "\u0935\u093F\u0915\u093E\u0938 \u0915\u0940 \u0936\u0941\u0930\u0941\u0906\u0924",
"roadmap.r1.sub": "\u0935\u093F\u091A\u093E\u0930, \u092A\u094D\u0930\u094B\u091F\u094B\u091F\u093E\u0907\u092A \u0914\u0930 \u092C\u0941\u0928\u093F\u092F\u093E\u0926\u0940 \u0922\u093E\u0901\u091A\u093E",
"roadmap.r1.date": "2025 \u0915\u0940 \u0936\u0941\u0930\u0941\u0906\u0924",
"roadmap.r1.features": [
"\u0905\u0935\u0927\u093E\u0930\u0923\u093E \u0914\u0930 \u0906\u0935\u0936\u094D\u092F\u0915\u0924\u093E\u090F\u0901 \u0924\u092F \u0939\u0941\u0908\u0902",
"\u0924\u0915\u0928\u0940\u0915\u0940 \u091A\u092F\u0928: WebRTC, P2P, \u0915\u094D\u0930\u093F\u092A\u094D\u091F\u094B\u0917\u094D\u0930\u093E\u092B\u093C\u0940",
"\u0938\u0902\u0926\u0947\u0936 \u092D\u0947\u091C\u0928\u0947 \u0915\u0947 \u092A\u0939\u0932\u0947 \u092A\u094D\u0930\u094B\u091F\u094B\u091F\u093E\u0907\u092A",
"\u0930\u093F\u092A\u0949\u091C\u093C\u093F\u091F\u0930\u0940 \u0914\u0930 CI \u0915\u0940 \u0938\u094D\u0925\u093E\u092A\u0928\u093E",
"\u092C\u0941\u0928\u093F\u092F\u093E\u0926\u0940 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0922\u093E\u0901\u091A\u093E",
"UX/UI \u0921\u093F\u091C\u093C\u093E\u0907\u0928"
],
"roadmap.r2.title": "\u0905\u0932\u094D\u092B\u093C\u093E \u0930\u093F\u0932\u0940\u091C\u093C",
"roadmap.r2.sub": "\u092A\u0939\u0932\u093E \u0938\u093E\u0930\u094D\u0935\u091C\u0928\u093F\u0915 \u0905\u0932\u094D\u092B\u093C\u093E: \u092C\u0941\u0928\u093F\u092F\u093E\u0926\u0940 \u091A\u0948\u091F \u0914\u0930 \u0915\u0941\u0902\u091C\u0940 \u0935\u093F\u0928\u093F\u092E\u092F",
"roadmap.r2.date": "\u0935\u0938\u0902\u0924 2025",
"roadmap.r2.features": [
"WebRTC \u092A\u0930 \u092C\u0941\u0928\u093F\u092F\u093E\u0926\u0940 P2P \u0938\u0902\u0926\u0947\u0936",
"\u0938\u0930\u0932 \u090F\u0902\u0921-\u091F\u0942-\u090F\u0902\u0921 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 (\u092A\u094D\u0930\u0926\u0930\u094D\u0936\u0928 \u092F\u094B\u091C\u0928\u093E)",
"\u0938\u094D\u0925\u093F\u0930 \u0938\u093F\u0917\u094D\u0928\u0932\u093F\u0902\u0917 \u0914\u0930 \u092A\u0941\u0928\u0903 \u091C\u0941\u0921\u093C\u093E\u0935",
"\u092A\u0930\u0940\u0915\u094D\u0937\u0923 \u0915\u0947 \u0932\u093F\u090F \u0928\u094D\u092F\u0942\u0928\u0924\u092E \u0907\u0902\u091F\u0930\u092B\u093C\u0947\u0938",
"\u0936\u0941\u0930\u0941\u0906\u0924\u0940 \u092A\u0930\u0940\u0915\u094D\u0937\u0915\u094B\u0902 \u0938\u0947 \u092A\u094D\u0930\u0924\u093F\u0915\u094D\u0930\u093F\u092F\u093E"
],
"roadmap.r3.title": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u092E\u091C\u093C\u092C\u0942\u0924 \u0939\u0941\u0908",
"roadmap.r3.sub": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u094B \u0915\u0938\u093E \u0917\u092F\u093E \u0914\u0930 \u0938\u094D\u0925\u093F\u0930 \u0936\u093E\u0916\u093E \u091C\u093E\u0930\u0940 \u0939\u0941\u0908",
"roadmap.r3.date": "\u0917\u0930\u094D\u092E\u0940 2025",
"roadmap.r3.features": [
"ECDH/ECDSA \u0915\u093E \u0935\u093E\u0938\u094D\u0924\u0935\u093F\u0915 \u0909\u092A\u092F\u094B\u0917",
"\u0905\u0917\u094D\u0930\u0917\u093E\u092E\u0940 \u0917\u094B\u092A\u0928\u0940\u092F\u0924\u093E \u0914\u0930 \u0915\u0941\u0902\u091C\u0940 \u092C\u0926\u0932\u093E\u0935",
"\u092C\u0947\u0939\u0924\u0930 \u092A\u094D\u0930\u092E\u093E\u0923\u0940\u0915\u0930\u0923 \u091C\u093E\u0901\u091A",
"\u092B\u093C\u093E\u0907\u0932 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0914\u0930 \u092C\u0921\u093C\u0947 \u0921\u0947\u091F\u093E \u0915\u093E \u0938\u094D\u0925\u093E\u0928\u093E\u0902\u0924\u0930\u0923",
"\u092C\u0941\u0928\u093F\u092F\u093E\u0926\u0940 \u0915\u094D\u0930\u093F\u092A\u094D\u091F\u094B \u092A\u094D\u0930\u0915\u094D\u0930\u093F\u092F\u093E\u0913\u0902 \u0915\u093E \u0911\u0921\u093F\u091F"
],
"roadmap.r4.title": "\u0935\u093F\u0938\u094D\u0924\u093E\u0930 \u0914\u0930 \u0938\u094D\u0925\u093F\u0930\u0924\u093E",
"roadmap.r4.sub": "\u0928\u0947\u091F\u0935\u0930\u094D\u0915 \u0915\u093E \u0935\u093F\u0938\u094D\u0924\u093E\u0930 \u0914\u0930 \u0938\u094D\u0925\u093F\u0930\u0924\u093E \u092E\u0947\u0902 \u0938\u0941\u0927\u093E\u0930",
"roadmap.r4.date": "\u092A\u0924\u091D\u0921\u093C 2025",
"roadmap.r4.features": [
"P2P \u091C\u0941\u0921\u093C\u093E\u0935 \u0914\u0930 NAT \u092A\u093E\u0930 \u0915\u0930\u0928\u0947 \u0915\u093E \u0905\u0928\u0941\u0915\u0942\u0932\u0928",
"\u092A\u0941\u0928\u0903 \u091C\u0941\u0921\u093C\u093E\u0935 \u0915\u0940 \u0935\u094D\u092F\u0935\u0938\u094D\u0925\u093E \u0914\u0930 \u0938\u0902\u0926\u0947\u0936 \u0915\u0924\u093E\u0930\u0947\u0902",
"\u092E\u094B\u092C\u093E\u0907\u0932 \u092A\u0930 \u0915\u092E \u092C\u0948\u091F\u0930\u0940 \u0916\u092A\u0924",
"\u0915\u0908 \u0909\u092A\u0915\u0930\u0923\u094B\u0902 \u0915\u0947 \u092C\u0940\u091A \u0924\u093E\u0932\u092E\u0947\u0932",
"\u0921\u0947\u0935\u0932\u092A\u0930\u094D\u0938 \u0915\u0947 \u0932\u093F\u090F \u0928\u093F\u0917\u0930\u093E\u0928\u0940 \u0914\u0930 \u0932\u0949\u0917\u093F\u0902\u0917 \u0909\u092A\u0915\u0930\u0923"
],
"roadmap.r5.title": "\u0928\u093F\u091C\u0924\u093E \u0938\u092C\u0938\u0947 \u092A\u0939\u0932\u0947",
"roadmap.r5.sub": "\u0927\u094D\u092F\u093E\u0928 \u0928\u093F\u091C\u0924\u093E \u092A\u0930: \u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0918\u091F\u093E\u0928\u093E",
"roadmap.r5.date": "\u0938\u0930\u094D\u0926\u0940 2025",
"roadmap.r5.features": [
"\u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0914\u0930 \u092A\u0939\u091A\u093E\u0928-\u091A\u093F\u0939\u094D\u0928 \u092E\u0947\u0902 \u0915\u092E\u0940",
"\u0911\u0928\u093F\u092F\u0928 \u0930\u0942\u091F\u093F\u0902\u0917 \u0914\u0930 DHT \u0915\u0947 \u092A\u094D\u0930\u092F\u094B\u0917",
"\u0917\u0941\u092E\u0928\u093E\u092E \u091C\u0941\u0921\u093C\u093E\u0935 \u0915\u0947 \u0935\u093F\u0915\u0932\u094D\u092A",
"\u0916\u0941\u0932\u0947 \u0915\u094B\u0921 \u0911\u0921\u093F\u091F \u0915\u0940 \u0924\u0948\u092F\u093E\u0930\u0940",
"\u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u092E\u0947\u0902 \u0938\u0941\u0927\u093E\u0930"
],
"roadmap.r6.title": "Enhanced Security Edition",
"roadmap.r6.sub": "\u092A\u0942\u0930\u0940 ASN.1 \u091C\u093E\u0901\u091A \u0915\u0947 \u0938\u093E\u0925 18 \u092A\u0930\u0924\u094B\u0902 \u0935\u093E\u0932\u0940 \u0938\u0948\u0928\u094D\u092F \u0938\u094D\u0924\u0930 \u0915\u0940 \u0915\u094D\u0930\u093F\u092A\u094D\u091F\u094B\u0917\u094D\u0930\u093E\u092B\u093C\u0940",
"roadmap.r6.date": "2025 \u0915\u093E \u0905\u0902\u0924",
"roadmap.r6.features": [
"\u0924\u093F\u0939\u0930\u0940 \u0938\u0941\u0930\u0915\u094D\u0937\u093E: ECDH + DTLS + SAS",
"ECDH P-384 \u0914\u0930 AES-GCM 256-\u092C\u093F\u091F \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928",
"DTLS \u092B\u093C\u093F\u0902\u0917\u0930\u092A\u094D\u0930\u093F\u0902\u091F \u0915\u0940 \u091C\u093E\u0901\u091A",
"SAS (\u0932\u0918\u0941 \u092A\u094D\u0930\u092E\u093E\u0923\u0940\u0915\u0930\u0923 \u0938\u094D\u091F\u094D\u0930\u093F\u0902\u0917) \u0938\u0924\u094D\u092F\u093E\u092A\u0928",
"\u0915\u0941\u0902\u091C\u0940 \u092C\u0926\u0932\u093E\u0935 \u0915\u0947 \u0938\u093E\u0925 \u0905\u0917\u094D\u0930\u0917\u093E\u092E\u0940 \u0917\u094B\u092A\u0928\u0940\u092F\u0924\u093E",
"\u092C\u0940\u091A \u092E\u0947\u0902 \u092C\u0948\u0920\u0947 \u0939\u092E\u0932\u093E\u0935\u0930 \u0938\u0947 \u092E\u091C\u093C\u092C\u0942\u0924 \u092C\u091A\u093E\u0935",
"\u092A\u0942\u0930\u0940 ASN.1 DER \u091C\u093E\u0901\u091A",
"OID \u0914\u0930 EC \u092C\u093F\u0902\u0926\u0941\u0913\u0902 \u0915\u0940 \u091C\u093E\u0901\u091A",
"SPKI \u0938\u0902\u0930\u091A\u0928\u093E \u0915\u0940 \u091C\u093E\u0901\u091A",
"P2P WebRTC \u0922\u093E\u0901\u091A\u093E",
"\u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093E",
"100% \u0916\u0941\u0932\u093E \u0938\u094D\u0930\u094B\u0924 \u0915\u094B\u0921"
],
"roadmap.r7.title": "Desktop Edition",
"roadmap.r7.sub": "Windows, macOS \u0914\u0930 Linux \u0915\u0947 \u0932\u093F\u090F \u092E\u0942\u0932 \u0921\u0947\u0938\u094D\u0915\u091F\u0949\u092A \u0910\u092A",
"roadmap.r7.date": "2026 \u0915\u0940 \u0936\u0941\u0930\u0941\u0906\u0924",
"roadmap.r7.features": [
"Windows \u0921\u0947\u0938\u094D\u0915\u091F\u0949\u092A \u0910\u092A (Tauri v2)",
"macOS \u0921\u0947\u0938\u094D\u0915\u091F\u0949\u092A \u0910\u092A (Tauri v2)",
"Linux AppImage (Tauri v2)",
"\u0924\u0924\u094D\u0915\u093E\u0932 \u0938\u0942\u091A\u0928\u093E\u090F\u0901",
"\u0938\u094D\u0935\u0924\u0903 \u092A\u0941\u0928\u0903 \u091C\u0941\u0921\u093C\u093E\u0935",
"\u0909\u092A\u0915\u0930\u0923\u094B\u0902 \u0915\u0947 \u092C\u0940\u091A \u0924\u093E\u0932\u092E\u0947\u0932",
"\u092C\u0947\u0939\u0924\u0930 \u0907\u0902\u091F\u0930\u092B\u093C\u0947\u0938",
"100 MB \u0924\u0915 \u0915\u0940 \u092B\u093C\u093E\u0907\u0932\u0947\u0902"
],
"roadmap.r8.title": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0906\u0935\u093E\u091C\u093C \u0914\u0930 \u0915\u0949\u0932",
"roadmap.r8.sub": "\u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0935\u0949\u0907\u0938 \u0938\u0902\u0926\u0947\u0936, \u0911\u0921\u093F\u092F\u094B \u0914\u0930 \u0935\u0940\u0921\u093F\u092F\u094B \u0915\u0949\u0932",
"roadmap.r8.date": "2026 \u0915\u0940 \u0936\u0941\u0930\u0941\u0906\u0924",
"roadmap.r8.features": [
"\u090F\u0902\u0921-\u091F\u0942-\u090F\u0902\u0921 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0935\u0949\u0907\u0938 \u0938\u0902\u0926\u0947\u0936",
"\u0906\u092E\u0928\u0947-\u0938\u093E\u092E\u0928\u0947 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0911\u0921\u093F\u092F\u094B \u0915\u0949\u0932 (WebRTC)",
"\u0906\u092E\u0928\u0947-\u0938\u093E\u092E\u0928\u0947 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0935\u0940\u0921\u093F\u092F\u094B \u0915\u0949\u0932 (WebRTC)",
"\u0932\u093E\u0907\u0935 \u092E\u0940\u0921\u093F\u092F\u093E \u0915\u0947 \u0932\u093F\u090F \u0905\u0917\u094D\u0930\u0917\u093E\u092E\u0940 \u0917\u094B\u092A\u0928\u0940\u092F\u0924\u093E",
"SRTP/DTLS \u0938\u0947 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u092E\u0940\u0921\u093F\u092F\u093E \u0927\u093E\u0930\u093E\u090F\u0901",
"\u0915\u0949\u0932 \u0915\u0947 \u0926\u094C\u0930\u093E\u0928 SAS \u0938\u0924\u094D\u092F\u093E\u092A\u0928",
"\u0915\u0949\u0932 \u0938\u0942\u091A\u0928\u093E\u090F\u0901 \u0914\u0930 \u0938\u094D\u0935\u0924\u0903 \u092A\u0941\u0928\u0903 \u091C\u0941\u0921\u093C\u093E\u0935",
"\u0915\u092E \u0935\u093F\u0932\u0902\u092C \u0935\u093E\u0932\u093E P2P \u092E\u0940\u0921\u093F\u092F\u093E"
],
"roadmap.r9.title": "\u0938\u092E\u0942\u0939 \u0938\u0902\u0935\u093E\u0926",
"roadmap.r9.sub": "\u0928\u093F\u091C\u0924\u093E \u092C\u0928\u093E\u090F \u0930\u0916\u0924\u0947 \u0939\u0941\u090F \u0938\u092E\u0942\u0939 \u091A\u0948\u091F",
"roadmap.r9.date": "\u0905\u092D\u0940",
"roadmap.r9.features": [
"8 \u0932\u094B\u0917\u094B\u0902 \u0924\u0915 P2P \u0938\u092E\u0942\u0939 \u091A\u0948\u091F",
"\u092E\u0947\u0936 \u0935\u093F\u0924\u0930\u0923, \u0914\u0930 \u0935\u093F\u0915\u0932\u094D\u092A \u092E\u0947\u0902 \u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930\u093F\u0924 \u0930\u093F\u0932\u0947",
"\u090F\u0915 \u0939\u0940 \u0938\u092E\u0942\u0939 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u094B\u0921, \u091C\u093F\u0938\u0947 \u0938\u092C \u092E\u093F\u0932\u093E\u0924\u0947 \u0939\u0948\u0902",
"\u0915\u094B\u0921 \u0905\u0928\u0941\u092E\u093E\u0928 \u0932\u0917\u093E\u0928\u0947 \u0938\u0947 \u092C\u091A\u093E\u0935 \u0915\u0947 \u0932\u093F\u090F \u092A\u0939\u0932\u0947 \u0935\u091A\u0928, \u092B\u093F\u0930 \u092A\u094D\u0930\u0915\u091F\u0940\u0915\u0930\u0923",
"\u0938\u092E\u0942\u0939 \u0915\u0940 \u0905\u092A\u0928\u0940 \u092A\u0939\u091A\u093E\u0928 \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901, \u092C\u0928\u093E\u0935\u091F \u0938\u0947 \u0939\u0940 \u0915\u094D\u0937\u0923\u093F\u0915",
"\u092F\u0941\u0917-\u0915\u094D\u0930\u092E \u0915\u0947 \u0938\u093E\u0925 \u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930\u093F\u0924 \u0938\u0926\u0938\u094D\u092F \u0938\u0942\u091A\u0940",
"\u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930\u093F\u0924 \u0938\u0902\u0926\u0947\u0936, \u0924\u093E\u0915\u093F \u0905\u0932\u0917-\u0905\u0932\u0917 \u0930\u093F\u0915\u0949\u0930\u094D\u0921 \u0938\u093F\u0926\u094D\u0927 \u0915\u093F\u092F\u093E \u091C\u093E \u0938\u0915\u0947",
"\u0928 \u0938\u0930\u094D\u0935\u0930, \u0928 \u0938\u093E\u091D\u093E \u0938\u092E\u0942\u0939 \u0915\u0941\u0902\u091C\u0940, \u0928 \u0907\u0924\u093F\u0939\u093E\u0938"
],
"roadmap.r10.title": "Mobile Edition",
"roadmap.r10.sub": "iOS \u0914\u0930 Android \u0915\u0947 \u0932\u093F\u090F \u092E\u0942\u0932 \u092E\u094B\u092C\u093E\u0907\u0932 \u0910\u092A",
"roadmap.r10.date": "2027 \u0915\u0940 \u0926\u0942\u0938\u0930\u0940 \u0924\u093F\u092E\u093E\u0939\u0940",
"roadmap.r10.features": [
"iOS \u092E\u0942\u0932 \u0910\u092A (Swift/SwiftUI)",
"Android \u092E\u0942\u0932 \u0910\u092A (Kotlin/Jetpack Compose)",
"\u092E\u094B\u092C\u093E\u0907\u0932 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u092E\u0947\u0902 PWA \u0938\u092E\u0930\u094D\u0925\u0928",
"\u0924\u0924\u094D\u0915\u093E\u0932 \u092A\u0941\u0936 \u0938\u0942\u091A\u0928\u093E\u090F\u0901",
"\u092C\u0948\u091F\u0930\u0940 \u0905\u0928\u0941\u0915\u0942\u0932\u0928",
"\u092E\u094B\u092C\u093E\u0907\u0932 \u0915\u0947 \u0932\u093F\u090F \u092C\u0928\u093E \u0907\u0902\u091F\u0930\u092B\u093C\u0947\u0938",
"\u0911\u092B\u093C\u0932\u093E\u0907\u0928 \u0938\u0902\u0926\u0947\u0936 \u0915\u0924\u093E\u0930",
"\u092C\u093E\u092F\u094B\u092E\u0947\u091F\u094D\u0930\u093F\u0915 \u092A\u094D\u0930\u092E\u093E\u0923\u0940\u0915\u0930\u0923"
],
"roadmap.r11.title": "\u0915\u094D\u0935\u093E\u0902\u091F\u092E-\u092A\u094D\u0930\u0924\u093F\u0930\u094B\u0927\u0940 \u0938\u0902\u0938\u094D\u0915\u0930\u0923",
"roadmap.r11.sub": "\u0915\u094D\u0935\u093E\u0902\u091F\u092E \u0915\u0902\u092A\u094D\u092F\u0942\u091F\u0930\u094B\u0902 \u0938\u0947 \u092C\u091A\u093E\u0935",
"roadmap.r11.date": "2027 \u0915\u0940 \u091A\u094C\u0925\u0940 \u0924\u093F\u092E\u093E\u0939\u0940",
"roadmap.r11.features": [
"\u092A\u094B\u0938\u094D\u091F-\u0915\u094D\u0935\u093E\u0902\u091F\u092E \u0915\u094D\u0930\u093F\u092A\u094D\u091F\u094B\u0917\u094D\u0930\u093E\u092B\u093C\u0940 CRYSTALS-Kyber",
"SPHINCS+ \u0921\u093F\u091C\u093F\u091F\u0932 \u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930",
"\u092E\u093F\u0936\u094D\u0930\u093F\u0924 \u092F\u094B\u091C\u0928\u093E: \u092A\u093E\u0930\u0902\u092A\u0930\u093F\u0915 \u0914\u0930 \u092A\u094B\u0938\u094D\u091F-\u0915\u094D\u0935\u093E\u0902\u091F\u092E",
"\u0915\u094D\u0935\u093E\u0902\u091F\u092E-\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0915\u0941\u0902\u091C\u0940 \u0935\u093F\u0928\u093F\u092E\u092F",
"\u0905\u0926\u094D\u092F\u0924\u0928 \u0939\u0948\u0936\u093F\u0902\u0917 \u090F\u0932\u094D\u0917\u094B\u0930\u093F\u0926\u092E",
"\u092E\u094C\u091C\u0942\u0926\u093E \u0938\u0924\u094D\u0930\u094B\u0902 \u0915\u093E \u0938\u094D\u0925\u093E\u0928\u093E\u0902\u0924\u0930\u0923",
"v5.x \u0915\u0947 \u0938\u093E\u0925 \u0938\u0902\u0917\u0924\u0924\u093E",
"\u0915\u094D\u0935\u093E\u0902\u091F\u092E-\u092A\u094D\u0930\u0924\u093F\u0930\u094B\u0927\u0940 \u092A\u094D\u0930\u094B\u091F\u094B\u0915\u0949\u0932"
],
"roadmap.r12.title": "\u0935\u093F\u0915\u0947\u0902\u0926\u094D\u0930\u093F\u0924 \u0928\u0947\u091F\u0935\u0930\u094D\u0915",
"roadmap.r12.sub": "\u092A\u0942\u0930\u0940 \u0924\u0930\u0939 \u0935\u093F\u0915\u0947\u0902\u0926\u094D\u0930\u093F\u0924 \u0928\u0947\u091F\u0935\u0930\u094D\u0915",
"roadmap.r12.date": "2028",
"roadmap.r12.features": [
"\u0928\u094B\u0921\u094D\u0938 \u0915\u093E \u092E\u0947\u0936 \u0928\u0947\u091F\u0935\u0930\u094D\u0915",
"\u0938\u093E\u0925\u0940 \u0916\u094B\u091C\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F DHT",
"\u0905\u0902\u0924\u0930\u094D\u0928\u093F\u0939\u093F\u0924 \u0911\u0928\u093F\u092F\u0928 \u0930\u0942\u091F\u093F\u0902\u0917",
"\u091F\u094B\u0915\u0928\u0949\u092E\u093F\u0915\u094D\u0938 \u0914\u0930 \u0928\u094B\u0921 \u092A\u094D\u0930\u094B\u0924\u094D\u0938\u093E\u0939\u0928",
"DAO \u0915\u0947 \u091C\u093C\u0930\u093F\u090F \u0938\u0902\u091A\u093E\u0932\u0928",
"\u0905\u0928\u094D\u092F \u0928\u0947\u091F\u0935\u0930\u094D\u0915\u094B\u0902 \u0915\u0947 \u0938\u093E\u0925 \u0905\u0902\u0924\u0930-\u0938\u0902\u091A\u093E\u0932\u0928",
"\u092E\u0902\u091A\u094B\u0902 \u0915\u0947 \u092C\u0940\u091A \u0938\u0902\u0917\u0924\u0924\u093E",
"\u0938\u094D\u0935\u092F\u0902 \u0920\u0940\u0915 \u0939\u094B\u0928\u0947 \u0935\u093E\u0932\u093E \u0928\u0947\u091F\u0935\u0930\u094D\u0915"
],
"roadmap.r13.title": "AI \u0928\u093F\u091C\u0924\u093E \u0938\u0939\u093E\u092F\u0915",
"roadmap.r13.sub": "\u0928\u093F\u091C\u0924\u093E \u0914\u0930 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u0943\u0924\u094D\u0930\u093F\u092E \u092C\u0941\u0926\u094D\u0927\u093F\u092E\u0924\u094D\u0924\u093E",
"roadmap.r13.date": "2028 \u0915\u0947 \u092C\u093E\u0926",
"roadmap.r13.features": [
"\u0909\u092A\u0915\u0930\u0923 \u092A\u0930 \u0939\u0940 AI \u0938\u0947 \u0916\u093C\u0924\u0930\u0947 \u0915\u093E \u0935\u093F\u0936\u094D\u0932\u0947\u0937\u0923",
"\u092C\u0940\u091A \u092E\u0947\u0902 \u092C\u0948\u0920\u0947 \u0939\u092E\u0932\u093E\u0935\u0930 \u0915\u0940 \u0938\u094D\u0935\u0924\u0903 \u092A\u0939\u091A\u093E\u0928",
"\u0905\u0928\u0941\u0915\u0942\u0932\u0940 \u0915\u094D\u0930\u093F\u092A\u094D\u091F\u094B\u0917\u094D\u0930\u093E\u092B\u093C\u0940",
"\u0906\u092A\u0915\u0947 \u0905\u0928\u0941\u0930\u0942\u092A \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0941\u091D\u093E\u0935",
"\u0936\u0942\u0928\u094D\u092F-\u091C\u094D\u091E\u093E\u0928 \u092E\u0936\u0940\u0928 \u0932\u0930\u094D\u0928\u093F\u0902\u0917",
"\u0928\u093F\u091C\u0940 AI \u0938\u0939\u093E\u092F\u0915",
"\u092A\u0942\u0930\u094D\u0935\u093E\u0928\u0941\u092E\u093E\u0928 \u0906\u0927\u093E\u0930\u093F\u0924 \u0938\u0941\u0930\u0915\u094D\u0937\u093E",
"\u0939\u092E\u0932\u094B\u0902 \u0938\u0947 \u0938\u094D\u0935\u093E\u092F\u0924\u094D\u0924 \u092C\u091A\u093E\u0935"
],
"handshake.step1": "ECDH P-384 \u0915\u0941\u0902\u091C\u0940 \u092F\u0941\u0917\u094D\u092E \u092C\u0928 \u0930\u0939\u093E \u0939\u0948",
"handshake.step2": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0915\u094B\u0921 \u0928\u093F\u0915\u093E\u0932\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948",
"handshake.step3": "\u0905\u0917\u094D\u0930\u0917\u093E\u092E\u0940 \u0917\u094B\u092A\u0928\u0940\u092F\u0924\u093E \u0924\u092F \u0915\u0940 \u091C\u093E \u0930\u0939\u0940 \u0939\u0948",
"handshake.securingTitle": "\u0906\u092A\u0915\u093E \u091A\u0948\u0928\u0932 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0915\u093F\u092F\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948",
"handshake.answerTitle": "\u0906\u092A\u0915\u093E \u0909\u0924\u094D\u0924\u0930 \u092C\u0928\u093E\u092F\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948",
"handshake.securingDesc": "\u0910\u0938\u0940 \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901 \u0917\u0922\u093C\u0940 \u091C\u093E \u0930\u0939\u0940 \u0939\u0948\u0902 \u091C\u094B \u091B\u0947\u0921\u093C\u091B\u093E\u0921\u093C \u091D\u0947\u0932 \u0938\u0915\u0947\u0902\u0964",
"handshake.shareTitle": "\u0905\u092A\u0928\u093E \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0938\u093E\u091D\u093E \u0915\u0930\u0947\u0902",
"handshake.sendAnswerTitle": "\u0905\u092A\u0928\u093E \u0909\u0924\u094D\u0924\u0930 \u0935\u093E\u092A\u0938 \u092D\u0947\u091C\u0947\u0902",
"handshake.shareDesc": "QR \u0926\u093F\u0916\u093E\u0907\u090F \u092F\u093E \u0915\u094B\u0921 \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u094B \u092D\u0947\u091C\u093F\u090F\u0964 \u092F\u0939 \u090F\u0915 \u0939\u0940 \u092C\u093E\u0930 \u0915\u093E\u092E \u0906\u0924\u093E \u0939\u0948 \u0914\u0930 \u091C\u0932\u094D\u0926\u0940 \u0938\u092E\u093E\u092A\u094D\u0924 \u0939\u094B \u091C\u093E\u0924\u093E \u0939\u0948\u0964",
"handshake.sendAnswerDesc": "\u092F\u0939 \u0909\u0924\u094D\u0924\u0930 \u0909\u0938 \u0935\u094D\u092F\u0915\u094D\u0924\u093F \u0915\u094B \u0926\u0940\u091C\u093F\u090F \u091C\u093F\u0938\u0928\u0947 \u091A\u0948\u0928\u0932 \u092C\u0928\u093E\u092F\u093E, \u0924\u093E\u0915\u093F \u0935\u0939 \u0939\u093E\u0925 \u092E\u093F\u0932\u093E\u0928\u093E \u092A\u0942\u0930\u093E \u0915\u0930 \u0938\u0915\u0947\u0964",
"handshake.establish": "\u091C\u0941\u0921\u093C\u093E\u0935 \u092C\u0928\u093E\u090F\u0901",
"handshake.thenReceive": "\u092B\u093F\u0930 \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u093E \u092D\u0947\u091C\u093E \u0909\u0924\u094D\u0924\u0930 \u0932\u0940\u091C\u093F\u090F",
"handshake.pasteAnswerPlaceholder": "\u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u093E \u0909\u0924\u094D\u0924\u0930 \u0915\u094B\u0921 \u091A\u093F\u092A\u0915\u093E\u090F\u0901\u2026",
"handshake.answerSentNote": "\u092F\u0939 \u0909\u0924\u094D\u0924\u0930 \u091A\u0948\u0928\u0932 \u092C\u0928\u093E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u094B \u092D\u0947\u091C\u093F\u090F \u0914\u0930 \u0930\u0941\u0915\u093F\u090F - \u091C\u0948\u0938\u0947 \u0939\u0940 \u0935\u0947 \u091C\u0941\u0921\u093C\u0947\u0902\u0917\u0947, \u091A\u0948\u091F \u0916\u0941\u0932 \u091C\u093E\u090F\u0917\u0940\u0964",
"handshake.qrHint": "\u091C\u092C \u0924\u0915 \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u093E \u0915\u094B\u0921 \u092A\u0922\u093C \u0928 \u0932\u0947, \u0907\u0938\u0947 \u0916\u0941\u0932\u093E \u0930\u0916\u093F\u090F\u0964",
"handshake.qrHintFrames": "\u0939\u093E\u0925 \u092E\u093F\u0932\u093E\u0928\u093E {frames} \u092B\u093C\u094D\u0930\u0947\u092E\u094B\u0902 \u092E\u0947\u0902 \u092C\u0901\u091F\u093E \u0939\u0948 - \u091C\u092C \u0924\u0915 \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u093E \u0938\u092C \u092A\u0922\u093C \u0928 \u0932\u0947, \u0907\u0938\u0947 \u0916\u0941\u0932\u093E \u0930\u0916\u093F\u090F\u0964",
"verify.title": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0924\u094D\u092F\u093E\u092A\u0928",
"verify.desc": "\u0907\u0938 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u094B\u0921 \u0915\u094B \u0915\u093F\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0930\u093E\u0938\u094D\u0924\u0947 \u0938\u0947 (\u0906\u0935\u093E\u091C\u093C \u092A\u0930 \u092F\u093E \u0906\u092E\u0928\u0947-\u0938\u093E\u092E\u0928\u0947) \u092E\u093F\u0932\u093E\u0907\u090F, \u092B\u093F\u0930 \u0909\u0938\u0947 \u0932\u093F\u0916\u0915\u0930 \u091A\u0948\u091F \u0916\u094B\u0932\u093F\u090F\u0964",
"verify.enterLabel": "\u092E\u093F\u0932\u093E\u092F\u093E \u0939\u0941\u0906 \u0915\u094B\u0921 \u0932\u093F\u0916\u0947\u0902",
"verify.placeholder": "\u0915\u094B\u0921 \u092F\u0939\u093E\u0901 \u0932\u093F\u0916\u0947\u0902",
"verify.confirm": "\u0915\u094B\u0921 \u092A\u0915\u094D\u0915\u093E \u0915\u0930\u0947\u0902",
"verify.confirmed": "\u092A\u0915\u094D\u0915\u093E \u0939\u0941\u0906",
"verify.mismatch": "\u092E\u0947\u0932 \u0928\u0939\u0940\u0902 \u0916\u093E\u0924\u093E",
"verify.yours": "\u0906\u092A\u0915\u0940 \u092A\u0941\u0937\u094D\u091F\u093F",
"verify.peer": "\u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u0940 \u092A\u0941\u0937\u094D\u091F\u093F",
"verify.pending": "\u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u092E\u0947\u0902",
"verify.waiting": "\u0915\u094B\u0921 \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E\u2026",
"verify.verified": "\u091A\u0948\u0928\u0932 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924",
"verify.bothConfirmed": "\u0926\u094B\u0928\u094B\u0902 \u092A\u0915\u094D\u0937\u094B\u0902 \u0928\u0947 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0930 \u0926\u0940\u0964 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u091F \u0916\u0941\u0932 \u0930\u0939\u0940 \u0939\u0948\u2026",
"pwa.bannerTitle": "SecureBit.chat \u0907\u0902\u0938\u094D\u091F\u0949\u0932 \u0915\u0930\u0947\u0902",
"pwa.bannerDesc": "\u092C\u0947\u0939\u0924\u0930 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u0947 \u0938\u093E\u0925 \u092E\u0942\u0932 \u0910\u092A \u091C\u0948\u0938\u093E \u0905\u0928\u0941\u092D\u0935 \u092A\u093E\u0907\u090F",
"pwa.install": "\u0907\u0902\u0938\u094D\u091F\u0949\u0932 \u0915\u0930\u0947\u0902",
"pwa.dismiss": "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
"pwa.close": "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
"pwa.iosTitle": "iOS \u092A\u0930 \u0907\u0902\u0938\u094D\u091F\u0949\u0932 \u0915\u0930\u0947\u0902",
"pwa.iosStep1": "\u0938\u093E\u091D\u093E \u0915\u0930\u0947\u0902 \u092C\u091F\u0928 \u0926\u092C\u093E\u0907\u090F",
"pwa.iosStep1Hint": "\u0906\u092E\u0924\u094C\u0930 \u092A\u0930 Safari \u092E\u0947\u0902 \u0928\u0940\u091A\u0947",
"pwa.iosStep2": "\xAB\u0939\u094B\u092E \u0938\u094D\u0915\u094D\u0930\u0940\u0928 \u092E\u0947\u0902 \u091C\u094B\u0921\u093C\u0947\u0902\xBB \u0922\u0942\u0901\u0922\u093F\u090F",
"pwa.iosStep2Hint": "\u0938\u093E\u091D\u093E \u092E\u0947\u0928\u094D\u092F\u0942 \u092E\u0947\u0902 \u0928\u0940\u091A\u0947 \u0924\u0915 \u091C\u093E\u0907\u090F",
"pwa.iosStep3": "\xAB\u091C\u094B\u0921\u093C\u0947\u0902\xBB \u0926\u092C\u093E\u0907\u090F",
"pwa.iosStep3Hint": "\u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0940\u091C\u093F\u090F, SecureBit.chat \u0907\u0902\u0938\u094D\u091F\u0949\u0932 \u0939\u094B \u091C\u093E\u090F\u0917\u093E",
"pwa.genericTitle": "SecureBit \u0907\u0902\u0938\u094D\u091F\u0949\u0932 \u0915\u0930\u0947\u0902",
"pwa.genericDesc": "\u0939\u0930 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0905\u092A\u0928\u0947 \u0924\u0930\u0940\u0915\u093C\u0947 \u0938\u0947 \u0907\u0902\u0938\u094D\u091F\u0949\u0932 \u0915\u0930\u0924\u093E \u0939\u0948\u0964 \u0905\u092A\u0928\u0947 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0938\u0947 \u092E\u0947\u0932 \u0916\u093E\u0924\u0947 \u091A\u0930\u0923 \u091A\u0941\u0928\u093F\u090F\u0964",
"pwa.gotIt": "\u0938\u092E\u091D \u0917\u092F\u093E",
"pwa.installedTitle": "\u0910\u092A \u0907\u0902\u0938\u094D\u091F\u0949\u0932 \u0939\u094B \u0917\u092F\u093E!",
"pwa.installedIos": "iOS \u0910\u092A \u0907\u0902\u0938\u094D\u091F\u0949\u0932 \u0939\u094B \u0917\u092F\u093E! \u0939\u094B\u092E \u0938\u094D\u0915\u094D\u0930\u0940\u0928 \u0938\u0947 \u0916\u094B\u0932\u093F\u090F\u0964",
"pwa.installedGeneric": "SecureBit.chat \u0905\u092C \u0906\u092A\u0915\u0947 \u0909\u092A\u0915\u0930\u0923 \u092A\u0930 \u0939\u0948",
"pwa.anytimeTitle": "\u091C\u092C \u091A\u093E\u0939\u0947\u0902 \u0907\u0902\u0938\u094D\u091F\u0949\u0932 \u0915\u0930\u0947\u0902",
"pwa.anytimeDesc": "\u0938\u092C\u0938\u0947 \u0905\u091A\u094D\u091B\u0947 \u0905\u0928\u0941\u092D\u0935 \u0915\u0947 \u0932\u093F\u090F, \u0906\u092A SecureBit.chat \u0915\u094B \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0915\u0947 \u092E\u0947\u0928\u094D\u092F\u0942 \u0938\u0947 \u0915\u092D\u0940 \u092D\u0940 \u0907\u0902\u0938\u094D\u091F\u0949\u0932 \u0915\u0930 \u0938\u0915\u0924\u0947 \u0939\u0948\u0902\u0964",
"pwa.ok": "\u0920\u0940\u0915 \u0939\u0948",
"step.open": "\u091A\u0930\u0923 1 \xB7 \u091A\u0948\u0928\u0932 \u0916\u094B\u0932\u0947\u0902",
"step.exchange": "\u091A\u0930\u0923 2 \xB7 \u0906\u0926\u093E\u0928-\u092A\u094D\u0930\u0926\u093E\u0928",
"step.verification": "\u091A\u0930\u0923 3 \xB7 \u0938\u0924\u094D\u092F\u093E\u092A\u0928",
"action.create": "\u092C\u0928\u093E\u090F\u0901",
"action.join": "\u0936\u093E\u092E\u093F\u0932 \u0939\u094B\u0902",
"action.back": "\u092A\u0940\u091B\u0947",
"action.copy": "\u0915\u0949\u092A\u0940 \u0915\u0930\u0947\u0902",
"action.copied": "\u0915\u0949\u092A\u0940 \u0939\u0941\u0906",
"action.scan": "\u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
"action.downloadDesktop": "\u0921\u0947\u0938\u094D\u0915\u091F\u0949\u092A \u0910\u092A \u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0915\u0930\u0947\u0902",
"action.advancedSettings": "\u0909\u0928\u094D\u0928\u0924 \u0938\u0947\u091F\u093F\u0902\u0917\u094D\u0938",
"cred.offerTag": "\u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \xB7 \u092F\u093E \u092A\u093E\u0920 \u0915\u0949\u092A\u0940 \u0915\u0930\u0947\u0902",
"cred.answerTag": "\u0909\u0924\u094D\u0924\u0930 \xB7 \u092F\u093E \u092A\u093E\u0920 \u0915\u0949\u092A\u0940 \u0915\u0930\u0947\u0902",
"cred.reveal": "\u0926\u0947\u0916\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0926\u092C\u093E\u090F\u0901 - \u092F\u0939 \u0915\u094B\u0921 \u0915\u093F\u0938\u0940 \u0915\u094B \u0928 \u092C\u0924\u093E\u090F\u0901",
"qr.title": "QR \u0915\u094B\u0921 \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
"qr.subtitle": "\u0915\u0948\u092E\u0930\u093E \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u0947 QR \u092A\u0930 \u0930\u0916\u0947\u0902",
"qr.scanning": "\u092A\u0922\u093C\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948\u2026",
"qr.hint": "\u091C\u092C \u0924\u0915 \u0938\u093E\u0930\u0947 \u0939\u093F\u0938\u094D\u0938\u0947 \u092A\u0922\u093C \u0928 \u0932\u093F\u090F \u091C\u093E\u090F\u0901, \u0938\u094D\u0925\u093F\u0930 \u0930\u0916\u093F\u090F\u0964 \u0915\u0948\u092E\u0930\u093E \u0909\u092A\u0915\u0930\u0923 \u092A\u0930 \u0939\u0940 \u091A\u0932\u0924\u093E \u0939\u0948 - \u0915\u0941\u091B \u092D\u0940 \u092D\u0947\u091C\u093E \u0928\u0939\u0940\u0902 \u091C\u093E\u0924\u093E\u0964",
"mesh.you": "\u0906\u092A",
"mesh.peer": "\u0938\u093E\u0925\u0940 \xB7 \u0938\u0924\u094D\u0930 1",
"mesh.joined2": "\u092A\u094D\u0930\u093F\u092F\u093E \u091C\u0941\u0921\u093C\u0940\u0902 \xB7 +2",
"mesh.joined3": "\u0905\u0930\u094D\u091C\u0941\u0928 \u091C\u0941\u0921\u093C\u0947 \xB7 +3",
"ice.title": "\u0928\u0947\u091F\u0935\u0930\u094D\u0915 \u0938\u0947\u091F\u093F\u0902\u0917\u094D\u0938",
"ice.subtitle": "\u092F\u0939\u0940\u0902 \u0909\u092A\u0915\u0930\u0923 \u092A\u0930 \u0924\u092F \u0939\u094B\u0924\u093E \u0939\u0948 - \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u094B \u0915\u092D\u0940 \u0928\u0939\u0940\u0902 \u092D\u0947\u091C\u093E \u091C\u093E\u0924\u093E",
"ice.intro": "SecureBit \u0921\u093F\u092B\u093C\u0949\u0932\u094D\u091F \u0930\u0942\u092A \u0938\u0947 \u0938\u093E\u0930\u094D\u0935\u091C\u0928\u093F\u0915 STUN \u0938\u0930\u094D\u0935\u0930\u094B\u0902 \u0938\u0947 \u092A\u0940\u092F\u0930-\u091F\u0942-\u092A\u0940\u092F\u0930 \u091C\u0941\u0921\u093C\u093E\u0935 \u0924\u092F \u0915\u0930\u0924\u093E \u0939\u0948\u0964 \u0905\u0917\u0930 \u0906\u092A \u0916\u093C\u0941\u0926 \u091A\u0932\u093E\u0924\u0947 \u0939\u0948\u0902, \u0924\u094B \u0905\u092A\u0928\u0947 STUN/TURN \u092C\u0924\u093E\u0907\u090F\u0964",
"ice.publicTitle": "\u0938\u093E\u0930\u094D\u0935\u091C\u0928\u093F\u0915 \u0938\u0930\u094D\u0935\u0930 (\u0921\u093F\u092B\u093C\u0949\u0932\u094D\u091F)",
"ice.publicDesc": "\u0915\u094B\u0908 \u0938\u0947\u091F\u093F\u0902\u0917 \u0928\u0939\u0940\u0902 \u091A\u093E\u0939\u093F\u090F\u0964 \u091C\u093C\u094D\u092F\u093E\u0926\u093E\u0924\u0930 \u0932\u094B\u0917\u094B\u0902 \u0915\u0947 \u0932\u093F\u090F \u0915\u093E\u092B\u093C\u0940\u0964",
"ice.customTitle": "\u092E\u0947\u0930\u0947 \u0905\u092A\u0928\u0947 STUN/TURN \u0938\u0930\u094D\u0935\u0930",
"ice.customDesc": "\u0905\u0927\u093F\u0915\u0924\u092E {max} \u0938\u0930\u094D\u0935\u0930\u0964",
"ice.turnNote": "TURN \u0930\u093F\u0932\u0947 \u0926\u094B\u0928\u094B\u0902 \u092A\u0915\u094D\u0937\u094B\u0902 \u0915\u093E IP \u0914\u0930 \u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u0915\u0940 \u091A\u093E\u0932 \u0926\u0947\u0916 \u0938\u0915\u0924\u093E \u0939\u0948, \u092A\u0930 \u0938\u0902\u0926\u0947\u0936\u094B\u0902 \u0915\u0940 \u0938\u093E\u092E\u0917\u094D\u0930\u0940 \u0915\u092D\u0940 \u0928\u0939\u0940\u0902, \u091C\u094B \u090F\u0902\u0921-\u091F\u0942-\u090F\u0902\u0921 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0930\u0939\u0924\u0940 \u0939\u0948\u0964 \u092C\u0947\u0939\u0924\u0930 \u0939\u0948 ",
"ice.turnNoteTls": " (TLS)\u0964",
"ice.test": "\u0938\u0930\u094D\u0935\u0930 \u091C\u093E\u0901\u091A\u0947\u0902",
"ice.testing": "\u091C\u093E\u0901\u091A \u091C\u093E\u0930\u0940\u2026",
"ice.relayTitle": "\u0915\u0947\u0935\u0932-\u0930\u093F\u0932\u0947 \u092E\u094B\u0921",
"ice.relayBadge": "\u0905\u0927\u093F\u0915\u0924\u092E \u0928\u093F\u091C\u0924\u093E",
"ice.relayDesc": "\u0938\u093E\u0930\u093E \u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 TURN \u0938\u0947 \u092D\u0947\u091C\u0924\u093E \u0939\u0948, \u0924\u093E\u0915\u093F \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u094B \u0906\u092A\u0915\u093E IP \u0915\u092D\u0940 \u0928 \u092A\u0924\u093E \u091A\u0932\u0947\u0964 \u0907\u0938\u0915\u0947 \u0932\u093F\u090F TURN \u0938\u0930\u094D\u0935\u0930 \u091A\u093E\u0939\u093F\u090F\u0964",
"ice.relayWarning": "\u0915\u0947\u0935\u0932-\u0930\u093F\u0932\u0947 \u092E\u094B\u0921 \u091A\u093E\u0932\u0942 \u0939\u0948 \u092A\u0930 \u0915\u094B\u0908 TURN \u0938\u0930\u094D\u0935\u0930 \u0924\u092F \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u091C\u0941\u0921\u093C\u093E\u0935 \u0936\u0941\u0930\u0942 \u0939\u0940 \u0928\u0939\u0940\u0902 \u0939\u094B \u092A\u093E\u090F\u0917\u093E\u0964",
"ice.persist": "\u0907\u0938\u0940 \u0909\u092A\u0915\u0930\u0923 \u092A\u0930 \u0938\u0939\u0947\u091C\u0947\u0902",
"ice.persistDesc": "\u0907\u0938 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u092E\u0947\u0902 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0930\u0942\u092A \u092E\u0947\u0902 \u0938\u0939\u0947\u091C\u093E \u091C\u093E\u0924\u093E \u0939\u0948\u0964 \u092C\u0902\u0926 \u0930\u0916\u0928\u0947 \u092A\u0930 \u0938\u093F\u0930\u094D\u092B\u093C \u0907\u0938\u0940 \u0938\u0924\u094D\u0930 \u0915\u0947 \u0932\u093F\u090F \u0932\u093E\u0917\u0942 \u0939\u094B\u0917\u093E\u0964",
"ice.forget": "\u0938\u0939\u0947\u091C\u093E \u0939\u0941\u0906 \u092D\u0942\u0932 \u091C\u093E\u090F\u0901",
"ice.cancel": "\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
"ice.apply": "\u0932\u093E\u0917\u0942 \u0915\u0930\u0947\u0902",
"ice.errUnavailable": "\u0907\u0938 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u092E\u0947\u0902 WebRTC \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948",
"ice.errInvalid": "\u0938\u0930\u094D\u0935\u0930 \u0915\u0940 \u0938\u0947\u091F\u093F\u0902\u0917 \u0917\u093C\u0932\u0924 \u0939\u0948",
"update.title": "\u0928\u092F\u093E \u0905\u092A\u0921\u0947\u091F \u0909\u092A\u0932\u092C\u094D\u0927 \u0939\u0948",
"update.desc": "SecureBit \u0915\u093E \u0928\u092F\u093E \u0938\u0902\u0938\u094D\u0915\u0930\u0923 \u092E\u093F\u0932\u093E \u0939\u0948\u0964",
"update.currentVersion": "\u092E\u094C\u091C\u0942\u0926\u093E \u0938\u0902\u0938\u094D\u0915\u0930\u0923",
"update.newVersion": "\u0928\u092F\u093E \u0938\u0902\u0938\u094D\u0915\u0930\u0923",
"update.now": "\u0905\u092D\u0940 \u0905\u092A\u0921\u0947\u091F \u0915\u0930\u0947\u0902",
"update.later": "\u092C\u093E\u0926 \u092E\u0947\u0902",
"update.unknown": "\u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
"update.stepSaving": "\u0921\u0947\u091F\u093E \u0938\u0939\u0947\u091C\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948\u2026",
"update.stepSwCaches": "Service Worker \u0915\u0947 \u0915\u0948\u0936 \u0938\u093E\u092B\u093C \u0939\u094B \u0930\u0939\u0947 \u0939\u0948\u0902\u2026",
"update.stepSwUnregister": "Service Worker \u0939\u091F\u093E\u090F \u091C\u093E \u0930\u0939\u0947 \u0939\u0948\u0902\u2026",
"update.stepBrowserCache": "\u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0915\u093E \u0915\u0948\u0936 \u0938\u093E\u092B\u093C \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
"update.stepVersion": "\u0938\u0902\u0938\u094D\u0915\u0930\u0923 \u0905\u092A\u0921\u0947\u091F \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
"update.stepReload": "\u0910\u092A \u092B\u093F\u0930 \u0938\u0947 \u0932\u094B\u0921 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
"update.error": "\u0905\u092A\u0921\u0947\u091F \u092E\u0947\u0902 \u0917\u0921\u093C\u092C\u0921\u093C\u0940\u0964 \u092A\u0947\u091C \u0916\u093C\u0941\u0926 \u0924\u093E\u091C\u093C\u093E \u0915\u0930\u0947\u0902 (Ctrl+F5 \u092F\u093E Cmd+Shift+R)",
"update.confirmSkip": "\u0928\u092F\u093E \u0938\u0902\u0938\u094D\u0915\u0930\u0923 \u0909\u092A\u0932\u092C\u094D\u0927 \u0939\u0948\u0964 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0914\u0930 \u0938\u094D\u0925\u093F\u0930\u0924\u093E \u0915\u0947 \u0932\u093F\u090F \u0905\u092A\u0921\u0947\u091F \u0915\u0930\u0928\u093E \u092C\u0947\u0939\u0924\u0930 \u0939\u0948\u0964 \u092C\u093F\u0928\u093E \u0905\u092A\u0921\u0947\u091F \u0915\u0947 \u0906\u0917\u0947 \u092C\u0922\u093C\u0947\u0902?",
"offline.backOnline": "\u092B\u093F\u0930 \u0938\u0947 \u0911\u0928\u0932\u093E\u0907\u0928",
"offline.mode": "\u0911\u092B\u093C\u0932\u093E\u0907\u0928 \u092E\u094B\u0921",
"offline.dismiss": "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
"offline.lostTitle": "\u091C\u0941\u0921\u093C\u093E\u0935 \u091F\u0942\u091F \u0917\u092F\u093E",
"offline.lostDesc": "SecureBit \u0905\u092D\u0940 \u0911\u092B\u093C\u0932\u093E\u0907\u0928 \u0939\u0948\u0964 \u0915\u0941\u091B \u0938\u0941\u0935\u093F\u0927\u093E\u090F\u0901 \u0938\u0940\u092E\u093F\u0924 \u0939\u0948\u0902, \u092A\u0930 \u0906\u092A\u0915\u093E \u0921\u0947\u091F\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0939\u0948\u0964",
"offline.point1": "\u0906\u092A\u0915\u093E \u0938\u0924\u094D\u0930 \u0914\u0930 \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901 \u092C\u0928\u0940 \u0930\u0939\u0924\u0940 \u0939\u0948\u0902",
"offline.point2": "\u0938\u0930\u094D\u0935\u0930 \u092A\u0930 \u0915\u094B\u0908 \u0921\u0947\u091F\u093E \u0928\u0939\u0940\u0902 \u0930\u0916\u093E \u091C\u093E\u0924\u093E",
"offline.point3": "\u0926\u094B\u092C\u093E\u0930\u093E \u091C\u0941\u0921\u093C\u0924\u0947 \u0939\u0940 \u0938\u0902\u0926\u0947\u0936 \u0914\u0930 \u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u092E\u093F\u0932 \u091C\u093E\u090F\u0901\u0917\u0940",
"offline.continue": "\u0911\u092B\u093C\u0932\u093E\u0907\u0928 \u091C\u093E\u0930\u0940 \u0930\u0916\u0947\u0902",
"offline.restoredTitle": "\u091C\u092C \u0906\u092A \u0926\u094B\u092C\u093E\u0930\u093E \u091C\u0941\u0921\u093C\u0947\u0902\u0917\u0947",
"offline.restoredDesc": "\u091C\u0941\u0921\u093C\u093E\u0935 \u091F\u0942\u091F\u0928\u0947 \u0938\u0947 \u0915\u0941\u091B \u0928\u0939\u0940\u0902 \u091C\u093E\u0924\u093E\u0964 SecureBit \u0938\u092C \u0915\u0941\u091B \u0909\u092A\u0915\u0930\u0923 \u092A\u0930 \u0939\u0940 \u0915\u0924\u093E\u0930 \u092E\u0947\u0902 \u0930\u0916\u0924\u093E \u0939\u0948 \u0914\u0930 \u0911\u0928\u0932\u093E\u0907\u0928 \u0939\u094B\u0924\u0947 \u0939\u0940 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0938\u0924\u094D\u0930 \u0935\u0939\u0940\u0902 \u0938\u0947 \u091A\u0932\u093E\u0924\u093E \u0939\u0948\u0964",
"offline.r1Title": "\u0906\u092A\u0915\u0947 \u0938\u0902\u0926\u0947\u0936 \u092A\u0939\u0941\u0901\u091A \u091C\u093E\u090F\u0901\u0917\u0947",
"offline.r1Desc": "\u0911\u092B\u093C\u0932\u093E\u0907\u0928 \u092E\u0947\u0902 \u0932\u093F\u0916\u093E \u0938\u092C \u0915\u0941\u091B \u0905\u092A\u0928\u0947 \u0906\u092A \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u094B \u091A\u0932\u093E \u091C\u093E\u090F\u0917\u093E\u0964",
"offline.r2Title": "\u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u092A\u0942\u0930\u0940 \u091A\u0932\u0940 \u091C\u093E\u090F\u0901\u0917\u0940",
"offline.r2Desc": "\u092D\u0947\u091C\u0928\u093E \u0935\u0939\u0940\u0902 \u0938\u0947 \u091C\u093E\u0930\u0940 \u0939\u094B\u0917\u093E \u091C\u0939\u093E\u0901 \u0930\u0941\u0915\u093E \u0925\u093E - \u0926\u094B\u092C\u093E\u0930\u093E \u092D\u0947\u091C\u0928\u0947 \u0915\u0940 \u091C\u093C\u0930\u0942\u0930\u0924 \u0928\u0939\u0940\u0902\u0964",
"offline.r3Title": "\u0909\u0928\u0915\u0947 \u0938\u0902\u0926\u0947\u0936 \u0914\u0930 \u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u0906 \u091C\u093E\u090F\u0901\u0917\u0940",
"offline.r3Desc": "\u0930\u0941\u0915\u093E\u0935\u091F \u0915\u0947 \u0926\u094C\u0930\u093E\u0928 \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0928\u0947 \u091C\u094B \u092D\u0947\u091C\u093E, \u0935\u0939 \u0915\u094D\u0930\u092E \u0938\u0947 \u0906\u092A\u0915\u094B \u092E\u093F\u0932 \u091C\u093E\u090F\u0917\u093E\u0964",
"offline.r4Title": "\u0915\u0941\u091B \u092D\u0940 \u0928\u0939\u0940\u0902 \u0916\u094B\u0924\u093E",
"offline.r4Desc": "\u0926\u094B\u092C\u093E\u0930\u093E \u091C\u0941\u0921\u093C\u0928\u0947 \u092A\u0930 \u0915\u094B\u0908 \u0916\u093E\u0932\u0940 \u091C\u0917\u0939 \u0928\u0939\u0940\u0902 \u0930\u0939\u0924\u0940 - \u092C\u093E\u0924\u091A\u0940\u0924 \u0935\u0939\u0940\u0902 \u0938\u0947 \u091A\u0932\u0924\u0940 \u0939\u0948 \u091C\u0939\u093E\u0901 \u0930\u0941\u0915\u0940 \u0925\u0940\u0964",
"offline.gotIt": "\u0938\u092E\u091D \u0917\u092F\u093E",
"qr.showTitle": "QR \u0915\u094B\u0921 \u0926\u093F\u0916\u093E\u090F\u0901",
"qr.showSubtitle": "\u092A\u0942\u0930\u0940 \u0938\u094D\u0915\u094D\u0930\u0940\u0928 \xB7 \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u094B \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0928\u0947 \u0926\u0947\u0902",
"qr.showSubtitleFrames": "\u092A\u0942\u0930\u0940 \u0938\u094D\u0915\u094D\u0930\u0940\u0928 \xB7 \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u094B \u0938\u092D\u0940 {frames} \u092B\u093C\u094D\u0930\u0947\u092E \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0928\u0947 \u0926\u0947\u0902",
"notify.enabledBody": "\u0938\u0942\u091A\u0928\u093E\u090F\u0901 \u091A\u093E\u0932\u0942 \u0939\u094B \u0917\u0908\u0902\u0964 \u0928\u090F \u0938\u0902\u0926\u0947\u0936\u094B\u0902 \u092A\u0930 \u0906\u092A\u0915\u094B \u092C\u0924\u093E\u092F\u093E \u091C\u093E\u090F\u0917\u093E\u0964",
"notify.workingBody": "\u0938\u0942\u091A\u0928\u093E\u090F\u0901 \u0915\u093E\u092E \u0915\u0930 \u0930\u0939\u0940 \u0939\u0948\u0902\u0964 \u0928\u090F \u0938\u0902\u0926\u0947\u0936\u094B\u0902 \u092A\u0930 \u0906\u092A\u0915\u094B \u092C\u0924\u093E\u092F\u093E \u091C\u093E\u090F\u0917\u093E\u0964",
"pw.label": "\u092A\u093E\u0938\u0935\u0930\u094D\u0921 \u0915\u093E \u0916\u093C\u093E\u0928\u093E",
"pw.placeholder": "\u092A\u093E\u0938\u0935\u0930\u094D\u0921 \u0932\u093F\u0916\u0947\u0902\u2026",
"pw.decrypt": "\u0921\u093F\u0915\u094D\u0930\u093F\u092A\u094D\u091F \u0915\u0930\u0947\u0902",
"pw.cancel": "\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
"file.title": "\u092B\u093C\u093E\u0907\u0932 \u0938\u094D\u0925\u093E\u0928\u093E\u0902\u0924\u0930\u0923",
"file.drop": "\u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u092F\u0939\u093E\u0901 \u091B\u094B\u0921\u093C\u0947\u0902",
"file.dropHint": "\u092D\u0947\u091C\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u090F\u0902\u0921-\u091F\u0942-\u090F\u0902\u0921 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \xB7 100 MB \u0924\u0915",
"file.browse": "\u0909\u092A\u0915\u0930\u0923 \u092E\u0947\u0902 \u0926\u0947\u0916\u0947\u0902",
"file.incoming": "\u092B\u093C\u093E\u0907\u0932 \u0915\u093E \u0905\u0928\u0941\u0930\u094B\u0927 \u0906\u092F\u093E \u0939\u0948",
"file.accept": "\u0938\u094D\u0935\u0940\u0915\u093E\u0930\u0947\u0902",
"file.reject": "\u0905\u0938\u094D\u0935\u0940\u0915\u093E\u0930\u0947\u0902",
"file.download": "\u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0915\u0930\u0947\u0902",
"file.notReady": "\u091C\u0941\u0921\u093C\u093E\u0935 \u0905\u092D\u0940 \u0924\u0948\u092F\u093E\u0930 \u0928\u0939\u0940\u0902",
"file.tooLarge": "\u092B\u093C\u093E\u0907\u0932 \u092C\u0939\u0941\u0924 \u092C\u0921\u093C\u0940 \u0939\u0948",
"file.typeNotAllowed": "\u0907\u0938 \u0924\u0930\u0939 \u0915\u0940 \u092B\u093C\u093E\u0907\u0932 \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0928\u0939\u0940\u0902",
"file.maxConcurrent": "\u090F\u0915 \u0938\u093E\u0925 \u0938\u094D\u0925\u093E\u0928\u093E\u0902\u0924\u0930\u0923 \u0915\u0940 \u0938\u0940\u092E\u093E \u092A\u0942\u0930\u0940 \u0939\u094B \u0917\u0908",
"file.gone": "\u092F\u0939 \u092B\u093C\u093E\u0907\u0932 \u0905\u092C \u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0915\u0947 \u0932\u093F\u090F \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
"call.incoming": "\u0906\u0924\u0940 \u0939\u0941\u0908 \u0915\u0949\u0932",
"call.incomingVideo": "\u0906\u0924\u0940 \u0939\u0941\u0908 \u0935\u0940\u0921\u093F\u092F\u094B \u0915\u0949\u0932",
"call.encrypted": "\u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0915\u0949\u0932",
"call.encryptedShort": "\u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921",
"call.peer": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0938\u093E\u0925\u0940",
"call.connecting": "\u091C\u0941\u0921\u093C \u0930\u0939\u0947 \u0939\u0948\u0902\u2026",
"call.ringing": "\u0918\u0902\u091F\u0940 \u092C\u091C \u0930\u0939\u0940 \u0939\u0948\u2026",
"call.accept": "\u0909\u0920\u093E\u090F\u0901",
"call.decline": "\u092E\u0928\u093E \u0915\u0930\u0947\u0902",
"call.end": "\u0915\u0949\u0932 \u0938\u092E\u093E\u092A\u094D\u0924 \u0915\u0930\u0947\u0902",
"call.camera": "\u0915\u0948\u092E\u0930\u093E",
"call.cameraOff": "\u0915\u0948\u092E\u0930\u093E \u092C\u0902\u0926",
"call.peerCameraOff": "\u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u093E \u0915\u0948\u092E\u0930\u093E \u092C\u0902\u0926 \u0939\u0948",
"call.flipCamera": "\u0915\u0948\u092E\u0930\u093E \u092C\u0926\u0932\u0947\u0902",
"call.addVideo": "\u0935\u0940\u0921\u093F\u092F\u094B \u091C\u094B\u0921\u093C\u0947\u0902",
"call.video": "\u0935\u0940\u0921\u093F\u092F\u094B",
"call.muted": "\u0906\u0935\u093E\u091C\u093C \u092C\u0902\u0926",
"call.expand": "\u092C\u0921\u093C\u093E \u0915\u0930\u0947\u0902",
"call.minimize": "\u091B\u094B\u091F\u093E \u0915\u0930\u0947\u0902",
"call.quality": "\u091C\u0941\u0921\u093C\u093E\u0935 \u0915\u0940 \u0917\u0941\u0923\u0935\u0924\u094D\u0924\u093E",
"call.qualityExcellent": "\u092C\u0939\u0941\u0924 \u0905\u091A\u094D\u091B\u0940",
"call.videoPrefix": "\u0935\u0940\u0921\u093F\u092F\u094B \xB7 ",
"call.voicePrefix": "\u0906\u0935\u093E\u091C\u093C \xB7 ",
"group.new": "\u0928\u092F\u093E \u0938\u092E\u0942\u0939",
"group.create": "\u0938\u092E\u0942\u0939 \u092C\u0928\u093E\u090F\u0901",
"group.join": "\u0938\u092E\u0942\u0939 \u092E\u0947\u0902 \u0936\u093E\u092E\u093F\u0932 \u0939\u094B\u0902",
"group.name": "\u0938\u092E\u0942\u0939 \u0915\u093E \u0928\u093E\u092E",
"group.nameTooLong": "\u0938\u092E\u0942\u0939 \u0915\u093E \u0928\u093E\u092E \u092C\u0939\u0941\u0924 \u0932\u0902\u092C\u093E \u0939\u0948\u0964",
"group.capacity": "{max} \u0932\u094B\u0917\u094B\u0902 \u0924\u0915, \u0938\u0940\u0927\u0947 \u0909\u092A\u0915\u0930\u0923 \u0938\u0947 \u0909\u092A\u0915\u0930\u0923\u0964 \u0938\u092E\u0942\u0939 \u0916\u0941\u0932\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u0938\u092C \u090F\u0915 \u0939\u0940 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u094B\u0921 \u092E\u093F\u0932\u093E\u090F\u0901\u0917\u0947\u0964",
"group.invite": "\u092C\u0941\u0932\u093E\u090F\u0901",
"group.inviteMore": "\u0914\u0930 \u0938\u0926\u0938\u094D\u092F\u094B\u0902 \u0915\u094B \u092C\u0941\u0932\u093E\u090F\u0901",
"group.invitePeople": "{count} \u0932\u094B\u0917\u094B\u0902 \u0915\u094B \u092C\u0941\u0932\u093E\u090F\u0901",
"group.invitation": "\u0938\u092E\u0942\u0939 \u0915\u093E \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923",
"group.addMembers": "\u0938\u0926\u0938\u094D\u092F \u091C\u094B\u0921\u093C\u0947\u0902",
"group.roomFor": "{remaining} \u0914\u0930 \u0932\u094B\u0917\u094B\u0902 \u0915\u0940 \u091C\u0917\u0939 \u0939\u0948\u0964 \u0909\u0928\u0915\u0947 \u0906\u0928\u0947 \u092A\u0930 \u0938\u092C \u090F\u0915 \u0928\u092F\u093E \u0938\u092E\u0942\u0939 \u0915\u094B\u0921 \u092E\u093F\u0932\u093E\u090F\u0901\u0917\u0947\u0964",
"group.membersCount": "{count} \u0938\u0926\u0938\u094D\u092F",
"group.member": "\u0938\u0926\u0938\u094D\u092F",
"group.members": "\u0938\u0926\u0938\u094D\u092F",
"group.remove": "{name} \u0915\u094B \u0939\u091F\u093E\u090F\u0901",
"group.message": "\xAB{name}\xBB \u092E\u0947\u0902 \u0938\u0902\u0926\u0947\u0936 \u092D\u0947\u091C\u0947\u0902",
"group.leave": "\u091B\u094B\u0921\u093C\u0947\u0902",
"group.leaveThis": "\u092F\u0939 \u0938\u092E\u0942\u0939 \u091B\u094B\u0921\u093C\u0947\u0902",
"group.cancel": "\u0938\u092E\u0942\u0939 \u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
"group.close": "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
"group.cancelBtn": "\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
"group.decline": "\u092E\u0928\u093E \u0915\u0930\u0947\u0902",
"group.working": "\u0915\u093E\u092E \u091C\u093E\u0930\u0940\u2026",
"group.sasTitle": "\u0938\u092E\u0942\u0939 \u0915\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u094B\u0921",
"group.sasEveryone": "\u092F\u0939 \u0915\u094B\u0921 \u0938\u092C\u0915\u094B \u090F\u0915 \u091C\u0948\u0938\u093E \u0926\u093F\u0916\u0924\u093E \u0939\u0948",
"group.sasCompare": "\u092F\u0939 \u0938\u092E\u0942\u0939 \u0916\u094B\u0932\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0939\u0930 \u0938\u0926\u0938\u094D\u092F \u0915\u0947 \u0938\u093E\u0925 \u0938\u092E\u0942\u0939 \u0915\u094B\u0921 \u092E\u093F\u0932\u093E\u0907\u090F\u0964",
"group.sasReadAloud": "\u092F\u0947 \u0905\u0902\u0915 \u091C\u093C\u094B\u0930 \u0938\u0947 \u092A\u0922\u093C\u0915\u0930 \u0938\u0941\u0928\u093E\u0907\u090F - ",
"group.sasWarning": "\u0905\u0917\u0930 \u090F\u0915 \u092D\u0940 \u0938\u0926\u0938\u094D\u092F \u0905\u0932\u0917 \u0915\u094B\u0921 \u092A\u0922\u093C\u0924\u093E \u0939\u0948, \u0924\u094B \u0915\u094B\u0908 \u092C\u0940\u091A \u092E\u0947\u0902 \u092C\u0948\u0920\u093E \u0939\u0948\u0964 \u0938\u092E\u0942\u0939 \u0930\u0926\u094D\u0926 \u0915\u0940\u091C\u093F\u090F - \u092A\u0941\u0937\u094D\u091F\u093F \u092E\u0924 \u0915\u0940\u091C\u093F\u090F\u0964",
"group.confirmFirst": "\u092A\u0939\u0932\u0947 \u0938\u092E\u0942\u0939 \u0915\u094B\u0921 \u0915\u0940 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0930\u0947\u0902",
"group.codeSuffix": " \xB7 \u0915\u094B\u0921 {code}",
"group.exchangingNonces": "\u090F\u0915-\u092C\u093E\u0930 \u0915\u0947 \u092E\u093E\u0928 \u092C\u0926\u0932\u0947 \u091C\u093E \u0930\u0939\u0947 \u0939\u0948\u0902\u2026",
"group.waitingCommit": "\u0939\u0930 \u0938\u0926\u0938\u094D\u092F \u0915\u0947 \u0935\u091A\u0928 \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E\u2026",
"group.waitingJoin": "\u092C\u093E\u0915\u093C\u0940 \u0938\u0926\u0938\u094D\u092F\u094B\u0902 \u0915\u0947 \u091C\u0941\u0921\u093C\u0928\u0947 \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E\u2026",
"group.emptyChat": "\u092F\u0939\u093E\u0901 \u0905\u092D\u0940 \u0915\u0941\u091B \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0939\u0930 \u0938\u0902\u0926\u0947\u0936 \u092D\u0947\u091C\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u0947 \u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930 \u0915\u0947 \u0938\u093E\u0925 \u0906\u0924\u093E \u0939\u0948 \u0914\u0930 \u0939\u0930 \u0938\u0926\u0938\u094D\u092F \u0915\u0940 \u0905\u092A\u0928\u0940 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0932\u093E\u0907\u0928 \u0938\u0947 \u0917\u0941\u091C\u093C\u0930\u0924\u093E \u0939\u0948\u0964",
"group.noVerified": "\u0905\u092D\u0940 \u0915\u094B\u0908 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \u091A\u0948\u091F \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u092A\u0939\u0932\u0947 \u0906\u092E\u0928\u0947-\u0938\u093E\u092E\u0928\u0947 \u0915\u0940 \u091A\u0948\u091F \u0916\u094B\u0932\u093F\u090F \u0914\u0930 \u0909\u0938\u0915\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u094B\u0921 \u092E\u093F\u0932\u093E\u0907\u090F - \u0938\u092E\u0942\u0939 \u0909\u0928\u094D\u0939\u0940\u0902 \u091C\u0941\u0921\u093C\u093E\u0935\u094B\u0902 \u0938\u0947 \u092C\u0928\u0924\u093E \u0939\u0948 \u091C\u093F\u0928\u094D\u0939\u0947\u0902 \u0906\u092A \u092A\u0939\u0932\u0947 \u091C\u093E\u0901\u091A \u091A\u0941\u0915\u0947 \u0939\u0948\u0902\u0964",
"group.noMoreToAdd": "\u091C\u094B\u0921\u093C\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0914\u0930 \u0915\u094B\u0908 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \u091A\u0948\u091F \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u092A\u0939\u0932\u0947 \u0906\u092E\u0928\u0947-\u0938\u093E\u092E\u0928\u0947 \u0915\u0940 \u091A\u0948\u091F \u0916\u094B\u0932\u093F\u090F \u0914\u0930 \u0909\u0938\u0915\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u094B\u0921 \u092E\u093F\u0932\u093E\u0907\u090F\u0964",
"group.directLink": "\u0938\u0940\u0927\u093E \u092A\u0940\u092F\u0930-\u091F\u0942-\u092A\u0940\u092F\u0930 \u091C\u0941\u0921\u093C\u093E\u0935",
"group.noDirectLink": "\u0905\u092D\u0940 \u0938\u0940\u0927\u093E \u091C\u0941\u0921\u093C\u093E\u0935 \u0928\u0939\u0940\u0902 \u0939\u0948 - \u092C\u0928\u0928\u0947 \u0924\u0915 \u0938\u0902\u0926\u0947\u0936 \u0915\u093F\u0938\u0940 \u0914\u0930 \u0938\u0926\u0938\u094D\u092F \u0915\u0947 \u091C\u093C\u0930\u093F\u090F \u091C\u093E\u0924\u0947 \u0939\u0948\u0902",
"group.relayNote": "\u0915\u0941\u091B \u0938\u0926\u0938\u094D\u092F\u094B\u0902 \u0938\u0947 \u0905\u092D\u0940 \u0938\u0940\u0927\u093E \u091C\u0941\u0921\u093C\u093E\u0935 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0909\u0928\u0915\u0947 \u0938\u0902\u0926\u0947\u0936 \u0915\u093F\u0938\u0940 \u0914\u0930 \u0938\u0926\u0938\u094D\u092F \u0938\u0947 \u0939\u094B\u0915\u0930 \u091C\u093E\u0924\u0947 \u0939\u0948\u0902, \u091C\u094B \u092F\u0939 \u0924\u094B \u0926\u0947\u0916 \u0938\u0915\u0924\u093E \u0939\u0948 \u0915\u093F \u092C\u093E\u0924\u091A\u0940\u0924 \u0939\u094B \u0930\u0939\u0940 \u0939\u0948, \u092A\u0930 \u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930 \u0915\u0947 \u0906\u0917\u0947 \u0928 \u092A\u0922\u093C \u0938\u0915\u0924\u093E \u0939\u0948 \u0928 \u0915\u0939\u0940 \u0939\u0941\u0908 \u092C\u093E\u0924 \u092C\u0926\u0932 \u0938\u0915\u0924\u093E \u0939\u0948\u0964 \u0938\u092E\u0942\u0939 \u0909\u0928\u094D\u0939\u0947\u0902 \u0938\u0940\u0927\u0947 \u091C\u094B\u0921\u093C\u0928\u0947 \u0915\u0940 \u0915\u094B\u0936\u093F\u0936 \u0915\u0930\u0924\u093E \u0930\u0939\u0924\u093E \u0939\u0948\u0964",
"group.relayOnlyOff": "\u0915\u0947\u0935\u0932-\u0930\u093F\u0932\u0947 \u092E\u094B\u0921 \u092C\u0902\u0926 \u0939\u0948, \u0907\u0938\u0932\u093F\u090F \u0939\u0930 \u0938\u0926\u0938\u094D\u092F \u0906\u092A\u0938\u0947 \u0938\u0940\u0927\u0947 \u091C\u0941\u0921\u093C\u0924\u093E \u0939\u0948 \u0914\u0930 \u0906\u092A\u0915\u093E IP \u092A\u0924\u093E \u091C\u093E\u0928 \u0932\u0947\u0924\u093E \u0939\u0948 - \u0909\u0928\u092E\u0947\u0902 \u0935\u0947 \u092D\u0940 \u0939\u0948\u0902 \u091C\u093F\u0928\u094D\u0939\u0947\u0902 \u0915\u093F\u0938\u0940 \u0914\u0930 \u0928\u0947 \u092C\u0941\u0932\u093E\u092F\u093E\u0964 \u0905\u0917\u0930 \u092F\u0939 \u092F\u0939\u093E\u0901 \u092E\u093E\u092F\u0928\u0947 \u0930\u0916\u0924\u093E \u0939\u0948, \u0924\u094B \u0928\u0947\u091F\u0935\u0930\u094D\u0915 \u0938\u0947\u091F\u093F\u0902\u0917\u094D\u0938 \u092E\u0947\u0902 \u0907\u0938\u0947 \u091A\u093E\u0932\u0942 \u0915\u0940\u091C\u093F\u090F\u0964",
"group.memberOffline": "{name} \u0911\u092B\u093C\u0932\u093E\u0907\u0928 \u0939\u0948\u0902 \u0914\u0930 \u0938\u0902\u0926\u0947\u0936 \u0928\u0939\u0940\u0902 \u092A\u093E\u090F\u0901\u0917\u0947\u0964 \u0935\u0947 \u0905\u092C \u092D\u0940 \u0938\u0926\u0938\u094D\u092F \u0939\u0948\u0902 - \u0939\u091F\u093E\u0928\u0947 \u092A\u0930 \u0938\u092E\u0942\u0939 \u0915\u0940 \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901 \u0928\u090F \u0938\u093F\u0930\u0947 \u0938\u0947 \u092C\u0928\u0924\u0940 \u0939\u0948\u0902\u0964",
"group.joinNote": "\u092C\u093E\u0915\u093C\u0940 \u0938\u0926\u0938\u094D\u092F\u094B\u0902 \u0915\u094B \u092A\u0924\u093E \u091A\u0932\u0947\u0917\u093E \u0915\u093F \u0906\u092A \u0907\u0938 \u0938\u092E\u0942\u0939 \u092E\u0947\u0902 \u0939\u0948\u0902\u0964 \u092A\u0940\u091B\u0947 \u0915\u093E \u0915\u094B\u0908 \u0907\u0924\u093F\u0939\u093E\u0938 \u0928\u0939\u0940\u0902 \u0939\u0948 - \u0938\u092E\u0942\u0939 \u0916\u093C\u093E\u0932\u0940 \u0938\u0947 \u0936\u0941\u0930\u0942 \u0939\u094B\u0924\u093E \u0939\u0948\u0964",
"group.inviteSentNote": "\u091C\u092C \u0924\u0915 \u0935\u0947 \u0938\u094D\u0935\u0940\u0915\u093E\u0930 \u0928\u0939\u0940\u0902 \u0915\u0930\u0924\u0947, \u0938\u092E\u0942\u0939 \u091A\u0932\u0924\u093E \u0930\u0939\u0924\u093E \u0939\u0948\u0964 \u0909\u0928\u0915\u0947 \u0932\u093F\u090F \u092A\u0940\u091B\u0947 \u0915\u093E \u0915\u094B\u0908 \u0907\u0924\u093F\u0939\u093E\u0938 \u0928\u0939\u0940\u0902 \u0939\u0948 - \u0935\u0947 \u0938\u093F\u0930\u094D\u092B\u093C \u0905\u092C \u0938\u0947 \u092D\u0947\u091C\u093E \u0917\u092F\u093E \u0926\u0947\u0916\u0947\u0902\u0917\u0947\u0964",
"group.errNotCreated": "\u0938\u092E\u0942\u0939 \u0928\u0939\u0940\u0902 \u092C\u0928\u093E",
"group.errNobodyAccepted": "\u0938\u092E\u092F \u0930\u0939\u0924\u0947 \u0915\u093F\u0938\u0940 \u0928\u0947 \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0938\u094D\u0935\u0940\u0915\u093E\u0930 \u0928\u0939\u0940\u0902 \u0915\u093F\u092F\u093E\u0964",
"group.errNothingSent": "\u0928 \u0915\u0941\u091B \u092D\u0947\u091C\u093E \u0917\u092F\u093E, \u0928 \u0915\u0941\u091B \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \u0939\u0941\u0906\u0964 \u0907\u0938\u0947 \u092C\u0902\u0926 \u0915\u0940\u091C\u093F\u090F \u0914\u0930 \u0938\u092C\u0915\u0947 \u091C\u0941\u0921\u093C\u0928\u0947 \u092A\u0930 \u0926\u094B\u092C\u093E\u0930\u093E \u0915\u094B\u0936\u093F\u0936 \u0915\u0940\u091C\u093F\u090F\u0964",
"group.errNotFormed": "\u092F\u0939 \u0938\u092E\u0942\u0939 \u0928\u0939\u0940\u0902 \u092C\u0928 \u0938\u0915\u093E\u0964",
"group.errFull": "\u092F\u0939 \u0938\u092E\u0942\u0939 \u092D\u0930 \u091A\u0941\u0915\u093E \u0939\u0948\u0964",
"group.errInviteFailed": "\u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0928\u0939\u0940\u0902 \u092D\u0947\u091C\u093E \u091C\u093E \u0938\u0915\u093E - \u0935\u0939 \u091A\u0948\u091F \u091C\u0941\u0921\u093C\u0940 \u0939\u0941\u0908 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
"group.errNoMemberList": "\u0938\u092E\u0942\u0939 \u092C\u0928\u093E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0928\u0947 \u0938\u0926\u0938\u094D\u092F\u094B\u0902 \u0915\u0940 \u0938\u0942\u091A\u0940 \u0915\u092D\u0940 \u092D\u0947\u091C\u0940 \u0939\u0940 \u0928\u0939\u0940\u0902\u0964",
"group.errUnsignedList": "\u0938\u0926\u0938\u094D\u092F \u0938\u0942\u091A\u0940 \u092A\u0930 \u0938\u092E\u0942\u0939 \u092C\u0928\u093E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u0947 \u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930 \u0928\u0939\u0940\u0902 \u0939\u0948\u0902\u0964 \u0926\u094B\u092C\u093E\u0930\u093E \u0915\u094B\u0936\u093F\u0936 \u092E\u0924 \u0915\u0940\u091C\u093F\u090F - \u0909\u0928\u094D\u0939\u0947\u0902 \u092C\u0924\u093E\u0907\u090F\u0964",
"group.errNotOwner": "\u0938\u092E\u0942\u0939 \u0915\u0947 \u0938\u094D\u0935\u093E\u092E\u0940 \u0915\u0947 \u0905\u0932\u093E\u0935\u093E \u0915\u093F\u0938\u0940 \u0914\u0930 \u0928\u0947 \u0938\u0926\u0938\u094D\u092F \u092C\u0926\u0932\u0928\u0947 \u0915\u0940 \u0915\u094B\u0936\u093F\u0936 \u0915\u0940\u0964",
"hdr.tagline": "\u090F\u0902\u0921-\u091F\u0942-\u090F\u0902\u0921 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921",
"hdr.netSettings": "\u0909\u0928\u094D\u0928\u0924 \u0928\u0947\u091F\u0935\u0930\u094D\u0915 \u0938\u0947\u091F\u093F\u0902\u0917\u094D\u0938",
"hdr.netSettingsTitle": "\u0909\u0928\u094D\u0928\u0924 \u0928\u0947\u091F\u0935\u0930\u094D\u0915 \u0938\u0947\u091F\u093F\u0902\u0917\u094D\u0938 (STUN/TURN)",
"hdr.disconnect": "\u091C\u0941\u0921\u093C\u093E\u0935 \u0924\u094B\u0921\u093C\u0947\u0902",
"status.connected": "\u091C\u0941\u0921\u093C \u0917\u092F\u093E",
"status.connecting": "\u091C\u0941\u0921\u093C \u0930\u0939\u0947 \u0939\u0948\u0902\u2026",
"status.notConnected": "\u091C\u0941\u0921\u093C\u093E \u0928\u0939\u0940\u0902 \u0939\u0948",
"status.reconnecting": "\u0926\u094B\u092C\u093E\u0930\u093E \u091C\u0941\u0921\u093C \u0930\u0939\u0947 \u0939\u0948\u0902\u2026",
"status.retrying": "\u092B\u093F\u0930 \u0915\u094B\u0936\u093F\u0936\u2026",
"status.verifying": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u091C\u093E\u0930\u0940\u2026",
"status.peerDisconnected": "\u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u093E \u091C\u0941\u0921\u093C\u093E\u0935 \u091F\u0942\u091F\u093E",
"sec.replayProtection": "\u092A\u0941\u0928\u0930\u093E\u0935\u0943\u0924\u094D\u0924\u093F \u0939\u092E\u0932\u0947 \u0938\u0947 \u092C\u091A\u093E\u0935",
"sec.messageIntegrity": "\u0938\u0902\u0926\u0947\u0936 \u0915\u0940 \u0905\u0916\u0902\u0921\u0924\u093E (HMAC)",
"sec.forwardSecrecy": "\u092A\u0942\u0930\u094D\u0923 \u0905\u0917\u094D\u0930\u0917\u093E\u092E\u0940 \u0917\u094B\u092A\u0928\u0940\u092F\u0924\u093E",
"sec.metadataProtection": "\u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093E",
"sec.trafficObfuscation": "\u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u0905\u0938\u094D\u092A\u0937\u094D\u091F\u0940\u0915\u0930\u0923",
"sec.realTests": "\u0905\u0938\u0932\u0940 \u0915\u094D\u0930\u093F\u092A\u094D\u091F\u094B\u0917\u094D\u0930\u093E\u092B\u093C\u093F\u0915 \u091C\u093E\u0901\u091A\u0947\u0902",
"sec.simulatedData": "\u092C\u0928\u093E\u0935\u091F\u0940 \u0921\u0947\u091F\u093E",
"sec.testPassed": "\u091C\u093E\u0901\u091A \u092A\u093E\u0938",
"sec.testFailed": "\u091C\u093E\u0901\u091A \u0935\u093F\u092B\u0932 \u092F\u093E \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
"sec.verificationDone": "\u0905\u0938\u0932\u0940 \u0915\u094D\u0930\u093F\u092A\u094D\u091F\u094B\u0917\u094D\u0930\u093E\u092B\u093C\u093F\u0915 \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u092A\u0942\u0930\u093E \u0939\u0941\u0906",
"sec.verificationInProgress": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u091C\u093E\u0930\u0940\u2026",
"sec.verificationWait": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u091C\u093E\u0930\u0940\u2026\n\u0915\u0943\u092A\u092F\u093E \u0935\u093E\u0938\u094D\u0924\u0935\u093F\u0915 \u0938\u092E\u092F \u0915\u0940 \u0915\u094D\u0930\u093F\u092A\u094D\u091F\u094B\u0917\u094D\u0930\u093E\u092B\u093C\u093F\u0915 \u091C\u093E\u0901\u091A \u092A\u0942\u0930\u0940 \u0939\u094B\u0928\u0947 \u0924\u0915 \u0930\u0941\u0915\u093F\u090F\u0964",
"sec.verificationUnavailable": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
"chat.placeholder": "\u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0938\u0902\u0926\u0947\u0936 \u0932\u093F\u0916\u0947\u0902\u2026",
"chat.send": "\u0938\u0902\u0926\u0947\u0936 \u092D\u0947\u091C\u0947\u0902",
"chat.sendFiles": "\u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u092D\u0947\u091C\u0947\u0902",
"chat.hideFiles": "\u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u091B\u093F\u092A\u093E\u090F\u0901",
"chat.recordVoice": "\u0935\u0949\u0907\u0938 \u0938\u0902\u0926\u0947\u0936 \u0930\u093F\u0915\u0949\u0930\u094D\u0921 \u0915\u0930\u0947\u0902",
"chat.sendVoice": "\u0935\u0949\u0907\u0938 \u0938\u0902\u0926\u0947\u0936 \u092D\u0947\u091C\u0947\u0902",
"chat.discard": "\u091B\u094B\u0921\u093C\u0947\u0902",
"chat.codeBlock": "\u0915\u094B\u0921 \u092C\u094D\u0932\u0949\u0915 \u0915\u0947 \u0930\u0942\u092A \u092E\u0947\u0902 \u092D\u0947\u091C\u0947\u0902 (\u0907\u0928\u092A\u0941\u091F \u092C\u0921\u093C\u093E \u0939\u094B \u091C\u093E\u090F\u0917\u093E)",
"chat.codeHint": "\u0915\u094B\u0921 \u0915\u093E \u0905\u0902\u0936 \xB7 \u0930\u0942\u092A-\u0938\u091C\u094D\u091C\u093E \u092C\u0928\u0940 \u0930\u0939\u0947\u0917\u0940 \xB7 \u092D\u0947\u091C\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u2318\u21B5",
"chat.viewOnce": "\u090F\u0915 \u092C\u093E\u0930 \u0926\u0947\u0916\u0947\u0902",
"chat.viewOnceTitle": "\u090F\u0915 \u092C\u093E\u0930 \u0926\u0947\u0916\u0947\u0902 - \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u0947 \u092A\u0922\u093C\u0924\u0947 \u0939\u0940 \u092E\u093F\u091F \u091C\u093E\u090F\u0917\u093E",
"chat.viewOncePrefix": "\u090F\u0915 \u092C\u093E\u0930 \u0926\u0947\u0916\u0947\u0902 \xB7 ",
"chat.viewOnceTap": "\u090F\u0915 \u092C\u093E\u0930 \u0926\u0947\u0916\u0947\u0902 \xB7 \u0926\u093F\u0916\u093E\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0926\u092C\u093E\u090F\u0901",
"chat.viewedOnce": "\u0926\u0947\u0916\u093E \u091C\u093E \u091A\u0941\u0915\u093E",
"chat.disappearing": "\u092E\u093F\u091F\u0928\u0947 \u0935\u093E\u0932\u093E \u0938\u0902\u0926\u0947\u0936 - \u0926\u094B\u0928\u094B\u0902 \u0913\u0930 \u0938\u0947 \u0939\u091F \u091C\u093E\u0924\u093E \u0939\u0948",
"chat.disappearAfter": "\u0907\u0924\u0928\u0947 \u0938\u092E\u092F \u092C\u093E\u0926 \u092E\u093F\u091F\u0947",
"chat.visibleFor": "\u0907\u0924\u0928\u0940 \u0926\u0947\u0930 \u0926\u093F\u0916\u0947",
"chat.timerPrefix": "\u091F\u093E\u0907\u092E\u0930 \xB7 ",
"chat.expired": "\u092F\u0939 \u0938\u0902\u0926\u0947\u0936 \u0938\u092E\u093E\u092A\u094D\u0924 \u0939\u094B \u091A\u0941\u0915\u093E \u0939\u0948",
"chat.deleteForEveryone": "\u0938\u092C\u0915\u0947 \u0932\u093F\u090F \u0939\u091F\u093E\u090F\u0901",
"chat.sending": "\u092D\u0947\u091C\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948",
"chat.delivered": "\u092A\u0939\u0941\u0901\u091A \u0917\u092F\u093E",
"chat.notSent": "\u0928\u0939\u0940\u0902 \u092D\u0947\u091C\u093E \u0917\u092F\u093E",
"chat.notSentReason": "\u0928\u0939\u0940\u0902 \u092D\u0947\u091C\u093E \u0917\u092F\u093E - \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u0928\u0932 \u0905\u092D\u0940 \u0924\u0948\u092F\u093E\u0930 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0906\u0917\u0947 \u092C\u0922\u093C\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0926\u094B\u092C\u093E\u0930\u093E \u091C\u0941\u0921\u093C\u093F\u090F\u0964",
"chat.encrypted": "\u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921",
"chat.decrypted": "\u0921\u093F\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921",
"chat.encryptedOnDevice": "\u0906\u092A\u0915\u0947 \u0909\u092A\u0915\u0930\u0923 \u092A\u0930 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F \u0939\u0941\u0906",
"chat.uploading": "\u092D\u0947\u091C\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948",
"chat.downloading": "\u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0939\u094B \u0930\u0939\u093E \u0939\u0948",
"chat.transferring": "\u0938\u094D\u0925\u093E\u0928\u093E\u0902\u0924\u0930\u0923 \u091C\u093E\u0930\u0940\u2026",
"chat.copied": "\u0915\u0949\u092A\u0940 \u0939\u094B \u0917\u092F\u093E!",
"chat.collapse": "\u0938\u092E\u0947\u091F\u0947\u0902",
"chat.closeMenu": "\u092E\u0947\u0928\u094D\u092F\u0942 \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
"chat.newChat": "\u0928\u0908 \u091A\u0948\u091F",
"chat.newGroup": "\u0928\u092F\u093E \u0938\u092E\u0942\u0939",
"chat.createGroup": "\u0938\u092E\u0942\u0939 \u092C\u0928\u093E\u090F\u0901",
"chat.groupChats": "\u0938\u092E\u0942\u0939 \u091A\u0948\u091F",
"chat.secureChat": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u091F",
"chat.nameThis": "\u0907\u0938 \u091A\u0948\u091F \u0915\u094B \u0928\u093E\u092E \u0926\u0947\u0902",
"chat.rename": "\u091A\u0948\u091F \u0915\u093E \u0928\u093E\u092E \u092C\u0926\u0932\u0947\u0902 (\u0915\u0947\u0935\u0932 \u0907\u0938 \u0909\u092A\u0915\u0930\u0923 \u092A\u0930)",
"chat.renameHint": "\u0928\u093E\u092E \u092C\u0926\u0932\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0926\u094B \u092C\u093E\u0930 \u0915\u094D\u0932\u093F\u0915 \u0915\u0930\u0947\u0902",
"chat.localLabel": "\u0938\u094D\u0925\u093E\u0928\u0940\u092F \u0928\u093E\u092E \xB7 \u0938\u093F\u0930\u094D\u092B\u093C \u0907\u0938\u0940 \u0909\u092A\u0915\u0930\u0923 \u092A\u0930 \u0938\u0939\u0947\u091C\u093E \u0917\u092F\u093E",
"chat.setStatus": "\u0905\u092A\u0928\u0940 \u0938\u094D\u0925\u093F\u0924\u093F \u091A\u0941\u0928\u0947\u0902",
"chat.yourStatusPrefix": "\u0906\u092A\u0915\u0940 \u0938\u094D\u0925\u093F\u0924\u093F - ",
"chat.meshHint": "8 \u0938\u093E\u0925\u093F\u092F\u094B\u0902 \u0924\u0915 \xB7 P2P \u092E\u0947\u0936",
"chat.offline": "\u0911\u092B\u093C\u0932\u093E\u0907\u0928",
"chat.noNetwork": "\u0928\u0947\u091F\u0935\u0930\u094D\u0915 \u0928\u0939\u0940\u0902 \xB7 \u0926\u094B\u092C\u093E\u0930\u093E \u091C\u0941\u0921\u093C \u0930\u0939\u0947 \u0939\u0948\u0902",
"chat.startVoiceCall": "\u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0935\u0949\u0907\u0938 \u0915\u0949\u0932 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
"chat.startVideoCall": "\u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0935\u0940\u0921\u093F\u092F\u094B \u0915\u0949\u0932 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
"chat.verifyForCalls": "\u0915\u0949\u0932 \u0915\u0947 \u0932\u093F\u090F \u092A\u0939\u0932\u0947 \u0938\u0924\u094D\u0930 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \u0915\u0930\u0947\u0902",
"chat.e2eeNote": "\u0939\u0930 \u0938\u0902\u0926\u0947\u0936 \u0906\u092A\u0915\u0947 \u0909\u092A\u0915\u0930\u0923 \u0938\u0947 \u0928\u093F\u0915\u0932\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u090F\u0902\u0921-\u091F\u0942-\u090F\u0902\u0921 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F \u0939\u094B \u091C\u093E\u0924\u093E \u0939\u0948\u0964",
"chat.peersOnly": "\u0915\u0947\u0935\u0932 \u091C\u0941\u0921\u093C\u0947 \u0939\u0941\u090F \u0938\u093E\u0925\u093F\u092F\u094B\u0902 \u0915\u094B \u090F\u0902\u0921-\u091F\u0942-\u090F\u0902\u0921 \u092D\u0947\u091C\u093E \u091C\u093E\u0924\u093E \u0939\u0948 - \u0915\u093F\u0938\u0940 \u0938\u0930\u094D\u0935\u0930 \u092A\u0930 \u0915\u092D\u0940 \u0928\u0939\u0940\u0902 \u0930\u0916\u093E \u091C\u093E\u0924\u093E\u0964",
"flow.invitationCreated": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u092C\u0928 \u0917\u092F\u093E",
"flow.invitationCreatedBang": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u092C\u0928\u093E \u0914\u0930 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F \u0939\u094B \u0917\u092F\u093E\u0964",
"flow.responseCreated": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0909\u0924\u094D\u0924\u0930 \u092C\u0928 \u0917\u092F\u093E",
"flow.responseCreatedBang": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0909\u0924\u094D\u0924\u0930 \u092C\u0928 \u0917\u092F\u093E\u0964",
"flow.sendInvitation": "\u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0915\u094B\u0921 \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u094B \u0915\u093F\u0938\u0940 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0930\u093E\u0938\u094D\u0924\u0947 \u0938\u0947 \u092D\u0947\u091C\u093F\u090F (\u0915\u0949\u0932, SMS \u0935\u0917\u093C\u0948\u0930\u0939)\u0964",
"flow.sendResponse": "\u0909\u0924\u094D\u0924\u0930 \u0915\u094B\u0921 \u091A\u0948\u0928\u0932 \u0936\u0941\u0930\u0942 \u0915\u0930\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u094B \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0930\u093E\u0938\u094D\u0924\u0947 \u0938\u0947 \u092D\u0947\u091C\u093F\u090F, \u092F\u093E \u0909\u0928\u094D\u0939\u0947\u0902 \u0928\u0940\u091A\u0947 \u0915\u093E QR \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0928\u0947 \u0926\u0940\u091C\u093F\u090F\u0964",
"flow.sendEncryptedCode": "\u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921 \u0915\u094B\u0921 \u092D\u0947\u091C\u0947\u0902",
"flow.sendTheResponse": "\u0909\u0924\u094D\u0924\u0930 \u092D\u0947\u091C\u0947\u0902",
"flow.pasteOrWrite": "\u0915\u094B\u0921 \u091A\u093F\u092A\u0915\u093E\u090F\u0901 \u092F\u093E \u0932\u093F\u0916\u0947\u0902\u2026",
"flow.processingInvitation": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0938\u0902\u0938\u093E\u0927\u093F\u0924 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
"flow.processingResponse": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0909\u0924\u094D\u0924\u0930 \u0938\u0902\u0938\u093E\u0927\u093F\u0924 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
"flow.finalizing": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091C\u0941\u0921\u093C\u093E\u0935 \u092A\u0942\u0930\u093E \u0915\u093F\u092F\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948\u2026",
"flow.channelEstablished": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u0928\u0932 \u092C\u0928 \u0917\u092F\u093E",
"flow.channelReady": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u0928\u0932 \u0924\u0948\u092F\u093E\u0930 \u0939\u0948",
"flow.restoring": "\u091C\u0941\u0921\u093C\u093E\u0935 \u092C\u0939\u093E\u0932 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
"flow.invitationCaptured": "\u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u092A\u0922\u093C \u0932\u093F\u092F\u093E \u0917\u092F\u093E\u0964",
"err.needInvitation": "\u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u093E \u0926\u093F\u092F\u093E \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0915\u094B\u0921 \u091A\u093F\u092A\u0915\u093E\u0928\u093E \u091C\u093C\u0930\u0942\u0930\u0940 \u0939\u0948\u0964",
"err.needResponse": "\u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u093E \u0926\u093F\u092F\u093E \u0909\u0924\u094D\u0924\u0930 \u0915\u094B\u0921 \u091A\u093F\u092A\u0915\u093E\u0928\u093E \u091C\u093C\u0930\u0942\u0930\u0940 \u0939\u0948\u0964",
"err.responseFormat": "\u0909\u0924\u094D\u0924\u0930 \u0915\u093E \u092A\u094D\u0930\u093E\u0930\u0942\u092A \u0917\u093C\u0932\u0924 \u0939\u0948 - \u0915\u094B\u0921 \u091C\u093E\u0901\u091A\u093F\u090F",
"err.responseNoKey": "\u0909\u0924\u094D\u0924\u0930 \u0915\u094B\u0921 \u0917\u093C\u0932\u0924 \u0939\u0948 - \u0915\u094D\u0930\u093F\u092A\u094D\u091F\u094B\u0917\u094D\u0930\u093E\u092B\u093C\u093F\u0915 \u0915\u0941\u0902\u091C\u0940 \u0928\u0939\u0940\u0902 \u0939\u0948 \u092F\u093E \u0916\u093C\u0930\u093E\u092C \u0939\u0948\u0964 \u0915\u094B\u0921 \u091C\u093E\u0901\u091A\u0915\u0930 \u0926\u094B\u092C\u093E\u0930\u093E \u0915\u094B\u0936\u093F\u0936 \u0915\u0940\u091C\u093F\u090F\u0964",
"err.responseNoSignKey": "\u0909\u0924\u094D\u0924\u0930 \u0915\u094B\u0921 \u0917\u093C\u0932\u0924 \u0939\u0948 - \u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930 \u091C\u093E\u0901\u091A\u0928\u0947 \u0915\u0940 \u0915\u0941\u0902\u091C\u0940 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0915\u094B\u0921 \u091C\u093E\u0901\u091A\u0915\u0930 \u0926\u094B\u092C\u093E\u0930\u093E \u0915\u094B\u0936\u093F\u0936 \u0915\u0940\u091C\u093F\u090F\u0964",
"err.responseOutdated": "\u0909\u0924\u094D\u0924\u0930 \u0915\u093E \u0921\u0947\u091F\u093E \u092A\u0941\u0930\u093E\u0928\u093E \u0939\u0948 - \u0928\u092F\u093E \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0907\u0938\u094D\u0924\u0947\u092E\u093E\u0932 \u0915\u0940\u091C\u093F\u090F",
"err.setupError": "\u091C\u0941\u0921\u093C\u093E\u0935 \u092C\u0928\u093E\u0924\u0947 \u0938\u092E\u092F \u0917\u0921\u093C\u092C\u0921\u093C\u0940",
"err.notReady": "\u091C\u0941\u0921\u093C\u093E\u0935 \u0905\u092D\u0940 \u0924\u0948\u092F\u093E\u0930 \u0928\u0939\u0940\u0902",
"err.securityBreach": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u092E\u0947\u0902 \u0938\u0947\u0902\u0927 \u092E\u093F\u0932\u0940 - \u091C\u0941\u0921\u093C\u093E\u0935 \u0905\u0938\u094D\u0935\u0940\u0915\u093E\u0930",
"err.securityValidation": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u091C\u093E\u0901\u091A \u0935\u093F\u092B\u0932 - \u0939\u092E\u0932\u093E \u0939\u094B \u0938\u0915\u0924\u093E \u0939\u0948",
"err.retiredQr": "\u092F\u0939 QR \u0910\u0938\u0947 \u092A\u0941\u0930\u093E\u0928\u0947 \u092A\u094D\u0930\u093E\u0930\u0942\u092A \u0915\u093E \u0939\u0948 \u091C\u093F\u0938\u0938\u0947 \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0928\u0939\u0940\u0902 \u092D\u0947\u091C\u093E \u091C\u093E \u0938\u0915\u093E\u0964 \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0938\u0947 \u0928\u092F\u093E \u092C\u0928\u0935\u093E\u0907\u090F, \u092F\u093E \u0915\u0949\u092A\u0940-\u092A\u0947\u0938\u094D\u091F \u0915\u0940\u091C\u093F\u090F\u0964",
"err.compressedQrNote": "\u0938\u0902\u0915\u094D\u0937\u0947\u092A \u0915\u0947 \u0932\u093F\u090F \u0926\u092C\u093E\u092F\u093E \u0939\u0941\u0906 QR \u0915\u092D\u0940-\u0915\u092D\u0940 SDP \u091B\u094B\u0921\u093C \u0926\u0947\u0924\u093E \u0939\u0948\u0964 \u091C\u0941\u0921\u093C\u093E\u0935 \u0928 \u092C\u0928\u0947 \u0924\u094B \u0915\u0949\u092A\u0940-\u092A\u0947\u0938\u094D\u091F \u0915\u0940\u091C\u093F\u090F\u0964",
"err.inviteNotConnected": "\u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0928\u0939\u0940\u0902 \u092D\u0947\u091C\u093E \u091C\u093E \u0938\u0915\u093E\u0964 \u0935\u0939 \u091A\u0948\u091F \u0905\u092D\u0940 \u091C\u0941\u0921\u093C\u0940 \u0939\u0941\u0908 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
"err.inviteNotConnectedRetry": "\u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0928\u0939\u0940\u0902 \u092D\u0947\u091C\u093E \u091C\u093E \u0938\u0915\u093E\u0964 \u0935\u0939 \u091A\u0948\u091F \u0905\u092D\u0940 \u091C\u0941\u0921\u093C\u0940 \u0939\u0941\u0908 \u0928\u0939\u0940\u0902 \u0939\u0948 - \u0909\u0938\u0947 \u0926\u094B\u092C\u093E\u0930\u093E \u0916\u094B\u0932\u0915\u0930 \u0915\u094B\u0936\u093F\u0936 \u0915\u0940\u091C\u093F\u090F\u0964",
"err.nobodyAccepted": "\u0915\u093F\u0938\u0940 \u0928\u0947 \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0938\u094D\u0935\u0940\u0915\u093E\u0930 \u0928\u0939\u0940\u0902 \u0915\u093F\u092F\u093E\u0964 \u0938\u092E\u0942\u0939 \u0935\u0948\u0938\u093E \u0939\u0940 \u0939\u0948\u0964",
"err.noAudio": "\u0915\u094B\u0908 \u0906\u0935\u093E\u091C\u093C \u0930\u093F\u0915\u0949\u0930\u094D\u0921 \u0928\u0939\u0940\u0902 \u0939\u0941\u0908 - \u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928 \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u091C\u093E\u0901\u091A\u0915\u0930 \u0926\u094B\u092C\u093E\u0930\u093E \u0915\u094B\u0936\u093F\u0936 \u0915\u0940\u091C\u093F\u090F\u0964",
"err.voiceNeedsConnection": "\u0935\u0949\u0907\u0938 \u0938\u0902\u0926\u0947\u0936 \u0915\u0947 \u0932\u093F\u090F \u091A\u093E\u0932\u0942 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091C\u0941\u0921\u093C\u093E\u0935 \u091A\u093E\u0939\u093F\u090F\u0964 \u0926\u094B\u092C\u093E\u0930\u093E \u091C\u0941\u0921\u093C\u0915\u0930 \u0915\u094B\u0936\u093F\u0936 \u0915\u0940\u091C\u093F\u090F\u0964",
"err.voiceRestoring": "\u091C\u0941\u0921\u093C\u093E\u0935 \u092C\u0939\u093E\u0932 \u0939\u094B \u0930\u0939\u093E \u0939\u0948 - \u0925\u094B\u0921\u093C\u0940 \u0926\u0947\u0930 \u092E\u0947\u0902 \u0935\u0949\u0907\u0938 \u0938\u0902\u0926\u0947\u0936 \u0926\u094B\u092C\u093E\u0930\u093E \u092D\u0947\u091C\u0928\u0947 \u0915\u0940 \u0915\u094B\u0936\u093F\u0936 \u0915\u0940\u091C\u093F\u090F\u0964",
"err.fileTooLarge": "\u092B\u093C\u093E\u0907\u0932 \u092C\u0939\u0941\u0924 \u092C\u0921\u093C\u0940 \u0939\u0948",
"sas.safetyNumber": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0902\u0916\u094D\u092F\u093E",
"sas.incorrect": "\u0915\u094B\u0921 \u0917\u093C\u0932\u0924 \u0939\u0948\u0964 \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0938\u0947 \u092E\u093F\u0932\u093E\u0915\u0930 \u0926\u094B\u092C\u093E\u0930\u093E \u0915\u094B\u0936\u093F\u0936 \u0915\u0940\u091C\u093F\u090F\u0964",
"sas.noMatch": "\u0915\u094B\u0921 \u092E\u0947\u0932 \u0928\u0939\u0940\u0902 \u0916\u093E\u0924\u0947",
"sas.makeSure": "\u092A\u0915\u094D\u0915\u093E \u0915\u0940\u091C\u093F\u090F \u0915\u093F \u0926\u094B\u0928\u094B\u0902 \u0915\u094B\u0921 \u092C\u093F\u0932\u094D\u0915\u0941\u0932 \u090F\u0915 \u091C\u0948\u0938\u0947 \u0939\u0948\u0902\u0964",
"sas.tooManyAttempts": "\u092C\u0939\u0941\u0924 \u092C\u093E\u0930 \u0917\u093C\u0932\u0924 \u0915\u094B\u0936\u093F\u0936 \u0939\u0941\u0908\u0964 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u0947 \u0932\u093F\u090F \u0938\u0924\u094D\u0930 \u0930\u0940\u0938\u0947\u091F \u0915\u0930 \u0926\u093F\u092F\u093E \u0917\u092F\u093E\u0964",
"sas.verificationFailed": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0935\u093F\u092B\u0932",
"sas.verified": "\u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \xB7 \u092A\u0942\u0930\u094D\u0923 \u0905\u0917\u094D\u0930\u0917\u093E\u092E\u0940 \u0917\u094B\u092A\u0928\u0940\u092F\u0924\u093E",
"sas.runVerification": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u091A\u0932\u093E\u090F\u0901",
"sec.panelTitle": "\u0928\u0947\u091F\u0935\u0930\u094D\u0915 \u0914\u0930 \u0915\u094D\u0930\u093F\u092A\u094D\u091F\u094B \u0915\u093E \u092C\u094D\u092F\u094B\u0930\u093E",
"sec.security": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E",
"sec.transport": "\u092A\u0930\u093F\u0935\u0939\u0928",
"sec.keyExchange": "\u0915\u0941\u0902\u091C\u0940 \u0935\u093F\u0928\u093F\u092E\u092F",
"sec.allEnabled": "\u0938\u092D\u0940 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0941\u0935\u093F\u0927\u093E\u090F\u0901 \u0921\u093F\u092B\u093C\u0949\u0932\u094D\u091F \u0930\u0942\u092A \u0938\u0947 \u091A\u093E\u0932\u0942 \u0939\u0948\u0902",
"sec.realTimeNote": "\u0905\u0938\u0932\u0940 \u0915\u094D\u0930\u093F\u092A\u094D\u091F\u094B\u0917\u094D\u0930\u093E\u092B\u093C\u093F\u0915 \u092B\u093C\u0902\u0915\u094D\u0936\u0928\u094B\u0902 \u0938\u0947 \u0935\u093E\u0938\u094D\u0924\u0935\u093F\u0915 \u0938\u092E\u092F \u092E\u0947\u0902 \u091C\u093E\u0901\u091A - \u0915\u094B\u0908 \u092C\u0928\u093E\u0935\u091F\u0940 \u0921\u0947\u091F\u093E \u0928\u0939\u0940\u0902\u0964",
"sec.simulatedWarning": "\u0927\u094D\u092F\u093E\u0928 \u0926\u0947\u0902: \u091C\u0941\u0921\u093C\u093E\u0935 \u0936\u093E\u092F\u0926 \u092A\u0942\u0930\u0940 \u0924\u0930\u0939 \u092C\u0928\u093E \u0928\u0939\u0940\u0902 \u0939\u0948 - \u092E\u093E\u0928 \u092C\u0928\u093E\u0935\u091F\u0940 \u0939\u094B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902\u0964",
"dl.title": "SecureBit \u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0915\u0930\u0947\u0902",
"dl.free": "\u092E\u0941\u092B\u093C\u094D\u0924 \xB7 \u0916\u0941\u0932\u093E \u0938\u094D\u0930\u094B\u0924",
"dl.soon": "\u092E\u094B\u092C\u093E\u0907\u0932 \u0910\u092A (iOS, Android) \u0914\u0930 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u090F\u0915\u094D\u0938\u091F\u0947\u0902\u0936\u0928 (Chrome, Firefox, Opera) \u091C\u0932\u094D\u0926 \u0906 \u0930\u0939\u0947 \u0939\u0948\u0902\u0964",
"chatHdr.chat": "\u091A\u0948\u091F",
"chatHdr.chats": "\u091A\u0948\u091F",
"chatHdr.newChat": "+ \u0928\u0908",
"chatHdr.secure": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924",
"chatHdr.p2pSub": "P2P \xB7 \u090F\u0902\u0921-\u091F\u0942-\u090F\u0902\u0921 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u091F\u0947\u0921",
"chatHdr.save": "\u0938\u0939\u0947\u091C\u0947\u0902",
"chatHdr.close": "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
"chatHdr.expand": "\u092C\u0921\u093C\u093E \u0915\u0930\u0947\u0902",
"chatHdr.you": "\u0906\u092A",
"chatHdr.qrCode": "QR \u0915\u094B\u0921",
"chat.disconnected": "\u091C\u0941\u0921\u093C\u093E\u0935 \u091F\u0942\u091F\u093E",
"call.mute": "\u0906\u0935\u093E\u091C\u093C \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
"call.endShort": "\u0938\u092E\u093E\u092A\u094D\u0924",
"group.add": "\u091C\u094B\u0921\u093C\u0947\u0902",
"group.send": "\u092D\u0947\u091C\u0947\u0902",
"sec.pfsShort": "\u092A\u0942\u0930\u094D\u0923 \u0905\u0917\u094D\u0930\u0917\u093E\u092E\u0940 \u0917\u094B\u092A\u0928\u0940\u092F\u0924\u093E",
"sec.cipher": "\u0938\u093F\u092B\u093C\u0930",
"chat.close": "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
"file.needConnection": "\u092B\u093C\u093E\u0907\u0932 \u092D\u0947\u091C\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u091C\u0941\u0921\u093C\u093E\u0935 \u091A\u093E\u0939\u093F\u090F",
"presence.available": "\u0909\u092A\u0932\u092C\u094D\u0927",
"presence.away": "\u0926\u0942\u0930",
"presence.busy": "\u0935\u094D\u092F\u0938\u094D\u0924",
"presence.offline": "\u0911\u092B\u093C\u0932\u093E\u0907\u0928",
"presence.invisible": "\u0905\u0926\u0943\u0936\u094D\u092F",
"presence.availableDesc": "\u0911\u0928\u0932\u093E\u0907\u0928 \u0914\u0930 \u0909\u092A\u0932\u092C\u094D\u0927",
"presence.awayDesc": "\u0928\u093F\u0937\u094D\u0915\u094D\u0930\u093F\u092F \xB7 \u0925\u094B\u0921\u093C\u0940 \u0926\u0947\u0930 \u0915\u0947 \u0932\u093F\u090F \u0926\u0942\u0930",
"presence.busyDesc": "\u092A\u0930\u0947\u0936\u093E\u0928 \u0928 \u0915\u0930\u0947\u0902",
"presence.invisibleDesc": "\u0926\u0942\u0938\u0930\u094B\u0902 \u0915\u094B \u0911\u092B\u093C\u0932\u093E\u0907\u0928 \u0926\u093F\u0916\u0947\u0902",
"presence.online": "\u0911\u0928\u0932\u093E\u0907\u0928",
"conn.p2p": "P2P \xB7 \u091C\u0941\u0921\u093C\u093E \u0939\u0941\u0906",
"conn.verifying": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u091C\u093E\u0930\u0940\u2026",
"conn.connecting": "\u091C\u0941\u0921\u093C \u0930\u0939\u0947 \u0939\u0948\u0902\u2026",
"conn.reconnecting": "\u0926\u094B\u092C\u093E\u0930\u093E \u091C\u0941\u0921\u093C \u0930\u0939\u0947 \u0939\u0948\u0902\u2026",
"conn.peerDisconnected": "\u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u093E \u091C\u0941\u0921\u093C\u093E\u0935 \u091F\u0942\u091F\u093E",
"conn.disconnected": "\u091C\u0941\u0921\u093C\u093E\u0935 \u091F\u0942\u091F\u093E",
"chat.defaultLabel": "\u091A\u0948\u091F",
"groupPhase.forming": "\u092C\u0928 \u0930\u0939\u093E \u0939\u0948\u2026",
"groupPhase.commitments": "\u0935\u091A\u0928\u094B\u0902 \u0915\u093E \u0906\u0926\u093E\u0928-\u092A\u094D\u0930\u0926\u093E\u0928\u2026",
"groupPhase.revealing": "\u092A\u094D\u0930\u0915\u091F \u0915\u093F\u092F\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948\u2026",
"groupPhase.compare": "\u0938\u092E\u0942\u0939 \u0915\u094B\u0921 \u092E\u093F\u0932\u093E\u0907\u090F",
"groupPhase.ready": "\u0938\u092E\u0942\u0939 \u0924\u0948\u092F\u093E\u0930",
"groupPhase.failed": "\u0938\u092E\u0942\u0939 \u0928\u0939\u0940\u0902 \u092C\u0928\u093E",
"call.qualityGood": "\u0905\u091A\u094D\u091B\u0940",
"call.qualityFair": "\u0920\u0940\u0915-\u0920\u093E\u0915",
"call.qualityWeak": "\u0915\u092E\u091C\u093C\u094B\u0930",
"msg.code": "\u0915\u094B\u0921",
"msg.timer": "\u091F\u093E\u0907\u092E\u0930",
"msg.voice": "\u0906\u0935\u093E\u091C\u093C",
"msg.play": "\u091A\u0932\u093E\u090F\u0901",
"msg.sent": "\u092D\u0947\u091C\u093E \u0917\u092F\u093E",
"msg.read": "\u092A\u0922\u093C \u0932\u093F\u092F\u093E",
"report.title": "\u0935\u093E\u0938\u094D\u0924\u0935\u093F\u0915 \u0938\u092E\u092F \u092E\u0947\u0902 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0924\u094D\u092F\u093E\u092A\u0928",
"report.active": "\u0938\u0915\u094D\u0930\u093F\u092F",
"report.testsPassed": "\u092A\u093E\u0938 \u0939\u0941\u0908 \u091C\u093E\u0901\u091A\u0947\u0902",
"report.verifiedAt": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0915\u093E \u0938\u092E\u092F",
"report.source": "\u0938\u094D\u0930\u094B\u0924",
"secTest.verifyECDHKeyExchange": "ECDH \u0915\u0941\u0902\u091C\u0940 \u0935\u093F\u0928\u093F\u092E\u092F",
"secTest.verifyECDSASignatures": "ECDSA \u0921\u093F\u091C\u093F\u091F\u0932 \u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930",
"secTest.verifyEncryption": "AES-GCM \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928",
"secTest.verifyMessageIntegrity": "\u0938\u0902\u0926\u0947\u0936 \u0915\u0940 \u0905\u0916\u0902\u0921\u0924\u093E",
"secTest.verifyPerfectForwardSecrecy": "\u092A\u0942\u0930\u094D\u0923 \u0905\u0917\u094D\u0930\u0917\u093E\u092E\u0940 \u0917\u094B\u092A\u0928\u0940\u092F\u0924\u093E",
"secTest.verifyPFS": "\u092A\u0942\u0930\u094D\u0923 \u0905\u0917\u094D\u0930\u0917\u093E\u092E\u0940 \u0917\u094B\u092A\u0928\u0940\u092F\u0924\u093E",
"secTest.verifyReplayProtection": "\u092A\u0941\u0928\u0930\u093E\u0935\u0943\u0924\u094D\u0924\u093F \u0939\u092E\u0932\u0947 \u0938\u0947 \u092C\u091A\u093E\u0935",
"secTest.verifyDTLSFingerprint": "DTLS \u092B\u093C\u093F\u0902\u0917\u0930\u092A\u094D\u0930\u093F\u0902\u091F",
"secTest.verifySASVerification": "SAS \u0938\u0924\u094D\u092F\u093E\u092A\u0928",
"secTest.verifyMetadataProtection": "\u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093E",
"secTest.verifyTrafficObfuscation": "\u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u0905\u0938\u094D\u092A\u0937\u094D\u091F\u0940\u0915\u0930\u0923",
"secTest.verifyPacketPadding": "\u092A\u0948\u0915\u0947\u091F \u092A\u0948\u0921\u093F\u0902\u0917",
"secTest.verifyNestedEncryption": "\u092A\u0930\u0924\u0926\u093E\u0930 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928",
"secTest.verifyNonExtractableKeys": "\u0928 \u0928\u093F\u0915\u093E\u0932\u0940 \u091C\u093E \u0938\u0915\u0928\u0947 \u0935\u093E\u0932\u0940 \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901",
"secTest.verifyRateLimiting": "\u0926\u0930 \u0938\u0940\u092E\u093E",
"secTest.verifyMutualAuth": "\u092A\u093E\u0930\u0938\u094D\u092A\u0930\u093F\u0915 \u092A\u094D\u0930\u092E\u093E\u0923\u0940\u0915\u0930\u0923",
"secTest.verifyAuthProof": "\u092A\u094D\u0930\u092E\u093E\u0923\u0940\u0915\u0930\u0923 \u0915\u093E \u092A\u094D\u0930\u092E\u093E\u0923",
"secTest.verifyEnhancedValidation": "\u0909\u0928\u094D\u0928\u0924 \u091C\u093E\u0901\u091A",
"secTest.verifyAdvancedFeatures": "\u0909\u0928\u094D\u0928\u0924 \u0938\u0941\u0935\u093F\u0927\u093E\u090F\u0901",
"secTest.verifySignature": "\u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930 \u0915\u0940 \u091C\u093E\u0901\u091A",
"secDetail.Security system initializing...": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u092A\u094D\u0930\u0923\u093E\u0932\u0940 \u0936\u0941\u0930\u0942 \u0939\u094B \u0930\u0939\u0940 \u0939\u0948\u2026",
"secDetail.Nested encryption active": "\u092A\u0930\u0924\u0926\u093E\u0930 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u091A\u093E\u0932\u0942 \u0939\u0948",
"secDetail.Nested encryption failed": "\u092A\u0930\u0924\u0926\u093E\u0930 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0935\u093F\u092B\u0932",
"secDetail.Packet padding active": "\u092A\u0948\u0915\u0947\u091F \u092A\u0948\u0921\u093F\u0902\u0917 \u091A\u093E\u0932\u0942 \u0939\u0948",
"secDetail.Packet padding failed": "\u092A\u0948\u0915\u0947\u091F \u092A\u0948\u0921\u093F\u0902\u0917 \u0935\u093F\u092B\u0932",
"secDetail.Advanced features active": "\u0909\u0928\u094D\u0928\u0924 \u0938\u0941\u0935\u093F\u0927\u093E\u090F\u0901 \u091A\u093E\u0932\u0942 \u0939\u0948\u0902",
"secDetail.Advanced features failed": "\u0909\u0928\u094D\u0928\u0924 \u0938\u0941\u0935\u093F\u0927\u093E\u090F\u0901 \u0935\u093F\u092B\u0932",
"secDetail.No encryption key available": "\u0915\u094B\u0908 \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0915\u0941\u0902\u091C\u0940 \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
"secDetail.AES-GCM encryption/decryption working correctly": "AES-GCM \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0914\u0930 \u0921\u093F\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0938\u0939\u0940 \u0915\u093E\u092E \u0915\u0930 \u0930\u0939\u0947 \u0939\u0948\u0902",
"secDetail.No ECDH key pair available": "\u0915\u094B\u0908 ECDH \u0915\u0941\u0902\u091C\u0940 \u092F\u0941\u0917\u094D\u092E \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
"secDetail.Key derivation failed": "\u0915\u0941\u0902\u091C\u0940 \u0928\u093F\u0915\u093E\u0932\u0928\u093E \u0935\u093F\u092B\u0932 \u0930\u0939\u093E",
"secDetail.No ECDSA key pair available": "\u0915\u094B\u0908 ECDSA \u0915\u0941\u0902\u091C\u0940 \u092F\u0941\u0917\u094D\u092E \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
"secDetail.ECDSA digital signatures working correctly": "ECDSA \u0921\u093F\u091C\u093F\u091F\u0932 \u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930 \u0938\u0939\u0940 \u0915\u093E\u092E \u0915\u0930 \u0930\u0939\u0947 \u0939\u0948\u0902",
"secDetail.MAC key not available or invalid": "MAC \u0915\u0941\u0902\u091C\u0940 \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u092F\u093E \u0905\u092E\u093E\u0928\u094D\u092F \u0939\u0948",
"secDetail.Rate limiter did not block a message over the limit": "\u0926\u0930 \u0938\u0940\u092E\u0915 \u0928\u0947 \u0938\u0940\u092E\u093E \u0938\u0947 \u0905\u0927\u093F\u0915 \u0938\u0902\u0926\u0947\u0936 \u0915\u094B \u0928\u0939\u0940\u0902 \u0930\u094B\u0915\u093E",
"secDetail.Rate limiter is not available": "\u0926\u0930 \u0938\u0940\u092E\u0915 \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948",
"secDetail.Replay protection is working correctly": "\u092A\u0941\u0928\u0930\u093E\u0935\u0943\u0924\u094D\u0924\u093F \u0939\u092E\u0932\u0947 \u0938\u0947 \u092C\u091A\u093E\u0935 \u0938\u0939\u0940 \u0915\u093E\u092E \u0915\u0930 \u0930\u0939\u093E \u0939\u0948",
"secDetail.Replay protection not enabled": "\u092A\u0941\u0928\u0930\u093E\u0935\u0943\u0924\u094D\u0924\u093F \u0939\u092E\u0932\u0947 \u0938\u0947 \u092C\u091A\u093E\u0935 \u091A\u093E\u0932\u0942 \u0928\u0939\u0940\u0902 \u0939\u0948",
"secDetail.SAS code not available": "SAS \u0915\u094B\u0921 \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
"secDetail.SAS verification code is valid and available": "SAS \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0915\u094B\u0921 \u0935\u0948\u0927 \u0914\u0930 \u0909\u092A\u0932\u092C\u094D\u0927 \u0939\u0948",
"secDetail.Traffic obfuscation is working correctly": "\u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u0905\u0938\u094D\u092A\u0937\u094D\u091F\u0940\u0915\u0930\u0923 \u0938\u0939\u0940 \u0915\u093E\u092E \u0915\u0930 \u0930\u0939\u093E \u0939\u0948",
"secDetail.Traffic obfuscation not enabled": "\u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u0905\u0938\u094D\u092A\u0937\u094D\u091F\u0940\u0915\u0930\u0923 \u091A\u093E\u0932\u0942 \u0928\u0939\u0940\u0902 \u0939\u0948",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "\u0907\u0938 \u0938\u0924\u094D\u0930 \u0915\u0947 \u0932\u093F\u090F \u0910\u0938\u0940 \u0915\u094D\u0937\u0923\u093F\u0915 ECDH \u0915\u0941\u0902\u091C\u0940 \u092F\u0941\u0917\u094D\u092E \u0928\u0939\u0940\u0902 \u0939\u0948 \u091C\u093F\u0938\u0947 \u0928\u093F\u0915\u093E\u0932\u093E \u0928 \u091C\u093E \u0938\u0915\u0947",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "\u0915\u0947\u0935\u0932 \u0938\u0924\u094D\u0930-\u0938\u094D\u0924\u0930 \u0915\u0940 \u0905\u0917\u094D\u0930\u0917\u093E\u092E\u0940 \u0917\u094B\u092A\u0928\u0940\u092F\u0924\u093E: \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901 \u0939\u0930 \u0938\u0924\u094D\u0930 \u0915\u0947 \u0932\u093F\u090F \u0915\u094D\u0937\u0923\u093F\u0915 \u0939\u0948\u0902, \u092A\u0930 \u0907\u0938 \u091C\u0941\u0921\u093C\u093E\u0935 \u092E\u0947\u0902 Double Ratchet \u091A\u093E\u0932\u0942 \u0928\u0939\u0940\u0902 \u0939\u0948 (\u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u093E \u092A\u0941\u0930\u093E\u0928\u093E \u0938\u0902\u0938\u094D\u0915\u0930\u0923 \u091A\u0932\u093E \u0930\u0939\u093E \u0939\u0948), \u0907\u0938\u0932\u093F\u090F \u0938\u0924\u094D\u0930 \u0915\u0941\u0902\u091C\u0940 \u0932\u0940\u0915 \u0939\u094B\u0928\u0947 \u092A\u0930 \u092A\u0942\u0930\u0940 \u092C\u093E\u0924\u091A\u0940\u0924 \u0916\u0941\u0932 \u091C\u093E\u0924\u0940 \u0939\u0948\u0964",
"msg.pause": "\u0930\u094B\u0915\u0947\u0902",
"msg.failed": "\u0935\u093F\u092B\u0932",
"groupErr.timeout": "\u0915\u094B\u0921 \u0924\u0948\u092F\u093E\u0930 \u0939\u094B\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u0939\u0940 \u090F\u0915 \u0938\u0926\u0938\u094D\u092F \u0928\u0947 \u091C\u0935\u093E\u092C \u0926\u0947\u0928\u093E \u092C\u0902\u0926 \u0915\u0930 \u0926\u093F\u092F\u093E\u0964",
"groupErr.keyMismatch": "\u090F\u0915 \u0938\u0926\u0938\u094D\u092F \u0915\u0940 \u0915\u0941\u0902\u091C\u0940 \u0909\u0938\u0915\u0940 \u092C\u0924\u093E\u0908 \u092A\u0939\u091A\u093E\u0928 \u0938\u0947 \u092E\u0947\u0932 \u0928\u0939\u0940\u0902 \u0916\u093E\u0908\u0964",
"groupErr.revealMismatch": "\u090F\u0915 \u0938\u0926\u0938\u094D\u092F \u0928\u0947 \u091C\u094B \u092E\u093E\u0928 \u092C\u0924\u093E\u092F\u093E, \u0935\u0939 \u0909\u0938\u0915\u0947 \u092A\u0939\u0932\u0947 \u0926\u093F\u090F \u0935\u091A\u0928 \u0938\u0947 \u092E\u0947\u0932 \u0928\u0939\u0940\u0902 \u0916\u093E\u092F\u093E\u0964",
"groupErr.commitChanged": "\u090F\u0915 \u0938\u0926\u0938\u094D\u092F \u0928\u0947 \u092C\u0940\u091A \u092E\u0947\u0902 \u0905\u092A\u0928\u093E \u0935\u091A\u0928 \u092C\u0926\u0932 \u0926\u093F\u092F\u093E\u0964",
"groupErr.missingKey": "\u0938\u0942\u091A\u0940 \u092E\u0947\u0902 \u090F\u0915 \u0938\u0926\u0938\u094D\u092F \u0925\u093E \u091C\u093F\u0938\u0915\u0940 \u0915\u0941\u0902\u091C\u0940 \u0915\u092D\u0940 \u0906\u0908 \u0939\u0940 \u0928\u0939\u0940\u0902\u0964",
"groupErr.outsider": "\u0938\u092E\u0942\u0939 \u0915\u0947 \u092C\u093E\u0939\u0930 \u0938\u0947 \u0915\u093F\u0938\u0940 \u0915\u093E \u092B\u093C\u094D\u0930\u0947\u092E \u0906\u092F\u093E\u0964",
"groupErr.limit": "\u090F\u0915 \u0938\u092E\u0942\u0939 \u092E\u0947\u0902 \u0905\u0927\u093F\u0915\u0924\u092E \u0906\u0920 \u0938\u0926\u0938\u094D\u092F \u0939\u094B\u0924\u0947 \u0939\u0948\u0902\u0964",
"groupErr.tooLarge": "\u090F\u0915 \u0938\u0902\u0926\u0947\u0936 \u0907\u0924\u0928\u093E \u092C\u0921\u093C\u093E \u0925\u093E \u0915\u093F \u0938\u092E\u0942\u0939 \u0915\u094B \u0928\u0939\u0940\u0902 \u092D\u0947\u091C\u093E \u091C\u093E \u0938\u0915\u093E\u0964",
"fileType.text": "\u0938\u093E\u0926\u093E \u092A\u093E\u0920",
"fileType.images": "\u091A\u093F\u0924\u094D\u0930",
"fileType.archives": "\u0938\u0902\u0917\u094D\u0930\u0939 \u092B\u093C\u093E\u0907\u0932\u0947\u0902",
"fileType.voice": "\u0935\u0949\u0907\u0938 \u0938\u0902\u0926\u0947\u0936",
"fileType.unsupported": "\u0938\u092E\u0930\u094D\u0925\u093F\u0924 \u0928\u0939\u0940\u0902",
"qrScan.title": "QR \u0915\u094B\u0921 \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
"qrScan.auto": "\u0938\u094D\u0935\u0924\u0903 \u092E\u094B\u0921",
"qrScan.reset": "\u0930\u0940\u0938\u0947\u091F",
"qrScan.autoScroll": "\u0938\u094D\u0935\u0924\u0903 \u0938\u094D\u0915\u094D\u0930\u0949\u0932 \u091A\u093E\u0932\u0942 \u0939\u0948",
"qrScan.starting": "\u0915\u0948\u092E\u0930\u093E \u0936\u0941\u0930\u0942 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
"qrScan.point": "\u0915\u0948\u092E\u0930\u093E \u0938\u093E\u092E\u0928\u0947 \u0935\u093E\u0932\u0947 \u0915\u0947 QR \u092A\u0930 \u0930\u0916\u0947\u0902",
"qrScan.tapFocus": "\u092B\u093C\u094B\u0915\u0938 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u094D\u0930\u0940\u0928 \u0926\u092C\u093E\u090F\u0901",
"qrScan.focusing": "\u092B\u093C\u094B\u0915\u0938 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
"iceErr.notArray": "\u0938\u0930\u094D\u0935\u0930\u094B\u0902 \u0915\u0940 \u0938\u0942\u091A\u0940 \u090F\u0915 \u0938\u0930\u0923\u0940 \u0939\u094B\u0928\u0940 \u091A\u093E\u0939\u093F\u090F",
"iceErr.invalidJson": "\u0917\u093C\u0932\u0924 JSON",
"iceErr.tooMany": "\u092C\u0939\u0941\u0924 \u091C\u093C\u094D\u092F\u093E\u0926\u093E \u0938\u0930\u094D\u0935\u0930 (\u0905\u0927\u093F\u0915\u0924\u092E {max})",
"iceErr.invalidEntry": "{label}: \u0917\u093C\u0932\u0924 \u092A\u094D\u0930\u0935\u093F\u0937\u094D\u091F\u093F",
"iceErr.urlCount": "{label}: 1 \u0938\u0947 {max} \u0924\u0915 URL \u091A\u093E\u0939\u093F\u090F",
"iceErr.turnCreds": "{label}: TURN \u0938\u0930\u094D\u0935\u0930\u094B\u0902 \u0915\u094B \u0906\u092E\u0924\u094C\u0930 \u092A\u0930 \u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0928\u093E\u092E \u0914\u0930 \u092A\u094D\u0930\u092E\u093E\u0923 \u091A\u093E\u0939\u093F\u090F",
"iceUrl.notString": "URL \u090F\u0915 \u0938\u094D\u091F\u094D\u0930\u093F\u0902\u0917 \u0939\u094B\u0928\u093E \u091A\u093E\u0939\u093F\u090F",
"iceUrl.empty": "URL \u0916\u093C\u093E\u0932\u0940 \u0939\u0948",
"iceUrl.tooLong": "URL \u092C\u0939\u0941\u0924 \u0932\u0902\u092C\u093E \u0939\u0948",
"iceUrl.badChars": "URL \u092E\u0947\u0902 \u0905\u092E\u093E\u0928\u094D\u092F \u0905\u0915\u094D\u0937\u0930 \u0939\u0948\u0902",
"iceUrl.badScheme": "URL stun:, stuns:, turn: \u092F\u093E turns: \u0938\u0947 \u0936\u0941\u0930\u0942 \u0939\u094B\u0928\u093E \u091A\u093E\u0939\u093F\u090F",
"iceUrl.badQuery": "URL \u0915\u0940 \u0915\u094D\u0935\u0947\u0930\u0940 \u0917\u093C\u0932\u0924 \u0939\u0948",
"iceUrl.noHost": "URL \u092E\u0947\u0902 \u0939\u094B\u0938\u094D\u091F \u0928\u0939\u0940\u0902 \u0939\u0948",
"iceUrl.badHost": "URL \u0915\u093E \u0939\u094B\u0938\u094D\u091F \u092F\u093E \u092A\u094B\u0930\u094D\u091F \u0917\u093C\u0932\u0924 \u0939\u0948",
"iceUrl.badTransport": "URL \u0915\u0940 \u0915\u094D\u0935\u0947\u0930\u0940 transport=udp \u092F\u093E transport=tcp \u0939\u094B\u0928\u0940 \u091A\u093E\u0939\u093F\u090F",
"msg.off": "\u092C\u0902\u0926",
"file.consentUnavailable": "\u0938\u0939\u092E\u0924\u093F \u0928\u0939\u0940\u0902 \u0932\u0940 \u091C\u093E \u0938\u0915\u0940",
"secLevel.MAXIMUM": "\u0905\u0927\u093F\u0915\u0924\u092E",
"secLevel.INITIALIZING": "\u0936\u0941\u0930\u0942 \u0939\u094B \u0930\u0939\u093E \u0939\u0948",
"secLevel.ERROR": "\u0924\u094D\u0930\u0941\u091F\u093F",
"secLevel.UNKNOWN": "\u0905\u091C\u094D\u091E\u093E\u0924",
"status.error": "\u0924\u094D\u0930\u0941\u091F\u093F",
"offline.disconnect": "\u091C\u0941\u0921\u093C\u093E\u0935 \u0924\u094B\u0921\u093C\u0947\u0902",
"offline.learnMore": "\u0914\u0930 \u091C\u093E\u0928\u0947\u0902",
"pwa.installApp": "\u0910\u092A \u0907\u0902\u0938\u094D\u091F\u0949\u0932 \u0915\u0930\u0947\u0902",
"chat.onWeb": "\u0906\u092A \u0935\u0947\u092C \u0938\u0902\u0938\u094D\u0915\u0930\u0923 \u092A\u0930 \u0939\u0948\u0902",
"groupCall.startVoice": "\u0938\u092E\u0942\u0939 \u0935\u0949\u0907\u0938 \u0915\u0949\u0932 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
"groupCall.startVideo": "\u0938\u092E\u0942\u0939 \u0935\u0940\u0921\u093F\u092F\u094B \u0915\u0949\u0932 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
"groupCall.join": "\u0936\u093E\u092E\u093F\u0932 \u0939\u094B\u0902",
"groupCall.dismiss": "\u0905\u092D\u0940 \u0928\u0939\u0940\u0902",
"groupCall.leave": "\u0915\u0949\u0932 \u091B\u094B\u0921\u093C\u0947\u0902",
"groupCall.you": "\u0906\u092A",
"groupCall.connecting": "\u091C\u0941\u0921\u093C \u0930\u0939\u093E \u0939\u0948\u2026",
"groupCall.waitingLink": "\u0938\u0940\u0927\u0947 \u0932\u093F\u0902\u0915 \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E\u2026",
"groupCall.legFailed": "\u0915\u0928\u0947\u0915\u094D\u091F \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u093E",
"groupCall.startedVoice": "{name} \u0928\u0947 \u0935\u0949\u0907\u0938 \u0915\u0949\u0932 \u0936\u0941\u0930\u0942 \u0915\u0940",
"groupCall.startedVideo": "{name} \u0928\u0947 \u0935\u0940\u0921\u093F\u092F\u094B \u0915\u0949\u0932 \u0936\u0941\u0930\u0942 \u0915\u0940",
"groupCall.inCall": "\u0915\u0949\u0932 \u092E\u0947\u0902 {count}",
"groupCall.err.permission_denied": "\u0915\u0949\u0932 \u0936\u0941\u0930\u0942 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u0940 - \u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928 \u0914\u0930 \u0915\u0948\u092E\u0930\u0947 \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0905\u0935\u0930\u0941\u0926\u094D\u0927 \u0939\u0948\u0964 \u0907\u0938 \u0938\u093E\u0907\u091F \u0915\u0947 \u0932\u093F\u090F \u0905\u0928\u0941\u092E\u0924\u093F \u0926\u0947\u0902 \u0914\u0930 \u092B\u093F\u0930 \u0915\u094B\u0936\u093F\u0936 \u0915\u0930\u0947\u0902\u0964",
"groupCall.err.device_not_found": "\u0915\u0949\u0932 \u0936\u0941\u0930\u0942 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u0940 - \u0907\u0938 \u0921\u093F\u0935\u093E\u0907\u0938 \u092A\u0930 \u0915\u094B\u0908 \u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928 \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\u0964",
"groupCall.err.device_busy": "\u0915\u0949\u0932 \u0936\u0941\u0930\u0942 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u0940 - \u0906\u092A\u0915\u093E \u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928 \u0915\u093F\u0938\u0940 \u0905\u0928\u094D\u092F \u0910\u092A \u0915\u0947 \u0909\u092A\u092F\u094B\u0917 \u092E\u0947\u0902 \u0939\u0948\u0964 \u0909\u0938\u0947 \u092C\u0902\u0926 \u0915\u0930\u0915\u0947 \u092B\u093F\u0930 \u0915\u094B\u0936\u093F\u0936 \u0915\u0930\u0947\u0902\u0964",
"groupCall.err.media_failed": "\u0915\u0949\u0932 \u0936\u0941\u0930\u0942 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u0940 - \u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928 \u0928\u0939\u0940\u0902 \u0916\u0941\u0932 \u0938\u0915\u093E\u0964",
"groupCall.err.call_in_progress": "\u0907\u0938 \u0938\u092E\u0942\u0939 \u092E\u0947\u0902 \u092A\u0939\u0932\u0947 \u0938\u0947 \u090F\u0915 \u0915\u0949\u0932 \u091A\u0932 \u0930\u0939\u0940 \u0939\u0948\u0964 \u0928\u0908 \u0936\u0941\u0930\u0942 \u0915\u0930\u0928\u0947 \u0915\u0947 \u092C\u091C\u093E\u092F \u0909\u0938\u092E\u0947\u0902 \u0936\u093E\u092E\u093F\u0932 \u0939\u094B\u0902\u0964",
"groupCall.err.not_ready": "\u0915\u0949\u0932 \u0915\u0930\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u0938\u092E\u0942\u0939 \u0915\u094B\u0921 \u0915\u0940 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0930\u0947\u0902\u0964",
"groupCall.speaking": "{name} \u092C\u094B\u0932 \u0930\u0939\u0947 \u0939\u0948\u0902",
"groupCall.pin": "{name} \u0915\u094B \u092C\u0921\u093C\u093E \u0926\u093F\u0916\u093E\u090F\u0901",
"groupCall.unpin": "\u0938\u092D\u0940 \u092A\u0930 \u0932\u094C\u091F\u0947\u0902",
"groupCall.showEveryone": "\u0938\u092D\u0940",
"msg.after5s": "\u092A\u0922\u093C\u0928\u0947 \u0915\u0947 5 \u0938\u0947\u0915\u0902\u0921 \u092C\u093E\u0926",
"msg.after15s": "\u092A\u0922\u093C\u0928\u0947 \u0915\u0947 15 \u0938\u0947\u0915\u0902\u0921 \u092C\u093E\u0926",
"msg.after30s": "\u092A\u0922\u093C\u0928\u0947 \u0915\u0947 30 \u0938\u0947\u0915\u0902\u0921 \u092C\u093E\u0926",
"msg.after1m": "\u092A\u0922\u093C\u0928\u0947 \u0915\u0947 1 \u092E\u093F\u0928\u091F \u092C\u093E\u0926",
"msg.sec30": "30 \u0938\u0947\u0915\u0902\u0921",
"msg.min5": "5 \u092E\u093F\u0928\u091F",
"msg.hour1": "1 \u0918\u0902\u091F\u093E",
"desktop.shareDesc": "\u0915\u094B\u0921 \u0905\u092A\u0928\u0947 \u0938\u093E\u0925\u0940 \u0915\u094B \u092D\u0947\u091C\u0947\u0902\u0964 \u092F\u0939 \u090F\u0915 \u092C\u093E\u0930 \u0915\u093E \u0939\u0948 \u0914\u0930 \u091C\u0932\u094D\u0926\u0940 \u0938\u092E\u093E\u092A\u094D\u0924 \u0939\u094B \u091C\u093E\u0924\u093E \u0939\u0948\u0964",
"desktop.invitationCreated": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u092C\u0928 \u0917\u092F\u093E - \u0907\u0938\u0947 \u0905\u092A\u0928\u0947 \u0938\u093E\u0925\u0940 \u0915\u094B \u092D\u0947\u091C\u0947\u0902\u0964",
"desktop.joinDesc": "\u0905\u092A\u0928\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0909\u0924\u094D\u0924\u0930 \u092C\u0928\u093E\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u093E\u0925\u0940 \u0915\u093E \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0915\u094B\u0921 \u091A\u093F\u092A\u0915\u093E\u090F\u0901\u0964",
"desktop.offerTag": "\u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \xB7 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0915\u0949\u092A\u0940 \u0915\u0930\u0947\u0902",
"desktop.answerTag": "\u0909\u0924\u094D\u0924\u0930 \xB7 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0915\u0949\u092A\u0940 \u0915\u0930\u0947\u0902",
"desktop.offerPlaceholder": "\u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0915\u094B\u0921 \u092F\u0939\u093E\u0901 \u0926\u093F\u0916\u093E\u0908 \u0926\u0947\u0917\u093E\u2026",
"desktop.answerPlaceholder": "\u0909\u0924\u094D\u0924\u0930 \u0915\u094B\u0921 \u092F\u0939\u093E\u0901 \u0926\u093F\u0916\u093E\u0908 \u0926\u0947\u0917\u093E\u2026",
"desktop.backToChats": "\u091A\u0948\u091F \u092A\u0930 \u0935\u093E\u092A\u0938",
"desktop.sendFeedback": "\u092A\u094D\u0930\u0924\u093F\u0915\u094D\u0930\u093F\u092F\u093E \u092D\u0947\u091C\u0947\u0902",
"desktop.callsNeedVerified": "\u0915\u0949\u0932 \u0915\u0947 \u0932\u093F\u090F \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u0928\u0932 \u091A\u093E\u0939\u093F\u090F\u0964",
"desktop.noOpenChannel": "\u0915\u094B\u0908 \u0916\u0941\u0932\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u0928\u0932 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
"desktop.chatCarriesCall": "\u092F\u0939 \u091A\u0948\u091F \u090F\u0915 \u0938\u092E\u0942\u0939 \u0915\u0949\u0932 \u0932\u0947 \u091C\u093E \u0930\u0939\u0940 \u0939\u0948\u0964 1:1 \u0915\u0949\u0932 \u0915\u0930\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u0938\u092E\u0942\u0939 \u0915\u0949\u0932 \u091B\u094B\u0921\u093C\u0947\u0902\u0964",
"desktop.err.permission_denied": "\u0915\u0949\u0932 \u0936\u0941\u0930\u0942 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u0940 - \u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928 \u0914\u0930 \u0915\u0948\u092E\u0930\u0947 \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0905\u0935\u0930\u0941\u0926\u094D\u0927 \u0939\u0948\u0964 \u0938\u093F\u0938\u094D\u091F\u092E \u0938\u0947\u091F\u093F\u0902\u0917\u094D\u0938 \u092E\u0947\u0902 \u0907\u0938\u0947 \u0905\u0928\u0941\u092E\u0924\u093F \u0926\u0947\u0902 \u0914\u0930 \u092B\u093F\u0930 \u0915\u094B\u0936\u093F\u0936 \u0915\u0930\u0947\u0902\u0964",
"desktop.language": "\u092D\u093E\u0937\u093E",
"desktop.languageHint": "\u0924\u0941\u0930\u0902\u0924 \u0932\u093E\u0917\u0942 \u0939\u094B\u0924\u093E \u0939\u0948\u0964 \u092A\u0939\u0932\u0947 \u092D\u0947\u091C\u0947 \u0917\u090F \u0938\u0902\u0926\u0947\u0936 \u0905\u092A\u0928\u0940 \u0939\u0940 \u092D\u093E\u0937\u093E \u092E\u0947\u0902 \u0930\u0939\u0924\u0947 \u0939\u0948\u0902\u0964",
"desktop.compareCode": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0915\u094B\u0921 \u0905\u092A\u0928\u0947 \u0938\u093E\u0925\u0940 \u0938\u0947 \u092E\u093F\u0932\u093E\u090F\u0901 \u0914\u0930 \u092E\u0947\u0932 \u0916\u093E\u0928\u0947 \u092A\u0930 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0930\u0947\u0902\u0964",
"desktop.verifyBeforeFiles": "\u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u092D\u0947\u091C\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u092A\u0942\u0930\u093E \u0915\u0930\u0947\u0902\u0964",
"desktop.verifyBeforeSending": "\u0938\u0902\u0926\u0947\u0936 \u092D\u0947\u091C\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u092A\u0942\u0930\u093E \u0915\u0930\u0947\u0902\u0964",
"desktop.disconnectedByBackend": "\u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0930\u0942\u092A \u0938\u0947 \u092C\u0902\u0926 \u0915\u0930 \u0926\u093F\u092F\u093E \u0917\u092F\u093E\u0964",
"desktop.restoreFailed": "\u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u092C\u0939\u093E\u0932 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u093E\u0964 \u092F\u0939 \u091A\u0948\u091F \u092C\u0902\u0926 \u0915\u0940 \u091C\u093E \u0930\u0939\u0940 \u0939\u0948\u0964",
"desktop.channelNotReady": "\u0921\u0947\u091F\u093E \u091A\u0948\u0928\u0932 \u0905\u092D\u0940 \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u092C\u0928\u0928\u0947 \u0924\u0915 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0915\u0930\u0947\u0902\u0964",
"desktop.enterCode": "\u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0947 \u0932\u093F\u090F \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0915\u094B\u0921 \u0926\u0930\u094D\u091C \u0915\u0930\u0947\u0902\u0964",
"desktop.noOffer": "\u0915\u094B\u0908 \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\u0964 \u092A\u0939\u0932\u0947 \u090F\u0915 \u092C\u0928\u093E\u090F\u0901\u0964",
"desktop.notInitiator": "\u092F\u0939 \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u0906\u092A\u0928\u0947 \u0928\u0939\u0940\u0902 \u092C\u0928\u093E\u092F\u093E, \u0907\u0938\u0932\u093F\u090F \u0932\u093E\u0917\u0942 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0915\u094B\u0908 \u0909\u0924\u094D\u0924\u0930 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
"desktop.decryptFailed": "\u090F\u0915 \u0938\u0902\u0926\u0947\u0936 \u0921\u093F\u0915\u094D\u0930\u093F\u092A\u094D\u091F \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u093E \u0914\u0930 \u0939\u091F\u093E \u0926\u093F\u092F\u093E \u0917\u092F\u093E\u0964",
"desktop.badMessageFormat": "\u0917\u0932\u0924 \u092A\u094D\u0930\u093E\u0930\u0942\u092A \u0935\u093E\u0932\u093E \u092B\u093C\u094D\u0930\u0947\u092E \u0906\u092F\u093E \u0914\u0930 \u0939\u091F\u093E \u0926\u093F\u092F\u093E \u0917\u092F\u093E\u0964",
"desktop.notSentNotReady": "\u0938\u0902\u0926\u0947\u0936 \u0928\u0939\u0940\u0902 \u092D\u0947\u091C\u093E \u0917\u092F\u093E: \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u0928\u0932 \u0924\u0948\u092F\u093E\u0930 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u092A\u0942\u0930\u093E \u0939\u094B\u0928\u0947 \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0915\u0930\u0947\u0902 \u092F\u093E \u092B\u093F\u0930 \u0938\u0947 \u091C\u0941\u0921\u093C\u0947\u0902\u0964",
"desktop.micDenied": "\u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928 \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0905\u0938\u094D\u0935\u0940\u0915\u093E\u0930 \u0915\u0930 \u0926\u0940 \u0917\u0908\u0964",
"desktop.noChannelWait": "\u0915\u094B\u0908 \u0916\u0941\u0932\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u0928\u0932 \u0928\u0939\u0940\u0902 - \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u092C\u0928\u0928\u0947 \u0924\u0915 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0915\u0930\u0947\u0902\u0964",
"desktop.sasFailed": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0935\u093F\u092B\u0932\u0964 \u092C\u0940\u091A \u092E\u0947\u0902 \u0915\u094B\u0908 \u0939\u094B \u0938\u0915\u0924\u093E \u0939\u0948, \u0907\u0938\u0932\u093F\u090F \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u0930\u094B\u0915 \u0926\u093F\u092F\u093E \u0917\u092F\u093E\u0964",
"desktop.sasOk": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0938\u092B\u0932\u0964 \u092F\u0939 \u091A\u0948\u0928\u0932 \u0938\u093F\u0930\u0947 \u0938\u0947 \u0938\u093F\u0930\u0947 \u0924\u0915 \u092A\u094D\u0930\u092E\u093E\u0923\u093F\u0924 \u0939\u0948\u0964",
"desktop.iceForgotten": "\u0938\u0939\u0947\u091C\u0947 \u0917\u090F \u0938\u0930\u094D\u0935\u0930 \u092D\u0941\u0932\u093E \u0926\u093F\u090F \u0917\u090F\u0964 \u0938\u093E\u0930\u094D\u0935\u091C\u0928\u093F\u0915 ICE \u0938\u0930\u094D\u0935\u0930 \u0909\u092A\u092F\u094B\u0917 \u0939\u094B \u0930\u0939\u0947 \u0939\u0948\u0902\u0964",
"desktop.icePublic": "\u0938\u093E\u0930\u094D\u0935\u091C\u0928\u093F\u0915 ICE \u0938\u0930\u094D\u0935\u0930 \u0909\u092A\u092F\u094B\u0917 \u0939\u094B \u0930\u0939\u0947 \u0939\u0948\u0902\u0964",
"desktop.verificationInProgress": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0905\u092D\u0940 \u091A\u0932 \u0930\u0939\u093E \u0939\u0948\u0964 \u092A\u0942\u0930\u093E \u0939\u094B\u0928\u0947 \u0924\u0915 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0915\u0930\u0947\u0902\u0964",
"desktop.fileGone": "\u092F\u0939 \u092B\u093C\u093E\u0907\u0932 \u0905\u092C \u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0915\u0947 \u0932\u093F\u090F \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
"desktop.codeMismatch": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0915\u094B\u0921 \u092E\u0947\u0932 \u0928\u0939\u0940\u0902 \u0916\u093E\u0924\u0947\u0964 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u092C\u0902\u0926 \u0915\u093F\u092F\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948\u0964",
"desktop.noLocalCode": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0935\u093F\u092B\u0932: \u0924\u0941\u0932\u0928\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u094B\u0908 \u0938\u094D\u0925\u093E\u0928\u0940\u092F \u0915\u094B\u0921 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u092C\u0902\u0926 \u0915\u093F\u092F\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948\u0964",
"desktop.protocolViolation": "\u0938\u093E\u0925\u0940 \u0928\u0947 \u0906\u092A\u0915\u0947 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0930\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u0939\u0940 \u0915\u094B\u0921 \u0915\u0940 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u093E \u0926\u093E\u0935\u093E \u0915\u093F\u092F\u093E\u0964 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u092C\u0902\u0926 \u0915\u093F\u092F\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948\u0964",
"desktop.verificationRejected": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0905\u0938\u094D\u0935\u0940\u0915\u093E\u0930\u0964 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u0930\u094B\u0915 \u0926\u093F\u092F\u093E \u0917\u092F\u093E\u0964",
"secLevel.HIGH": "\u0909\u091A\u094D\u091A",
"secLevel.MEDIUM": "\u092E\u0927\u094D\u092F\u092E",
"secLevel.LOW": "\u0928\u093F\u092E\u094D\u0928",
"desktop.rerun": "\u0926\u094B\u092C\u093E\u0930\u093E \u091C\u093E\u0901\u091A\u0947\u0902",
"desktop.ice.customDesc": "\u0905\u0927\u093F\u0915\u0924\u092E {max} \u0938\u0930\u094D\u0935\u0930, \u092A\u094D\u0930\u0924\u093F \u092A\u0902\u0915\u094D\u0924\u093F \u090F\u0915 URL \u092F\u093E JSON\u0964",
"desktop.ice.persistDesc": "\u0907\u0938\u0940 \u0921\u093F\u0935\u093E\u0907\u0938 \u092A\u0930 \u0938\u0939\u0947\u091C\u093E \u091C\u093E\u0924\u093E \u0939\u0948\u0964 \u0915\u0947\u0935\u0932 \u0907\u0938\u0940 \u0938\u0924\u094D\u0930 \u0915\u0947 \u0932\u093F\u090F \u0909\u092A\u092F\u094B\u0917 \u0915\u0930\u0928\u093E \u0939\u094B \u0924\u094B \u092C\u0902\u0926 \u0930\u0939\u0928\u0947 \u0926\u0947\u0902\u0964",
"desktop.group.leaveNote": "\u092C\u093E\u0915\u0940 \u0938\u0926\u0938\u094D\u092F\u094B\u0902 \u0915\u094B \u092C\u0924\u093E \u0926\u093F\u092F\u093E \u091C\u093E\u0924\u093E \u0939\u0948 \u0915\u093F \u0906\u092A \u091A\u0932\u0947 \u0917\u090F\u0964 \u0909\u0938\u0915\u0947 \u092C\u093E\u0926 \u0907\u0938 \u0921\u093F\u0935\u093E\u0907\u0938 \u092A\u0930 \u0907\u0938 \u0938\u092E\u0942\u0939 \u0915\u093E \u0915\u0941\u091B \u0928\u0939\u0940\u0902 \u0930\u0939\u0924\u093E - \u0915\u093F\u0938\u0940 \u0938\u0930\u094D\u0935\u0930 \u0915\u0947 \u092A\u093E\u0938 \u092A\u094D\u0930\u0924\u093F \u0928\u0939\u0940\u0902 \u0939\u0948 \u091C\u093F\u0938\u0938\u0947 \u0932\u094C\u091F\u093E \u091C\u093E \u0938\u0915\u0947, \u0907\u0938\u0932\u093F\u090F \u0928\u092F\u093E \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u091A\u093E\u0939\u093F\u090F \u0939\u094B\u0917\u093E\u0964",
"desktop.sec.ecdsaOk": "\u0939\u0948\u0902\u0921\u0936\u0947\u0915 \u0915\u0947 \u0926\u094C\u0930\u093E\u0928 \u0938\u093E\u0925\u0940 \u0915\u0947 \u0915\u0940-\u092A\u0948\u0915\u0947\u091C \u0915\u093E \u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 (ECDSA P-384 / SHA-384)",
"desktop.sec.ecdsaNone": "\u0915\u094B\u0908 \u092A\u0942\u0930\u094D\u0923 \u0939\u0948\u0902\u0921\u0936\u0947\u0915 \u0928\u0939\u0940\u0902",
"desktop.sec.ecdhOk": "\u0938\u0924\u094D\u0930 \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901 \u0905\u0938\u094D\u0925\u093E\u092F\u0940 ECDH P-384 \u0935\u093F\u0928\u093F\u092E\u092F \u0938\u0947 HKDF-SHA-256 \u0926\u094D\u0935\u093E\u0930\u093E \u0935\u094D\u092F\u0941\u0924\u094D\u092A\u0928\u094D\u0928",
"desktop.sec.ecdhNone": "\u0915\u094B\u0908 \u0938\u0924\u094D\u0930 \u0915\u0941\u0902\u091C\u0940 \u0935\u094D\u092F\u0941\u0924\u094D\u092A\u0928\u094D\u0928 \u0928\u0939\u0940\u0902 \u0939\u0941\u0908",
"desktop.sec.encryptionOk": "\u0915\u094B\u0930 \u092E\u0947\u0902 AES-GCM \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0914\u0930 \u0921\u093F\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924",
"desktop.sec.encryptionNa": "AES-GCM \u0938\u094D\u0935-\u092A\u0930\u0940\u0915\u094D\u0937\u0923 \u0928\u0939\u0940\u0902 \u091A\u0932 \u0938\u0915\u093E",
"desktop.sec.integrityOk": "\u0938\u0902\u0926\u0947\u0936 \u0905\u0916\u0902\u0921\u0924\u093E \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 (AES-GCM \u092A\u094D\u0930\u092E\u093E\u0923\u0940\u0915\u0930\u0923)",
"desktop.sec.integrityNa": "\u0905\u0916\u0902\u0921\u0924\u093E \u0938\u094D\u0935-\u092A\u0930\u0940\u0915\u094D\u0937\u0923 \u0928\u0939\u0940\u0902 \u091A\u0932 \u0938\u0915\u093E",
"desktop.sec.pfsOk": "Double Ratchet \u0938\u0915\u094D\u0930\u093F\u092F - \u0939\u0930 \u0938\u0902\u0926\u0947\u0936 \u0915\u0940 \u0905\u092A\u0928\u0940 \u0915\u0941\u0902\u091C\u0940 \u0939\u0948",
"desktop.sec.pfsNa": "\u092E\u093E\u092A\u093E \u0928\u0939\u0940\u0902 \u0917\u092F\u093E",
"desktop.sec.replayOk": "\u0930\u0948\u091A\u0947\u091F \u0938\u0902\u0926\u0947\u0936 \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901 \u0909\u092A\u092F\u094B\u0917 \u0939\u094B\u0924\u0947 \u0939\u0940 \u0928\u0937\u094D\u091F \u0939\u094B \u091C\u093E\u0924\u0940 \u0939\u0948\u0902, \u0907\u0938\u0932\u093F\u090F \u092A\u0915\u0921\u093C\u093E \u0917\u092F\u093E \u092B\u093C\u094D\u0930\u0947\u092E \u0926\u094B\u092C\u093E\u0930\u093E \u0928\u0939\u0940\u0902 \u091A\u0932\u093E\u092F\u093E \u091C\u093E \u0938\u0915\u0924\u093E",
"desktop.sec.replayNa": "\u092E\u093E\u092A\u093E \u0928\u0939\u0940\u0902 \u0917\u092F\u093E",
"desktop.sec.dtlsPinned": "\u0938\u093E\u0925\u0940 \u0915\u093E DTLS \u092B\u093C\u093F\u0902\u0917\u0930\u092A\u094D\u0930\u093F\u0902\u091F \u092A\u093F\u0928 \u0915\u093F\u092F\u093E \u0917\u092F\u093E: {fp}",
"desktop.sec.dtlsNone": "\u0926\u0942\u0930\u0938\u094D\u0925 DTLS \u092B\u093C\u093F\u0902\u0917\u0930\u092A\u094D\u0930\u093F\u0902\u091F \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
"desktop.sec.sasBoth": "\u0926\u094B\u0928\u094B\u0902 \u092A\u0915\u094D\u0937\u094B\u0902 \u0928\u0947 \u092C\u093E\u0939\u0930\u0940 \u092E\u093E\u0927\u094D\u092F\u092E \u0938\u0947 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u094B\u0921 \u0915\u0940 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0940",
"desktop.sec.sasIncomplete": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u094B\u0921 \u0915\u0940 \u092A\u0941\u0937\u094D\u091F\u093F \u0926\u094B\u0928\u094B\u0902 \u092A\u0915\u094D\u0937\u094B\u0902 \u0928\u0947 \u0928\u0939\u0940\u0902 \u0915\u0940",
"desktop.sec.metadataOk": "\u0938\u092E\u0930\u094D\u092A\u093F\u0924 \u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0915\u0941\u0902\u091C\u0940 \u0935\u094D\u092F\u0941\u0924\u094D\u092A\u0928\u094D\u0928 (HKDF metadata-protection-v4)",
"desktop.sec.metadataNone": "\u0915\u094B\u0908 \u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0915\u0941\u0902\u091C\u0940 \u0928\u0939\u0940\u0902",
"desktop.sec.coverOn": "\u0906\u0935\u0930\u0923 \u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u0938\u0915\u094D\u0930\u093F\u092F: \u0930\u0948\u091A\u0947\u091F \u091A\u0948\u0928\u0932 \u092A\u0930 \u092F\u093E\u0926\u0943\u091A\u094D\u091B\u093F\u0915 \u0928\u0915\u0932\u0940 \u092B\u093C\u094D\u0930\u0947\u092E (\u0939\u0930 15-30 \u0938\u0947\u0915\u0902\u0921 \u092E\u0947\u0902 32-128 B)",
"desktop.sec.coverOff": "\u0906\u0935\u0930\u0923 \u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u091C\u0928\u0930\u0947\u091F\u0930 \u0928\u0939\u0940\u0902 \u091A\u0932 \u0930\u0939\u093E",
"desktop.sec.coverUnsupported": "\u0906\u0935\u0930\u0923 \u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u0915\u0947 \u0932\u093F\u090F Double Ratchet \u0938\u0924\u094D\u0930 \u091A\u093E\u0939\u093F\u090F (\u0938\u093E\u0925\u0940 \u092A\u0941\u0930\u093E\u0928\u0947 \u0938\u0902\u0938\u094D\u0915\u0930\u0923 \u092A\u0930 \u0939\u0948)",
"desktop.tagline": "\u0938\u093F\u0930\u0947 \u0938\u0947 \u0938\u093F\u0930\u0947 \u0924\u0915 \u0906\u091C\u093C\u093E\u0926\u0940"
},
"ar": {
"language.label": "\u0627\u0644\u0644\u063A\u0629",
"language.suggest.text": "\u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629 \u0645\u062A\u0648\u0641\u0631\u0629 \u0623\u064A\u0636\u064B\u0627 \u0628\u0627\u0644\u0639\u0631\u0628\u064A\u0629.",
"language.suggest.cta": "\u0627\u0642\u0631\u0623 \u0628\u0627\u0644\u0639\u0631\u0628\u064A\u0629",
"language.suggest.dismiss": "\u0625\u063A\u0644\u0627\u0642",
"community.title": "\u0627\u0646\u0636\u0645\u0651 \u0625\u0644\u0649 \u0645\u0633\u062A\u0642\u0628\u0644 \u0627\u0644\u062E\u0635\u0648\u0635\u064A\u0629",
"community.description": "\u064A\u0646\u0645\u0648 SecureBit \u0628\u0641\u0636\u0644 \u0645\u062C\u062A\u0645\u0639\u0647. \u0623\u0641\u0643\u0627\u0631\u0643\u0645 \u0648\u0645\u0644\u0627\u062D\u0638\u0627\u062A\u0643\u0645 \u0647\u064A \u0645\u0627 \u064A\u0635\u0648\u063A \u0645\u0633\u062A\u0642\u0628\u0644 \u0627\u0644\u062A\u0648\u0627\u0635\u0644 \u0627\u0644\u0622\u0645\u0646 - \u0645\u0628\u0646\u064A\u0651 \u0641\u064A \u0627\u0644\u0639\u0644\u0646\u060C \u0645\u0639 \u062A\u062D\u0642\u0651\u0642 ASN.1 \u0643\u0627\u0645\u0644 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641.",
"community.github": "\u0645\u0633\u062A\u0648\u062F\u0639 GitHub",
"community.feedback": "\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A",
"unique.eyebrow": "\u0645\u0627 \u0627\u0644\u0630\u064A \u064A\u0645\u064A\u0651\u0632\u0646\u0627",
"unique.heading": "\u0644\u0645\u0627\u0630\u0627 SecureBit \u0641\u0631\u064A\u062F",
"unique.s1.titleTop": "\u0646\u0648\u0627\u0629 \u062A\u0634\u0641\u064A\u0631",
"unique.s1.titleBottom": "\u0645\u062A\u0639\u062F\u0651\u062F\u0629 \u0627\u0644\u0637\u0628\u0642\u0627\u062A",
"unique.s1.collapsed": "\u0646\u0648\u0627\u0629 \u0627\u0644\u062A\u0634\u0641\u064A\u0631",
"unique.s1.desc": "\u062A\u0628\u0627\u062F\u0644 \u0645\u0641\u0627\u062A\u064A\u062D ECDH P-384\u060C \u0648\u062D\u0645\u0648\u0644\u0627\u062A AES-256-GCM\u060C \u0648\u062A\u0648\u0627\u0642\u064A\u0639 ECDSA\u060C \u0648\u062A\u062D\u0642\u0651\u0642 ASN.1 \u0643\u0627\u0645\u0644 - \u0645\u062C\u0645\u0648\u0639\u0629 \u0641\u064A \u062E\u0637\u0651 \u0648\u0627\u062D\u062F \u0645\u064F\u062D\u0635\u064E\u0651\u0646.",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "\u0646\u062F\u064C\u0651 \u0644\u0646\u062F\u0651 \u062E\u0627\u0644\u0635",
"unique.s2.titleBottom": "\u0639\u0628\u0631 WebRTC",
"unique.s2.collapsed": "WebRTC \u0646\u062F\u064C\u0651 \u0644\u0646\u062F\u0651 \u062E\u0627\u0644\u0635",
"unique.s2.desc": "\u062A\u0646\u062A\u0642\u0644 \u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0645\u0628\u0627\u0634\u0631\u0629\u064B \u0628\u064A\u0646 \u0627\u0644\u0623\u062C\u0647\u0632\u0629 \u0639\u0628\u0631 WebRTC. \u0644\u0627 \u0645\u064F\u0631\u062D\u0650\u0651\u0644 \u064A\u062D\u062A\u0641\u0638 \u0628\u0628\u064A\u0627\u0646\u0627\u062A\u0643 - \u0627\u0644\u062E\u0627\u062F\u0645 \u064A\u0633\u0627\u0639\u062F \u0627\u0644\u0637\u0631\u0641\u064A\u0646 \u0639\u0644\u0649 \u0625\u064A\u062C\u0627\u062F \u0628\u0639\u0636\u0647\u0645\u0627 \u0641\u0642\u0637.",
"unique.s2.tags": [
"DTLS 1.3",
"\u0628\u0644\u0627 \u0645\u064F\u0631\u062D\u0650\u0651\u0644"
],
"unique.s3.titleTop": "\u0633\u0631\u0651\u064A\u0629 \u062A\u0627\u0645\u0651\u0629",
"unique.s3.titleBottom": "\u0625\u0644\u0649 \u0627\u0644\u0623\u0645\u0627\u0645",
"unique.s3.collapsed": "\u0627\u0644\u0633\u0631\u0651\u064A\u0629 \u0627\u0644\u062A\u0627\u0645\u0651\u0629 \u0644\u0644\u0623\u0645\u0627\u0645",
"unique.s3.desc": "\u062A\u062A\u0628\u062F\u0651\u0644 \u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u062C\u0644\u0633\u0629 \u0628\u0627\u0633\u062A\u0645\u0631\u0627\u0631 \u0648\u062A\u064F\u062A\u0644\u064E\u0641 \u0628\u0639\u062F \u0627\u0644\u0627\u0633\u062A\u0639\u0645\u0627\u0644\u060C \u0641\u0644\u0627 \u064A\u0641\u062A\u062D \u0645\u0641\u062A\u0627\u062D \u0648\u0627\u062D\u062F \u0645\u0633\u0631\u0648\u0642 \u0623\u064A\u0651 \u0645\u062D\u0627\u062F\u062B\u0629 \u0645\u0627\u0636\u064A\u0629.",
"unique.s3.tags": [
"\u0645\u0641\u0627\u062A\u064A\u062D \u0639\u0627\u0628\u0631\u0629",
"\u062A\u0628\u062F\u064A\u0644 \u062A\u0644\u0642\u0627\u0626\u064A"
],
"unique.s4.titleTop": "\u062A\u0645\u0648\u064A\u0647",
"unique.s4.titleBottom": "\u062D\u0631\u0643\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A",
"unique.s4.collapsed": "\u062A\u0645\u0648\u064A\u0647 \u062D\u0631\u0643\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A",
"unique.s4.desc": "\u062A\u064F\u062D\u0634\u0649 \u0623\u062D\u062C\u0627\u0645 \u0627\u0644\u062D\u0632\u0645 \u0648\u062A\u0648\u0642\u064A\u062A\u0627\u062A\u0647\u0627 \u0648\u062A\u064F\u0639\u0634\u0648\u064E\u0623\u060C \u0641\u062A\u062E\u062A\u0641\u064A \u0623\u0646\u0645\u0627\u0637 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629 \u0639\u0646 \u0623\u0639\u064A\u0646 \u0645\u0646 \u064A\u0631\u0627\u0642\u0628 \u0627\u0644\u062E\u0637\u0651.",
"unique.s4.tags": [
"\u062D\u0634\u0648 \u0627\u0644\u062D\u0632\u0645",
"\u062A\u0634\u0648\u064A\u0634 \u0627\u0644\u062A\u0648\u0642\u064A\u062A"
],
"unique.s5.titleTop": "\u0635\u0641\u0631",
"unique.s5.titleBottom": "\u062C\u0645\u0639\u064D \u0644\u0644\u0628\u064A\u0627\u0646\u0627\u062A",
"unique.s5.collapsed": "\u0635\u0641\u0631 \u062C\u0645\u0639\u064D \u0644\u0644\u0628\u064A\u0627\u0646\u0627\u062A",
"unique.s5.desc": "\u0644\u0627 \u062D\u0633\u0627\u0628\u0627\u062A \u0648\u0644\u0627 \u0633\u062C\u0644\u0651\u0627\u062A \u0648\u0644\u0627 \u062A\u062E\u0632\u064A\u0646 \u0644\u0644\u0631\u0633\u0627\u0626\u0644. \u0644\u0627 \u0634\u064A\u0621 \u0639\u0644\u0649 \u062E\u0627\u062F\u0645 \u064A\u0645\u0643\u0646 \u0623\u0646 \u064A\u062A\u0633\u0631\u0651\u0628 \u0623\u0648 \u064A\u064F\u0637\u0644\u064E\u0628 \u0642\u0636\u0627\u0626\u064A\u0627\u064B \u0623\u0648 \u064A\u064F\u0628\u0627\u0639.",
"unique.s5.tags": [
"\u0628\u0644\u0627 \u062D\u0633\u0627\u0628\u0627\u062A",
"\u0628\u0644\u0627 \u0633\u062C\u0644\u0651\u0627\u062A"
],
"partners.eyebrow": "\u0627\u0644\u0634\u0631\u0643\u0627\u0621 \u0648\u0627\u0644\u0645\u0646\u0638\u0648\u0645\u0629",
"partners.heading": "\u0634\u0631\u0643\u0627\u0624\u0646\u0627 \u064A\u062B\u0642\u0648\u0646 \u0628\u0646\u0627",
"partners.aegis.desc": "\u0634\u0631\u064A\u0643 \u0631\u0623\u0633\u0645\u0627\u0644\u064A \u064A\u0624\u0645\u0651\u0646 \u0627\u0644\u0627\u062A\u0635\u0627\u0644\u0627\u062A \u0627\u0644\u0645\u0627\u0644\u064A\u0629 \u0627\u0644\u0633\u0631\u0651\u064A\u0629 \u0639\u0628\u0631 \u0645\u062D\u0641\u0638\u062A\u0647 \u0627\u0644\u0627\u0633\u062A\u062B\u0645\u0627\u0631\u064A\u0629.",
"partners.aegis.role": "\u062F\u0627\u0639\u0645 \u0627\u0633\u062A\u0631\u0627\u062A\u064A\u062C\u064A",
"partners.furilabs.desc": "\u0647\u0648\u0627\u062A\u0641 \u0644\u064A\u0646\u0643\u0633 \u062A\u0636\u0639 \u0627\u0644\u062E\u0635\u0648\u0635\u064A\u0629 \u0623\u0648\u0644\u0627\u064B \u0648\u062A\u0634\u062D\u0646 SecureBit \u0643\u0642\u0646\u0627\u0629 \u0622\u0645\u0646\u0629 \u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0629.",
"partners.furilabs.role": "\u0634\u0631\u064A\u0643 \u062A\u0642\u0646\u064A",
"partners.inviteTitle": "\u0643\u0646 \u0634\u0631\u064A\u0643\u0627\u064B",
"partners.inviteDesc": "\u0647\u0644 \u062A\u0628\u0646\u064A \u0639\u062A\u0627\u062F\u0627\u064B \u0623\u0648 \u0628\u0646\u064A\u0629 \u062A\u062D\u062A\u064A\u0629 \u0644\u0644\u062E\u0635\u0648\u0635\u064A\u0629\u061F \u0644\u0646\u064F\u062F\u0645\u062C SecureBit \u0645\u0639\u0627\u064B.",
"partners.inviteCta": "\u0627\u0628\u062F\u0623 \u0645\u062D\u0627\u062F\u062B\u0629",
"roadmap.eyebrow": "\u062E\u0627\u0631\u0637\u0629 \u0637\u0631\u064A\u0642 \u0627\u0644\u062A\u0637\u0648\u064A\u0631",
"roadmap.heading": "\u062A\u0637\u0648\u0651\u0631 SecureBit",
"roadmap.subheading": "\u0645\u0646 \u0623\u0648\u0651\u0644 \u0646\u0645\u0648\u0630\u062C \u0623\u0648\u0651\u0644\u064A \u0625\u0644\u0649 \u0634\u0628\u0643\u0629 \u0644\u0627\u0645\u0631\u0643\u0632\u064A\u0629 \u0645\u0642\u0627\u0648\u0645\u0629 \u0644\u0644\u062D\u0648\u0633\u0628\u0629 \u0627\u0644\u0643\u0645\u0651\u064A\u0629 - \u0645\u0639 \u062A\u062D\u0642\u0651\u0642 ASN.1 \u0643\u0627\u0645\u0644 \u0641\u064A \u0643\u0644\u0651 \u0637\u0628\u0642\u0629.",
"roadmap.progress": "\u0623\u064F\u0646\u062C\u0632\u062A {shipped} \u0645\u0646 \u0623\u0635\u0644 {total} \u0645\u062D\u0637\u0651\u0629",
"roadmap.upcoming": "{upcoming} \u0641\u064A \u0627\u0644\u0637\u0631\u064A\u0642",
"roadmap.keyFeatures": "\u0623\u0628\u0631\u0632 \u0627\u0644\u0645\u0632\u0627\u064A\u0627",
"roadmap.status.released": "\u0635\u062F\u0631\u062A",
"roadmap.status.current": "\u0627\u0644\u062D\u0627\u0644\u064A\u0629",
"roadmap.status.dev": "\u0642\u064A\u062F \u0627\u0644\u062A\u0637\u0648\u064A\u0631",
"roadmap.status.planned": "\u0645\u064F\u062E\u0637\u0651\u0637\u0629",
"roadmap.status.research": "\u0642\u064A\u062F \u0627\u0644\u0628\u062D\u062B",
"hero.headlineTop": "\u062E\u0637\u064C\u0651 \u0645\u0628\u0627\u0634\u0631",
"hero.headlineBottom": "\u0644\u0627 \u064A\u0642\u0631\u0623\u0647 \u0625\u0644\u0651\u0627 \u0623\u0646\u062A\u0645\u0627.",
"hero.subheading": "\u062A\u064F\u0648\u0644\u064E\u0651\u062F \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D \u0639\u0644\u0649 \u062C\u0647\u0627\u0632\u0643 \u0648\u062A\u064F\u062A\u0628\u0627\u062F\u064E\u0644 \u0646\u062F\u0651\u0627\u064B \u0644\u0646\u062F\u0651. \u0628\u0644\u0627 \u062D\u0633\u0627\u0628\u0627\u062A \u0648\u0628\u0644\u0627 \u062E\u0648\u0627\u062F\u0645 \u062A\u062D\u0641\u0638 \u0631\u0633\u0627\u0626\u0644\u0643.",
"hero.diagramAlt": "\u062E\u0637\u0651 \u0645\u0634\u0641\u0651\u0631 \u0645\u0628\u0627\u0634\u0631 \u0625\u0644\u0649 \u0637\u0631\u0641 \u0648\u0627\u062D\u062F\u060C \u0645\u0639 \u0627\u0646\u0636\u0645\u0627\u0645 \u0637\u0631\u0641\u064A\u0646 \u0622\u062E\u0631\u064A\u0646 \u0625\u0644\u0649 \u0627\u0644\u0634\u0628\u0643\u0629",
"intro.createTitle": "\u0623\u0646\u0634\u0626 \u0642\u0646\u0627\u0629 \u062C\u062F\u064A\u062F\u0629",
"intro.createDesc": "\u064A\u0648\u0644\u0651\u062F \u062C\u0647\u0627\u0632\u0643 \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D \u0648\u062F\u0639\u0648\u0629 \u062A\u064F\u0633\u062A\u0639\u0645\u0644 \u0645\u0631\u0651\u0629 \u0648\u0627\u062D\u062F\u0629. \u0644\u0627 \u0634\u064A\u0621 \u064A\u0645\u0631\u0651 \u0639\u0628\u0631 \u062E\u0627\u062F\u0645.",
"intro.createCta": "\u062A\u0648\u0644\u064A\u062F \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D \u0648\u0627\u0644\u062F\u0639\u0648\u0629",
"intro.joinTitle": "\u0627\u0646\u0636\u0645\u0651 \u0625\u0644\u0649 \u0642\u0646\u0627\u0629",
"intro.scanTitle": "\u0627\u0645\u0633\u062D \u0631\u0645\u0632 QR \u0628\u0627\u0644\u0643\u0627\u0645\u064A\u0631\u0627",
"intro.scanSubtitle": "\u0627\u0644\u0623\u0633\u0631\u0639 - \u0648\u062C\u0651\u0647\u0647\u0627 \u0625\u0644\u0649 \u0634\u0627\u0634\u0629 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631",
"intro.orPasteCode": "\u0623\u0648 \u0623\u0644\u0635\u0642 \u0627\u0644\u0631\u0645\u0632",
"intro.pastePlaceholder": "\u0623\u0644\u0635\u0642 \u0631\u0645\u0632 \u0627\u0644\u062F\u0639\u0648\u0629 \u0647\u0646\u0627\u2026",
"intro.connect": "\u0627\u062A\u0651\u0635\u0644",
"intro.connecting": "\u062C\u0627\u0631\u064D \u0627\u0644\u0645\u0639\u0627\u0644\u062C\u0629\u2026",
"roadmap.r1.title": "\u0628\u062F\u0627\u064A\u0629 \u0627\u0644\u062A\u0637\u0648\u064A\u0631",
"roadmap.r1.sub": "\u0627\u0644\u0641\u0643\u0631\u0629 \u0648\u0627\u0644\u0646\u0645\u0648\u0630\u062C \u0627\u0644\u0623\u0648\u0651\u0644\u064A \u0648\u062A\u0647\u064A\u0626\u0629 \u0627\u0644\u0628\u0646\u064A\u0629 \u0627\u0644\u062A\u062D\u062A\u064A\u0629",
"roadmap.r1.date": "\u0623\u0648\u0627\u0626\u0644 2025",
"roadmap.r1.features": [
"\u0628\u0644\u0648\u0631\u0629 \u0627\u0644\u0641\u0643\u0631\u0629 \u0648\u0627\u0644\u0645\u062A\u0637\u0644\u0651\u0628\u0627\u062A",
"\u0627\u062E\u062A\u064A\u0627\u0631 \u0627\u0644\u062A\u0642\u0646\u064A\u0627\u062A: WebRTC \u0648P2P \u0648\u0627\u0644\u062A\u0639\u0645\u064A\u0629",
"\u0623\u0648\u0651\u0644 \u0646\u0645\u0627\u0630\u062C \u0644\u0644\u0645\u0631\u0627\u0633\u0644\u0629",
"\u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u0645\u0633\u062A\u0648\u062F\u0639 \u0648\u0627\u0644\u062A\u0643\u0627\u0645\u0644 \u0627\u0644\u0645\u0633\u062A\u0645\u0631",
"\u0628\u0646\u064A\u0629 \u0627\u0644\u062A\u0634\u0641\u064A\u0631 \u0627\u0644\u0623\u0633\u0627\u0633\u064A\u0629",
"\u062A\u0635\u0645\u064A\u0645 \u062A\u062C\u0631\u0628\u0629 \u0648\u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645"
],
"roadmap.r2.title": "\u0625\u0635\u062F\u0627\u0631 \u0623\u0644\u0641\u0627",
"roadmap.r2.sub": "\u0623\u0648\u0651\u0644 \u0623\u0644\u0641\u0627 \u0639\u0644\u0646\u064A\u0629: \u062F\u0631\u062F\u0634\u0629 \u0623\u0633\u0627\u0633\u064A\u0629 \u0648\u062A\u0628\u0627\u062F\u0644 \u0645\u0641\u0627\u062A\u064A\u062D",
"roadmap.r2.date": "\u0631\u0628\u064A\u0639 2025",
"roadmap.r2.features": [
"\u0645\u0631\u0627\u0633\u0644\u0629 \u0646\u062F\u064C\u0651 \u0644\u0646\u062F\u0651 \u0623\u0633\u0627\u0633\u064A\u0629 \u0639\u0628\u0631 WebRTC",
"\u062A\u0634\u0641\u064A\u0631 \u0628\u0633\u064A\u0637 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641 (\u0645\u062E\u0637\u0651\u0637 \u062A\u062C\u0631\u064A\u0628\u064A)",
"\u0625\u0634\u0627\u0631\u0627\u062A \u0645\u0633\u062A\u0642\u0631\u0651\u0629 \u0648\u0625\u0639\u0627\u062F\u0629 \u0627\u062A\u0635\u0627\u0644",
"\u0648\u0627\u062C\u0647\u0629 \u0628\u062D\u062F\u0651\u0647\u0627 \u0627\u0644\u0623\u062F\u0646\u0649 \u0644\u0644\u0627\u062E\u062A\u0628\u0627\u0631",
"\u062C\u0645\u0639 \u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0645\u062E\u062A\u0628\u0650\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0627\u0626\u0644"
],
"roadmap.r3.title": "\u062A\u062D\u0635\u064A\u0646 \u0623\u0645\u0646\u064A",
"roadmap.r3.sub": "\u062A\u0639\u0632\u064A\u0632 \u0627\u0644\u0623\u0645\u0627\u0646 \u0648\u0625\u0637\u0644\u0627\u0642 \u0641\u0631\u0639 \u0645\u0633\u062A\u0642\u0631\u0651",
"roadmap.r3.date": "\u0635\u064A\u0641 2025",
"roadmap.r3.features": [
"\u062A\u0637\u0628\u064A\u0642 ECDH/ECDSA \u0641\u064A \u0627\u0644\u0625\u0646\u062A\u0627\u062C",
"\u0627\u0644\u0633\u0631\u0651\u064A\u0629 \u0627\u0644\u062A\u0627\u0645\u0651\u0629 \u0644\u0644\u0623\u0645\u0627\u0645 \u0648\u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D",
"\u062A\u062D\u0633\u064A\u0646 \u0641\u062D\u0648\u0635 \u0627\u0644\u0627\u0633\u062A\u064A\u062B\u0627\u0642",
"\u062A\u0634\u0641\u064A\u0631 \u0627\u0644\u0645\u0644\u0641\u0651\u0627\u062A \u0648\u0646\u0642\u0644 \u0627\u0644\u062D\u0645\u0648\u0644\u0627\u062A \u0627\u0644\u0643\u0628\u064A\u0631\u0629",
"\u062A\u062F\u0642\u064A\u0642 \u0639\u0645\u0644\u064A\u0627\u062A \u0627\u0644\u062A\u0639\u0645\u064A\u0629 \u0627\u0644\u0623\u0633\u0627\u0633\u064A\u0629"
],
"roadmap.r4.title": "\u0627\u0644\u062A\u0648\u0633\u0651\u0639 \u0648\u0627\u0644\u0627\u0633\u062A\u0642\u0631\u0627\u0631",
"roadmap.r4.sub": "\u062A\u0648\u0633\u064A\u0639 \u0627\u0644\u0634\u0628\u0643\u0629 \u0648\u062A\u062D\u0633\u064A\u0646 \u0627\u0644\u0627\u0633\u062A\u0642\u0631\u0627\u0631",
"roadmap.r4.date": "\u062E\u0631\u064A\u0641 2025",
"roadmap.r4.features": [
"\u062A\u062D\u0633\u064A\u0646 \u0627\u062A\u0635\u0627\u0644\u0627\u062A P2P \u0648\u0627\u062C\u062A\u064A\u0627\u0632 NAT",
"\u0622\u0644\u064A\u0627\u062A \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0648\u0637\u0648\u0627\u0628\u064A\u0631 \u0627\u0644\u0631\u0633\u0627\u0626\u0644",
"\u062E\u0641\u0636 \u0627\u0633\u062A\u0647\u0644\u0627\u0643 \u0627\u0644\u0628\u0637\u0627\u0631\u064A\u0629 \u0639\u0644\u0649 \u0627\u0644\u0647\u0648\u0627\u062A\u0641",
"\u062F\u0639\u0645 \u0627\u0644\u0645\u0632\u0627\u0645\u0646\u0629 \u0628\u064A\u0646 \u0639\u062F\u0651\u0629 \u0623\u062C\u0647\u0632\u0629",
"\u0623\u062F\u0648\u0627\u062A \u0645\u0631\u0627\u0642\u0628\u0629 \u0648\u062A\u0633\u062C\u064A\u0644 \u0644\u0644\u0645\u0637\u0648\u0651\u0631\u064A\u0646"
],
"roadmap.r5.title": "\u0625\u0635\u062F\u0627\u0631 \u0627\u0644\u062E\u0635\u0648\u0635\u064A\u0629 \u0623\u0648\u0651\u0644\u0627\u064B",
"roadmap.r5.sub": "\u0627\u0644\u062A\u0631\u0643\u064A\u0632 \u0639\u0644\u0649 \u0627\u0644\u062E\u0635\u0648\u0635\u064A\u0629: \u062A\u0642\u0644\u064A\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629",
"roadmap.r5.date": "\u0634\u062A\u0627\u0621 2025",
"roadmap.r5.features": [
"\u062D\u0645\u0627\u064A\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629 \u0648\u062A\u0642\u0644\u064A\u0644 \u0627\u0644\u0628\u0635\u0645\u0629",
"\u062A\u062C\u0627\u0631\u0628 \u0639\u0644\u0649 \u062A\u0648\u062C\u064A\u0647 \u0627\u0644\u0628\u0635\u0644\u0629 \u0648\u062C\u062F\u0627\u0648\u0644 DHT",
"\u062E\u064A\u0627\u0631\u0627\u062A \u0644\u0644\u0627\u062A\u0635\u0627\u0644\u0627\u062A \u0627\u0644\u0645\u062C\u0647\u0648\u0644\u0629",
"\u0627\u0644\u062A\u062D\u0636\u064A\u0631 \u0644\u062A\u062F\u0642\u064A\u0642 \u0645\u0641\u062A\u0648\u062D \u0644\u0644\u0634\u064A\u0641\u0631\u0629",
"\u062A\u062D\u0633\u064A\u0646 \u0639\u0645\u0644\u064A\u0627\u062A \u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645\u064A\u0646"
],
"roadmap.r6.title": "\u0625\u0635\u062F\u0627\u0631 \u0627\u0644\u0623\u0645\u0627\u0646 \u0627\u0644\u0645\u0639\u0632\u064E\u0651\u0632",
"roadmap.r6.sub": "\u062A\u0639\u0645\u064A\u0629 \u0628\u0645\u0633\u062A\u0648\u0649 \u0639\u0633\u0643\u0631\u064A \u0645\u0646 18 \u0637\u0628\u0642\u0629 \u0645\u0639 \u062A\u062D\u0642\u0651\u0642 ASN.1 \u0643\u0627\u0645\u0644",
"roadmap.r6.date": "\u0623\u0648\u0627\u062E\u0631 2025",
"roadmap.r6.features": [
"\u0623\u0645\u0627\u0646 \u062B\u0644\u0627\u062B\u064A \u0627\u0644\u0637\u0628\u0642\u0627\u062A: ECDH \u0648DTLS \u0648SAS",
"\u062A\u0634\u0641\u064A\u0631 ECDH P-384 \u0645\u0639 AES-GCM \u0628\u0637\u0648\u0644 256 \u0628\u062A",
"\u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0628\u0635\u0645\u0629 DTLS",
"\u062A\u062D\u0642\u0651\u0642 SAS (\u0633\u0644\u0633\u0644\u0629 \u0627\u0633\u062A\u064A\u062B\u0627\u0642 \u0642\u0635\u064A\u0631\u0629)",
"\u0627\u0644\u0633\u0631\u0651\u064A\u0629 \u0627\u0644\u062A\u0627\u0645\u0651\u0629 \u0644\u0644\u0623\u0645\u0627\u0645 \u0645\u0639 \u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D",
"\u062D\u0645\u0627\u064A\u0629 \u0645\u064F\u0639\u0632\u064E\u0651\u0632\u0629 \u0645\u0646 \u0647\u062C\u0645\u0627\u062A \u0627\u0644\u0648\u0633\u064A\u0637",
"\u062A\u062D\u0642\u0651\u0642 ASN.1 DER \u0643\u0627\u0645\u0644",
"\u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0627\u0644\u0645\u0639\u0631\u0651\u0641\u0627\u062A OID \u0648\u0646\u0642\u0627\u0637 \u0627\u0644\u0645\u0646\u062D\u0646\u0649",
"\u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0628\u0646\u064A\u0629 SPKI",
"\u0628\u0646\u064A\u0629 WebRTC \u0646\u062F\u064C\u0651 \u0644\u0646\u062F\u0651",
"\u062D\u0645\u0627\u064A\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629",
"\u0634\u064A\u0641\u0631\u0629 \u0645\u0641\u062A\u0648\u062D\u0629 \u0627\u0644\u0645\u0635\u062F\u0631 100%"
],
"roadmap.r7.title": "\u0625\u0635\u062F\u0627\u0631 \u0633\u0637\u062D \u0627\u0644\u0645\u0643\u062A\u0628",
"roadmap.r7.sub": "\u062A\u0637\u0628\u064A\u0642\u0627\u062A \u0623\u0635\u0644\u064A\u0629 \u0644\u0648\u064A\u0646\u062F\u0648\u0632 \u0648\u0645\u0627\u0643 \u0648\u0644\u064A\u0646\u0643\u0633",
"roadmap.r7.date": "\u0623\u0648\u0627\u0626\u0644 2026",
"roadmap.r7.features": [
"\u062A\u0637\u0628\u064A\u0642 \u0648\u064A\u0646\u062F\u0648\u0632 (Tauri v2)",
"\u062A\u0637\u0628\u064A\u0642 macOS (Tauri v2)",
"\u062F\u0639\u0645 AppImage \u0644\u0644\u064A\u0646\u0643\u0633 (Tauri v2)",
"\u0625\u0634\u0639\u0627\u0631\u0627\u062A \u0641\u0648\u0631\u064A\u0629",
"\u0625\u0639\u0627\u062F\u0629 \u0627\u062A\u0635\u0627\u0644 \u062A\u0644\u0642\u0627\u0626\u064A\u0629",
"\u0645\u0632\u0627\u0645\u0646\u0629 \u0628\u064A\u0646 \u0627\u0644\u0623\u062C\u0647\u0632\u0629",
"\u062A\u062D\u0633\u064A\u0646 \u062A\u062C\u0631\u0628\u0629 \u0648\u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645",
"\u062F\u0639\u0645 \u0645\u0644\u0641\u0651\u0627\u062A \u062D\u062A\u0649 100 \u0645\u064A\u063A\u0627\u0628\u0627\u064A\u062A"
],
"roadmap.r8.title": "\u0627\u0644\u0635\u0648\u062A \u0648\u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0627\u062A \u0627\u0644\u0622\u0645\u0646\u0629",
"roadmap.r8.sub": "\u0631\u0633\u0627\u0626\u0644 \u0635\u0648\u062A\u064A\u0629 \u0648\u0645\u0643\u0627\u0644\u0645\u0627\u062A \u0635\u0648\u062A\u064A\u0629 \u0648\u0645\u0631\u0626\u064A\u0629 \u0645\u0634\u0641\u0651\u0631\u0629",
"roadmap.r8.date": "\u0623\u0648\u0627\u0626\u0644 2026",
"roadmap.r8.features": [
"\u0631\u0633\u0627\u0626\u0644 \u0635\u0648\u062A\u064A\u0629 \u0645\u0634\u0641\u0651\u0631\u0629 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641",
"\u0645\u0643\u0627\u0644\u0645\u0627\u062A \u0635\u0648\u062A\u064A\u0629 \u0645\u0634\u0641\u0651\u0631\u0629 \u062B\u0646\u0627\u0626\u064A\u0629 (WebRTC)",
"\u0645\u0643\u0627\u0644\u0645\u0627\u062A \u0645\u0631\u0626\u064A\u0629 \u0645\u0634\u0641\u0651\u0631\u0629 \u062B\u0646\u0627\u0626\u064A\u0629 (WebRTC)",
"\u0633\u0631\u0651\u064A\u0629 \u062A\u0627\u0645\u0651\u0629 \u0644\u0644\u0623\u0645\u0627\u0645 \u0644\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u062D\u064A\u0651\u0629",
"\u062A\u062F\u0641\u0651\u0642\u0627\u062A \u0648\u0633\u0627\u0626\u0637 \u0645\u062D\u0645\u064A\u0651\u0629 \u0628\u0640 SRTP/DTLS",
"\u062A\u062D\u0642\u0651\u0642 SAS \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629",
"\u0625\u0634\u0639\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0627\u062A \u0648\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0627\u0644\u062A\u0644\u0642\u0627\u0626\u064A\u0629",
"\u0648\u0633\u0627\u0626\u0637 \u0646\u062F\u064C\u0651 \u0644\u0646\u062F\u0651 \u0628\u0632\u0645\u0646 \u0627\u0633\u062A\u062C\u0627\u0628\u0629 \u0645\u0646\u062E\u0641\u0636"
],
"roadmap.r9.title": "\u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0627\u062A \u0627\u0644\u062C\u0645\u0627\u0639\u064A\u0629",
"roadmap.r9.sub": "\u062F\u0631\u062F\u0634\u0627\u062A \u062C\u0645\u0627\u0639\u064A\u0629 \u0645\u0639 \u0627\u0644\u062D\u0641\u0627\u0638 \u0639\u0644\u0649 \u0627\u0644\u062E\u0635\u0648\u0635\u064A\u0629",
"roadmap.r9.date": "\u0627\u0644\u0622\u0646",
"roadmap.r9.features": [
"\u062F\u0631\u062F\u0634\u0627\u062A \u062C\u0645\u0627\u0639\u064A\u0629 \u0646\u062F\u064C\u0651 \u0644\u0646\u062F\u0651 \u062D\u062A\u0649 8 \u0645\u0634\u0627\u0631\u0643\u064A\u0646",
"\u062A\u0648\u0635\u064A\u0644 \u0634\u0628\u0643\u064A \u0645\u0639 \u0627\u062D\u062A\u064A\u0627\u0637\u064A \u062A\u0631\u062D\u064A\u0644 \u0645\u0648\u0642\u064E\u0651\u0639",
"\u0631\u0645\u0632 \u0623\u0645\u0627\u0646 \u0648\u0627\u062D\u062F \u0644\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u064A\u0642\u0627\u0631\u0646\u0647 \u0627\u0644\u062C\u0645\u064A\u0639",
"\u0645\u0631\u0627\u0633\u0645 \u0627\u0644\u0627\u0644\u062A\u0632\u0627\u0645 \u062B\u0645\u0651 \u0627\u0644\u0643\u0634\u0641 \u0636\u062F\u0651 \u062A\u062E\u0645\u064A\u0646 \u0627\u0644\u0631\u0645\u0632",
"\u0645\u0641\u0627\u062A\u064A\u062D \u0647\u0648\u064A\u0629 \u0644\u0643\u0644\u0651 \u0645\u062C\u0645\u0648\u0639\u0629\u060C \u0639\u0627\u0628\u0631\u0629 \u0628\u0627\u0644\u062A\u0635\u0645\u064A\u0645",
"\u0639\u0636\u0648\u064A\u0629 \u0645\u0648\u0642\u064E\u0651\u0639\u0629 \u0645\u0639 \u062A\u0631\u062A\u064A\u0628 \u062D\u0650\u0642\u064E\u0628\u064A",
"\u0631\u0633\u0627\u0626\u0644 \u0645\u0648\u0642\u064E\u0651\u0639\u0629\u060C \u0641\u0623\u064A\u0651 \u0646\u0635\u0651 \u0645\u0646\u0642\u0633\u0645 \u064A\u0645\u0643\u0646 \u0625\u062B\u0628\u0627\u062A\u0647",
"\u0628\u0644\u0627 \u062E\u0627\u062F\u0645 \u0648\u0628\u0644\u0627 \u0645\u0641\u062A\u0627\u062D \u062C\u0645\u0627\u0639\u064A \u0645\u0634\u062A\u0631\u0643 \u0648\u0628\u0644\u0627 \u0633\u062C\u0644\u0651"
],
"roadmap.r10.title": "\u0625\u0635\u062F\u0627\u0631 \u0627\u0644\u0647\u0648\u0627\u062A\u0641",
"roadmap.r10.sub": "\u062A\u0637\u0628\u064A\u0642\u0627\u062A \u0623\u0635\u0644\u064A\u0629 \u0644\u0640 iOS \u0648\u0623\u0646\u062F\u0631\u0648\u064A\u062F",
"roadmap.r10.date": "\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062B\u0627\u0646\u064A 2027",
"roadmap.r10.features": [
"\u062A\u0637\u0628\u064A\u0642 iOS \u0623\u0635\u0644\u064A (Swift/SwiftUI)",
"\u062A\u0637\u0628\u064A\u0642 \u0623\u0646\u062F\u0631\u0648\u064A\u062F \u0623\u0635\u0644\u064A (Kotlin/Jetpack Compose)",
"\u062F\u0639\u0645 PWA \u0644\u0645\u062A\u0635\u0641\u0651\u062D\u0627\u062A \u0627\u0644\u0647\u0648\u0627\u062A\u0641",
"\u0625\u0634\u0639\u0627\u0631\u0627\u062A \u0641\u0648\u0631\u064A\u0629 \u0645\u062F\u0641\u0648\u0639\u0629",
"\u062A\u062D\u0633\u064A\u0646 \u0627\u0633\u062A\u0647\u0644\u0627\u0643 \u0627\u0644\u0628\u0637\u0627\u0631\u064A\u0629",
"\u0648\u0627\u062C\u0647\u0629 \u0645\u0647\u064A\u0651\u0623\u0629 \u0644\u0644\u0647\u0648\u0627\u062A\u0641",
"\u0637\u0627\u0628\u0648\u0631 \u0631\u0633\u0627\u0626\u0644 \u062F\u0648\u0646 \u0627\u062A\u0635\u0627\u0644",
"\u0627\u0633\u062A\u064A\u062B\u0627\u0642 \u062D\u064A\u0648\u064A"
],
"roadmap.r11.title": "\u0625\u0635\u062F\u0627\u0631 \u0645\u0642\u0627\u0648\u0645 \u0644\u0644\u0643\u0645\u0651",
"roadmap.r11.sub": "\u062D\u0645\u0627\u064A\u0629 \u0645\u0646 \u0627\u0644\u062D\u0648\u0627\u0633\u064A\u0628 \u0627\u0644\u0643\u0645\u0651\u064A\u0629",
"roadmap.r11.date": "\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0631\u0627\u0628\u0639 2027",
"roadmap.r11.features": [
"\u062A\u0639\u0645\u064A\u0629 \u0645\u0627 \u0628\u0639\u062F \u0627\u0644\u0643\u0645\u0651 CRYSTALS-Kyber",
"\u062A\u0648\u0627\u0642\u064A\u0639 \u0631\u0642\u0645\u064A\u0629 SPHINCS+",
"\u0645\u062E\u0637\u0651\u0637 \u0647\u062C\u064A\u0646: \u0643\u0644\u0627\u0633\u064A\u0643\u064A + \u0645\u0627 \u0628\u0639\u062F \u0627\u0644\u0643\u0645\u0651",
"\u062A\u0628\u0627\u062F\u0644 \u0645\u0641\u0627\u062A\u064A\u062D \u0622\u0645\u0646 \u0643\u0645\u0651\u064A\u0627\u064B",
"\u062E\u0648\u0627\u0631\u0632\u0645\u064A\u0627\u062A \u062A\u062C\u0632\u0626\u0629 \u0645\u062D\u062F\u064E\u0651\u062B\u0629",
"\u062A\u0631\u062D\u064A\u0644 \u0627\u0644\u062C\u0644\u0633\u0627\u062A \u0627\u0644\u0642\u0627\u0626\u0645\u0629",
"\u062A\u0648\u0627\u0641\u0642 \u0645\u0639 \u0627\u0644\u0625\u0635\u062F\u0627\u0631 5.x",
"\u0628\u0631\u0648\u062A\u0648\u0643\u0648\u0644\u0627\u062A \u0645\u0642\u0627\u0648\u0645\u0629 \u0644\u0644\u0643\u0645\u0651"
],
"roadmap.r12.title": "\u0634\u0628\u0643\u0629 \u0644\u0627\u0645\u0631\u0643\u0632\u064A\u0629",
"roadmap.r12.sub": "\u0634\u0628\u0643\u0629 \u0644\u0627\u0645\u0631\u0643\u0632\u064A\u0629 \u0628\u0627\u0644\u0643\u0627\u0645\u0644",
"roadmap.r12.date": "2028",
"roadmap.r12.features": [
"\u0634\u0628\u0643\u0629 \u0639\u064F\u0642\u064E\u062F \u0645\u062A\u0634\u0627\u0628\u0643\u0629",
"\u062C\u062F\u0648\u0644 DHT \u0644\u0627\u0643\u062A\u0634\u0627\u0641 \u0627\u0644\u0623\u0642\u0631\u0627\u0646",
"\u062A\u0648\u062C\u064A\u0647 \u0628\u0635\u0644\u064A \u0645\u062F\u0645\u062C",
"\u0627\u0642\u062A\u0635\u0627\u062F \u0631\u0645\u0632\u064A \u0648\u062D\u0648\u0627\u0641\u0632 \u0644\u0644\u0639\u064F\u0642\u064E\u062F",
"\u062D\u0648\u0643\u0645\u0629 \u0639\u0628\u0631 \u0645\u0646\u0638\u0651\u0645\u0629 \u0644\u0627\u0645\u0631\u0643\u0632\u064A\u0629",
"\u0642\u0627\u0628\u0644\u064A\u0629 \u0627\u0644\u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0628\u064A\u0646\u064A \u0645\u0639 \u0634\u0628\u0643\u0627\u062A \u0623\u062E\u0631\u0649",
"\u062A\u0648\u0627\u0641\u0642 \u0639\u0628\u0631 \u0627\u0644\u0645\u0646\u0635\u0651\u0627\u062A",
"\u0634\u0628\u0643\u0629 \u0630\u0627\u062A\u064A\u0629 \u0627\u0644\u062A\u0639\u0627\u0641\u064A"
],
"roadmap.r13.title": "\u0645\u0633\u0627\u0639\u062F \u062E\u0635\u0648\u0635\u064A\u0629 \u0628\u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A",
"roadmap.r13.sub": "\u0630\u0643\u0627\u0621 \u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0644\u0644\u062E\u0635\u0648\u0635\u064A\u0629 \u0648\u0627\u0644\u0623\u0645\u0627\u0646",
"roadmap.r13.date": "2028 \u0648\u0645\u0627 \u0628\u0639\u062F\u0647\u0627",
"roadmap.r13.features": [
"\u062A\u062D\u0644\u064A\u0644 \u062A\u0647\u062F\u064A\u062F\u0627\u062A \u0645\u062D\u0644\u0651\u064A \u0628\u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A",
"\u0643\u0634\u0641 \u062A\u0644\u0642\u0627\u0626\u064A \u0644\u0647\u062C\u0645\u0627\u062A \u0627\u0644\u0648\u0633\u064A\u0637",
"\u062A\u0639\u0645\u064A\u0629 \u062A\u0643\u064A\u0651\u0641\u064A\u0629",
"\u062A\u0648\u0635\u064A\u0627\u062A \u0623\u0645\u0646\u064A\u0629 \u0645\u062E\u0635\u0651\u0635\u0629",
"\u062A\u0639\u0644\u0651\u0645 \u0622\u0644\u064A \u0628\u0645\u0639\u0631\u0641\u0629 \u0635\u0641\u0631\u064A\u0629",
"\u0645\u0633\u0627\u0639\u062F \u0630\u0643\u0627\u0621 \u0627\u0635\u0637\u0646\u0627\u0639\u064A \u062E\u0627\u0635\u0651",
"\u0623\u0645\u0627\u0646 \u062A\u0646\u0628\u0651\u0624\u064A",
"\u062D\u0645\u0627\u064A\u0629 \u0630\u0627\u062A\u064A\u0629 \u0645\u0646 \u0627\u0644\u0647\u062C\u0645\u0627\u062A"
],
"handshake.step1": "\u062A\u0648\u0644\u064A\u062F \u0632\u0648\u062C \u0645\u0641\u0627\u062A\u064A\u062D ECDH P-384",
"handshake.step2": "\u0627\u0634\u062A\u0642\u0627\u0642 \u0631\u0645\u0632 \u0627\u0644\u062A\u062D\u0642\u0651\u0642",
"handshake.step3": "\u062A\u062B\u0628\u064A\u062A \u0627\u0644\u0633\u0631\u0651\u064A\u0629 \u0627\u0644\u062A\u0627\u0645\u0651\u0629 \u0644\u0644\u0623\u0645\u0627\u0645",
"handshake.securingTitle": "\u062C\u0627\u0631\u064D \u062A\u0623\u0645\u064A\u0646 \u0642\u0646\u0627\u062A\u0643",
"handshake.answerTitle": "\u062C\u0627\u0631\u064D \u0628\u0646\u0627\u0621 \u0631\u062F\u0651\u0643",
"handshake.securingDesc": "\u0646\u0635\u0648\u063A \u0645\u0641\u0627\u062A\u064A\u062D \u0642\u0648\u064A\u0651\u0629 \u0628\u0645\u0627 \u064A\u0643\u0641\u064A \u0644\u0645\u0642\u0627\u0648\u0645\u0629 \u0627\u0644\u0639\u0628\u062B.",
"handshake.shareTitle": "\u0634\u0627\u0631\u0650\u0643 \u062F\u0639\u0648\u062A\u0643",
"handshake.sendAnswerTitle": "\u0623\u0639\u062F \u0625\u0631\u0633\u0627\u0644 \u0631\u062F\u0651\u0643",
"handshake.shareDesc": "\u0623\u0638\u0647\u0631 \u0631\u0645\u0632 QR \u0623\u0648 \u0623\u0631\u0633\u0644 \u0627\u0644\u0631\u0645\u0632 \u0625\u0644\u0649 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631. \u064A\u064F\u0633\u062A\u0639\u0645\u0644 \u0645\u0631\u0651\u0629 \u0648\u0627\u062D\u062F\u0629 \u0648\u064A\u0646\u062A\u0647\u064A \u0633\u0631\u064A\u0639\u0627\u064B.",
"handshake.sendAnswerDesc": "\u0623\u0639\u0637\u0650 \u0647\u0630\u0627 \u0627\u0644\u0631\u062F\u0651 \u0644\u0645\u064F\u0646\u0634\u0626 \u0627\u0644\u0642\u0646\u0627\u0629 \u0643\u064A \u064A\u064F\u062A\u0645\u0651 \u0627\u0644\u0645\u0635\u0627\u0641\u062D\u0629.",
"handshake.establish": "\u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u0627\u062A\u0635\u0627\u0644",
"handshake.thenReceive": "\u062B\u0645\u0651 \u0627\u0633\u062A\u0642\u0628\u0644 \u0627\u0644\u0631\u062F\u0651 \u0627\u0644\u0630\u064A \u064A\u0631\u0633\u0644\u0647 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631",
"handshake.pasteAnswerPlaceholder": "\u0623\u0644\u0635\u0642 \u0631\u0645\u0632 \u0631\u062F\u0651 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631\u2026",
"handshake.answerSentNote": "\u0623\u0631\u0633\u0644 \u0647\u0630\u0627 \u0627\u0644\u0631\u062F\u0651 \u0625\u0644\u0649 \u0627\u0644\u0645\u064F\u0646\u0634\u0626 \u062B\u0645\u0651 \u0627\u0646\u062A\u0638\u0631 - \u062A\u064F\u0641\u062A\u062D \u0627\u0644\u062F\u0631\u062F\u0634\u0629 \u062D\u0627\u0644\u0645\u0627 \u064A\u062A\u0651\u0635\u0644.",
"handshake.qrHint": "\u0623\u0628\u0642\u0650 \u0647\u0630\u0627 \u0645\u0641\u062A\u0648\u062D\u0627\u064B \u062D\u062A\u0649 \u064A\u0644\u062A\u0642\u0637 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0627\u0644\u0631\u0645\u0632.",
"handshake.qrHintFrames": "\u0627\u0644\u0645\u0635\u0627\u0641\u062D\u0629 \u0645\u0648\u0632\u0651\u0639\u0629 \u0639\u0644\u0649 {frames} \u0625\u0637\u0627\u0631\u0627\u062A - \u0623\u0628\u0642\u0650 \u0647\u0630\u0627 \u0645\u0641\u062A\u0648\u062D\u0627\u064B \u062D\u062A\u0649 \u064A\u0644\u062A\u0642\u0637\u0647\u0627 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0643\u0644\u0651\u0647\u0627.",
"verify.title": "\u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0627\u0644\u0623\u0645\u0646\u064A",
"verify.desc": "\u0642\u0627\u0631\u0650\u0646 \u0631\u0645\u0632 \u0627\u0644\u0623\u0645\u0627\u0646 \u0647\u0630\u0627 \u0645\u0639 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0639\u0628\u0631 \u0642\u0646\u0627\u0629 \u0645\u0646\u0641\u0635\u0644\u0629 (\u0645\u0643\u0627\u0644\u0645\u0629 \u0623\u0648 \u0644\u0642\u0627\u0621 \u0645\u0628\u0627\u0634\u0631)\u060C \u062B\u0645\u0651 \u0627\u0643\u062A\u0628\u0647 \u0644\u0641\u062A\u062D \u0627\u0644\u062F\u0631\u062F\u0634\u0629.",
"verify.enterLabel": "\u0623\u062F\u062E\u0644 \u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0645\u064F\u062A\u062D\u0642\u064E\u0651\u0642 \u0645\u0646\u0647",
"verify.placeholder": "\u0627\u0643\u062A\u0628 \u0627\u0644\u0631\u0645\u0632 \u0647\u0646\u0627",
"verify.confirm": "\u062A\u0623\u0643\u064A\u062F \u0627\u0644\u0631\u0645\u0632",
"verify.confirmed": "\u0645\u0624\u0643\u064E\u0651\u062F",
"verify.mismatch": "\u063A\u064A\u0631 \u0645\u062A\u0637\u0627\u0628\u0642\u064A\u0646",
"verify.yours": "\u062A\u0623\u0643\u064A\u062F\u0643",
"verify.peer": "\u062A\u0623\u0643\u064A\u062F \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631",
"verify.pending": "\u0642\u064A\u062F \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631",
"verify.waiting": "\u0628\u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u0631\u0645\u0632\u2026",
"verify.verified": "\u062A\u0645\u0651 \u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0627\u0644\u0642\u0646\u0627\u0629",
"verify.bothConfirmed": "\u0623\u0643\u0651\u062F \u0627\u0644\u0637\u0631\u0641\u0627\u0646. \u062C\u0627\u0631\u064D \u0641\u062A\u062D \u0627\u0644\u062F\u0631\u062F\u0634\u0629 \u0627\u0644\u0622\u0645\u0646\u0629\u2026",
"pwa.bannerTitle": "\u062B\u0628\u0651\u062A SecureBit.chat",
"pwa.bannerDesc": "\u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u062A\u062C\u0631\u0628\u0629 \u062A\u0637\u0628\u064A\u0642 \u0623\u0635\u0644\u064A \u0628\u0623\u0645\u0627\u0646 \u0623\u0639\u0644\u0649",
"pwa.install": "\u062A\u062B\u0628\u064A\u062A",
"pwa.dismiss": "\u062A\u062C\u0627\u0647\u0644",
"pwa.close": "\u0625\u063A\u0644\u0627\u0642",
"pwa.iosTitle": "\u0627\u0644\u062A\u062B\u0628\u064A\u062A \u0639\u0644\u0649 iOS",
"pwa.iosStep1": "\u0627\u0636\u063A\u0637 \u0632\u0631\u0651 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629",
"pwa.iosStep1Hint": "\u0639\u0627\u062F\u0629\u064B \u0641\u064A \u0623\u0633\u0641\u0644 \u0633\u0641\u0627\u0631\u064A",
"pwa.iosStep2": "\u0627\u0628\u062D\u062B \u0639\u0646 \xAB\u0625\u0636\u0627\u0641\u0629 \u0625\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629 \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629\xBB",
"pwa.iosStep2Hint": "\u0645\u0631\u0651\u0631 \u0644\u0623\u0633\u0641\u0644 \u0641\u064A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629",
"pwa.iosStep3": "\u0627\u0636\u063A\u0637 \xAB\u0625\u0636\u0627\u0641\u0629\xBB",
"pwa.iosStep3Hint": "\u0623\u0643\u0651\u062F \u0644\u062A\u062B\u0628\u064A\u062A SecureBit.chat",
"pwa.genericTitle": "\u062A\u062B\u0628\u064A\u062A SecureBit",
"pwa.genericDesc": "\u0644\u0643\u0644\u0651 \u0645\u062A\u0635\u0641\u0651\u062D \u0637\u0631\u064A\u0642\u062A\u0647 \u0641\u064A \u0627\u0644\u062A\u062B\u0628\u064A\u062A. \u0627\u062E\u062A\u0631 \u0627\u0644\u062E\u0637\u0648\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u0646\u0627\u0633\u0628 \u0645\u062A\u0635\u0641\u0651\u062D\u0643.",
"pwa.gotIt": "\u0641\u0647\u0645\u062A",
"pwa.installedTitle": "\u062A\u0645\u0651 \u062A\u062B\u0628\u064A\u062A \u0627\u0644\u062A\u0637\u0628\u064A\u0642!",
"pwa.installedIos": "\u062A\u0645\u0651 \u062A\u062B\u0628\u064A\u062A \u062A\u0637\u0628\u064A\u0642 iOS! \u0627\u0641\u062A\u062D\u0647 \u0645\u0646 \u0627\u0644\u0634\u0627\u0634\u0629 \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629.",
"pwa.installedGeneric": "\u0635\u0627\u0631 SecureBit.chat \u0639\u0644\u0649 \u062C\u0647\u0627\u0632\u0643",
"pwa.anytimeTitle": "\u062B\u0628\u0651\u062A\u0647 \u0641\u064A \u0623\u064A\u0651 \u0648\u0642\u062A",
"pwa.anytimeDesc": "\u0644\u0627 \u064A\u0632\u0627\u0644 \u0628\u0625\u0645\u0643\u0627\u0646\u0643 \u062A\u062B\u0628\u064A\u062A SecureBit.chat \u0645\u0646 \u0642\u0627\u0626\u0645\u0629 \u0645\u062A\u0635\u0641\u0651\u062D\u0643 \u0644\u0644\u062D\u0635\u0648\u0644 \u0639\u0644\u0649 \u0623\u0641\u0636\u0644 \u062A\u062C\u0631\u0628\u0629.",
"pwa.ok": "\u062D\u0633\u0646\u0627\u064B",
"step.open": "\u0627\u0644\u062E\u0637\u0648\u0629 1 \xB7 \u0627\u0641\u062A\u062D \u0642\u0646\u0627\u0629",
"step.exchange": "\u0627\u0644\u062E\u0637\u0648\u0629 2 \xB7 \u0627\u0644\u062A\u0628\u0627\u062F\u0644",
"step.verification": "\u0627\u0644\u062E\u0637\u0648\u0629 3 \xB7 \u0627\u0644\u062A\u062D\u0642\u0651\u0642",
"action.create": "\u0625\u0646\u0634\u0627\u0621",
"action.join": "\u0627\u0646\u0636\u0645\u0627\u0645",
"action.back": "\u0631\u062C\u0648\u0639",
"action.copy": "\u0646\u0633\u062E",
"action.copied": "\u062A\u0645\u0651 \u0627\u0644\u0646\u0633\u062E",
"action.scan": "\u0645\u0633\u062D",
"action.downloadDesktop": "\u0646\u0632\u0651\u0644 \u062A\u0637\u0628\u064A\u0642 \u0633\u0637\u062D \u0627\u0644\u0645\u0643\u062A\u0628",
"action.advancedSettings": "\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0645\u062A\u0642\u062F\u0651\u0645\u0629",
"cred.offerTag": "\u0639\u0631\u0636 \xB7 \u0623\u0648 \u0627\u0646\u0633\u062E \u0627\u0644\u0646\u0635\u0651",
"cred.answerTag": "\u0631\u062F\u0651 \xB7 \u0623\u0648 \u0627\u0646\u0633\u062E \u0627\u0644\u0646\u0635\u0651",
"cred.reveal": "\u0627\u0636\u063A\u0637 \u0644\u0644\u0643\u0634\u0641 - \u0623\u0628\u0642\u0650 \u0647\u0630\u0627 \u0627\u0644\u0631\u0645\u0632 \u0633\u0631\u0651\u064A\u0627\u064B",
"qr.title": "\u0627\u0645\u0633\u062D \u0631\u0645\u0632 QR",
"qr.subtitle": "\u0648\u062C\u0651\u0647 \u0643\u0627\u0645\u064A\u0631\u062A\u0643 \u0625\u0644\u0649 \u0631\u0645\u0632\u0647\u0645",
"qr.scanning": "\u062C\u0627\u0631\u064D \u0627\u0644\u0645\u0633\u062D\u2026",
"qr.hint": "\u062B\u0628\u0651\u062A \u064A\u062F\u0643 \u062D\u062A\u0649 \u062A\u064F\u0644\u062A\u0642\u0637 \u0643\u0644\u0651 \u0627\u0644\u0623\u062C\u0632\u0627\u0621. \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0643\u0627\u0645\u064A\u0631\u0627 \u0645\u062D\u0644\u0651\u064A - \u0644\u0627 \u064A\u064F\u0631\u0641\u0639 \u0634\u064A\u0621.",
"mesh.you": "\u0623\u0646\u062A",
"mesh.peer": "\u0637\u0631\u0641 \xB7 \u062C\u0644\u0633\u0629 1",
"mesh.joined2": "\u0627\u0646\u0636\u0645\u0651\u062A mara \xB7 +2",
"mesh.joined3": "\u0627\u0646\u0636\u0645\u0651 tobi \xB7 +3",
"ice.title": "\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u0634\u0628\u0643\u0629",
"ice.subtitle": "\u062A\u064F\u0636\u0628\u0637 \u0645\u062D\u0644\u0651\u064A\u0627\u064B - \u0648\u0644\u0627 \u062A\u064F\u0634\u0627\u0631\u064E\u0643 \u0623\u0628\u062F\u0627\u064B \u0645\u0639 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631",
"ice.intro": "\u064A\u0633\u062A\u062E\u062F\u0645 SecureBit \u062E\u0648\u0627\u062F\u0645 STUN \u0639\u0627\u0645\u0651\u0629 \u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0627\u064B \u0644\u0644\u062A\u0641\u0627\u0648\u0636 \u0639\u0644\u0649 \u0627\u0644\u0648\u0635\u0644\u0629 \u0628\u064A\u0646 \u0627\u0644\u0637\u0631\u0641\u064A\u0646. \u0648\u062C\u0651\u0647\u0647 \u0625\u0644\u0649 STUN/TURN \u0627\u0644\u062E\u0627\u0635\u0651 \u0628\u0643 \u0625\u0646 \u0643\u0646\u062A \u062A\u0633\u062A\u0636\u064A\u0641\u0647 \u0628\u0646\u0641\u0633\u0643.",
"ice.publicTitle": "\u062E\u0648\u0627\u062F\u0645 \u0639\u0627\u0645\u0651\u0629 (\u0627\u0641\u062A\u0631\u0627\u0636\u064A)",
"ice.publicDesc": "\u0628\u0644\u0627 \u0625\u0639\u062F\u0627\u062F. \u0645\u0646\u0627\u0633\u0628\u0629 \u0644\u0645\u0639\u0638\u0645 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645\u064A\u0646.",
"ice.customTitle": "\u062E\u0648\u0627\u062F\u0645 STUN/TURN \u0627\u0644\u062E\u0627\u0635\u0651\u0629 \u0628\u064A",
"ice.customDesc": "\u062D\u062A\u0649 {max} \u062E\u0648\u0627\u062F\u0645.",
"ice.turnNote": "\u064A\u0631\u0649 \u0645\u064F\u0631\u062D\u0650\u0651\u0644 TURN \u0639\u0646\u0648\u0627\u0646 IP \u0644\u0643\u0644\u0627 \u0627\u0644\u0637\u0631\u0641\u064A\u0646 \u0648\u062A\u0648\u0642\u064A\u062A \u062D\u0631\u0643\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A - \u0644\u0643\u0646\u0647 \u0644\u0627 \u064A\u0631\u0649 \u0645\u062D\u062A\u0648\u0649 \u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0623\u0628\u062F\u0627\u064B\u060C \u0641\u0647\u064A \u062A\u0628\u0642\u0649 \u0645\u0634\u0641\u0651\u0631\u0629 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641. \u064A\u064F\u0641\u0636\u064E\u0651\u0644 ",
"ice.turnNoteTls": " (TLS).",
"ice.test": "\u0627\u062E\u062A\u0628\u0631 \u0627\u0644\u062E\u0648\u0627\u062F\u0645",
"ice.testing": "\u062C\u0627\u0631\u064D \u0627\u0644\u0627\u062E\u062A\u0628\u0627\u0631\u2026",
"ice.relayTitle": "\u0648\u0636\u0639 \u0627\u0644\u062A\u0631\u062D\u064A\u0644 \u0641\u0642\u0637",
"ice.relayBadge": "\u0623\u0642\u0635\u0649 \u062E\u0635\u0648\u0635\u064A\u0629",
"ice.relayDesc": "\u064A\u0648\u062C\u0651\u0647 \u0643\u0644\u0651 \u062D\u0631\u0643\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0639\u0628\u0631 TURN \u0641\u0644\u0627 \u064A\u064F\u0643\u0634\u0641 \u0639\u0646\u0648\u0627\u0646 IP \u0644\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0623\u0628\u062F\u0627\u064B. \u064A\u062A\u0637\u0644\u0651\u0628 \u062E\u0627\u062F\u0645 TURN.",
"ice.relayWarning": "\u0648\u0636\u0639 \u0627\u0644\u062A\u0631\u062D\u064A\u0644 \u0641\u0642\u0637 \u0645\u0641\u0639\u064E\u0651\u0644 \u0644\u0643\u0646 \u0644\u0627 \u064A\u0648\u062C\u062F \u062E\u0627\u062F\u0645 TURN \u0645\u0636\u0628\u0648\u0637. \u0644\u0646 \u064A\u062A\u0645\u0643\u0651\u0646 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0645\u0646 \u0627\u0644\u0628\u062F\u0621.",
"ice.persist": "\u0627\u062D\u0641\u0638 \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632",
"ice.persistDesc": "\u064A\u064F\u062E\u0632\u064E\u0651\u0646 \u0645\u0634\u0641\u064E\u0651\u0631\u0627\u064B \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u0651\u062D. \u0627\u062A\u0631\u0643\u0647 \u0645\u064F\u0637\u0641\u0623\u064B \u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645\u0647 \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u062C\u0644\u0633\u0629 \u0641\u0642\u0637.",
"ice.forget": "\u0627\u0646\u0633\u064E \u0627\u0644\u0645\u062D\u0641\u0648\u0638",
"ice.cancel": "\u0625\u0644\u063A\u0627\u0621",
"ice.apply": "\u062A\u0637\u0628\u064A\u0642",
"ice.errUnavailable": "WebRTC \u063A\u064A\u0631 \u0645\u062A\u0627\u062D \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u0651\u062D",
"ice.errInvalid": "\u0625\u0639\u062F\u0627\u062F \u062E\u0627\u062F\u0645 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D",
"update.title": "\u064A\u062A\u0648\u0641\u0651\u0631 \u062A\u062D\u062F\u064A\u062B",
"update.desc": "\u0631\u064F\u0635\u062F \u0625\u0635\u062F\u0627\u0631 \u0623\u062D\u062F\u062B \u0645\u0646 SecureBit.",
"update.currentVersion": "\u0627\u0644\u0625\u0635\u062F\u0627\u0631 \u0627\u0644\u062D\u0627\u0644\u064A",
"update.newVersion": "\u0627\u0644\u0625\u0635\u062F\u0627\u0631 \u0627\u0644\u062C\u062F\u064A\u062F",
"update.now": "\u062D\u062F\u0651\u062B \u0627\u0644\u0622\u0646",
"update.later": "\u0644\u0627\u062D\u0642\u0627\u064B",
"update.unknown": "\u063A\u064A\u0631 \u0645\u062A\u0627\u062D",
"update.stepSaving": "\u062C\u0627\u0631\u064D \u062D\u0641\u0638 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A...",
"update.stepSwCaches": "\u062C\u0627\u0631\u064D \u0645\u0633\u062D \u0645\u062E\u0627\u0628\u0626 \u0639\u0627\u0645\u0644 \u0627\u0644\u062E\u062F\u0645\u0629...",
"update.stepSwUnregister": "\u062C\u0627\u0631\u064D \u0625\u0644\u063A\u0627\u0621 \u062A\u0633\u062C\u064A\u0644 \u0639\u0648\u0627\u0645\u0644 \u0627\u0644\u062E\u062F\u0645\u0629...",
"update.stepBrowserCache": "\u062C\u0627\u0631\u064D \u0645\u0633\u062D \u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u0645\u062A\u0635\u0641\u0651\u062D \u0627\u0644\u0645\u0624\u0642\u0651\u062A\u0629...",
"update.stepVersion": "\u062C\u0627\u0631\u064D \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0625\u0635\u062F\u0627\u0631...",
"update.stepReload": "\u062C\u0627\u0631\u064D \u0625\u0639\u0627\u062F\u0629 \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u062A\u0637\u0628\u064A\u0642...",
"update.error": "\u062E\u0637\u0623 \u0641\u064A \u0627\u0644\u062A\u062D\u062F\u064A\u062B. \u064A\u064F\u0631\u062C\u0649 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0635\u0641\u062D\u0629 \u064A\u062F\u0648\u064A\u0627\u064B (Ctrl+F5 \u0623\u0648 Cmd+Shift+R)",
"update.confirmSkip": "\u064A\u062A\u0648\u0641\u0651\u0631 \u0625\u0635\u062F\u0627\u0631 \u062C\u062F\u064A\u062F. \u064A\u064F\u0646\u0635\u062D \u0628\u0627\u0644\u062A\u062D\u062F\u064A\u062B \u0644\u0644\u0623\u0645\u0627\u0646 \u0648\u0627\u0644\u0627\u0633\u062A\u0642\u0631\u0627\u0631. \u0623\u062A\u0631\u064A\u062F \u0627\u0644\u0645\u062A\u0627\u0628\u0639\u0629 \u062F\u0648\u0646 \u062A\u062D\u062F\u064A\u062B\u061F",
"offline.backOnline": "\u0639\u0627\u062F \u0627\u0644\u0627\u062A\u0635\u0627\u0644",
"offline.mode": "\u0648\u0636\u0639 \u062F\u0648\u0646 \u0627\u062A\u0635\u0627\u0644",
"offline.dismiss": "\u062A\u062C\u0627\u0647\u0644",
"offline.lostTitle": "\u0627\u0646\u0642\u0637\u0639 \u0627\u0644\u0627\u062A\u0635\u0627\u0644",
"offline.lostDesc": "SecureBit \u0627\u0644\u0622\u0646 \u0641\u064A \u0648\u0636\u0639 \u062F\u0648\u0646 \u0627\u062A\u0635\u0627\u0644. \u0628\u0639\u0636 \u0627\u0644\u0645\u0632\u0627\u064A\u0627 \u0645\u062D\u062F\u0648\u062F\u0629\u060C \u0644\u0643\u0646 \u0628\u064A\u0627\u0646\u0627\u062A\u0643 \u062A\u0628\u0642\u0649 \u0622\u0645\u0646\u0629.",
"offline.point1": "\u062C\u0644\u0633\u062A\u0643 \u0648\u0645\u0641\u0627\u062A\u064A\u062D\u0643 \u0645\u062D\u0641\u0648\u0638\u0629",
"offline.point2": "\u0644\u0627 \u062A\u064F\u062E\u0632\u064E\u0651\u0646 \u0623\u064A\u0651 \u0628\u064A\u0627\u0646\u0627\u062A \u0639\u0644\u0649 \u0627\u0644\u062E\u0648\u0627\u062F\u0645",
"offline.point3": "\u062A\u064F\u0632\u0627\u0645\u064E\u0646 \u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0648\u0627\u0644\u0645\u0644\u0641\u0651\u0627\u062A \u0639\u0646\u062F \u0639\u0648\u062F\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644",
"offline.continue": "\u062A\u0627\u0628\u0639 \u062F\u0648\u0646 \u0627\u062A\u0635\u0627\u0644",
"offline.restoredTitle": "\u0639\u0646\u062F \u0639\u0648\u062F\u0629 \u0627\u062A\u0635\u0627\u0644\u0643",
"offline.restoredDesc": "\u0627\u0646\u0642\u0637\u0627\u0639 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0644\u0627 \u064A\u0643\u0644\u0651\u0641\u0643 \u0634\u064A\u0626\u0627\u064B. \u064A\u0636\u0639 SecureBit \u0643\u0644\u0651 \u0634\u064A\u0621 \u0641\u064A \u0637\u0627\u0628\u0648\u0631 \u0645\u062D\u0644\u0651\u064A \u0648\u064A\u0633\u062A\u0623\u0646\u0641 \u0627\u0644\u062C\u0644\u0633\u0629 \u0627\u0644\u0645\u0634\u0641\u0651\u0631\u0629 \u0644\u062D\u0638\u0629 \u0639\u0648\u062F\u062A\u0643.",
"offline.r1Title": "\u062A\u0635\u0644 \u0631\u0633\u0627\u0626\u0644\u0643",
"offline.r1Desc": "\u0643\u0644\u0651 \u0645\u0627 \u0643\u062A\u0628\u062A\u0647 \u062F\u0648\u0646 \u0627\u062A\u0635\u0627\u0644 \u064A\u064F\u0631\u0633\u064E\u0644 \u0625\u0644\u0649 \u0645\u0631\u0627\u0633\u0644\u0643 \u062A\u0644\u0642\u0627\u0626\u064A\u0627\u064B.",
"offline.r2Title": "\u062A\u0643\u062A\u0645\u0644 \u0627\u0644\u0645\u0644\u0641\u0651\u0627\u062A",
"offline.r2Desc": "\u062A\u064F\u0633\u062A\u0623\u0646\u0641 \u0639\u0645\u0644\u064A\u0627\u062A \u0627\u0644\u0631\u0641\u0639 \u0645\u0646 \u062D\u064A\u062B \u062A\u0648\u0642\u0651\u0641\u062A - \u0644\u0627 \u062D\u0627\u062C\u0629 \u0644\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0625\u0631\u0633\u0627\u0644.",
"offline.r3Title": "\u062A\u0635\u0644\u0643 \u0631\u0633\u0627\u0626\u0644\u0647\u0645 \u0648\u0645\u0644\u0641\u0651\u0627\u062A\u0647\u0645",
"offline.r3Desc": "\u0643\u0644\u0651 \u0645\u0627 \u0623\u0631\u0633\u0644\u0647 \u0645\u0631\u0627\u0633\u0644\u0643 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0627\u0646\u0642\u0637\u0627\u0639 \u064A\u0635\u0644\u0643 \u0628\u0627\u0644\u062A\u0631\u062A\u064A\u0628.",
"offline.r4Title": "\u0644\u0627 \u0634\u064A\u0621 \u064A\u0636\u064A\u0639",
"offline.r4Desc": "\u0628\u0639\u062F \u0639\u0648\u062F\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0644\u0627 \u062A\u0648\u062C\u062F \u0641\u062C\u0648\u0629 - \u062A\u0643\u0645\u0644 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629 \u062A\u0645\u0627\u0645\u0627\u064B \u0645\u0646 \u062D\u064A\u062B \u062A\u0648\u0642\u0651\u0641\u062A.",
"offline.gotIt": "\u0641\u0647\u0645\u062A",
"qr.showTitle": "\u0623\u0638\u0647\u0631 \u0631\u0645\u0632 QR",
"qr.showSubtitle": "\u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629 \xB7 \u062F\u0639 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u064A\u0645\u0633\u062D\u0647",
"qr.showSubtitleFrames": "\u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629 \xB7 \u062F\u0639 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u064A\u0645\u0633\u062D \u0627\u0644\u0625\u0637\u0627\u0631\u0627\u062A \u0627\u0644\u0640 {frames} \u0643\u0644\u0651\u0647\u0627",
"notify.enabledBody": "\u0641\u064F\u0639\u0650\u0651\u0644\u062A \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A! \u0633\u062A\u0635\u0644\u0643 \u062A\u0646\u0628\u064A\u0647\u0627\u062A \u0628\u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0627\u0644\u062C\u062F\u064A\u062F\u0629.",
"notify.workingBody": "\u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A \u062A\u0639\u0645\u0644! \u0633\u062A\u0635\u0644\u0643 \u062A\u0646\u0628\u064A\u0647\u0627\u062A \u0628\u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0627\u0644\u062C\u062F\u064A\u062F\u0629.",
"pw.label": "\u0625\u062F\u062E\u0627\u0644 \u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631",
"pw.placeholder": "\u0623\u062F\u062E\u0644 \u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631...",
"pw.decrypt": "\u0641\u0643\u0651 \u0627\u0644\u062A\u0634\u0641\u064A\u0631",
"pw.cancel": "\u0625\u0644\u063A\u0627\u0621",
"file.title": "\u0646\u0642\u0644 \u0627\u0644\u0645\u0644\u0641\u0651\u0627\u062A",
"file.drop": "\u0623\u0633\u0642\u0637 \u0627\u0644\u0645\u0644\u0641\u0651\u0627\u062A \u0647\u0646\u0627",
"file.dropHint": "\u062A\u064F\u0634\u0641\u064E\u0651\u0631 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641 \u0642\u0628\u0644 \u0627\u0644\u0646\u0642\u0644 \xB7 \u062D\u062A\u0649 100 \u0645\u064A\u063A\u0627\u0628\u0627\u064A\u062A",
"file.browse": "\u062A\u0635\u0641\u0651\u062D \u0627\u0644\u062C\u0647\u0627\u0632",
"file.incoming": "\u0637\u0644\u0628 \u0645\u0644\u0641\u0651 \u0648\u0627\u0631\u062F",
"file.accept": "\u0642\u0628\u0648\u0644",
"file.reject": "\u0631\u0641\u0636",
"file.download": "\u062A\u0646\u0632\u064A\u0644",
"file.notReady": "\u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u063A\u064A\u0631 \u062C\u0627\u0647\u0632",
"file.tooLarge": "\u0627\u0644\u0645\u0644\u0641\u0651 \u0643\u0628\u064A\u0631 \u062C\u062F\u0627\u064B",
"file.typeNotAllowed": "\u0646\u0648\u0639 \u0627\u0644\u0645\u0644\u0641\u0651 \u063A\u064A\u0631 \u0645\u0633\u0645\u0648\u062D",
"file.maxConcurrent": "\u0627\u0644\u062D\u062F\u0651 \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0646\u0642\u0644 \u0627\u0644\u0645\u062A\u0632\u0627\u0645\u0646",
"file.gone": "\u0644\u0645 \u064A\u0639\u062F \u0647\u0630\u0627 \u0627\u0644\u0645\u0644\u0641\u0651 \u0645\u062A\u0627\u062D\u0627\u064B \u0644\u0644\u062A\u0646\u0632\u064A\u0644.",
"call.incoming": "\u0645\u0643\u0627\u0644\u0645\u0629 \u0648\u0627\u0631\u062F\u0629",
"call.incomingVideo": "\u0645\u0643\u0627\u0644\u0645\u0629 \u0645\u0631\u0626\u064A\u0629 \u0648\u0627\u0631\u062F\u0629",
"call.encrypted": "\u0645\u0643\u0627\u0644\u0645\u0629 \u0645\u0634\u0641\u0651\u0631\u0629",
"call.encryptedShort": "\u0645\u0634\u0641\u0651\u0631\u0629",
"call.peer": "\u0637\u0631\u0641 \u0622\u0645\u0646",
"call.connecting": "\u062C\u0627\u0631\u064D \u0627\u0644\u0627\u062A\u0635\u0627\u0644\u2026",
"call.ringing": "\u062C\u0627\u0631\u064D \u0627\u0644\u0631\u0646\u064A\u0646\u2026",
"call.accept": "\u0642\u0628\u0648\u0644",
"call.decline": "\u0631\u0641\u0636",
"call.end": "\u0625\u0646\u0647\u0627\u0621 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629",
"call.camera": "\u0627\u0644\u0643\u0627\u0645\u064A\u0631\u0627",
"call.cameraOff": "\u0627\u0644\u0643\u0627\u0645\u064A\u0631\u0627 \u0645\u064F\u0637\u0641\u0623\u0629",
"call.peerCameraOff": "\u0643\u0627\u0645\u064A\u0631\u0627 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0645\u064F\u0637\u0641\u0623\u0629",
"call.flipCamera": "\u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u0643\u0627\u0645\u064A\u0631\u0627",
"call.addVideo": "\u0623\u0636\u0641 \u0627\u0644\u0641\u064A\u062F\u064A\u0648",
"call.video": "\u0641\u064A\u062F\u064A\u0648",
"call.muted": "\u0645\u0643\u062A\u0648\u0645",
"call.expand": "\u062A\u0648\u0633\u064A\u0639",
"call.minimize": "\u062A\u0635\u063A\u064A\u0631",
"call.quality": "\u062C\u0648\u062F\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644",
"call.qualityExcellent": "\u0645\u0645\u062A\u0627\u0632\u0629",
"call.videoPrefix": "\u0645\u0631\u0626\u064A\u0629 \xB7 ",
"call.voicePrefix": "\u0635\u0648\u062A\u064A\u0629 \xB7 ",
"group.new": "\u0645\u062C\u0645\u0648\u0639\u0629 \u062C\u062F\u064A\u062F\u0629",
"group.create": "\u0623\u0646\u0634\u0626 \u0645\u062C\u0645\u0648\u0639\u0629",
"group.join": "\u0627\u0646\u0636\u0645\u0651 \u0625\u0644\u0649 \u0645\u062C\u0645\u0648\u0639\u0629",
"group.name": "\u0627\u0633\u0645 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629",
"group.nameTooLong": "\u0627\u0633\u0645 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0637\u0648\u064A\u0644 \u062C\u062F\u0627\u064B.",
"group.capacity": "\u062D\u062A\u0649 {max} \u0623\u0634\u062E\u0627\u0635\u060C \u0646\u062F\u064C\u0651 \u0644\u0646\u062F\u0651. \u0633\u064A\u0642\u0627\u0631\u0646 \u0627\u0644\u062C\u0645\u064A\u0639 \u0631\u0645\u0632 \u0623\u0645\u0627\u0646 \u0648\u0627\u062D\u062F\u0627\u064B \u0642\u0628\u0644 \u0641\u062A\u062D \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629.",
"group.invite": "\u062F\u0639\u0648\u0629",
"group.inviteMore": "\u0627\u062F\u0639\u064F \u0623\u0639\u0636\u0627\u0621 \u0622\u062E\u0631\u064A\u0646",
"group.invitePeople": "\u0627\u062F\u0639\u064F {count} \u0623\u0634\u062E\u0627\u0635",
"group.invitation": "\u062F\u0639\u0648\u0629 \u0645\u062C\u0645\u0648\u0639\u0629",
"group.addMembers": "\u0623\u0636\u0641 \u0623\u0639\u0636\u0627\u0621",
"group.roomFor": "\u064A\u062A\u0651\u0633\u0639 \u0644\u0640 {remaining} \u0622\u062E\u0631\u064A\u0646. \u0633\u064A\u0642\u0627\u0631\u0646 \u0627\u0644\u062C\u0645\u064A\u0639 \u0631\u0645\u0632 \u0645\u062C\u0645\u0648\u0639\u0629 \u062C\u062F\u064A\u062F\u0627\u064B \u0628\u0645\u062C\u0631\u0651\u062F \u0627\u0646\u0636\u0645\u0627\u0645\u0647\u0645.",
"group.membersCount": "{count} \u0623\u0639\u0636\u0627\u0621",
"group.member": "\u0639\u0636\u0648",
"group.members": "\u0627\u0644\u0623\u0639\u0636\u0627\u0621",
"group.remove": "\u0623\u0632\u0644 {name}",
"group.message": "\u0631\u0627\u0633\u0650\u0644 {name}",
"group.leave": "\u0645\u063A\u0627\u062F\u0631\u0629",
"group.leaveThis": "\u063A\u0627\u062F\u0631 \u0647\u0630\u0647 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629",
"group.cancel": "\u0623\u0644\u063A\u0650 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629",
"group.close": "\u0625\u063A\u0644\u0627\u0642",
"group.cancelBtn": "\u0625\u0644\u063A\u0627\u0621",
"group.decline": "\u0631\u0641\u0636",
"group.working": "\u062C\u0627\u0631\u064D \u0627\u0644\u0639\u0645\u0644\u2026",
"group.sasTitle": "\u0631\u0645\u0632 \u0623\u0645\u0627\u0646 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629",
"group.sasEveryone": "\u064A\u0631\u0649 \u0627\u0644\u062C\u0645\u064A\u0639 \u0647\u0630\u0627 \u0627\u0644\u0631\u0645\u0632",
"group.sasCompare": "\u0642\u0627\u0631\u0650\u0646 \u0631\u0645\u0632 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0645\u0639 \u0643\u0644\u0651 \u0639\u0636\u0648 \u0644\u0641\u062A\u062D \u0647\u0630\u0647 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629.",
"group.sasReadAloud": "\u0627\u0642\u0631\u0623 \u0647\u0630\u0647 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0628\u0635\u0648\u062A \u0639\u0627\u0644\u064D \u0625\u0644\u0649 ",
"group.sasWarning": "\u0625\u0646 \u0642\u0631\u0623 \u0639\u0636\u0648 \u0648\u0627\u062D\u062F \u0631\u0645\u0632\u0627\u064B \u0645\u062E\u062A\u0644\u0641\u0627\u064B \u0641\u0647\u0646\u0627\u0643 \u0645\u0646 \u064A\u062C\u0644\u0633 \u0628\u064A\u0646\u0643\u0645. \u0623\u0644\u063A\u0650 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 - \u0644\u0627 \u062A\u0624\u0643\u0651\u062F.",
"group.confirmFirst": "\u0623\u0643\u0651\u062F \u0631\u0645\u0632 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0623\u0648\u0651\u0644\u0627\u064B",
"group.codeSuffix": " \xB7 \u0631\u0645\u0632 {code}",
"group.exchangingNonces": "\u062C\u0627\u0631\u064D \u062A\u0628\u0627\u062F\u0644 \u0627\u0644\u0642\u064A\u0645 \u0627\u0644\u0639\u0634\u0648\u0627\u0626\u064A\u0629\u2026",
"group.waitingCommit": "\u0628\u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u062A\u0632\u0627\u0645 \u0643\u0644\u0651 \u0639\u0636\u0648\u2026",
"group.waitingJoin": "\u0628\u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0646\u0636\u0645\u0627\u0645 \u0628\u0642\u064A\u0651\u0629 \u0627\u0644\u0623\u0639\u0636\u0627\u0621\u2026",
"group.emptyChat": "\u0644\u0627 \u0634\u064A\u0621 \u0647\u0646\u0627 \u0628\u0639\u062F. \u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0645\u0648\u0642\u064E\u0651\u0639\u0629 \u0645\u0646 \u0645\u064F\u0631\u0633\u0650\u0644\u0647\u0627 \u0648\u062A\u0646\u062A\u0642\u0644 \u0639\u0628\u0631 \u0648\u0635\u0644\u0629 \u0645\u0634\u0641\u0651\u0631\u0629 \u062E\u0627\u0635\u0651\u0629 \u0628\u0643\u0644\u0651 \u0639\u0636\u0648.",
"group.noVerified": "\u0644\u0627 \u062A\u0648\u062C\u062F \u062F\u0631\u062F\u0634\u0627\u062A \u0645\u064F\u062A\u062D\u0642\u064E\u0651\u0642 \u0645\u0646\u0647\u0627 \u0628\u0639\u062F. \u0627\u0641\u062A\u062D \u062F\u0631\u062F\u0634\u0629 \u062B\u0646\u0627\u0626\u064A\u0629 \u0648\u0642\u0627\u0631\u0650\u0646 \u0631\u0645\u0632 \u0623\u0645\u0627\u0646\u0647\u0627 \u0623\u0648\u0651\u0644\u0627\u064B - \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u062A\u064F\u0628\u0646\u0649 \u0645\u0646 \u0627\u062A\u0635\u0627\u0644\u0627\u062A \u0641\u062D\u0635\u062A\u0647\u0627 \u0645\u0646 \u0642\u0628\u0644.",
"group.noMoreToAdd": "\u0644\u0627 \u062A\u0648\u062C\u062F \u062F\u0631\u062F\u0634\u0627\u062A \u0645\u064F\u062A\u062D\u0642\u064E\u0651\u0642 \u0645\u0646\u0647\u0627 \u0623\u062E\u0631\u0649 \u0644\u0625\u0636\u0627\u0641\u062A\u0647\u0627. \u0627\u0641\u062A\u062D \u062F\u0631\u062F\u0634\u0629 \u062B\u0646\u0627\u0626\u064A\u0629 \u0648\u0642\u0627\u0631\u0650\u0646 \u0631\u0645\u0632 \u0623\u0645\u0627\u0646\u0647\u0627 \u0623\u0648\u0651\u0644\u0627\u064B.",
"group.directLink": "\u0648\u0635\u0644\u0629 \u0645\u0628\u0627\u0634\u0631\u0629 \u0646\u062F\u064C\u0651 \u0644\u0646\u062F\u0651",
"group.noDirectLink": "\u0644\u0627 \u0648\u0635\u0644\u0629 \u0645\u0628\u0627\u0634\u0631\u0629 \u0628\u0639\u062F - \u064A\u064F\u0631\u062D\u0650\u0651\u0644 \u0639\u0636\u0648 \u0622\u062E\u0631 \u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0631\u064A\u062B\u0645\u0627 \u062A\u064F\u0628\u0646\u0649 \u0648\u0627\u062D\u062F\u0629",
"group.relayNote": "\u0628\u0639\u0636 \u0627\u0644\u0623\u0639\u0636\u0627\u0621 \u0644\u064A\u0633\u062A \u0644\u062F\u064A\u0647\u0645 \u0648\u0635\u0644\u0629 \u0645\u0628\u0627\u0634\u0631\u0629 \u0628\u0643 \u0628\u0639\u062F. \u062A\u0645\u0631\u0651 \u0631\u0633\u0627\u0626\u0644\u0647\u0645 \u0639\u0628\u0631 \u0639\u0636\u0648 \u0622\u062E\u0631 \u064A\u0631\u0649 \u0623\u0646\u0651\u0643\u0645 \u062A\u062A\u062D\u062F\u0651\u062B\u0648\u0646 \u0644\u0643\u0646\u0647 \u0644\u0627 \u064A\u0633\u062A\u0637\u064A\u0639 \u0642\u0631\u0627\u0621\u0629 \u0645\u0627 \u0648\u0631\u0627\u0621 \u0627\u0644\u062A\u0648\u0642\u064A\u0639 \u0648\u0644\u0627 \u062A\u063A\u064A\u064A\u0631 \u0645\u0627 \u0642\u0644\u062A\u0647. \u062A\u0648\u0627\u0635\u0644 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0645\u062D\u0627\u0648\u0644\u0629 \u0648\u0635\u0644\u0647\u0645 \u0645\u0628\u0627\u0634\u0631\u0629\u064B.",
"group.relayOnlyOff": "\u0648\u0636\u0639 \u0627\u0644\u062A\u0631\u062D\u064A\u0644 \u0641\u0642\u0637 \u0645\u064F\u0637\u0641\u0623\u060C \u0641\u064A\u062A\u0651\u0635\u0644 \u0628\u0643 \u0643\u0644\u0651 \u0639\u0636\u0648 \u0645\u0628\u0627\u0634\u0631\u0629\u064B \u0648\u064A\u0639\u0631\u0641 \u0639\u0646\u0648\u0627\u0646 IP \u0627\u0644\u062E\u0627\u0635\u0651 \u0628\u0643 - \u0628\u0645\u0646 \u0641\u064A\u0647\u0645 \u0623\u0639\u0636\u0627\u0621 \u062F\u0639\u0627\u0647\u0645 \u0634\u062E\u0635 \u0622\u062E\u0631. \u0641\u0639\u0651\u0644\u0647 \u0645\u0646 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u0634\u0628\u0643\u0629 \u0625\u0646 \u0643\u0627\u0646 \u0630\u0644\u0643 \u064A\u0647\u0645\u0651\u0643 \u0647\u0646\u0627.",
"group.memberOffline": "{name} \u063A\u064A\u0631 \u0645\u062A\u0651\u0635\u0644 \u0648\u0644\u0646 \u064A\u062A\u0644\u0642\u0651\u0649 \u0627\u0644\u0631\u0633\u0627\u0626\u0644. \u0644\u0627 \u064A\u0632\u0627\u0644 \u0639\u0636\u0648\u0627\u064B - \u0625\u0632\u0627\u0644\u062A\u0647 \u062A\u064F\u0639\u064A\u062F \u062A\u0648\u0644\u064A\u062F \u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629.",
"group.joinNote": "\u0633\u064A\u0639\u0631\u0641 \u0628\u0642\u064A\u0651\u0629 \u0627\u0644\u0623\u0639\u0636\u0627\u0621 \u0628\u0648\u062C\u0648\u062F\u0643 \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629. \u0644\u0627 \u0633\u062C\u0644\u0651 \u0631\u0633\u0627\u0626\u0644 \u0644\u062A\u0644\u062D\u0642 \u0628\u0647 - \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u062A\u0628\u062F\u0623 \u0641\u0627\u0631\u063A\u0629.",
"group.inviteSentNote": "\u062A\u0648\u0627\u0635\u0644 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0639\u0645\u0644\u0647\u0627 \u062D\u062A\u0649 \u064A\u0642\u0628\u0644\u0648\u0627. \u0644\u0627 \u0633\u062C\u0644\u0651 \u064A\u0644\u062D\u0642\u0648\u0646 \u0628\u0647 - \u0644\u0646 \u064A\u0631\u0648\u0627 \u0625\u0644\u0651\u0627 \u0645\u0627 \u064A\u064F\u0631\u0633\u064E\u0644 \u0645\u0646 \u0627\u0644\u0622\u0646.",
"group.errNotCreated": "\u0644\u0645 \u062A\u064F\u0646\u0634\u0623 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629",
"group.errNobodyAccepted": "\u0644\u0645 \u064A\u0642\u0628\u0644 \u0623\u062D\u062F \u0627\u0644\u062F\u0639\u0648\u0629 \u0641\u064A \u0627\u0644\u0648\u0642\u062A \u0627\u0644\u0645\u062D\u062F\u0651\u062F.",
"group.errNothingSent": "\u0644\u0645 \u064A\u064F\u0631\u0633\u064E\u0644 \u0634\u064A\u0621 \u0648\u0644\u0645 \u064A\u064F\u062A\u062D\u0642\u064E\u0651\u0642 \u0645\u0646 \u0634\u064A\u0621. \u0623\u063A\u0644\u0642 \u0647\u0630\u0627 \u0648\u062D\u0627\u0648\u0644 \u0645\u062C\u062F\u0651\u062F\u0627\u064B \u0628\u0639\u062F \u0627\u062A\u0635\u0627\u0644 \u0627\u0644\u062C\u0645\u064A\u0639.",
"group.errNotFormed": "\u062A\u0639\u0630\u0651\u0631 \u062A\u0643\u0648\u064A\u0646 \u0647\u0630\u0647 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629.",
"group.errFull": "\u0647\u0630\u0647 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0645\u0645\u062A\u0644\u0626\u0629.",
"group.errInviteFailed": "\u062A\u0639\u0630\u0651\u0631 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u062F\u0639\u0648\u0629 - \u062A\u0644\u0643 \u0627\u0644\u062F\u0631\u062F\u0634\u0629 \u063A\u064A\u0631 \u0645\u062A\u0651\u0635\u0644\u0629.",
"group.errNoMemberList": "\u0644\u0645 \u064A\u0631\u0633\u0644 \u0645\u0627\u0644\u0643 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0623\u0639\u0636\u0627\u0621 \u0642\u0637\u0651.",
"group.errUnsignedList": "\u0644\u0645 \u064A\u0648\u0642\u0651\u0639 \u0645\u0627\u0644\u0643 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0623\u0639\u0636\u0627\u0621. \u0644\u0627 \u062A\u064F\u0639\u0650\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 - \u0623\u062E\u0628\u0631\u0647\u0645.",
"group.errNotOwner": "\u062D\u0627\u0648\u0644 \u0634\u062E\u0635 \u063A\u064A\u0631 \u0645\u0627\u0644\u0643 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0623\u0639\u0636\u0627\u0621.",
"hdr.tagline": "\u0645\u0634\u0641\u064E\u0651\u0631 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641",
"hdr.netSettings": "\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0634\u0628\u0643\u0629 \u0645\u062A\u0642\u062F\u0651\u0645\u0629",
"hdr.netSettingsTitle": "\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0634\u0628\u0643\u0629 \u0645\u062A\u0642\u062F\u0651\u0645\u0629 (STUN/TURN)",
"hdr.disconnect": "\u0642\u0637\u0639 \u0627\u0644\u0627\u062A\u0635\u0627\u0644",
"status.connected": "\u0645\u062A\u0651\u0635\u0644",
"status.connecting": "\u062C\u0627\u0631\u064D \u0627\u0644\u0627\u062A\u0635\u0627\u0644...",
"status.notConnected": "\u063A\u064A\u0631 \u0645\u062A\u0651\u0635\u0644",
"status.reconnecting": "\u062C\u0627\u0631\u064D \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644...",
"status.retrying": "\u062C\u0627\u0631\u064D \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629...",
"status.verifying": "\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u062D\u0642\u0651\u0642...",
"status.peerDisconnected": "\u0627\u0646\u0642\u0637\u0639 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631",
"sec.replayProtection": "\u0627\u0644\u062D\u0645\u0627\u064A\u0629 \u0645\u0646 \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u062A\u0634\u063A\u064A\u0644",
"sec.messageIntegrity": "\u0633\u0644\u0627\u0645\u0629 \u0627\u0644\u0631\u0633\u0627\u0644\u0629 (HMAC)",
"sec.forwardSecrecy": "\u0627\u0644\u0633\u0631\u0651\u064A\u0629 \u0627\u0644\u062A\u0627\u0645\u0651\u0629 \u0644\u0644\u0623\u0645\u0627\u0645",
"sec.metadataProtection": "\u062D\u0645\u0627\u064A\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629",
"sec.trafficObfuscation": "\u062A\u0645\u0648\u064A\u0647 \u062D\u0631\u0643\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A",
"sec.realTests": "\u0627\u062E\u062A\u0628\u0627\u0631\u0627\u062A \u062A\u0639\u0645\u064A\u0629 \u062D\u0642\u064A\u0642\u064A\u0629",
"sec.simulatedData": "\u0628\u064A\u0627\u0646\u0627\u062A \u0645\u062D\u0627\u0643\u0627\u0629",
"sec.testPassed": "\u0646\u062C\u062D \u0627\u0644\u0627\u062E\u062A\u0628\u0627\u0631",
"sec.testFailed": "\u0641\u0634\u0644 \u0627\u0644\u0627\u062E\u062A\u0628\u0627\u0631 \u0623\u0648 \u063A\u064A\u0631 \u0645\u062A\u0627\u062D",
"sec.verificationDone": "\u0627\u0643\u062A\u0645\u0644 \u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0627\u0644\u062A\u0639\u0645\u0648\u064A \u0627\u0644\u062D\u0642\u064A\u0642\u064A",
"sec.verificationInProgress": "\u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0627\u0644\u0623\u0645\u0646\u064A \u062C\u0627\u0631\u064D...",
"sec.verificationWait": "\u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0627\u0644\u0623\u0645\u0646\u064A \u062C\u0627\u0631\u064D...\n\u064A\u064F\u0631\u062C\u0649 \u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0643\u062A\u0645\u0627\u0644 \u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0627\u0644\u062A\u0639\u0645\u0648\u064A \u0627\u0644\u0622\u0646\u064A.",
"sec.verificationUnavailable": "\u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0627\u0644\u0623\u0645\u0646\u064A \u063A\u064A\u0631 \u0645\u062A\u0627\u062D",
"chat.placeholder": "\u0627\u0643\u062A\u0628 \u0631\u0633\u0627\u0644\u0629 \u0645\u0634\u0641\u0651\u0631\u0629\u2026",
"chat.send": "\u0623\u0631\u0633\u0644 \u0627\u0644\u0631\u0633\u0627\u0644\u0629",
"chat.sendFiles": "\u0623\u0631\u0633\u0644 \u0645\u0644\u0641\u0651\u0627\u062A",
"chat.hideFiles": "\u0623\u062E\u0641\u0650 \u0627\u0644\u0645\u0644\u0641\u0651\u0627\u062A",
"chat.recordVoice": "\u0633\u062C\u0651\u0644 \u0631\u0633\u0627\u0644\u0629 \u0635\u0648\u062A\u064A\u0629",
"chat.sendVoice": "\u0623\u0631\u0633\u0644 \u0627\u0644\u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u0635\u0648\u062A\u064A\u0629",
"chat.discard": "\u062A\u062C\u0627\u0647\u0644",
"chat.codeBlock": "\u0623\u0631\u0633\u0644 \u0643\u0643\u062A\u0644\u0629 \u0634\u064A\u0641\u0631\u0629 (\u064A\u0648\u0633\u0651\u0639 \u062D\u0642\u0644 \u0627\u0644\u0625\u062F\u062E\u0627\u0644)",
"chat.codeHint": "\u0645\u0642\u062A\u0637\u0641 \u0634\u064A\u0641\u0631\u0629 \xB7 \u0627\u0644\u062A\u0646\u0633\u064A\u0642 \u0645\u062D\u0641\u0648\u0638 \xB7 \u2318\u21B5 \u0644\u0644\u0625\u0631\u0633\u0627\u0644",
"chat.viewOnce": "\u0639\u0631\u0636 \u0644\u0645\u0631\u0651\u0629",
"chat.viewOnceTitle": "\u0639\u0631\u0636 \u0644\u0645\u0631\u0651\u0629 - \u064A\u062E\u062A\u0641\u064A \u0628\u0639\u062F \u0623\u0646 \u064A\u0642\u0631\u0623\u0647 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631",
"chat.viewOncePrefix": "\u0639\u0631\u0636 \u0644\u0645\u0631\u0651\u0629 \xB7 ",
"chat.viewOnceTap": "\u0639\u0631\u0636 \u0644\u0645\u0631\u0651\u0629 \xB7 \u0627\u0636\u063A\u0637 \u0644\u0644\u0643\u0634\u0641",
"chat.viewedOnce": "\u0634\u064F\u0648\u0647\u062F \u0645\u0631\u0651\u0629",
"chat.disappearing": "\u0631\u0633\u0627\u0644\u0629 \u062A\u062E\u062A\u0641\u064A - \u062A\u064F\u062D\u0630\u0641 \u0639\u0646\u062F \u0627\u0644\u0637\u0631\u0641\u064A\u0646",
"chat.disappearAfter": "\u062A\u062E\u062A\u0641\u064A \u0628\u0639\u062F",
"chat.visibleFor": "\u0638\u0627\u0647\u0631\u0629 \u0644\u0645\u062F\u0651\u0629",
"chat.timerPrefix": "\u0645\u0624\u0642\u0651\u062A \xB7 ",
"chat.expired": "\u0627\u0646\u062A\u0647\u062A \u0635\u0644\u0627\u062D\u064A\u0629 \u0647\u0630\u0647 \u0627\u0644\u0631\u0633\u0627\u0644\u0629",
"chat.deleteForEveryone": "\u0627\u062D\u0630\u0641 \u0639\u0646\u062F \u0627\u0644\u062C\u0645\u064A\u0639",
"chat.sending": "\u062C\u0627\u0631\u064D \u0627\u0644\u0625\u0631\u0633\u0627\u0644",
"chat.delivered": "\u0648\u0635\u0644\u062A",
"chat.notSent": "\u0644\u0645 \u062A\u064F\u0631\u0633\u0644",
"chat.notSentReason": "\u0644\u0645 \u062A\u064F\u0631\u0633\u0644 - \u0627\u0644\u0642\u0646\u0627\u0629 \u0627\u0644\u0622\u0645\u0646\u0629 \u0644\u064A\u0633\u062A \u062C\u0627\u0647\u0632\u0629. \u0623\u0639\u062F \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0644\u0644\u0645\u062A\u0627\u0628\u0639\u0629.",
"chat.encrypted": "\u0645\u0634\u0641\u0651\u0631\u0629",
"chat.decrypted": "\u0641\u064F\u0643\u0651 \u062A\u0634\u0641\u064A\u0631\u0647\u0627",
"chat.encryptedOnDevice": "\u0645\u0634\u0641\u0651\u0631\u0629 \u0639\u0644\u0649 \u062C\u0647\u0627\u0632\u0643",
"chat.uploading": "\u062C\u0627\u0631\u064D \u0627\u0644\u0631\u0641\u0639",
"chat.downloading": "\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u0646\u0632\u064A\u0644",
"chat.transferring": "\u062C\u0627\u0631\u064D \u0627\u0644\u0646\u0642\u0644\u2026",
"chat.copied": "\u062A\u0645\u0651 \u0627\u0644\u0646\u0633\u062E!",
"chat.collapse": "\u0637\u064A\u0651",
"chat.closeMenu": "\u0623\u063A\u0644\u0642 \u0627\u0644\u0642\u0627\u0626\u0645\u0629",
"chat.newChat": "\u062F\u0631\u062F\u0634\u0629 \u062C\u062F\u064A\u062F\u0629",
"chat.newGroup": "\u0645\u062C\u0645\u0648\u0639\u0629 \u062C\u062F\u064A\u062F\u0629",
"chat.createGroup": "\u0623\u0646\u0634\u0626 \u0645\u062C\u0645\u0648\u0639\u0629",
"chat.groupChats": "\u0627\u0644\u062F\u0631\u062F\u0634\u0627\u062A \u0627\u0644\u062C\u0645\u0627\u0639\u064A\u0629",
"chat.secureChat": "\u062F\u0631\u062F\u0634\u0629 \u0622\u0645\u0646\u0629",
"chat.nameThis": "\u0633\u0645\u0650\u0651 \u0647\u0630\u0647 \u0627\u0644\u062F\u0631\u062F\u0634\u0629",
"chat.rename": "\u0623\u0639\u062F \u062A\u0633\u0645\u064A\u0629 \u0627\u0644\u062F\u0631\u062F\u0634\u0629 (\u0645\u062D\u0644\u0651\u064A\u0627\u064B \u0641\u0642\u0637)",
"chat.renameHint": "\u0627\u0646\u0642\u0631 \u0646\u0642\u0631\u062A\u064A\u0646 \u0644\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u062A\u0633\u0645\u064A\u0629",
"chat.localLabel": "\u062A\u0633\u0645\u064A\u0629 \u0645\u062D\u0644\u0651\u064A\u0629 \xB7 \u0645\u062E\u0632\u064E\u0651\u0646\u0629 \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632 \u0641\u0642\u0637",
"chat.setStatus": "\u0627\u0636\u0628\u0637 \u062D\u0627\u0644\u062A\u0643",
"chat.yourStatusPrefix": "\u062D\u0627\u0644\u062A\u0643 - ",
"chat.meshHint": "\u062D\u062A\u0649 8 \u0623\u0637\u0631\u0627\u0641 \xB7 \u0634\u0628\u0643\u0629 \u0646\u062F\u064D\u0651 \u0644\u0646\u062F\u0651",
"chat.offline": "\u063A\u064A\u0631 \u0645\u062A\u0651\u0635\u0644",
"chat.noNetwork": "\u0644\u0627 \u0634\u0628\u0643\u0629 \xB7 \u062C\u0627\u0631\u064D \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644",
"chat.startVoiceCall": "\u0627\u0628\u062F\u0623 \u0645\u0643\u0627\u0644\u0645\u0629 \u0635\u0648\u062A\u064A\u0629 \u0645\u0634\u0641\u0651\u0631\u0629",
"chat.startVideoCall": "\u0627\u0628\u062F\u0623 \u0645\u0643\u0627\u0644\u0645\u0629 \u0645\u0631\u0626\u064A\u0629 \u0645\u0634\u0641\u0651\u0631\u0629",
"chat.verifyForCalls": "\u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0627\u0644\u062C\u0644\u0633\u0629 \u0644\u062A\u0641\u0639\u064A\u0644 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0627\u062A",
"chat.e2eeNote": "\u0643\u0644\u0651 \u0631\u0633\u0627\u0644\u0629 \u062A\u064F\u0634\u0641\u064E\u0651\u0631 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641 \u0639\u0644\u0649 \u062C\u0647\u0627\u0632\u0643 \u0642\u0628\u0644 \u0623\u0646 \u062A\u063A\u0627\u062F\u0631\u0647.",
"chat.peersOnly": "\u062A\u064F\u0631\u0633\u064E\u0644 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0627\u0644\u0623\u0642\u0631\u0627\u0646 \u0627\u0644\u0645\u062A\u0651\u0635\u0644\u064A\u0646 \u0641\u0642\u0637 - \u0648\u0644\u0627 \u062A\u064F\u062E\u0632\u064E\u0651\u0646 \u0639\u0644\u0649 \u062E\u0627\u062F\u0645 \u0623\u0628\u062F\u0627\u064B.",
"flow.invitationCreated": "\u0623\u064F\u0646\u0634\u0626\u062A \u062F\u0639\u0648\u0629 \u0622\u0645\u0646\u0629",
"flow.invitationCreatedBang": "\u0623\u064F\u0646\u0634\u0626\u062A \u062F\u0639\u0648\u0629 \u0622\u0645\u0646\u0629 \u0648\u0645\u0634\u0641\u0651\u0631\u0629!",
"flow.responseCreated": "\u0623\u064F\u0646\u0634\u0626 \u0631\u062F\u0651 \u0622\u0645\u0646",
"flow.responseCreatedBang": "\u0623\u064F\u0646\u0634\u0626 \u0631\u062F\u0651 \u0622\u0645\u0646!",
"flow.sendInvitation": "\u0623\u0631\u0633\u0644 \u0631\u0645\u0632 \u0627\u0644\u062F\u0639\u0648\u0629 \u0625\u0644\u0649 \u0645\u062D\u062F\u0651\u062B\u0643 \u0639\u0628\u0631 \u0642\u0646\u0627\u0629 \u0622\u0645\u0646\u0629 (\u0645\u0643\u0627\u0644\u0645\u0629 \u0635\u0648\u062A\u064A\u0629 \u0623\u0648 \u0631\u0633\u0627\u0644\u0629 \u0646\u0635\u0651\u064A\u0629 \u0648\u0645\u0627 \u0625\u0644\u0649 \u0630\u0644\u0643).",
"flow.sendResponse": "\u0623\u0631\u0633\u0644 \u0631\u0645\u0632 \u0627\u0644\u0631\u062F\u0651 \u0625\u0644\u0649 \u0627\u0644\u0628\u0627\u062F\u0626 \u0639\u0628\u0631 \u0642\u0646\u0627\u0629 \u0622\u0645\u0646\u0629 \u0623\u0648 \u062F\u0639\u0647 \u064A\u0645\u0633\u062D \u0631\u0645\u0632 QR \u0623\u062F\u0646\u0627\u0647.",
"flow.sendEncryptedCode": "\u0623\u0631\u0633\u0644 \u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0645\u0634\u0641\u0651\u0631",
"flow.sendTheResponse": "\u0623\u0631\u0633\u0644 \u0627\u0644\u0631\u062F\u0651",
"flow.pasteOrWrite": "\u0623\u0644\u0635\u0642 \u0627\u0644\u0631\u0645\u0632 \u0623\u0648 \u0627\u0643\u062A\u0628\u0647\u2026",
"flow.processingInvitation": "\u062C\u0627\u0631\u064D \u0645\u0639\u0627\u0644\u062C\u0629 \u0627\u0644\u062F\u0639\u0648\u0629 \u0627\u0644\u0622\u0645\u0646\u0629...",
"flow.processingResponse": "\u062C\u0627\u0631\u064D \u0645\u0639\u0627\u0644\u062C\u0629 \u0627\u0644\u0631\u062F\u0651 \u0627\u0644\u0622\u0645\u0646...",
"flow.finalizing": "\u062C\u0627\u0631\u064D \u0625\u062A\u0645\u0627\u0645 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0627\u0644\u0622\u0645\u0646...",
"flow.channelEstablished": "\u0623\u064F\u0646\u0634\u0626\u062A \u0627\u0644\u0642\u0646\u0627\u0629 \u0627\u0644\u0622\u0645\u0646\u0629",
"flow.channelReady": "\u0627\u0644\u0642\u0646\u0627\u0629 \u0627\u0644\u0622\u0645\u0646\u0629 \u062C\u0627\u0647\u0632\u0629",
"flow.restoring": "\u062C\u0627\u0631\u064D \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644\u2026",
"flow.invitationCaptured": "\u0627\u0644\u062A\u064F\u0642\u0637\u062A \u0627\u0644\u062F\u0639\u0648\u0629.",
"err.needInvitation": "\u0639\u0644\u064A\u0643 \u0625\u062F\u0631\u0627\u062C \u0631\u0645\u0632 \u0627\u0644\u062F\u0639\u0648\u0629 \u0645\u0646 \u0645\u062D\u062F\u0651\u062B\u0643.",
"err.needResponse": "\u0639\u0644\u064A\u0643 \u0625\u062F\u0631\u0627\u062C \u0631\u0645\u0632 \u0627\u0644\u0631\u062F\u0651 \u0645\u0646 \u0645\u062D\u062F\u0651\u062B\u0643.",
"err.responseFormat": "\u0635\u064A\u063A\u0629 \u0627\u0644\u0631\u062F\u0651 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D\u0629 - \u064A\u064F\u0631\u062C\u0649 \u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0627\u0644\u0631\u0645\u0632",
"err.responseNoKey": "\u0631\u0645\u0632 \u0627\u0644\u0631\u062F\u0651 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D - \u0645\u0641\u062A\u0627\u062D \u0627\u0644\u062A\u0639\u0645\u064A\u0629 \u0645\u0641\u0642\u0648\u062F \u0623\u0648 \u062A\u0627\u0644\u0641. \u064A\u064F\u0631\u062C\u0649 \u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0627\u0644\u0631\u0645\u0632 \u0648\u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0645\u062C\u062F\u0651\u062F\u0627\u064B.",
"err.responseNoSignKey": "\u0631\u0645\u0632 \u0627\u0644\u0631\u062F\u0651 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D - \u0645\u0641\u062A\u0627\u062D \u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0627\u0644\u062A\u0648\u0642\u064A\u0639 \u0645\u0641\u0642\u0648\u062F. \u064A\u064F\u0631\u062C\u0649 \u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0627\u0644\u0631\u0645\u0632 \u0648\u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0645\u062C\u062F\u0651\u062F\u0627\u064B.",
"err.responseOutdated": "\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0631\u062F\u0651 \u0642\u062F\u064A\u0645\u0629 - \u064A\u064F\u0631\u062C\u0649 \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u062F\u0639\u0648\u0629 \u062C\u062F\u064A\u062F\u0629",
"err.setupError": "\u062E\u0637\u0623 \u0641\u064A \u062A\u0647\u064A\u0626\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644",
"err.notReady": "\u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u063A\u064A\u0631 \u062C\u0627\u0647\u0632",
"err.securityBreach": "\u0631\u064F\u0635\u062F \u062E\u0631\u0642 \u0623\u0645\u0646\u064A - \u0631\u064F\u0641\u0636 \u0627\u0644\u0627\u062A\u0635\u0627\u0644",
"err.securityValidation": "\u0641\u0634\u0644 \u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0627\u0644\u0623\u0645\u0646\u064A - \u064A\u064F\u062D\u062A\u0645\u0644 \u0648\u062C\u0648\u062F \u0647\u062C\u0648\u0645",
"err.retiredQr": "\u064A\u0633\u062A\u062E\u062F\u0645 \u0631\u0645\u0632 QR \u0647\u0630\u0627 \u0635\u064A\u063A\u0629 \u0645\u062A\u0642\u0627\u0639\u062F\u0629 \u062A\u0639\u0630\u0651\u0631 \u0645\u0639\u0647\u0627 \u0646\u0642\u0644 \u0627\u0644\u062F\u0639\u0648\u0629. \u0627\u0637\u0644\u0628 \u0645\u0646 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u062A\u0648\u0644\u064A\u062F \u0631\u0645\u0632 \u062C\u062F\u064A\u062F\u060C \u0623\u0648 \u0627\u0633\u062A\u062E\u062F\u0645 \u0627\u0644\u0646\u0633\u062E \u0648\u0627\u0644\u0644\u0635\u0642.",
"err.compressedQrNote": "\u0642\u062F \u064A\u064F\u063A\u0641\u0644 \u0631\u0645\u0632 QR \u0627\u0644\u0645\u0636\u063A\u0648\u0637 \u0628\u064A\u0627\u0646\u0627\u062A SDP \u0627\u062E\u062A\u0635\u0627\u0631\u0627\u064B. \u0627\u0633\u062A\u062E\u062F\u0645 \u0627\u0644\u0646\u0633\u062E \u0648\u0627\u0644\u0644\u0635\u0642 \u0625\u0646 \u0641\u0634\u0644 \u0627\u0644\u0627\u062A\u0635\u0627\u0644.",
"err.inviteNotConnected": "\u062A\u0639\u0630\u0651\u0631 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u062F\u0639\u0648\u0629. \u062A\u0644\u0643 \u0627\u0644\u062F\u0631\u062F\u0634\u0629 \u063A\u064A\u0631 \u0645\u062A\u0651\u0635\u0644\u0629 \u0627\u0644\u0622\u0646.",
"err.inviteNotConnectedRetry": "\u062A\u0639\u0630\u0651\u0631 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u062F\u0639\u0648\u0629. \u062A\u0644\u0643 \u0627\u0644\u062F\u0631\u062F\u0634\u0629 \u063A\u064A\u0631 \u0645\u062A\u0651\u0635\u0644\u0629 \u0627\u0644\u0622\u0646 - \u0623\u0639\u062F \u0641\u062A\u062D\u0647\u0627 \u0648\u062D\u0627\u0648\u0644 \u0645\u062C\u062F\u0651\u062F\u0627\u064B.",
"err.nobodyAccepted": "\u0644\u0645 \u064A\u0642\u0628\u0644 \u0623\u062D\u062F \u0627\u0644\u062F\u0639\u0648\u0629. \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0639\u0644\u0649 \u062D\u0627\u0644\u0647\u0627.",
"err.noAudio": "\u0644\u0645 \u064A\u064F\u0644\u062A\u0642\u0637 \u0623\u064A\u0651 \u0635\u0648\u062A - \u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0625\u0630\u0646 \u0627\u0644\u0645\u064A\u0643\u0631\u0648\u0641\u0648\u0646 \u0648\u062D\u0627\u0648\u0644 \u0645\u062C\u062F\u0651\u062F\u0627\u064B.",
"err.voiceNeedsConnection": "\u062A\u062D\u062A\u0627\u062C \u0627\u0644\u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u0635\u0648\u062A\u064A\u0629 \u0625\u0644\u0649 \u0627\u062A\u0635\u0627\u0644 \u0622\u0645\u0646 \u0646\u0634\u0637. \u0623\u0639\u062F \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0648\u062D\u0627\u0648\u0644 \u0645\u062C\u062F\u0651\u062F\u0627\u064B.",
"err.voiceRestoring": "\u062C\u0627\u0631\u064D \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 - \u062D\u0627\u0648\u0644 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u0635\u0648\u062A\u064A\u0629 \u0628\u0639\u062F \u0644\u062D\u0638\u0629.",
"err.fileTooLarge": "\u0627\u0644\u0645\u0644\u0641\u0651 \u0643\u0628\u064A\u0631 \u062C\u062F\u0627\u064B",
"sas.safetyNumber": "\u0631\u0642\u0645 \u0627\u0644\u0623\u0645\u0627\u0646",
"sas.incorrect": "\u0631\u0645\u0632 \u063A\u064A\u0631 \u0635\u062D\u064A\u062D. \u062A\u062D\u0642\u0651\u0642 \u0645\u0646\u0647 \u0645\u0639 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0648\u062D\u0627\u0648\u0644 \u0645\u062C\u062F\u0651\u062F\u0627\u064B.",
"sas.noMatch": "\u0627\u0644\u0631\u0645\u0632\u0627\u0646 \u063A\u064A\u0631 \u0645\u062A\u0637\u0627\u0628\u0642\u064A\u0646",
"sas.makeSure": "\u062A\u0623\u0643\u0651\u062F \u0645\u0646 \u062A\u0637\u0627\u0628\u0642 \u0627\u0644\u0631\u0645\u0632\u064A\u0646 \u062A\u0645\u0627\u0645\u0627\u064B.",
"sas.tooManyAttempts": "\u0645\u062D\u0627\u0648\u0644\u0627\u062A \u062E\u0627\u0637\u0626\u0629 \u0643\u062B\u064A\u0631\u0629. \u0623\u064F\u0639\u064A\u062F\u062A \u0627\u0644\u062C\u0644\u0633\u0629 \u0625\u0644\u0649 \u0646\u0642\u0637\u0629 \u0627\u0644\u0628\u062F\u0621 \u062D\u0641\u0627\u0638\u0627\u064B \u0639\u0644\u0649 \u0627\u0644\u0623\u0645\u0627\u0646.",
"sas.verificationFailed": "\u0641\u0634\u0644 \u0627\u0644\u062A\u062D\u0642\u0651\u0642",
"sas.verified": "\u0645\u064F\u062A\u062D\u0642\u064E\u0651\u0642 \u0645\u0646\u0647 \xB7 \u0633\u0631\u0651\u064A\u0629 \u062A\u0627\u0645\u0651\u0629 \u0644\u0644\u0623\u0645\u0627\u0645",
"sas.runVerification": "\u0634\u063A\u0651\u0644 \u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0627\u0644\u0623\u0645\u0646\u064A",
"sec.panelTitle": "\u062A\u0641\u0627\u0635\u064A\u0644 \u0627\u0644\u0634\u0628\u0643\u0629 \u0648\u0627\u0644\u062A\u0639\u0645\u064A\u0629",
"sec.security": "\u0627\u0644\u0623\u0645\u0627\u0646",
"sec.transport": "\u0627\u0644\u0646\u0642\u0644",
"sec.keyExchange": "\u062A\u0628\u0627\u062F\u0644 \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D",
"sec.allEnabled": "\u0643\u0644\u0651 \u0645\u0632\u0627\u064A\u0627 \u0627\u0644\u0623\u0645\u0627\u0646 \u0645\u0641\u0639\u064E\u0651\u0644\u0629 \u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0627\u064B",
"sec.realTimeNote": "\u062A\u062D\u0642\u0651\u0642 \u0622\u0646\u064A\u0651 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u062F\u0648\u0627\u0644 \u062A\u0639\u0645\u064A\u0629 \u062D\u0642\u064A\u0642\u064A\u0629 - \u0644\u0627 \u0628\u064A\u0627\u0646\u0627\u062A \u0648\u0647\u0645\u064A\u0629.",
"sec.simulatedWarning": "\u062A\u062D\u0630\u064A\u0631: \u0642\u062F \u0644\u0627 \u064A\u0643\u0648\u0646 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0642\u0627\u0626\u0645\u0627\u064B \u0628\u0627\u0644\u0643\u0627\u0645\u0644 - \u0642\u062F \u062A\u0643\u0648\u0646 \u0627\u0644\u0642\u064A\u0645 \u0645\u062D\u0627\u0643\u0627\u0629.",
"dl.title": "\u0646\u0632\u0651\u0644 SecureBit",
"dl.free": "\u0645\u062C\u0651\u0627\u0646\u064A \xB7 \u0645\u0641\u062A\u0648\u062D \u0627\u0644\u0645\u0635\u062F\u0631",
"dl.soon": "\u062A\u0637\u0628\u064A\u0642\u0627\u062A \u0627\u0644\u0647\u0648\u0627\u062A\u0641 (iOS \u0648\u0623\u0646\u062F\u0631\u0648\u064A\u062F) \u0648\u0625\u0636\u0627\u0641\u0627\u062A \u0627\u0644\u0645\u062A\u0635\u0641\u0651\u062D\u0627\u062A (Chrome \u0648Firefox \u0648Opera) \u0642\u0627\u062F\u0645\u0629 \u0642\u0631\u064A\u0628\u0627\u064B.",
"chatHdr.chat": "\u062F\u0631\u062F\u0634\u0629",
"chatHdr.chats": "\u0627\u0644\u062F\u0631\u062F\u0634\u0627\u062A",
"chatHdr.newChat": "+ \u062C\u062F\u064A\u062F\u0629",
"chatHdr.secure": "\u0622\u0645\u0646\u0629",
"chatHdr.p2pSub": "\u0646\u062F\u064C\u0651 \u0644\u0646\u062F\u0651 \xB7 \u0645\u0634\u0641\u064E\u0651\u0631\u0629 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641",
"chatHdr.save": "\u062D\u0641\u0638",
"chatHdr.close": "\u0625\u063A\u0644\u0627\u0642",
"chatHdr.expand": "\u062A\u0648\u0633\u064A\u0639",
"chatHdr.you": "\u0623\u0646\u062A",
"chatHdr.qrCode": "\u0631\u0645\u0632 QR",
"chat.disconnected": "\u063A\u064A\u0631 \u0645\u062A\u0651\u0635\u0644",
"call.mute": "\u0643\u062A\u0645",
"call.endShort": "\u0625\u0646\u0647\u0627\u0621",
"group.add": "\u0625\u0636\u0627\u0641\u0629",
"group.send": "\u0625\u0631\u0633\u0627\u0644",
"sec.pfsShort": "\u0627\u0644\u0633\u0631\u0651\u064A\u0629 \u0627\u0644\u062A\u0627\u0645\u0651\u0629 \u0644\u0644\u0623\u0645\u0627\u0645",
"sec.cipher": "\u0627\u0644\u0634\u064A\u0641\u0631\u0629",
"chat.close": "\u0625\u063A\u0644\u0627\u0642",
"file.needConnection": "\u0646\u0642\u0644 \u0627\u0644\u0645\u0644\u0641\u0651\u0627\u062A \u064A\u062D\u062A\u0627\u062C \u0625\u0644\u0649 \u0627\u062A\u0635\u0627\u0644 \u0645\u0641\u062A\u0648\u062D",
"presence.available": "\u0645\u062A\u0627\u062D",
"presence.away": "\u0628\u0639\u064A\u062F",
"presence.busy": "\u0645\u0634\u063A\u0648\u0644",
"presence.offline": "\u063A\u064A\u0631 \u0645\u062A\u0651\u0635\u0644",
"presence.invisible": "\u062E\u0641\u064A\u0651",
"presence.availableDesc": "\u0645\u062A\u0651\u0635\u0644 \u0648\u064A\u0645\u0643\u0646 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u064A\u0647",
"presence.awayDesc": "\u062E\u0627\u0645\u0644 \xB7 \u0627\u0628\u062A\u0639\u062F \u0642\u0644\u064A\u0644\u0627\u064B",
"presence.busyDesc": "\u0627\u0644\u0631\u062C\u0627\u0621 \u0639\u062F\u0645 \u0627\u0644\u0625\u0632\u0639\u0627\u062C",
"presence.invisibleDesc": "\u062A\u0638\u0647\u0631 \u063A\u064A\u0631 \u0645\u062A\u0651\u0635\u0644 \u0644\u0644\u0623\u0642\u0631\u0627\u0646",
"presence.online": "\u0645\u062A\u0651\u0635\u0644",
"conn.p2p": "\u0646\u062F\u064C\u0651 \u0644\u0646\u062F\u0651 \xB7 \u0645\u062A\u0651\u0635\u0644",
"conn.verifying": "\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u062D\u0642\u0651\u0642\u2026",
"conn.connecting": "\u062C\u0627\u0631\u064D \u0627\u0644\u0627\u062A\u0635\u0627\u0644\u2026",
"conn.reconnecting": "\u062C\u0627\u0631\u064D \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644\u2026",
"conn.peerDisconnected": "\u0627\u0646\u0642\u0637\u0639 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631",
"conn.disconnected": "\u063A\u064A\u0631 \u0645\u062A\u0651\u0635\u0644",
"chat.defaultLabel": "\u062F\u0631\u062F\u0634\u0629",
"groupPhase.forming": "\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u0643\u0648\u064A\u0646\u2026",
"groupPhase.commitments": "\u062C\u0627\u0631\u064D \u062A\u0628\u0627\u062F\u0644 \u0627\u0644\u0627\u0644\u062A\u0632\u0627\u0645\u0627\u062A\u2026",
"groupPhase.revealing": "\u062C\u0627\u0631\u064D \u0627\u0644\u0643\u0634\u0641\u2026",
"groupPhase.compare": "\u0642\u0627\u0631\u0650\u0646 \u0631\u0645\u0632 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629",
"groupPhase.ready": "\u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u062C\u0627\u0647\u0632\u0629",
"groupPhase.failed": "\u0641\u0634\u0644\u062A \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629",
"call.qualityGood": "\u062C\u064A\u0651\u062F\u0629",
"call.qualityFair": "\u0645\u0642\u0628\u0648\u0644\u0629",
"call.qualityWeak": "\u0636\u0639\u064A\u0641\u0629",
"msg.code": "\u0634\u064A\u0641\u0631\u0629",
"msg.timer": "\u0645\u0624\u0642\u0651\u062A",
"msg.voice": "\u0635\u0648\u062A",
"msg.play": "\u062A\u0634\u063A\u064A\u0644",
"msg.sent": "\u0623\u064F\u0631\u0633\u0644\u062A",
"msg.read": "\u0642\u064F\u0631\u0626\u062A",
"report.title": "\u062A\u062D\u0642\u0651\u0642 \u0623\u0645\u0646\u064A \u0622\u0646\u064A\u0651",
"report.active": "\u0646\u0634\u0637",
"report.testsPassed": "\u0627\u062E\u062A\u0628\u0627\u0631\u0627\u062A \u0646\u0627\u062C\u062D\u0629",
"report.verifiedAt": "\u062A\u0645\u0651 \u0627\u0644\u062A\u062D\u0642\u0651\u0642 \u0641\u064A",
"report.source": "\u0627\u0644\u0645\u0635\u062F\u0631",
"secTest.verifyECDHKeyExchange": "\u062A\u0628\u0627\u062F\u0644 \u0645\u0641\u0627\u062A\u064A\u062D ECDH",
"secTest.verifyECDSASignatures": "\u062A\u0648\u0627\u0642\u064A\u0639 ECDSA \u0627\u0644\u0631\u0642\u0645\u064A\u0629",
"secTest.verifyEncryption": "\u062A\u0634\u0641\u064A\u0631 AES-GCM",
"secTest.verifyMessageIntegrity": "\u0633\u0644\u0627\u0645\u0629 \u0627\u0644\u0631\u0633\u0627\u0644\u0629",
"secTest.verifyPerfectForwardSecrecy": "\u0627\u0644\u0633\u0631\u0651\u064A\u0629 \u0627\u0644\u062A\u0627\u0645\u0651\u0629 \u0644\u0644\u0623\u0645\u0627\u0645",
"secTest.verifyPFS": "\u0627\u0644\u0633\u0631\u0651\u064A\u0629 \u0627\u0644\u062A\u0627\u0645\u0651\u0629 \u0644\u0644\u0623\u0645\u0627\u0645",
"secTest.verifyReplayProtection": "\u0627\u0644\u062D\u0645\u0627\u064A\u0629 \u0645\u0646 \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u062A\u0634\u063A\u064A\u0644",
"secTest.verifyDTLSFingerprint": "\u0628\u0635\u0645\u0629 DTLS",
"secTest.verifySASVerification": "\u062A\u062D\u0642\u0651\u0642 SAS",
"secTest.verifyMetadataProtection": "\u062D\u0645\u0627\u064A\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629",
"secTest.verifyTrafficObfuscation": "\u062A\u0645\u0648\u064A\u0647 \u062D\u0631\u0643\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A",
"secTest.verifyPacketPadding": "\u062D\u0634\u0648 \u0627\u0644\u062D\u0632\u0645",
"secTest.verifyNestedEncryption": "\u0627\u0644\u062A\u0634\u0641\u064A\u0631 \u0627\u0644\u0645\u062A\u062F\u0627\u062E\u0644",
"secTest.verifyNonExtractableKeys": "\u0645\u0641\u0627\u062A\u064A\u062D \u063A\u064A\u0631 \u0642\u0627\u0628\u0644\u0629 \u0644\u0644\u0627\u0633\u062A\u062E\u0631\u0627\u062C",
"secTest.verifyRateLimiting": "\u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0645\u0639\u062F\u0651\u0644",
"secTest.verifyMutualAuth": "\u0627\u0633\u062A\u064A\u062B\u0627\u0642 \u0645\u062A\u0628\u0627\u062F\u0644",
"secTest.verifyAuthProof": "\u0628\u0631\u0647\u0627\u0646 \u0627\u0644\u0627\u0633\u062A\u064A\u062B\u0627\u0642",
"secTest.verifyEnhancedValidation": "\u062A\u062D\u0642\u0651\u0642 \u0645\u064F\u0639\u0632\u064E\u0651\u0632",
"secTest.verifyAdvancedFeatures": "\u0645\u0632\u0627\u064A\u0627 \u0645\u062A\u0642\u062F\u0651\u0645\u0629",
"secTest.verifySignature": "\u0641\u062D\u0635 \u0627\u0644\u062A\u0648\u0642\u064A\u0639",
"secDetail.Security system initializing...": "\u062C\u0627\u0631\u064D \u062A\u0647\u064A\u0626\u0629 \u0646\u0638\u0627\u0645 \u0627\u0644\u0623\u0645\u0627\u0646...",
"secDetail.Nested encryption active": "\u0627\u0644\u062A\u0634\u0641\u064A\u0631 \u0627\u0644\u0645\u062A\u062F\u0627\u062E\u0644 \u0646\u0634\u0637",
"secDetail.Nested encryption failed": "\u0641\u0634\u0644 \u0627\u0644\u062A\u0634\u0641\u064A\u0631 \u0627\u0644\u0645\u062A\u062F\u0627\u062E\u0644",
"secDetail.Packet padding active": "\u062D\u0634\u0648 \u0627\u0644\u062D\u0632\u0645 \u0646\u0634\u0637",
"secDetail.Packet padding failed": "\u0641\u0634\u0644 \u062D\u0634\u0648 \u0627\u0644\u062D\u0632\u0645",
"secDetail.Advanced features active": "\u0627\u0644\u0645\u0632\u0627\u064A\u0627 \u0627\u0644\u0645\u062A\u0642\u062F\u0651\u0645\u0629 \u0646\u0634\u0637\u0629",
"secDetail.Advanced features failed": "\u0641\u0634\u0644\u062A \u0627\u0644\u0645\u0632\u0627\u064A\u0627 \u0627\u0644\u0645\u062A\u0642\u062F\u0651\u0645\u0629",
"secDetail.No encryption key available": "\u0644\u0627 \u064A\u062A\u0648\u0641\u0651\u0631 \u0645\u0641\u062A\u0627\u062D \u062A\u0634\u0641\u064A\u0631",
"secDetail.AES-GCM encryption/decryption working correctly": "\u062A\u0634\u0641\u064A\u0631 \u0648\u0641\u0643\u0651 \u062A\u0634\u0641\u064A\u0631 AES-GCM \u064A\u0639\u0645\u0644\u0627\u0646 \u0628\u0634\u0643\u0644 \u0635\u062D\u064A\u062D",
"secDetail.No ECDH key pair available": "\u0644\u0627 \u064A\u062A\u0648\u0641\u0651\u0631 \u0632\u0648\u062C \u0645\u0641\u0627\u062A\u064A\u062D ECDH",
"secDetail.Key derivation failed": "\u0641\u0634\u0644 \u0627\u0634\u062A\u0642\u0627\u0642 \u0627\u0644\u0645\u0641\u062A\u0627\u062D",
"secDetail.No ECDSA key pair available": "\u0644\u0627 \u064A\u062A\u0648\u0641\u0651\u0631 \u0632\u0648\u062C \u0645\u0641\u0627\u062A\u064A\u062D ECDSA",
"secDetail.ECDSA digital signatures working correctly": "\u062A\u0648\u0627\u0642\u064A\u0639 ECDSA \u0627\u0644\u0631\u0642\u0645\u064A\u0629 \u062A\u0639\u0645\u0644 \u0628\u0634\u0643\u0644 \u0635\u062D\u064A\u062D",
"secDetail.MAC key not available or invalid": "\u0645\u0641\u062A\u0627\u062D MAC \u063A\u064A\u0631 \u0645\u062A\u0627\u062D \u0623\u0648 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D",
"secDetail.Rate limiter did not block a message over the limit": "\u0644\u0645 \u064A\u0645\u0646\u0639 \u0645\u062D\u062F\u0650\u0651\u062F \u0627\u0644\u0645\u0639\u062F\u0651\u0644 \u0631\u0633\u0627\u0644\u0629 \u062A\u062C\u0627\u0648\u0632\u062A \u0627\u0644\u062D\u062F\u0651",
"secDetail.Rate limiter is not available": "\u0645\u062D\u062F\u0650\u0651\u062F \u0627\u0644\u0645\u0639\u062F\u0651\u0644 \u063A\u064A\u0631 \u0645\u062A\u0627\u062D",
"secDetail.Replay protection is working correctly": "\u0627\u0644\u062D\u0645\u0627\u064A\u0629 \u0645\u0646 \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u062A\u0634\u063A\u064A\u0644 \u062A\u0639\u0645\u0644 \u0628\u0634\u0643\u0644 \u0635\u062D\u064A\u062D",
"secDetail.Replay protection not enabled": "\u0627\u0644\u062D\u0645\u0627\u064A\u0629 \u0645\u0646 \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u062A\u0634\u063A\u064A\u0644 \u063A\u064A\u0631 \u0645\u0641\u0639\u064E\u0651\u0644\u0629",
"secDetail.SAS code not available": "\u0631\u0645\u0632 SAS \u063A\u064A\u0631 \u0645\u062A\u0627\u062D",
"secDetail.SAS verification code is valid and available": "\u0631\u0645\u0632 \u062A\u062D\u0642\u0651\u0642 SAS \u0635\u0627\u0644\u062D \u0648\u0645\u062A\u0627\u062D",
"secDetail.Traffic obfuscation is working correctly": "\u062A\u0645\u0648\u064A\u0647 \u062D\u0631\u0643\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u064A\u0639\u0645\u0644 \u0628\u0634\u0643\u0644 \u0635\u062D\u064A\u062D",
"secDetail.Traffic obfuscation not enabled": "\u062A\u0645\u0648\u064A\u0647 \u062D\u0631\u0643\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u063A\u064A\u0631 \u0645\u0641\u0639\u064E\u0651\u0644",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "\u0644\u0627 \u064A\u0648\u062C\u062F \u0632\u0648\u062C \u0645\u0641\u0627\u062A\u064A\u062D ECDH \u0639\u0627\u0628\u0631 \u063A\u064A\u0631 \u0642\u0627\u0628\u0644 \u0644\u0644\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0644\u0647\u0630\u0647 \u0627\u0644\u062C\u0644\u0633\u0629",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "\u0633\u0631\u0651\u064A\u0629 \u0644\u0644\u0623\u0645\u0627\u0645 \u0639\u0644\u0649 \u0645\u0633\u062A\u0648\u0649 \u0627\u0644\u062C\u0644\u0633\u0629 \u0641\u0642\u0637: \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D \u0639\u0627\u0628\u0631\u0629 \u0644\u0643\u0644\u0651 \u062C\u0644\u0633\u0629\u060C \u0644\u0643\u0646\u0651 \u0627\u0644\u0633\u0642\u0651\u0627\u0637\u0629 \u0627\u0644\u0645\u0632\u062F\u0648\u062C\u0629 \u063A\u064A\u0631 \u0646\u0634\u0637\u0629 \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 (\u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0639\u0644\u0649 \u0625\u0635\u062F\u0627\u0631 \u0623\u0642\u062F\u0645)\u060C \u0641\u062A\u0633\u0631\u064A\u0628 \u0645\u0641\u062A\u0627\u062D \u062C\u0644\u0633\u0629 \u0648\u0627\u062D\u062F \u064A\u0643\u0634\u0641 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629 \u0643\u0644\u0651\u0647\u0627",
"msg.pause": "\u0625\u064A\u0642\u0627\u0641 \u0645\u0624\u0642\u0651\u062A",
"msg.failed": "\u0641\u0634\u0644\u062A",
"groupErr.timeout": "\u062A\u0648\u0642\u0651\u0641 \u0639\u0636\u0648 \u0639\u0646 \u0627\u0644\u0627\u0633\u062A\u062C\u0627\u0628\u0629 \u0642\u0628\u0644 \u0623\u0646 \u064A\u062C\u0647\u0632 \u0627\u0644\u0631\u0645\u0632.",
"groupErr.keyMismatch": "\u0644\u0645 \u064A\u0637\u0627\u0628\u0642 \u0645\u0641\u062A\u0627\u062D \u0623\u062D\u062F \u0627\u0644\u0623\u0639\u0636\u0627\u0621 \u0627\u0644\u0647\u0648\u064A\u0651\u0629 \u0627\u0644\u0645\u062F\u0651\u0639\u0627\u0629 \u0644\u0647.",
"groupErr.revealMismatch": "\u0644\u0645 \u062A\u0637\u0627\u0628\u0642 \u0627\u0644\u0642\u064A\u0645\u0629 \u0627\u0644\u062A\u064A \u0643\u0634\u0641\u0647\u0627 \u0623\u062D\u062F \u0627\u0644\u0623\u0639\u0636\u0627\u0621 \u0645\u0627 \u0627\u0644\u062A\u0632\u0645 \u0628\u0647.",
"groupErr.commitChanged": "\u063A\u064A\u0651\u0631 \u0623\u062D\u062F \u0627\u0644\u0623\u0639\u0636\u0627\u0621 \u0627\u0644\u062A\u0632\u0627\u0645\u0647 \u0641\u064A \u0645\u0646\u062A\u0635\u0641 \u0627\u0644\u0637\u0631\u064A\u0642.",
"groupErr.missingKey": "\u0623\u064F\u062F\u0631\u062C \u0639\u0636\u0648 \u0644\u0645 \u064A\u0635\u0644 \u0645\u0641\u062A\u0627\u062D\u0647 \u0642\u0637\u0651.",
"groupErr.outsider": "\u0648\u0635\u0644 \u0625\u0637\u0627\u0631 \u0645\u0646 \u0634\u062E\u0635 \u062E\u0627\u0631\u062C \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629.",
"groupErr.limit": "\u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0645\u062D\u062F\u0648\u062F\u0629 \u0628\u062B\u0645\u0627\u0646\u064A\u0629 \u0623\u0639\u0636\u0627\u0621.",
"groupErr.tooLarge": "\u0643\u0627\u0646\u062A \u0627\u0644\u0631\u0633\u0627\u0644\u0629 \u0623\u0643\u0628\u0631 \u0645\u0646 \u0623\u0646 \u062A\u064F\u0631\u0633\u064E\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629.",
"fileType.text": "\u0646\u0635\u0651 \u0639\u0627\u062F\u064A",
"fileType.images": "\u0635\u0648\u0631",
"fileType.archives": "\u0623\u0631\u0634\u064A\u0641\u0627\u062A",
"fileType.voice": "\u0631\u0633\u0627\u0626\u0644 \u0635\u0648\u062A\u064A\u0629",
"fileType.unsupported": "\u063A\u064A\u0631 \u0645\u062F\u0639\u0648\u0645",
"qrScan.title": "\u0627\u0645\u0633\u062D \u0631\u0645\u0632 QR",
"qrScan.auto": "\u0627\u0644\u0648\u0636\u0639 \u0627\u0644\u062A\u0644\u0642\u0627\u0626\u064A",
"qrScan.reset": "\u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646",
"qrScan.autoScroll": "\u0627\u0644\u062A\u0645\u0631\u064A\u0631 \u0627\u0644\u062A\u0644\u0642\u0627\u0626\u064A \u0645\u0641\u0639\u064E\u0651\u0644",
"qrScan.starting": "\u062C\u0627\u0631\u064D \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0643\u0627\u0645\u064A\u0631\u0627...",
"qrScan.point": "\u0648\u062C\u0651\u0647 \u0627\u0644\u0643\u0627\u0645\u064A\u0631\u0627 \u0625\u0644\u0649 \u0631\u0645\u0632 QR",
"qrScan.tapFocus": "\u0627\u0636\u063A\u0637 \u0627\u0644\u0634\u0627\u0634\u0629 \u0644\u0636\u0628\u0637 \u0627\u0644\u062A\u0631\u0643\u064A\u0632",
"qrScan.focusing": "\u062C\u0627\u0631\u064D \u0636\u0628\u0637 \u0627\u0644\u062A\u0631\u0643\u064A\u0632...",
"iceErr.notArray": "\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062E\u0648\u0627\u062F\u0645 \u0645\u0635\u0641\u0648\u0641\u0629",
"iceErr.invalidJson": "JSON \u063A\u064A\u0631 \u0635\u0627\u0644\u062D",
"iceErr.tooMany": "\u062E\u0648\u0627\u062F\u0645 \u0623\u0643\u062B\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645 (\u0627\u0644\u062D\u062F\u0651 \u0627\u0644\u0623\u0642\u0635\u0649 {max})",
"iceErr.invalidEntry": "{label}: \u0645\u064F\u062F\u062E\u064E\u0644 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D",
"iceErr.urlCount": "{label}: \u0645\u0637\u0644\u0648\u0628 \u0628\u064A\u0646 1 \u0648{max} \u0639\u0646\u0648\u0627\u0646",
"iceErr.turnCreds": "{label}: \u0639\u0627\u062F\u0629\u064B \u062A\u062A\u0637\u0644\u0651\u0628 \u062E\u0648\u0627\u062F\u0645 TURN \u0627\u0633\u0645 \u0645\u0633\u062A\u062E\u062F\u0645 \u0648\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0639\u062A\u0645\u0627\u062F",
"iceUrl.notString": "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u0646\u0635\u0651\u0627\u064B",
"iceUrl.empty": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u0641\u0627\u0631\u063A",
"iceUrl.tooLong": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u0637\u0648\u064A\u0644 \u062C\u062F\u0627\u064B",
"iceUrl.badChars": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0645\u062D\u0627\u0631\u0641 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D\u0629",
"iceUrl.badScheme": "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0628\u062F\u0623 \u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u0628\u0640 stun: \u0623\u0648 stuns: \u0623\u0648 turn: \u0623\u0648 turns:",
"iceUrl.badQuery": "\u0627\u0633\u062A\u0639\u0644\u0627\u0645 \u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D",
"iceUrl.noHost": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u064A\u0646\u0642\u0635\u0647 \u0627\u0644\u0645\u0636\u064A\u0641",
"iceUrl.badHost": "\u0645\u0636\u064A\u0641 \u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u0623\u0648 \u0645\u0646\u0641\u0630\u0647 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D",
"iceUrl.badTransport": "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0627\u0633\u062A\u0639\u0644\u0627\u0645 \u0627\u0644\u0639\u0646\u0648\u0627\u0646 transport=udp \u0623\u0648 transport=tcp",
"msg.off": "\u0645\u064F\u0637\u0641\u0623",
"file.consentUnavailable": "\u0645\u0648\u0627\u0641\u0642\u0629 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \u063A\u064A\u0631 \u0645\u062A\u0627\u062D\u0629",
"secLevel.MAXIMUM": "\u0627\u0644\u0623\u0642\u0635\u0649",
"secLevel.INITIALIZING": "\u0642\u064A\u062F \u0627\u0644\u062A\u0647\u064A\u0626\u0629",
"secLevel.ERROR": "\u062E\u0637\u0623",
"secLevel.UNKNOWN": "\u063A\u064A\u0631 \u0645\u0639\u0631\u0648\u0641",
"status.error": "\u062E\u0637\u0623",
"offline.disconnect": "\u0642\u0637\u0639 \u0627\u0644\u0627\u062A\u0635\u0627\u0644",
"offline.learnMore": "\u0627\u0639\u0631\u0641 \u0627\u0644\u0645\u0632\u064A\u062F",
"pwa.installApp": "\u062B\u0628\u0651\u062A \u0627\u0644\u062A\u0637\u0628\u064A\u0642",
"chat.onWeb": "\u0623\u0646\u062A \u0639\u0644\u0649 \u0627\u0644\u0648\u064A\u0628",
"groupCall.startVoice": "\u0628\u062F\u0621 \u0645\u0643\u0627\u0644\u0645\u0629 \u0635\u0648\u062A\u064A\u0629 \u062C\u0645\u0627\u0639\u064A\u0629",
"groupCall.startVideo": "\u0628\u062F\u0621 \u0645\u0643\u0627\u0644\u0645\u0629 \u0641\u064A\u062F\u064A\u0648 \u062C\u0645\u0627\u0639\u064A\u0629",
"groupCall.join": "\u0627\u0646\u0636\u0645\u0627\u0645",
"groupCall.dismiss": "\u0644\u064A\u0633 \u0627\u0644\u0622\u0646",
"groupCall.leave": "\u0645\u063A\u0627\u062F\u0631\u0629 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629",
"groupCall.you": "\u0623\u0646\u062A",
"groupCall.connecting": "\u062C\u0627\u0631\u064D \u0627\u0644\u0627\u062A\u0635\u0627\u0644\u2026",
"groupCall.waitingLink": "\u0641\u064A \u0627\u0646\u062A\u0638\u0627\u0631 \u0631\u0627\u0628\u0637 \u0645\u0628\u0627\u0634\u0631\u2026",
"groupCall.legFailed": "\u062A\u0639\u0630\u0651\u0631 \u0627\u0644\u0627\u062A\u0635\u0627\u0644",
"groupCall.startedVoice": "\u0628\u062F\u0623 {name} \u0645\u0643\u0627\u0644\u0645\u0629 \u0635\u0648\u062A\u064A\u0629",
"groupCall.startedVideo": "\u0628\u062F\u0623 {name} \u0645\u0643\u0627\u0644\u0645\u0629 \u0641\u064A\u062F\u064A\u0648",
"groupCall.inCall": "{count} \u0641\u064A \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629",
"groupCall.err.permission_denied": "\u062A\u0639\u0630\u0651\u0631 \u0628\u062F\u0621 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629 - \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u064A\u0643\u0631\u0648\u0641\u0648\u0646 \u0648\u0627\u0644\u0643\u0627\u0645\u064A\u0631\u0627 \u0645\u062D\u0638\u0648\u0631. \u0627\u0633\u0645\u062D \u0628\u0647 \u0644\u0647\u0630\u0627 \u0627\u0644\u0645\u0648\u0642\u0639 \u062B\u0645 \u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629.",
"groupCall.err.device_not_found": "\u062A\u0639\u0630\u0651\u0631 \u0628\u062F\u0621 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629 - \u0644\u0645 \u064A\u064F\u0639\u062B\u0631 \u0639\u0644\u0649 \u0645\u064A\u0643\u0631\u0648\u0641\u0648\u0646 \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632.",
"groupCall.err.device_busy": "\u062A\u0639\u0630\u0651\u0631 \u0628\u062F\u0621 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629 - \u0627\u0644\u0645\u064A\u0643\u0631\u0648\u0641\u0648\u0646 \u0645\u0633\u062A\u062E\u062F\u064E\u0645 \u0645\u0646 \u062A\u0637\u0628\u064A\u0642 \u0622\u062E\u0631. \u0623\u063A\u0644\u0642\u0647 \u062B\u0645 \u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629.",
"groupCall.err.media_failed": "\u062A\u0639\u0630\u0651\u0631 \u0628\u062F\u0621 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629 - \u0644\u0645 \u064A\u0645\u0643\u0646 \u0641\u062A\u062D \u0627\u0644\u0645\u064A\u0643\u0631\u0648\u0641\u0648\u0646.",
"groupCall.err.call_in_progress": "\u0647\u0646\u0627\u0643 \u0645\u0643\u0627\u0644\u0645\u0629 \u062C\u0627\u0631\u064A\u0629 \u0628\u0627\u0644\u0641\u0639\u0644 \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629. \u0627\u0646\u0636\u0645 \u0625\u0644\u064A\u0647\u0627 \u0628\u062F\u0644 \u0628\u062F\u0621 \u0623\u062E\u0631\u0649.",
"groupCall.err.not_ready": "\u0623\u0643\u0651\u062F \u0631\u0645\u0632 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0642\u0628\u0644 \u0627\u0644\u0627\u062A\u0635\u0627\u0644.",
"groupCall.speaking": "{name} \u064A\u062A\u062D\u062F\u0651\u062B \u0627\u0644\u0622\u0646",
"groupCall.pin": "\u0639\u0631\u0636 {name} \u0628\u062D\u062C\u0645 \u0643\u0628\u064A\u0631",
"groupCall.unpin": "\u0627\u0644\u0639\u0648\u062F\u0629 \u0625\u0644\u0649 \u0627\u0644\u062C\u0645\u064A\u0639",
"groupCall.showEveryone": "\u0627\u0644\u062C\u0645\u064A\u0639",
"msg.after5s": "\u0665 \u062B\u0648\u0627\u0646\u064D \u0628\u0639\u062F \u0627\u0644\u0642\u0631\u0627\u0621\u0629",
"msg.after15s": "\u0661\u0665 \u062B\u0627\u0646\u064A\u0629 \u0628\u0639\u062F \u0627\u0644\u0642\u0631\u0627\u0621\u0629",
"msg.after30s": "\u0663\u0660 \u062B\u0627\u0646\u064A\u0629 \u0628\u0639\u062F \u0627\u0644\u0642\u0631\u0627\u0621\u0629",
"msg.after1m": "\u062F\u0642\u064A\u0642\u0629 \u0648\u0627\u062D\u062F\u0629 \u0628\u0639\u062F \u0627\u0644\u0642\u0631\u0627\u0621\u0629",
"msg.sec30": "\u0663\u0660 \u062B\u0627\u0646\u064A\u0629",
"msg.min5": "\u0665 \u062F\u0642\u0627\u0626\u0642",
"msg.hour1": "\u0633\u0627\u0639\u0629 \u0648\u0627\u062D\u062F\u0629",
"desktop.shareDesc": "\u0623\u0631\u0633\u0644 \u0627\u0644\u0631\u0645\u0632 \u0625\u0644\u0649 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631. \u064A\u064F\u0633\u062A\u062E\u062F\u0645 \u0645\u0631\u0629 \u0648\u0627\u062D\u062F\u0629 \u0648\u064A\u0646\u062A\u0647\u064A \u0633\u0631\u064A\u0639\u064B\u0627.",
"desktop.invitationCreated": "\u0623\u064F\u0646\u0634\u0626\u062A \u0627\u0644\u062F\u0639\u0648\u0629 \u0627\u0644\u0622\u0645\u0646\u0629 - \u0623\u0631\u0633\u0644\u0647\u0627 \u0625\u0644\u0649 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631.",
"desktop.joinDesc": "\u0627\u0644\u0635\u0642 \u0631\u0645\u0632 \u062F\u0639\u0648\u0629 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0644\u0628\u0646\u0627\u0621 \u0631\u062F\u0643 \u0627\u0644\u0622\u0645\u0646.",
"desktop.offerTag": "\u062F\u0639\u0648\u0629 \xB7 \u0646\u0633\u062E \u0627\u0644\u0646\u0635",
"desktop.answerTag": "\u0631\u062F \xB7 \u0646\u0633\u062E \u0627\u0644\u0646\u0635",
"desktop.offerPlaceholder": "\u0633\u064A\u0638\u0647\u0631 \u0631\u0645\u0632 \u0627\u0644\u062F\u0639\u0648\u0629 \u0647\u0646\u0627\u2026",
"desktop.answerPlaceholder": "\u0633\u064A\u0638\u0647\u0631 \u0631\u0645\u0632 \u0627\u0644\u0631\u062F \u0647\u0646\u0627\u2026",
"desktop.backToChats": "\u0627\u0644\u0639\u0648\u062F\u0629 \u0625\u0644\u0649 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0627\u062A",
"desktop.sendFeedback": "\u0625\u0631\u0633\u0627\u0644 \u0645\u0644\u0627\u062D\u0638\u0627\u062A",
"desktop.callsNeedVerified": "\u062A\u062A\u0637\u0644\u0628 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0627\u062A \u0642\u0646\u0627\u0629 \u0622\u0645\u0646\u0629 \u0645\u064F\u062A\u062D\u0642\u064E\u0651\u0642\u064B\u0627 \u0645\u0646\u0647\u0627.",
"desktop.noOpenChannel": "\u0644\u0627 \u062A\u0648\u062C\u062F \u0642\u0646\u0627\u0629 \u0622\u0645\u0646\u0629 \u0645\u0641\u062A\u0648\u062D\u0629.",
"desktop.chatCarriesCall": "\u062A\u062D\u0645\u0644 \u0647\u0630\u0647 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629 \u0645\u0643\u0627\u0644\u0645\u0629 \u062C\u0645\u0627\u0639\u064A\u0629. \u063A\u0627\u062F\u0631 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629 \u0627\u0644\u062C\u0645\u0627\u0639\u064A\u0629 \u0642\u0628\u0644 \u0625\u062C\u0631\u0627\u0621 \u0645\u0643\u0627\u0644\u0645\u0629 \u0641\u0631\u062F\u064A\u0629.",
"desktop.err.permission_denied": "\u062A\u0639\u0630\u0651\u0631 \u0628\u062F\u0621 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629 - \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u064A\u0643\u0631\u0648\u0641\u0648\u0646 \u0648\u0627\u0644\u0643\u0627\u0645\u064A\u0631\u0627 \u0645\u062D\u0638\u0648\u0631. \u0627\u0633\u0645\u062D \u0628\u0647 \u0641\u064A \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u0646\u0638\u0627\u0645 \u062B\u0645 \u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629.",
"desktop.language": "\u0627\u0644\u0644\u063A\u0629",
"desktop.languageHint": "\u064A\u064F\u0637\u0628\u064E\u0651\u0642 \u0641\u0648\u0631\u064B\u0627. \u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0627\u0644\u0645\u064F\u0631\u0633\u0644\u0629 \u062A\u0628\u0642\u0649 \u0628\u0627\u0644\u0643\u0644\u0645\u0627\u062A \u0627\u0644\u062A\u064A \u0643\u064F\u062A\u0628\u062A \u0628\u0647\u0627.",
"desktop.compareCode": "\u0642\u0627\u0631\u0646 \u0631\u0645\u0632 \u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0639 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0648\u0623\u0643\u0650\u0651\u062F\u0647 \u0625\u0630\u0627 \u062A\u0637\u0627\u0628\u0642.",
"desktop.verifyBeforeFiles": "\u0623\u0643\u0645\u0644 \u0627\u0644\u062A\u062D\u0642\u0642 \u0642\u0628\u0644 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0645\u0644\u0641\u0627\u062A.",
"desktop.verifyBeforeSending": "\u0623\u0643\u0645\u0644 \u0627\u0644\u062A\u062D\u0642\u0642 \u0642\u0628\u0644 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0631\u0633\u0627\u0626\u0644.",
"desktop.disconnectedByBackend": "\u0623\u064F\u063A\u0644\u0642 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0628\u0623\u0645\u0627\u0646.",
"desktop.restoreFailed": "\u062A\u0639\u0630\u0651\u0631\u062A \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644. \u0633\u064A\u062A\u0645 \u0625\u063A\u0644\u0627\u0642 \u0647\u0630\u0647 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629.",
"desktop.channelNotReady": "\u0642\u0646\u0627\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u063A\u064A\u0631 \u0645\u062A\u0627\u062D\u0629 \u0628\u0639\u062F. \u0627\u0646\u062A\u0638\u0631 \u062D\u062A\u0649 \u064A\u064F\u0646\u0634\u0623 \u0627\u0644\u0627\u062A\u0635\u0627\u0644.",
"desktop.enterCode": "\u0623\u062F\u062E\u0644 \u0631\u0645\u0632 \u0627\u0644\u062A\u062D\u0642\u0642 \u0644\u0644\u062A\u0623\u0643\u064A\u062F.",
"desktop.noOffer": "\u0644\u0645 \u064A\u064F\u0639\u062B\u0631 \u0639\u0644\u0649 \u062F\u0639\u0648\u0629. \u0623\u0646\u0634\u0626 \u0648\u0627\u062D\u062F\u0629 \u0623\u0648\u0644\u064B\u0627.",
"desktop.notInitiator": "\u0644\u0645 \u062A\u064F\u0646\u0634\u0626 \u0647\u0630\u0627 \u0627\u0644\u0627\u062A\u0635\u0627\u0644\u060C \u0641\u0644\u0627 \u064A\u0648\u062C\u062F \u0631\u062F \u0644\u062A\u0637\u0628\u064A\u0642\u0647.",
"desktop.decryptFailed": "\u062A\u0639\u0630\u0651\u0631 \u0641\u0643 \u062A\u0634\u0641\u064A\u0631 \u0631\u0633\u0627\u0644\u0629\u060C \u0648\u0642\u062F \u0623\u064F\u0647\u0645\u0644\u062A.",
"desktop.badMessageFormat": "\u0648\u0635\u0644 \u0625\u0637\u0627\u0631 \u0645\u064F\u0634\u0648\u064E\u0651\u0647 \u0648\u0623\u064F\u0647\u0645\u0644.",
"desktop.notSentNotReady": "\u0644\u0645 \u062A\u064F\u0631\u0633\u0644 \u0627\u0644\u0631\u0633\u0627\u0644\u0629: \u0627\u0644\u0642\u0646\u0627\u0629 \u0627\u0644\u0622\u0645\u0646\u0629 \u063A\u064A\u0631 \u062C\u0627\u0647\u0632\u0629. \u0627\u0646\u062A\u0638\u0631 \u0627\u0646\u062A\u0647\u0627\u0621 \u0627\u0644\u062A\u062D\u0642\u0642 \u0623\u0648 \u0623\u0639\u062F \u0627\u0644\u0627\u062A\u0635\u0627\u0644.",
"desktop.micDenied": "\u0631\u064F\u0641\u0636 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u064A\u0643\u0631\u0648\u0641\u0648\u0646.",
"desktop.noChannelWait": "\u0644\u0627 \u062A\u0648\u062C\u062F \u0642\u0646\u0627\u0629 \u0622\u0645\u0646\u0629 \u0645\u0641\u062A\u0648\u062D\u0629 - \u0627\u0646\u062A\u0638\u0631 \u062D\u062A\u0649 \u064A\u064F\u0646\u0634\u0623 \u0627\u0644\u0627\u062A\u0635\u0627\u0644.",
"desktop.sasFailed": "\u0641\u0634\u0644 \u0627\u0644\u062A\u062D\u0642\u0642. \u0642\u062F \u064A\u0648\u062C\u062F \u0648\u0633\u064A\u0637\u060C \u0644\u0630\u0644\u0643 \u0623\u064F\u0644\u063A\u064A \u0627\u0644\u0627\u062A\u0635\u0627\u0644.",
"desktop.sasOk": "\u0646\u062C\u062D \u0627\u0644\u062A\u062D\u0642\u0642. \u0647\u0630\u0647 \u0627\u0644\u0642\u0646\u0627\u0629 \u0645\u0648\u062B\u064E\u0651\u0642\u0629 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641.",
"desktop.iceForgotten": "\u0646\u064F\u0633\u064A\u062A \u0627\u0644\u062E\u0648\u0627\u062F\u0645 \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629. \u062A\u064F\u0633\u062A\u062E\u062F\u0645 \u062E\u0648\u0627\u062F\u0645 ICE \u0627\u0644\u0639\u0627\u0645\u0629.",
"desktop.icePublic": "\u062A\u064F\u0633\u062A\u062E\u062F\u0645 \u062E\u0648\u0627\u062F\u0645 ICE \u0627\u0644\u0639\u0627\u0645\u0629.",
"desktop.verificationInProgress": "\u0645\u0627 \u0632\u0627\u0644 \u0627\u0644\u062A\u062D\u0642\u0642 \u0627\u0644\u0623\u0645\u0646\u064A \u062C\u0627\u0631\u064A\u064B\u0627. \u0627\u0646\u062A\u0638\u0631 \u062D\u062A\u0649 \u064A\u0646\u062A\u0647\u064A.",
"desktop.fileGone": "\u0644\u0645 \u064A\u0639\u062F \u0647\u0630\u0627 \u0627\u0644\u0645\u0644\u0641 \u0645\u062A\u0627\u062D\u064B\u0627 \u0644\u0644\u062A\u0646\u0632\u064A\u0644.",
"desktop.codeMismatch": "\u0631\u0645\u0648\u0632 \u0627\u0644\u062A\u062D\u0642\u0642 \u063A\u064A\u0631 \u0645\u062A\u0637\u0627\u0628\u0642\u0629. \u064A\u062C\u0631\u064A \u0642\u0637\u0639 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u062D\u0641\u0627\u0638\u064B\u0627 \u0639\u0644\u0649 \u0627\u0644\u0623\u0645\u0627\u0646.",
"desktop.noLocalCode": "\u0641\u0634\u0644 \u0627\u0644\u062A\u062D\u0642\u0642: \u0644\u0627 \u064A\u0648\u062C\u062F \u0631\u0645\u0632 \u0645\u0634\u062A\u0642 \u0645\u062D\u0644\u064A\u064B\u0627 \u0644\u0644\u0645\u0642\u0627\u0631\u0646\u0629. \u064A\u062C\u0631\u064A \u0642\u0637\u0639 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u062D\u0641\u0627\u0638\u064B\u0627 \u0639\u0644\u0649 \u0627\u0644\u0623\u0645\u0627\u0646.",
"desktop.protocolViolation": "\u0627\u062F\u0651\u0639\u0649 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u062A\u0623\u0643\u064A\u062F \u0627\u0644\u0631\u0645\u0632 \u0642\u0628\u0644 \u0623\u0646 \u062A\u0624\u0643\u0651\u062F\u0647 \u0623\u0646\u062A. \u064A\u062C\u0631\u064A \u0642\u0637\u0639 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u062D\u0641\u0627\u0638\u064B\u0627 \u0639\u0644\u0649 \u0627\u0644\u0623\u0645\u0627\u0646.",
"desktop.verificationRejected": "\u0631\u064F\u0641\u0636 \u0627\u0644\u062A\u062D\u0642\u0642. \u0623\u064F\u0644\u063A\u064A \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u062D\u0641\u0627\u0638\u064B\u0627 \u0639\u0644\u0649 \u0627\u0644\u0623\u0645\u0627\u0646.",
"secLevel.HIGH": "\u0639\u0627\u0644\u064D",
"secLevel.MEDIUM": "\u0645\u062A\u0648\u0633\u0637",
"secLevel.LOW": "\u0645\u0646\u062E\u0641\u0636",
"desktop.rerun": "\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0641\u062D\u0635",
"desktop.ice.customDesc": "\u062D\u062A\u0649 {max} \u062E\u0627\u062F\u0645\u064B\u0627\u060C \u0631\u0627\u0628\u0637 \u0648\u0627\u062D\u062F \u0644\u0643\u0644 \u0633\u0637\u0631 \u0623\u0648 \u0628\u0635\u064A\u063A\u0629 JSON.",
"desktop.ice.persistDesc": "\u064A\u064F\u062D\u0641\u0638 \u0645\u062D\u0644\u064A\u064B\u0627 \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632. \u0627\u062A\u0631\u0643\u0647 \u0645\u0637\u0641\u0623\u064B \u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645\u0647 \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u062C\u0644\u0633\u0629 \u0641\u0642\u0637.",
"desktop.group.leaveNote": "\u064A\u064F\u0628\u0644\u064E\u0651\u063A \u0628\u0642\u064A\u0629 \u0627\u0644\u0623\u0639\u0636\u0627\u0621 \u0628\u0623\u0646\u0643 \u063A\u0627\u062F\u0631\u062A. \u0628\u0639\u062F \u0630\u0644\u0643 \u0644\u0627 \u064A\u0628\u0642\u0649 \u0634\u064A\u0621 \u0645\u0646 \u0647\u0630\u0647 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632 - \u0644\u0627 \u064A\u0648\u062C\u062F \u062E\u0627\u062F\u0645 \u064A\u062D\u062A\u0641\u0638 \u0628\u0646\u0633\u062E\u0629 \u0644\u0644\u0639\u0648\u062F\u0629 \u0645\u0646\u0647\u0627\u060C \u0644\u0630\u0627 \u0633\u062A\u062D\u062A\u0627\u062C \u0625\u0644\u0649 \u062F\u0639\u0648\u0629 \u062C\u062F\u064A\u062F\u0629.",
"desktop.sec.ecdsaOk": "\u062A\u0645 \u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u062A\u0648\u0642\u064A\u0639 \u062D\u0632\u0645\u0629 \u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0645\u0635\u0627\u0641\u062D\u0629 (ECDSA P-384 / SHA-384)",
"desktop.sec.ecdsaNone": "\u0644\u0627 \u062A\u0648\u062C\u062F \u0645\u0635\u0627\u0641\u062D\u0629 \u0645\u0643\u062A\u0645\u0644\u0629",
"desktop.sec.ecdhOk": "\u0627\u0634\u062A\u064F\u0642\u0651\u062A \u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u062C\u0644\u0633\u0629 \u0645\u0646 \u062A\u0628\u0627\u062F\u0644 ECDH P-384 \u0639\u0627\u0628\u0631 \u0639\u0628\u0631 HKDF-SHA-256",
"desktop.sec.ecdhNone": "\u0644\u0645 \u062A\u064F\u0634\u062A\u0642 \u0645\u0641\u0627\u062A\u064A\u062D \u062C\u0644\u0633\u0629",
"desktop.sec.encryptionOk": "\u062A\u0645 \u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u062A\u0634\u0641\u064A\u0631 \u0648\u0641\u0643 \u0627\u0644\u062A\u0634\u0641\u064A\u0631 AES-GCM \u062F\u0627\u062E\u0644 \u0627\u0644\u0646\u0648\u0627\u0629",
"desktop.sec.encryptionNa": "\u062A\u0639\u0630\u0651\u0631 \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0630\u0627\u062A\u064A \u0644\u0640 AES-GCM",
"desktop.sec.integrityOk": "\u062A\u0645 \u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u0633\u0644\u0627\u0645\u0629 \u0627\u0644\u0631\u0633\u0627\u0626\u0644 (\u062A\u0648\u062B\u064A\u0642 AES-GCM)",
"desktop.sec.integrityNa": "\u062A\u0639\u0630\u0651\u0631 \u062A\u0634\u063A\u064A\u0644 \u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0633\u0644\u0627\u0645\u0629 \u0627\u0644\u0630\u0627\u062A\u064A",
"desktop.sec.pfsOk": "Double Ratchet \u0646\u0634\u0637 - \u0644\u0643\u0644 \u0631\u0633\u0627\u0644\u0629 \u0645\u0641\u062A\u0627\u062D\u0647\u0627 \u0627\u0644\u062E\u0627\u0635",
"desktop.sec.pfsNa": "\u0644\u0645 \u064A\u064F\u0642\u064E\u0633",
"desktop.sec.replayOk": "\u062A\u064F\u062A\u0644\u064E\u0641 \u0645\u0641\u0627\u062A\u064A\u062D \u0631\u0633\u0627\u0626\u0644 \u0627\u0644\u0631\u0627\u062A\u0634\u064A\u062A \u0641\u0648\u0631 \u0627\u0633\u062A\u062E\u062F\u0627\u0645\u0647\u0627\u060C \u0641\u0644\u0627 \u064A\u0645\u0643\u0646 \u0625\u0639\u0627\u062F\u0629 \u062A\u0634\u063A\u064A\u0644 \u0625\u0637\u0627\u0631 \u0645\u064F\u0644\u062A\u0642\u064E\u0637",
"desktop.sec.replayNa": "\u0644\u0645 \u064A\u064F\u0642\u064E\u0633",
"desktop.sec.dtlsPinned": "\u062A\u0645 \u062A\u062B\u0628\u064A\u062A \u0628\u0635\u0645\u0629 DTLS \u0644\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631: {fp}",
"desktop.sec.dtlsNone": "\u0644\u0627 \u062A\u062A\u0648\u0641\u0631 \u0628\u0635\u0645\u0629 DTLS \u0644\u0644\u0637\u0631\u0641 \u0627\u0644\u0628\u0639\u064A\u062F",
"desktop.sec.sasBoth": "\u0623\u0643\u0651\u062F \u0627\u0644\u0637\u0631\u0641\u0627\u0646 \u0631\u0645\u0632 \u0627\u0644\u0623\u0645\u0627\u0646 \u062E\u0627\u0631\u062C \u0627\u0644\u0642\u0646\u0627\u0629",
"desktop.sec.sasIncomplete": "\u0644\u0645 \u064A\u0624\u0643\u0651\u062F \u0627\u0644\u0637\u0631\u0641\u0627\u0646 \u0631\u0645\u0632 \u0627\u0644\u0623\u0645\u0627\u0646",
"desktop.sec.metadataOk": "\u0627\u0634\u062A\u064F\u0642\u0651 \u0645\u0641\u062A\u0627\u062D \u0645\u062E\u0635\u0635 \u0644\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629 (HKDF metadata-protection-v4)",
"desktop.sec.metadataNone": "\u0644\u0627 \u064A\u0648\u062C\u062F \u0645\u0641\u062A\u0627\u062D \u0644\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629",
"desktop.sec.coverOn": "\u062D\u0631\u0643\u0629 \u0627\u0644\u062A\u0645\u0648\u064A\u0647 \u0646\u0634\u0637\u0629: \u0625\u0637\u0627\u0631\u0627\u062A \u0648\u0647\u0645\u064A\u0629 \u0639\u0634\u0648\u0627\u0626\u064A\u0629 (32-128 \u0628\u0627\u064A\u062A \u0643\u0644 15-30 \u062B\u0627\u0646\u064A\u0629) \u0639\u0644\u0649 \u0642\u0646\u0627\u0629 \u0627\u0644\u0631\u0627\u062A\u0634\u064A\u062A",
"desktop.sec.coverOff": "\u0645\u0648\u0644\u0651\u062F \u062D\u0631\u0643\u0629 \u0627\u0644\u062A\u0645\u0648\u064A\u0647 \u0644\u0627 \u064A\u0639\u0645\u0644",
"desktop.sec.coverUnsupported": "\u062A\u062D\u062A\u0627\u062C \u062D\u0631\u0643\u0629 \u0627\u0644\u062A\u0645\u0648\u064A\u0647 \u0625\u0644\u0649 \u062C\u0644\u0633\u0629 Double Ratchet (\u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0639\u0644\u0649 \u0625\u0635\u062F\u0627\u0631 \u0623\u0642\u062F\u0645)",
"desktop.tagline": "\u062D\u0631\u064A\u0629 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641"
},
"he": {
"language.label": "\u05E9\u05E4\u05D4",
"language.suggest.text": "\u05D4\u05D3\u05E3 \u05D4\u05D6\u05D4 \u05D6\u05DE\u05D9\u05DF \u05D2\u05DD \u05D1\u05E2\u05D1\u05E8\u05D9\u05EA.",
"language.suggest.cta": "\u05DC\u05E7\u05E8\u05D9\u05D0\u05D4 \u05D1\u05E2\u05D1\u05E8\u05D9\u05EA",
"language.suggest.dismiss": "\u05E1\u05D2\u05D9\u05E8\u05D4",
"community.title": "\u05D4\u05E6\u05D8\u05E8\u05E4\u05D5 \u05DC\u05E2\u05EA\u05D9\u05D3 \u05E9\u05DC \u05D4\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA",
"community.description": "SecureBit \u05D2\u05D3\u05DC \u05D1\u05D6\u05DB\u05D5\u05EA \u05D4\u05E7\u05D4\u05D9\u05DC\u05D4 \u05E9\u05DC\u05D5. \u05D4\u05E8\u05E2\u05D9\u05D5\u05E0\u05D5\u05EA \u05D5\u05D4\u05DE\u05E9\u05D5\u05D1 \u05E9\u05DC\u05DB\u05DD \u05DE\u05E2\u05E6\u05D1\u05D9\u05DD \u05D0\u05EA \u05E2\u05EA\u05D9\u05D3 \u05D4\u05EA\u05E7\u05E9\u05D5\u05E8\u05EA \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u05EA - \u05E0\u05D1\u05E0\u05D4 \u05D1\u05D2\u05DC\u05D5\u05D9, \u05E2\u05DD \u05D0\u05D9\u05DE\u05D5\u05EA ASN.1 \u05DE\u05DC\u05D0 \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4.",
"community.github": "\u05DE\u05D0\u05D2\u05E8 GitHub",
"community.feedback": "\u05DE\u05E9\u05D5\u05D1",
"unique.eyebrow": "\u05DE\u05D4 \u05DE\u05D9\u05D9\u05D7\u05D3 \u05D0\u05D5\u05EA\u05E0\u05D5",
"unique.heading": "\u05DC\u05DE\u05D4 SecureBit \u05D9\u05D9\u05D7\u05D5\u05D3\u05D9",
"unique.s1.titleTop": "\u05DC\u05D9\u05D1\u05EA \u05D4\u05E6\u05E4\u05E0\u05D4",
"unique.s1.titleBottom": "\u05E8\u05D1\u05BE\u05E9\u05DB\u05D1\u05EA\u05D9\u05EA",
"unique.s1.collapsed": "\u05DC\u05D9\u05D1\u05EA \u05D4\u05D4\u05E6\u05E4\u05E0\u05D4",
"unique.s1.desc": "\u05D7\u05D9\u05DC\u05D5\u05E4\u05D9 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA ECDH P-384, \u05DE\u05D8\u05E2\u05E0\u05D9\u05DD \u05D1-AES-256-GCM, \u05D7\u05EA\u05D9\u05DE\u05D5\u05EA ECDSA \u05D5\u05D0\u05D9\u05DE\u05D5\u05EA ASN.1 \u05DE\u05DC\u05D0 - \u05DE\u05D5\u05E8\u05DB\u05D1\u05D9\u05DD \u05DC\u05E6\u05D9\u05E0\u05D5\u05E8 \u05DE\u05D5\u05E7\u05E9\u05D7 \u05D0\u05D7\u05D3.",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "\u05E2\u05DE\u05D9\u05EA\u05BE\u05DC\u05E2\u05DE\u05D9\u05EA",
"unique.s2.titleBottom": "\u05D8\u05D4\u05D5\u05E8 \u05D1-WebRTC",
"unique.s2.collapsed": "WebRTC \u05E2\u05DE\u05D9\u05EA\u05BE\u05DC\u05E2\u05DE\u05D9\u05EA \u05D8\u05D4\u05D5\u05E8",
"unique.s2.desc": "\u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E2\u05D5\u05D1\u05E8\u05D5\u05EA \u05D9\u05E9\u05D9\u05E8\u05D5\u05EA \u05D1\u05D9\u05DF \u05D4\u05DE\u05DB\u05E9\u05D9\u05E8\u05D9\u05DD \u05D3\u05E8\u05DA WebRTC. \u05D0\u05E3 \u05DE\u05DE\u05E1\u05E8 \u05DC\u05D0 \u05DE\u05D7\u05D6\u05D9\u05E7 \u05D0\u05EA \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05DC\u05DB\u05DD - \u05D4\u05E9\u05E8\u05EA \u05E8\u05E7 \u05E2\u05D5\u05D6\u05E8 \u05DC\u05E9\u05E0\u05D9 \u05E2\u05DE\u05D9\u05EA\u05D9\u05DD \u05DC\u05DE\u05E6\u05D5\u05D0 \u05D6\u05D4 \u05D0\u05EA \u05D6\u05D4.",
"unique.s2.tags": [
"DTLS 1.3",
"\u05D1\u05DC\u05D9 \u05DE\u05DE\u05E1\u05E8"
],
"unique.s3.titleTop": "\u05E1\u05D5\u05D3\u05D9\u05D5\u05EA \u05E7\u05D3\u05D9\u05DE\u05D4",
"unique.s3.titleBottom": "\u05DE\u05D5\u05E9\u05DC\u05DE\u05EA",
"unique.s3.collapsed": "\u05E1\u05D5\u05D3\u05D9\u05D5\u05EA \u05E7\u05D3\u05D9\u05DE\u05D4",
"unique.s3.desc": "\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D4\u05E4\u05E2\u05DC\u05D4 \u05DE\u05EA\u05D7\u05DC\u05E4\u05D9\u05DD \u05D1\u05E8\u05E6\u05D9\u05E4\u05D5\u05EA \u05D5\u05E0\u05DE\u05D7\u05E7\u05D9\u05DD \u05DC\u05D0\u05D7\u05E8 \u05D4\u05E9\u05D9\u05DE\u05D5\u05E9, \u05DB\u05DA \u05E9\u05DE\u05E4\u05EA\u05D7 \u05D0\u05D7\u05D3 \u05E9\u05E0\u05D7\u05E9\u05E3 \u05DC\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05D9\u05E4\u05EA\u05D7 \u05E9\u05D9\u05D7\u05D5\u05EA \u05DE\u05D4\u05E2\u05D1\u05E8.",
"unique.s3.tags": [
"\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D6\u05DE\u05E0\u05D9\u05D9\u05DD",
"\u05D4\u05D7\u05DC\u05E4\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA"
],
"unique.s4.titleTop": "\u05E2\u05E8\u05E4\u05D5\u05DC",
"unique.s4.titleBottom": "\u05EA\u05E2\u05D1\u05D5\u05E8\u05D4",
"unique.s4.collapsed": "\u05E2\u05E8\u05E4\u05D5\u05DC \u05EA\u05E2\u05D1\u05D5\u05E8\u05D4",
"unique.s4.desc": "\u05D2\u05D3\u05DC\u05D9 \u05D4\u05DE\u05E0\u05D5\u05EA \u05D5\u05D4\u05EA\u05D6\u05DE\u05D5\u05E0\u05D9\u05DD \u05DE\u05E8\u05D5\u05E4\u05D3\u05D9\u05DD \u05D5\u05DE\u05E2\u05D5\u05E8\u05D1\u05DC\u05D9\u05DD, \u05D5\u05DE\u05E1\u05EA\u05D9\u05E8\u05D9\u05DD \u05D3\u05E4\u05D5\u05E1\u05D9 \u05DE\u05D8\u05D0\u05BE\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DE\u05DB\u05DC \u05DE\u05D9 \u05E9\u05DE\u05D0\u05D6\u05D9\u05DF \u05DC\u05E7\u05D5.",
"unique.s4.tags": [
"\u05E8\u05D9\u05E4\u05D5\u05D3 \u05DE\u05E0\u05D5\u05EA",
"\u05E8\u05E2\u05E9 \u05D1\u05EA\u05D6\u05DE\u05D5\u05DF"
],
"unique.s5.titleTop": "\u05D0\u05E4\u05E1",
"unique.s5.titleBottom": "\u05D0\u05D9\u05E1\u05D5\u05E3 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD",
"unique.s5.collapsed": "\u05D0\u05E4\u05E1 \u05D0\u05D9\u05E1\u05D5\u05E3 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD",
"unique.s5.desc": "\u05D1\u05DC\u05D9 \u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA, \u05D1\u05DC\u05D9 \u05D9\u05D5\u05DE\u05E0\u05D9\u05DD, \u05D1\u05DC\u05D9 \u05D0\u05D7\u05E1\u05D5\u05DF \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA. \u05D0\u05D9\u05DF \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05D1\u05E9\u05E8\u05EA \u05E9\u05D0\u05E4\u05E9\u05E8 \u05DC\u05D4\u05D3\u05DC\u05D9\u05E3, \u05DC\u05D6\u05DE\u05DF \u05D1\u05E6\u05D5 \u05D0\u05D5 \u05DC\u05DE\u05DB\u05D5\u05E8.",
"unique.s5.tags": [
"\u05D1\u05DC\u05D9 \u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA",
"\u05D1\u05DC\u05D9 \u05D9\u05D5\u05DE\u05E0\u05D9\u05DD"
],
"partners.eyebrow": "\u05E9\u05D5\u05EA\u05E4\u05D9\u05DD \u05D5\u05D0\u05E7\u05D5\u05E1\u05D9\u05E1\u05D8\u05DD",
"partners.heading": "\u05D4\u05E9\u05D5\u05EA\u05E4\u05D9\u05DD \u05E9\u05DC\u05E0\u05D5 \u05E1\u05D5\u05DE\u05DB\u05D9\u05DD \u05E2\u05DC\u05D9\u05E0\u05D5",
"partners.aegis.desc": "\u05E9\u05D5\u05EA\u05E3 \u05D4\u05D5\u05DF \u05E9\u05DE\u05D0\u05D1\u05D8\u05D7 \u05EA\u05E7\u05E9\u05D5\u05E8\u05EA \u05E4\u05D9\u05E0\u05E0\u05E1\u05D9\u05EA \u05D7\u05E1\u05D5\u05D9\u05D4 \u05D1\u05DB\u05DC \u05EA\u05D9\u05E7 \u05D4\u05D4\u05E9\u05E7\u05E2\u05D5\u05EA \u05E9\u05DC\u05D5.",
"partners.aegis.role": "\u05EA\u05D5\u05DE\u05DA \u05D0\u05E1\u05D8\u05E8\u05D8\u05D2\u05D9",
"partners.furilabs.desc": "\u05D8\u05DC\u05E4\u05D5\u05E0\u05D9 \u05DC\u05D9\u05E0\u05D5\u05E7\u05E1 \u05E9\u05DE\u05E2\u05DE\u05D9\u05D3\u05D9\u05DD \u05E4\u05E8\u05D8\u05D9\u05D5\u05EA \u05D1\u05E8\u05D0\u05E9 \u05D5\u05DE\u05E9\u05DC\u05D1\u05D9\u05DD \u05D0\u05EA SecureBit \u05DB\u05E2\u05E8\u05D5\u05E5 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC.",
"partners.furilabs.role": "\u05E9\u05D5\u05EA\u05E3 \u05D8\u05DB\u05E0\u05D5\u05DC\u05D5\u05D2\u05D9",
"partners.inviteTitle": "\u05D4\u05D9\u05D5 \u05E9\u05D5\u05EA\u05E4\u05D9\u05DD",
"partners.inviteDesc": "\u05D1\u05D5\u05E0\u05D9\u05DD \u05D7\u05D5\u05DE\u05E8\u05D4 \u05D0\u05D5 \u05EA\u05E9\u05EA\u05D9\u05EA \u05DC\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA? \u05D1\u05D5\u05D0\u05D5 \u05E0\u05E9\u05DC\u05D1 \u05D0\u05EA SecureBit.",
"partners.inviteCta": "\u05E4\u05EA\u05D7\u05D5 \u05E9\u05D9\u05D7\u05D4",
"roadmap.eyebrow": "\u05DE\u05E4\u05EA \u05D3\u05E8\u05DB\u05D9\u05DD \u05DC\u05E4\u05D9\u05EA\u05D5\u05D7",
"roadmap.heading": "\u05D4\u05D4\u05EA\u05E4\u05EA\u05D7\u05D5\u05EA \u05E9\u05DC SecureBit",
"roadmap.subheading": "\u05DE\u05D4\u05D0\u05D1\u05BE\u05D8\u05D9\u05E4\u05D5\u05E1 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF \u05D5\u05E2\u05D3 \u05E8\u05E9\u05EA \u05DE\u05D1\u05D5\u05D6\u05E8\u05EA \u05E2\u05DE\u05D9\u05D3\u05D4 \u05DC\u05E7\u05D5\u05D5\u05E0\u05D8\u05D9\u05DD - \u05E2\u05DD \u05D0\u05D9\u05DE\u05D5\u05EA ASN.1 \u05DE\u05DC\u05D0 \u05D1\u05DB\u05DC \u05E9\u05DB\u05D1\u05D4.",
"roadmap.progress": "{shipped} \u05DE\u05EA\u05D5\u05DA {total} \u05D0\u05D1\u05E0\u05D9 \u05D3\u05E8\u05DA \u05D4\u05D5\u05E9\u05DC\u05DE\u05D5",
"roadmap.upcoming": "{upcoming} \u05D1\u05D3\u05E8\u05DA",
"roadmap.keyFeatures": "\u05D9\u05DB\u05D5\u05DC\u05D5\u05EA \u05DE\u05E8\u05DB\u05D6\u05D9\u05D5\u05EA",
"roadmap.status.released": "\u05E9\u05D5\u05D7\u05E8\u05E8",
"roadmap.status.current": "\u05E0\u05D5\u05DB\u05D7\u05D9",
"roadmap.status.dev": "\u05D1\u05E4\u05D9\u05EA\u05D5\u05D7",
"roadmap.status.planned": "\u05DE\u05EA\u05D5\u05DB\u05E0\u05DF",
"roadmap.status.research": "\u05DE\u05D7\u05E7\u05E8",
"hero.headlineTop": "\u05E7\u05D5 \u05D9\u05E9\u05D9\u05E8",
"hero.headlineBottom": "\u05E9\u05E8\u05E7 \u05E9\u05E0\u05D9\u05DB\u05DD \u05D9\u05DB\u05D5\u05DC\u05D9\u05DD \u05DC\u05E7\u05E8\u05D5\u05D0.",
"hero.subheading": "\u05D4\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05E0\u05D5\u05E6\u05E8\u05D9\u05DD \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8 \u05E9\u05DC\u05DB\u05DD \u05D5\u05DE\u05D5\u05D7\u05DC\u05E4\u05D9\u05DD \u05E2\u05DE\u05D9\u05EA\u05BE\u05DC\u05E2\u05DE\u05D9\u05EA. \u05D1\u05DC\u05D9 \u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA, \u05D1\u05DC\u05D9 \u05E9\u05E8\u05EA\u05D9\u05DD \u05E9\u05E9\u05D5\u05DE\u05E8\u05D9\u05DD \u05D0\u05EA \u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA.",
"hero.diagramAlt": "\u05E7\u05D5 \u05DE\u05D5\u05E6\u05E4\u05DF \u05D9\u05E9\u05D9\u05E8 \u05DC\u05E2\u05DE\u05D9\u05EA \u05D0\u05D7\u05D3, \u05DB\u05E9\u05E9\u05E0\u05D9 \u05E2\u05DE\u05D9\u05EA\u05D9\u05DD \u05E0\u05D5\u05E1\u05E4\u05D9\u05DD \u05DE\u05E6\u05D8\u05E8\u05E4\u05D9\u05DD \u05DC\u05E8\u05E9\u05EA",
"intro.createTitle": "\u05E4\u05EA\u05D7\u05D5 \u05E2\u05E8\u05D5\u05E5 \u05D7\u05D3\u05E9",
"intro.createDesc": "\u05D4\u05DE\u05DB\u05E9\u05D9\u05E8 \u05E9\u05DC\u05DB\u05DD \u05D9\u05D5\u05E6\u05E8 \u05D0\u05EA \u05D4\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D5\u05D4\u05D6\u05DE\u05E0\u05D4 \u05D7\u05D3\u05BE\u05E4\u05E2\u05DE\u05D9\u05EA. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05D5\u05D2\u05E2 \u05D1\u05E9\u05E8\u05EA.",
"intro.createCta": "\u05D9\u05E6\u05D9\u05E8\u05EA \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D5\u05D4\u05D6\u05DE\u05E0\u05D4",
"intro.joinTitle": "\u05D4\u05E6\u05D8\u05E8\u05E4\u05D5 \u05DC\u05E2\u05E8\u05D5\u05E5",
"intro.scanTitle": "\u05E1\u05E8\u05E7\u05D5 QR \u05E2\u05DD \u05D4\u05DE\u05E6\u05DC\u05DE\u05D4",
"intro.scanSubtitle": "\u05D4\u05DB\u05D9 \u05DE\u05D4\u05D9\u05E8 - \u05DB\u05D5\u05D5\u05E0\u05D5 \u05DC\u05DE\u05E1\u05DA \u05E9\u05DC \u05D4\u05E2\u05DE\u05D9\u05EA",
"intro.orPasteCode": "\u05D0\u05D5 \u05D4\u05D3\u05D1\u05D9\u05E7\u05D5 \u05E7\u05D5\u05D3",
"intro.pastePlaceholder": "\u05D4\u05D3\u05D1\u05D9\u05E7\u05D5 \u05DB\u05D0\u05DF \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D4\u05D6\u05DE\u05E0\u05D4\u2026",
"intro.connect": "\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5",
"intro.connecting": "\u05DE\u05E2\u05D1\u05D3\u2026",
"roadmap.r1.title": "\u05EA\u05D7\u05D9\u05DC\u05EA \u05D4\u05E4\u05D9\u05EA\u05D5\u05D7",
"roadmap.r1.sub": "\u05E8\u05E2\u05D9\u05D5\u05DF, \u05D0\u05D1\u05BE\u05D8\u05D9\u05E4\u05D5\u05E1 \u05D5\u05D4\u05E7\u05DE\u05EA \u05EA\u05E9\u05EA\u05D9\u05EA",
"roadmap.r1.date": "\u05EA\u05D7\u05D9\u05DC\u05EA 2025",
"roadmap.r1.features": [
"\u05D2\u05D9\u05D1\u05D5\u05E9 \u05D4\u05E8\u05E2\u05D9\u05D5\u05DF \u05D5\u05D4\u05D3\u05E8\u05D9\u05E9\u05D5\u05EA",
"\u05D1\u05D7\u05D9\u05E8\u05EA \u05DE\u05D7\u05E1\u05E0\u05D9\u05EA: WebRTC, P2P, \u05E7\u05E8\u05D9\u05E4\u05D8\u05D5\u05D2\u05E8\u05E4\u05D9\u05D4",
"\u05D0\u05D1\u05D5\u05EA\u05BE\u05D8\u05D9\u05E4\u05D5\u05E1 \u05E8\u05D0\u05E9\u05D5\u05E0\u05D9\u05DD \u05DC\u05DE\u05E1\u05E8\u05D9\u05DD",
"\u05D9\u05E6\u05D9\u05E8\u05EA \u05DE\u05D0\u05D2\u05E8 \u05D5\u05D0\u05D9\u05E0\u05D8\u05D2\u05E8\u05E6\u05D9\u05D4 \u05E8\u05E6\u05D9\u05E4\u05D4",
"\u05D0\u05E8\u05DB\u05D9\u05D8\u05E7\u05D8\u05D5\u05E8\u05EA \u05D4\u05E6\u05E4\u05E0\u05D4 \u05D1\u05E1\u05D9\u05E1\u05D9\u05EA",
"\u05E2\u05D9\u05E6\u05D5\u05D1 \u05D7\u05D5\u05D5\u05D9\u05D4 \u05D5\u05DE\u05DE\u05E9\u05E7"
],
"roadmap.r2.title": "\u05D2\u05E8\u05E1\u05EA \u05D0\u05DC\u05E4\u05D0",
"roadmap.r2.sub": "\u05D0\u05DC\u05E4\u05D0 \u05E6\u05D9\u05D1\u05D5\u05E8\u05D9\u05EA \u05E8\u05D0\u05E9\u05D5\u05E0\u05D4: \u05E6'\u05D0\u05D8 \u05D1\u05E1\u05D9\u05E1\u05D9 \u05D5\u05D7\u05D9\u05DC\u05D5\u05E4\u05D9 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA",
"roadmap.r2.date": "\u05D0\u05D1\u05D9\u05D1 2025",
"roadmap.r2.features": [
"\u05DE\u05E1\u05E8\u05D9\u05DD \u05E2\u05DE\u05D9\u05EA\u05BE\u05DC\u05E2\u05DE\u05D9\u05EA \u05D1\u05E1\u05D9\u05E1\u05D9\u05D9\u05DD \u05D3\u05E8\u05DA WebRTC",
"\u05D4\u05E6\u05E4\u05E0\u05D4 \u05E4\u05E9\u05D5\u05D8\u05D4 \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4 (\u05E1\u05DB\u05DE\u05EA \u05D4\u05D3\u05D2\u05DE\u05D4)",
"\u05D0\u05D9\u05EA\u05D5\u05EA \u05D9\u05E6\u05D9\u05D1 \u05D5\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05DE\u05D7\u05D3\u05E9",
"\u05DE\u05DE\u05E9\u05E7 \u05DE\u05D9\u05E0\u05D9\u05DE\u05DC\u05D9 \u05DC\u05D1\u05D3\u05D9\u05E7\u05D5\u05EA",
"\u05D0\u05D9\u05E1\u05D5\u05E3 \u05DE\u05E9\u05D5\u05D1 \u05DE\u05D1\u05D5\u05D3\u05E7\u05D9\u05DD \u05DE\u05D5\u05E7\u05D3\u05DE\u05D9\u05DD"
],
"roadmap.r3.title": "\u05D7\u05D9\u05D6\u05D5\u05E7 \u05D0\u05D1\u05D8\u05D7\u05D4",
"roadmap.r3.sub": "\u05D7\u05D9\u05D6\u05D5\u05E7 \u05D4\u05D0\u05D1\u05D8\u05D7\u05D4 \u05D5\u05E9\u05D7\u05E8\u05D5\u05E8 \u05E2\u05E0\u05E3 \u05D9\u05E6\u05D9\u05D1",
"roadmap.r3.date": "\u05E7\u05D9\u05E5 2025",
"roadmap.r3.features": [
"\u05DE\u05D9\u05DE\u05D5\u05E9 ECDH/ECDSA \u05D1\u05E1\u05D1\u05D9\u05D1\u05EA \u05D9\u05D9\u05E6\u05D5\u05E8",
"\u05E1\u05D5\u05D3\u05D9\u05D5\u05EA \u05E7\u05D3\u05D9\u05DE\u05D4 \u05DE\u05D5\u05E9\u05DC\u05DE\u05EA \u05D5\u05D4\u05D7\u05DC\u05E4\u05EA \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA",
"\u05E9\u05D9\u05E4\u05D5\u05E8 \u05D1\u05D3\u05D9\u05E7\u05D5\u05EA \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA",
"\u05D4\u05E6\u05E4\u05E0\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD \u05D5\u05D4\u05E2\u05D1\u05E8\u05EA \u05DE\u05D8\u05E2\u05E0\u05D9\u05DD \u05D2\u05D3\u05D5\u05DC\u05D9\u05DD",
"\u05D1\u05D9\u05E7\u05D5\u05E8\u05EA \u05E2\u05DC \u05EA\u05D4\u05DC\u05D9\u05DB\u05D9 \u05D4\u05E7\u05E8\u05D9\u05E4\u05D8\u05D5 \u05D4\u05D1\u05E1\u05D9\u05E1\u05D9\u05D9\u05DD"
],
"roadmap.r4.title": "\u05D4\u05EA\u05E8\u05D7\u05D1\u05D5\u05EA \u05D5\u05D9\u05E6\u05D9\u05D1\u05D5\u05EA",
"roadmap.r4.sub": "\u05D4\u05E8\u05D7\u05D1\u05EA \u05D4\u05E8\u05E9\u05EA \u05D5\u05E9\u05D9\u05E4\u05D5\u05E8 \u05D4\u05D9\u05E6\u05D9\u05D1\u05D5\u05EA",
"roadmap.r4.date": "\u05E1\u05EA\u05D9\u05D5 2025",
"roadmap.r4.features": [
"\u05D9\u05D9\u05E2\u05D5\u05DC \u05D7\u05D9\u05D1\u05D5\u05E8\u05D9 P2P \u05D5\u05D7\u05E6\u05D9\u05D9\u05EA NAT",
"\u05DE\u05E0\u05D2\u05E0\u05D5\u05E0\u05D9 \u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05DE\u05D7\u05D3\u05E9 \u05D5\u05EA\u05D5\u05E8\u05D9 \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA",
"\u05E6\u05E8\u05D9\u05DB\u05EA \u05E1\u05D5\u05DC\u05DC\u05D4 \u05DE\u05D5\u05E4\u05D7\u05EA\u05EA \u05D1\u05E0\u05D9\u05D9\u05D3",
"\u05EA\u05DE\u05D9\u05DB\u05D4 \u05D1\u05E1\u05E0\u05DB\u05E8\u05D5\u05DF \u05D1\u05D9\u05DF \u05DE\u05DB\u05E9\u05D9\u05E8\u05D9\u05DD",
"\u05DB\u05DC\u05D9 \u05E0\u05D9\u05D8\u05D5\u05E8 \u05D5\u05E8\u05D9\u05E9\u05D5\u05DD \u05DC\u05DE\u05E4\u05EA\u05D7\u05D9\u05DD"
],
"roadmap.r5.title": "\u05D2\u05E8\u05E1\u05EA \u05E4\u05E8\u05D8\u05D9\u05D5\u05EA \u05EA\u05D7\u05D9\u05DC\u05D4",
"roadmap.r5.sub": "\u05D4\u05EA\u05DE\u05E7\u05D3\u05D5\u05EA \u05D1\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA: \u05DE\u05D6\u05E2\u05D5\u05E8 \u05DE\u05D8\u05D0\u05BE\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD",
"roadmap.r5.date": "\u05D7\u05D5\u05E8\u05E3 2025",
"roadmap.r5.features": [
"\u05D4\u05D2\u05E0\u05EA \u05DE\u05D8\u05D0\u05BE\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D5\u05D4\u05E7\u05D8\u05E0\u05EA \u05D8\u05D1\u05D9\u05E2\u05EA \u05D0\u05E6\u05D1\u05E2",
"\u05E0\u05D9\u05E1\u05D5\u05D9\u05D9\u05DD \u05D1\u05E0\u05D9\u05EA\u05D5\u05D1 \u05D1\u05E6\u05DC \u05D5\u05D1-DHT",
"\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05DC\u05D7\u05D9\u05D1\u05D5\u05E8\u05D9\u05DD \u05D0\u05E0\u05D5\u05E0\u05D9\u05DE\u05D9\u05D9\u05DD",
"\u05D4\u05D9\u05E2\u05E8\u05DB\u05D5\u05EA \u05DC\u05D1\u05D9\u05E7\u05D5\u05E8\u05EA \u05E7\u05D5\u05D3 \u05E4\u05EA\u05D5\u05D7\u05D4",
"\u05E9\u05D9\u05E4\u05D5\u05E8 \u05EA\u05D4\u05DC\u05D9\u05DB\u05D9 \u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD"
],
"roadmap.r6.title": "\u05DE\u05D4\u05D3\u05D5\u05E8\u05EA \u05D0\u05D1\u05D8\u05D7\u05D4 \u05DE\u05D5\u05D2\u05D1\u05E8\u05EA",
"roadmap.r6.sub": "\u05E7\u05E8\u05D9\u05E4\u05D8\u05D5\u05D2\u05E8\u05E4\u05D9\u05D4 \u05D1\u05E8\u05DE\u05D4 \u05E6\u05D1\u05D0\u05D9\u05EA \u05D1-18 \u05E9\u05DB\u05D1\u05D5\u05EA \u05E2\u05DD \u05D0\u05D9\u05DE\u05D5\u05EA ASN.1 \u05DE\u05DC\u05D0",
"roadmap.r6.date": "\u05E1\u05D5\u05E3 2025",
"roadmap.r6.features": [
"\u05D0\u05D1\u05D8\u05D7\u05D4 \u05EA\u05DC\u05EA\u05BE\u05E9\u05DB\u05D1\u05EA\u05D9\u05EA: ECDH, DTLS \u05D5-SAS",
"\u05D4\u05E6\u05E4\u05E0\u05EA ECDH P-384 \u05E2\u05DD AES-GCM 256 \u05E1\u05D9\u05D1\u05D9\u05D5\u05EA",
"\u05D0\u05D9\u05DE\u05D5\u05EA \u05D8\u05D1\u05D9\u05E2\u05EA \u05D0\u05E6\u05D1\u05E2 DTLS",
"\u05D0\u05D9\u05DE\u05D5\u05EA SAS (\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D0\u05D9\u05DE\u05D5\u05EA \u05E7\u05E6\u05E8\u05D4)",
"\u05E1\u05D5\u05D3\u05D9\u05D5\u05EA \u05E7\u05D3\u05D9\u05DE\u05D4 \u05DE\u05D5\u05E9\u05DC\u05DE\u05EA \u05E2\u05DD \u05D4\u05D7\u05DC\u05E4\u05EA \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA",
"\u05DE\u05E0\u05D9\u05E2\u05D4 \u05DE\u05D5\u05D2\u05D1\u05E8\u05EA \u05E9\u05DC \u05D4\u05EA\u05E7\u05E4\u05D5\u05EA \u05D0\u05D3\u05DD \u05D1\u05D0\u05DE\u05E6\u05E2",
"\u05D0\u05D9\u05DE\u05D5\u05EA ASN.1 DER \u05DE\u05DC\u05D0",
"\u05D0\u05D9\u05DE\u05D5\u05EA OID \u05D5\u05E0\u05E7\u05D5\u05D3\u05D5\u05EA \u05E2\u05E7\u05D5\u05DE\u05D4",
"\u05D0\u05D9\u05DE\u05D5\u05EA \u05DE\u05D1\u05E0\u05D4 SPKI",
"\u05D0\u05E8\u05DB\u05D9\u05D8\u05E7\u05D8\u05D5\u05E8\u05EA WebRTC \u05E2\u05DE\u05D9\u05EA\u05BE\u05DC\u05E2\u05DE\u05D9\u05EA",
"\u05D4\u05D2\u05E0\u05EA \u05DE\u05D8\u05D0\u05BE\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD",
"\u05E7\u05D5\u05D3 \u05E4\u05EA\u05D5\u05D7 \u05D1-100%"
],
"roadmap.r7.title": "\u05DE\u05D4\u05D3\u05D5\u05E8\u05EA \u05E9\u05D5\u05DC\u05D7\u05DF \u05E2\u05D1\u05D5\u05D3\u05D4",
"roadmap.r7.sub": "\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D5\u05EA \u05DE\u05E7\u05D5\u05E8\u05D9\u05D5\u05EA \u05DC-Windows, macOS \u05D5\u05DC\u05D9\u05E0\u05D5\u05E7\u05E1",
"roadmap.r7.date": "\u05EA\u05D7\u05D9\u05DC\u05EA 2026",
"roadmap.r7.features": [
"\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA Windows\u200F (Tauri v2)",
"\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA macOS\u200F (Tauri v2)",
"\u05EA\u05DE\u05D9\u05DB\u05EA AppImage \u05D1\u05DC\u05D9\u05E0\u05D5\u05E7\u05E1\u200F (Tauri v2)",
"\u05D4\u05EA\u05E8\u05D0\u05D5\u05EA \u05D1\u05D6\u05DE\u05DF \u05D0\u05DE\u05EA",
"\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05DE\u05D7\u05D3\u05E9 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA",
"\u05E1\u05E0\u05DB\u05E8\u05D5\u05DF \u05D1\u05D9\u05DF \u05DE\u05DB\u05E9\u05D9\u05E8\u05D9\u05DD",
"\u05E9\u05D9\u05E4\u05D5\u05E8 \u05D7\u05D5\u05D5\u05D9\u05D4 \u05D5\u05DE\u05DE\u05E9\u05E7",
"\u05EA\u05DE\u05D9\u05DB\u05D4 \u05D1\u05E7\u05D1\u05E6\u05D9\u05DD \u05E2\u05D3 100MB"
],
"roadmap.r8.title": "\u05E7\u05D5\u05DC \u05D5\u05E9\u05D9\u05D7\u05D5\u05EA \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u05D5\u05EA",
"roadmap.r8.sub": "\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E7\u05D5\u05DC\u05D9\u05D5\u05EA, \u05E9\u05D9\u05D7\u05D5\u05EA \u05D0\u05D5\u05D3\u05D9\u05D5 \u05D5\u05D5\u05D9\u05D3\u05D0\u05D5 \u05DE\u05D5\u05E6\u05E4\u05E0\u05D5\u05EA",
"roadmap.r8.date": "\u05EA\u05D7\u05D9\u05DC\u05EA 2026",
"roadmap.r8.features": [
"\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E7\u05D5\u05DC\u05D9\u05D5\u05EA \u05DE\u05D5\u05E6\u05E4\u05E0\u05D5\u05EA \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4",
"\u05E9\u05D9\u05D7\u05D5\u05EA \u05D0\u05D5\u05D3\u05D9\u05D5 \u05DE\u05D5\u05E6\u05E4\u05E0\u05D5\u05EA 1:1\u200F (WebRTC)",
"\u05E9\u05D9\u05D7\u05D5\u05EA \u05D5\u05D9\u05D3\u05D0\u05D5 \u05DE\u05D5\u05E6\u05E4\u05E0\u05D5\u05EA 1:1\u200F (WebRTC)",
"\u05E1\u05D5\u05D3\u05D9\u05D5\u05EA \u05E7\u05D3\u05D9\u05DE\u05D4 \u05DE\u05D5\u05E9\u05DC\u05DE\u05EA \u05DC\u05DE\u05D3\u05D9\u05D4 \u05D7\u05D9\u05D4",
"\u05D6\u05E8\u05DE\u05D9 \u05DE\u05D3\u05D9\u05D4 \u05DE\u05D5\u05D2\u05E0\u05D9 SRTP/DTLS",
"\u05D0\u05D9\u05DE\u05D5\u05EA SAS \u05EA\u05D5\u05DA \u05DB\u05D3\u05D9 \u05E9\u05D9\u05D7\u05D4",
"\u05D4\u05EA\u05E8\u05D0\u05D5\u05EA \u05E9\u05D9\u05D7\u05D4 \u05D5\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05DE\u05D7\u05D3\u05E9 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA",
"\u05DE\u05D3\u05D9\u05D4 \u05E2\u05DE\u05D9\u05EA\u05BE\u05DC\u05E2\u05DE\u05D9\u05EA \u05D1\u05D4\u05E9\u05D4\u05D9\u05D4 \u05E0\u05DE\u05D5\u05DB\u05D4"
],
"roadmap.r9.title": "\u05EA\u05E7\u05E9\u05D5\u05E8\u05EA \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9\u05EA",
"roadmap.r9.sub": "\u05E6'\u05D0\u05D8\u05D9\u05DD \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9\u05D9\u05DD \u05EA\u05D5\u05DA \u05E9\u05DE\u05D9\u05E8\u05D4 \u05E2\u05DC \u05D4\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA",
"roadmap.r9.date": "\u05E2\u05DB\u05E9\u05D9\u05D5",
"roadmap.r9.features": [
"\u05E6'\u05D0\u05D8\u05D9\u05DD \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9\u05D9\u05DD \u05E2\u05DE\u05D9\u05EA\u05BE\u05DC\u05E2\u05DE\u05D9\u05EA \u05E2\u05D3 8 \u05DE\u05E9\u05EA\u05EA\u05E4\u05D9\u05DD",
"\u05DE\u05E1\u05D9\u05E8\u05D4 \u05D1\u05E8\u05E9\u05EA \u05E2\u05DD \u05D2\u05D9\u05D1\u05D5\u05D9 \u05DE\u05DE\u05E1\u05E8 \u05D7\u05EA\u05D5\u05DD",
"\u05E7\u05D5\u05D3 \u05D1\u05D8\u05D9\u05D7\u05D5\u05EA \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9 \u05D0\u05D7\u05D3 \u05E9\u05DB\u05D5\u05DC\u05DD \u05DE\u05E9\u05D5\u05D5\u05D9\u05DD",
"\u05D8\u05E7\u05E1 \u05D4\u05EA\u05D7\u05D9\u05D9\u05D1\u05D5\u05EA\u05BE\u05D5\u05D0\u05D6\u05BE\u05D7\u05E9\u05D9\u05E4\u05D4 \u05E0\u05D2\u05D3 \u05E0\u05D9\u05D7\u05D5\u05E9 \u05D4\u05E7\u05D5\u05D3",
"\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D6\u05D4\u05D5\u05EA \u05DC\u05DB\u05DC \u05E7\u05D1\u05D5\u05E6\u05D4, \u05D6\u05DE\u05E0\u05D9\u05D9\u05DD \u05DE\u05E2\u05E6\u05DD \u05D4\u05EA\u05DB\u05E0\u05D5\u05DF",
"\u05D7\u05D1\u05E8\u05D5\u05BC\u05EA \u05D7\u05EA\u05D5\u05DE\u05D4 \u05E2\u05DD \u05E1\u05D3\u05E8 \u05DC\u05E4\u05D9 \u05EA\u05E7\u05D5\u05E4\u05D5\u05EA",
"\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05D7\u05EA\u05D5\u05DE\u05D5\u05EA, \u05DB\u05DA \u05E9\u05EA\u05DE\u05DC\u05D9\u05DC \u05DE\u05E4\u05D5\u05E6\u05DC \u05E0\u05D9\u05EA\u05DF \u05DC\u05D4\u05D5\u05DB\u05D7\u05D4",
"\u05D1\u05DC\u05D9 \u05E9\u05E8\u05EA, \u05D1\u05DC\u05D9 \u05DE\u05E4\u05EA\u05D7 \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9 \u05DE\u05E9\u05D5\u05EA\u05E3, \u05D1\u05DC\u05D9 \u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D4"
],
"roadmap.r10.title": "\u05DE\u05D4\u05D3\u05D5\u05E8\u05EA \u05E0\u05D9\u05D9\u05D3",
"roadmap.r10.sub": "\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D5\u05EA \u05DE\u05E7\u05D5\u05E8\u05D9\u05D5\u05EA \u05DC-iOS \u05D5\u05D0\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9\u05D3",
"roadmap.r10.date": "\u05E8\u05D1\u05E2\u05D5\u05DF 2 2027",
"roadmap.r10.features": [
"\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA iOS \u05DE\u05E7\u05D5\u05E8\u05D9\u05EA\u200F (Swift/SwiftUI)",
"\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA \u05D0\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9\u05D3 \u05DE\u05E7\u05D5\u05E8\u05D9\u05EA\u200F (Kotlin/Jetpack Compose)",
"\u05EA\u05DE\u05D9\u05DB\u05EA PWA \u05D1\u05D3\u05E4\u05D3\u05E4\u05E0\u05D9 \u05E0\u05D9\u05D9\u05D3",
"\u05D4\u05EA\u05E8\u05D0\u05D5\u05EA \u05D3\u05D7\u05D9\u05E4\u05D4 \u05D1\u05D6\u05DE\u05DF \u05D0\u05DE\u05EA",
"\u05D0\u05D5\u05E4\u05D8\u05D9\u05DE\u05D9\u05D6\u05E6\u05D9\u05D9\u05EA \u05E1\u05D5\u05DC\u05DC\u05D4",
"\u05DE\u05DE\u05E9\u05E7 \u05DE\u05D5\u05EA\u05D0\u05DD \u05DC\u05E0\u05D9\u05D9\u05D3",
"\u05EA\u05D5\u05E8 \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05D1\u05DE\u05E6\u05D1 \u05DC\u05D0 \u05DE\u05E7\u05D5\u05D5\u05DF",
"\u05D0\u05D9\u05DE\u05D5\u05EA \u05D1\u05D9\u05D5\u05DE\u05D8\u05E8\u05D9"
],
"roadmap.r11.title": "\u05DE\u05D4\u05D3\u05D5\u05E8\u05D4 \u05E2\u05DE\u05D9\u05D3\u05D4 \u05DC\u05E7\u05D5\u05D5\u05E0\u05D8\u05D9\u05DD",
"roadmap.r11.sub": "\u05D4\u05D2\u05E0\u05D4 \u05DE\u05E4\u05E0\u05D9 \u05DE\u05D7\u05E9\u05D1\u05D9\u05DD \u05E7\u05D5\u05D5\u05E0\u05D8\u05D9\u05D9\u05DD",
"roadmap.r11.date": "\u05E8\u05D1\u05E2\u05D5\u05DF 4 2027",
"roadmap.r11.features": [
"\u05E7\u05E8\u05D9\u05E4\u05D8\u05D5\u05D2\u05E8\u05E4\u05D9\u05D4 \u05E4\u05D5\u05E1\u05D8\u05BE\u05E7\u05D5\u05D5\u05E0\u05D8\u05D9\u05EA CRYSTALS-Kyber",
"\u05D7\u05EA\u05D9\u05DE\u05D5\u05EA \u05D3\u05D9\u05D2\u05D9\u05D8\u05DC\u05D9\u05D5\u05EA SPHINCS+",
"\u05E1\u05DB\u05DE\u05D4 \u05D4\u05D9\u05D1\u05E8\u05D9\u05D3\u05D9\u05EA: \u05E7\u05DC\u05D0\u05E1\u05D9 + \u05E4\u05D5\u05E1\u05D8\u05BE\u05E7\u05D5\u05D5\u05E0\u05D8\u05D9",
"\u05D7\u05D9\u05DC\u05D5\u05E4\u05D9 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D1\u05D8\u05D5\u05D7\u05D9\u05DD \u05E7\u05D5\u05D5\u05E0\u05D8\u05D9\u05EA",
"\u05D0\u05DC\u05D2\u05D5\u05E8\u05D9\u05EA\u05DE\u05D9 \u05D2\u05D9\u05D1\u05D5\u05D1 \u05DE\u05E2\u05D5\u05D3\u05DB\u05E0\u05D9\u05DD",
"\u05D4\u05E2\u05D1\u05E8\u05EA \u05D4\u05E4\u05E2\u05DC\u05D5\u05EA \u05E7\u05D9\u05D9\u05DE\u05D5\u05EA",
"\u05EA\u05D0\u05D9\u05DE\u05D5\u05EA \u05DC-v5.x",
"\u05E4\u05E8\u05D5\u05D8\u05D5\u05E7\u05D5\u05DC\u05D9\u05DD \u05E2\u05DE\u05D9\u05D3\u05D9\u05DD \u05DC\u05E7\u05D5\u05D5\u05E0\u05D8\u05D9\u05DD"
],
"roadmap.r12.title": "\u05E8\u05E9\u05EA \u05DE\u05D1\u05D5\u05D6\u05E8\u05EA",
"roadmap.r12.sub": "\u05E8\u05E9\u05EA \u05DE\u05D1\u05D5\u05D6\u05E8\u05EA \u05DC\u05D7\u05DC\u05D5\u05D8\u05D9\u05DF",
"roadmap.r12.date": "2028",
"roadmap.r12.features": [
"\u05E8\u05E9\u05EA \u05E6\u05DE\u05EA\u05D9\u05DD \u05DE\u05E7\u05D5\u05E9\u05E8\u05EA",
"DHT \u05DC\u05D2\u05D9\u05DC\u05D5\u05D9 \u05E2\u05DE\u05D9\u05EA\u05D9\u05DD",
"\u05E0\u05D9\u05EA\u05D5\u05D1 \u05D1\u05E6\u05DC \u05DE\u05D5\u05D1\u05E0\u05D4",
"\u05D8\u05D5\u05E7\u05E0\u05D5\u05DE\u05D9\u05E7\u05D4 \u05D5\u05EA\u05DE\u05E8\u05D9\u05E6\u05D9\u05DD \u05DC\u05E6\u05DE\u05EA\u05D9\u05DD",
"\u05DE\u05DE\u05E9\u05DC \u05D1\u05D0\u05DE\u05E6\u05E2\u05D5\u05EA DAO",
"\u05D9\u05DB\u05D5\u05DC\u05EA \u05E4\u05E2\u05D5\u05DC\u05D4 \u05D4\u05D3\u05D3\u05D9\u05EA \u05E2\u05DD \u05E8\u05E9\u05EA\u05D5\u05EA \u05D0\u05D7\u05E8\u05D5\u05EA",
"\u05EA\u05D0\u05D9\u05DE\u05D5\u05EA \u05D7\u05D5\u05E6\u05EA \u05E4\u05DC\u05D8\u05E4\u05D5\u05E8\u05DE\u05D5\u05EA",
"\u05E8\u05E9\u05EA \u05E9\u05DE\u05E8\u05E4\u05D0\u05EA \u05D0\u05EA \u05E2\u05E6\u05DE\u05D4"
],
"roadmap.r13.title": "\u05E2\u05D5\u05D6\u05E8 \u05E4\u05E8\u05D8\u05D9\u05D5\u05EA \u05DE\u05D1\u05D5\u05E1\u05E1 \u05D1\u05D9\u05E0\u05D4 \u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA",
"roadmap.r13.sub": "\u05D1\u05D9\u05E0\u05D4 \u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA \u05DC\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA \u05D5\u05D0\u05D1\u05D8\u05D7\u05D4",
"roadmap.r13.date": "2028 \u05D5\u05D0\u05D9\u05DC\u05DA",
"roadmap.r13.features": [
"\u05E0\u05D9\u05EA\u05D5\u05D7 \u05D0\u05D9\u05D5\u05DE\u05D9\u05DD \u05DE\u05E7\u05D5\u05DE\u05D9 \u05D1\u05D1\u05D9\u05E0\u05D4 \u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA",
"\u05D6\u05D9\u05D4\u05D5\u05D9 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9 \u05E9\u05DC \u05D0\u05D3\u05DD \u05D1\u05D0\u05DE\u05E6\u05E2",
"\u05E7\u05E8\u05D9\u05E4\u05D8\u05D5\u05D2\u05E8\u05E4\u05D9\u05D4 \u05D0\u05D3\u05E4\u05D8\u05D9\u05D1\u05D9\u05EA",
"\u05D4\u05DE\u05DC\u05E6\u05D5\u05EA \u05D0\u05D1\u05D8\u05D7\u05D4 \u05DE\u05D5\u05EA\u05D0\u05DE\u05D5\u05EA \u05D0\u05D9\u05E9\u05D9\u05EA",
"\u05DC\u05DE\u05D9\u05D3\u05EA \u05DE\u05DB\u05D5\u05E0\u05D4 \u05D1\u05D0\u05E4\u05E1 \u05D9\u05D3\u05E2",
"\u05E2\u05D5\u05D6\u05E8 \u05D1\u05D9\u05E0\u05D4 \u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA \u05E4\u05E8\u05D8\u05D9",
"\u05D0\u05D1\u05D8\u05D7\u05D4 \u05D7\u05D6\u05D0\u05D9\u05EA",
"\u05D4\u05D2\u05E0\u05D4 \u05D0\u05D5\u05D8\u05D5\u05E0\u05D5\u05DE\u05D9\u05EA \u05DE\u05E4\u05E0\u05D9 \u05D4\u05EA\u05E7\u05E4\u05D5\u05EA"
],
"handshake.step1": "\u05D9\u05D5\u05E6\u05E8 \u05D6\u05D5\u05D2 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA ECDH P-384",
"handshake.step2": "\u05D2\u05D5\u05D6\u05E8 \u05E7\u05D5\u05D3 \u05D0\u05D9\u05DE\u05D5\u05EA",
"handshake.step3": "\u05DE\u05E7\u05D1\u05E2 \u05E1\u05D5\u05D3\u05D9\u05D5\u05EA \u05E7\u05D3\u05D9\u05DE\u05D4 \u05DE\u05D5\u05E9\u05DC\u05DE\u05EA",
"handshake.securingTitle": "\u05DE\u05D0\u05D1\u05D8\u05D7 \u05D0\u05EA \u05D4\u05E2\u05E8\u05D5\u05E5 \u05E9\u05DC\u05DB\u05DD",
"handshake.answerTitle": "\u05D1\u05D5\u05E0\u05D4 \u05D0\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05E9\u05DC\u05DB\u05DD",
"handshake.securingDesc": "\u05DE\u05D7\u05E9\u05DC \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D7\u05D6\u05E7\u05D9\u05DD \u05D3\u05D9\u05D9\u05DD \u05DB\u05D3\u05D9 \u05DC\u05E2\u05DE\u05D5\u05D3 \u05D1\u05D7\u05D1\u05DC\u05D4.",
"handshake.shareTitle": "\u05E9\u05EA\u05E4\u05D5 \u05D0\u05EA \u05D4\u05D4\u05D6\u05DE\u05E0\u05D4",
"handshake.sendAnswerTitle": "\u05E9\u05DC\u05D7\u05D5 \u05D1\u05D7\u05D6\u05E8\u05D4 \u05D0\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4",
"handshake.shareDesc": "\u05D4\u05E6\u05D9\u05D2\u05D5 \u05D0\u05EA \u05D4-QR \u05D0\u05D5 \u05E9\u05DC\u05D7\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05DC\u05E2\u05DE\u05D9\u05EA. \u05D4\u05D5\u05D0 \u05D7\u05D3\u05BE\u05E4\u05E2\u05DE\u05D9 \u05D5\u05E4\u05D2 \u05D1\u05E7\u05E8\u05D5\u05D1.",
"handshake.sendAnswerDesc": "\u05DE\u05E1\u05E8\u05D5 \u05D0\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05D4\u05D6\u05D5 \u05DC\u05D9\u05D5\u05E6\u05E8 \u05D4\u05E2\u05E8\u05D5\u05E5 \u05DB\u05D3\u05D9 \u05E9\u05D9\u05D5\u05DB\u05DC \u05DC\u05D4\u05E9\u05DC\u05D9\u05DD \u05D0\u05EA \u05DC\u05D7\u05D9\u05E6\u05EA \u05D4\u05D9\u05D3.",
"handshake.establish": "\u05D9\u05E6\u05D9\u05E8\u05EA \u05D7\u05D9\u05D1\u05D5\u05E8",
"handshake.thenReceive": "\u05D5\u05D0\u05D6 \u05E7\u05D1\u05DC\u05D5 \u05D0\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05E9\u05D4\u05E2\u05DE\u05D9\u05EA \u05E9\u05D5\u05DC\u05D7 \u05D1\u05D7\u05D6\u05E8\u05D4",
"handshake.pasteAnswerPlaceholder": "\u05D4\u05D3\u05D1\u05D9\u05E7\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05E9\u05DC \u05D4\u05E2\u05DE\u05D9\u05EA\u2026",
"handshake.answerSentNote": "\u05E9\u05DC\u05D7\u05D5 \u05D0\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05DC\u05D9\u05D5\u05E6\u05E8 \u05D5\u05D0\u05D6 \u05D4\u05DE\u05EA\u05D9\u05E0\u05D5 - \u05D4\u05E6'\u05D0\u05D8 \u05E0\u05E4\u05EA\u05D7 \u05D1\u05E8\u05D2\u05E2 \u05E9\u05D4\u05DD \u05DE\u05EA\u05D7\u05D1\u05E8\u05D9\u05DD.",
"handshake.qrHint": "\u05D4\u05E9\u05D0\u05D9\u05E8\u05D5 \u05E4\u05EA\u05D5\u05D7 \u05E2\u05D3 \u05E9\u05D4\u05E2\u05DE\u05D9\u05EA \u05D9\u05E7\u05DC\u05D5\u05D8 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3.",
"handshake.qrHintFrames": "\u05DC\u05D7\u05D9\u05E6\u05EA \u05D4\u05D9\u05D3 \u05DE\u05E4\u05D5\u05E6\u05DC\u05EA \u05DC-{frames} \u05E4\u05E8\u05D9\u05D9\u05DE\u05D9\u05DD - \u05D4\u05E9\u05D0\u05D9\u05E8\u05D5 \u05E4\u05EA\u05D5\u05D7 \u05E2\u05D3 \u05E9\u05D4\u05E2\u05DE\u05D9\u05EA \u05D9\u05E7\u05DC\u05D5\u05D8 \u05D0\u05EA \u05DB\u05D5\u05DC\u05DD.",
"verify.title": "\u05D0\u05D9\u05DE\u05D5\u05EA \u05D0\u05D1\u05D8\u05D7\u05D4",
"verify.desc": "\u05D4\u05E9\u05D5\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA \u05D4\u05D6\u05D4 \u05E2\u05DD \u05D4\u05E2\u05DE\u05D9\u05EA \u05D1\u05E2\u05E8\u05D5\u05E5 \u05E0\u05E4\u05E8\u05D3 (\u05E9\u05D9\u05D7\u05D4 \u05E7\u05D5\u05DC\u05D9\u05EA / \u05E4\u05E0\u05D9\u05DD \u05D0\u05DC \u05E4\u05E0\u05D9\u05DD), \u05D5\u05D0\u05D6 \u05D4\u05E7\u05DC\u05D9\u05D3\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05DB\u05D3\u05D9 \u05DC\u05E4\u05EA\u05D5\u05D7 \u05D0\u05EA \u05D4\u05E6'\u05D0\u05D8.",
"verify.enterLabel": "\u05D4\u05D6\u05D9\u05E0\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05D4\u05DE\u05D0\u05D5\u05DE\u05EA",
"verify.placeholder": "\u05D4\u05E7\u05DC\u05D9\u05D3\u05D5 \u05DB\u05D0\u05DF \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3",
"verify.confirm": "\u05D0\u05E9\u05E8\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3",
"verify.confirmed": "\u05D0\u05D5\u05E9\u05E8",
"verify.mismatch": "\u05DC\u05D0 \u05EA\u05D5\u05D0\u05DE\u05D9\u05DD",
"verify.yours": "\u05D4\u05D0\u05D9\u05E9\u05D5\u05E8 \u05E9\u05DC\u05DB\u05DD",
"verify.peer": "\u05D0\u05D9\u05E9\u05D5\u05E8 \u05D4\u05E2\u05DE\u05D9\u05EA",
"verify.pending": "\u05DE\u05DE\u05EA\u05D9\u05DF",
"verify.waiting": "\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05E7\u05D5\u05D3\u2026",
"verify.verified": "\u05D4\u05E2\u05E8\u05D5\u05E5 \u05D0\u05D5\u05DE\u05EA",
"verify.bothConfirmed": "\u05E9\u05E0\u05D9 \u05D4\u05E6\u05D3\u05D3\u05D9\u05DD \u05D0\u05D9\u05E9\u05E8\u05D5. \u05E4\u05D5\u05EA\u05D7 \u05D0\u05EA \u05D4\u05E6'\u05D0\u05D8 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u2026",
"pwa.bannerTitle": "\u05D4\u05EA\u05E7\u05D9\u05E0\u05D5 \u05D0\u05EA SecureBit.chat",
"pwa.bannerDesc": "\u05E7\u05D1\u05DC\u05D5 \u05D7\u05D5\u05D5\u05D9\u05D9\u05EA \u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05DE\u05E7\u05D5\u05E8\u05D9\u05EA \u05E2\u05DD \u05D0\u05D1\u05D8\u05D7\u05D4 \u05DE\u05E9\u05D5\u05E4\u05E8\u05EA",
"pwa.install": "\u05D4\u05EA\u05E7\u05E0\u05D4",
"pwa.dismiss": "\u05D1\u05D9\u05D8\u05D5\u05DC",
"pwa.close": "\u05E1\u05D2\u05D9\u05E8\u05D4",
"pwa.iosTitle": "\u05D4\u05EA\u05E7\u05E0\u05D4 \u05D1-iOS",
"pwa.iosStep1": "\u05D4\u05E7\u05D9\u05E9\u05D5 \u05E2\u05DC \u05DB\u05E4\u05EA\u05D5\u05E8 \u05D4\u05E9\u05D9\u05EA\u05D5\u05E3",
"pwa.iosStep1Hint": "\u05D1\u05D3\u05E8\u05DA \u05DB\u05DC\u05DC \u05D1\u05EA\u05D7\u05EA\u05D9\u05EA \u05E1\u05E4\u05D0\u05E8\u05D9",
"pwa.iosStep2": '\u05DE\u05E6\u05D0\u05D5 "\u05D4\u05D5\u05E1\u05E3 \u05DC\u05DE\u05E1\u05DA \u05D4\u05D1\u05D9\u05EA"',
"pwa.iosStep2Hint": "\u05D2\u05DC\u05DC\u05D5 \u05DE\u05D8\u05D4 \u05D1\u05EA\u05E4\u05E8\u05D9\u05D8 \u05D4\u05E9\u05D9\u05EA\u05D5\u05E3",
"pwa.iosStep3": '\u05D4\u05E7\u05D9\u05E9\u05D5 \u05E2\u05DC "\u05D4\u05D5\u05E1\u05E3"',
"pwa.iosStep3Hint": "\u05D0\u05E9\u05E8\u05D5 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05EA\u05E7\u05D9\u05DF \u05D0\u05EA SecureBit.chat",
"pwa.genericTitle": "\u05D4\u05EA\u05E7\u05E0\u05EA SecureBit",
"pwa.genericDesc": "\u05DC\u05DB\u05DC \u05D3\u05E4\u05D3\u05E4\u05DF \u05D3\u05E8\u05DA \u05DE\u05E9\u05DC\u05D5 \u05DC\u05D4\u05EA\u05E7\u05D9\u05DF. \u05D1\u05D7\u05E8\u05D5 \u05D0\u05EA \u05D4\u05E9\u05DC\u05D1\u05D9\u05DD \u05E9\u05DE\u05EA\u05D0\u05D9\u05DE\u05D9\u05DD \u05DC\u05E9\u05DC\u05DB\u05DD.",
"pwa.gotIt": "\u05D4\u05D1\u05E0\u05EA\u05D9",
"pwa.installedTitle": "\u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05D4\u05D5\u05EA\u05E7\u05E0\u05D4!",
"pwa.installedIos": "\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA iOS \u05D4\u05D5\u05EA\u05E7\u05E0\u05D4! \u05E4\u05EA\u05D7\u05D5 \u05DE\u05DE\u05E1\u05DA \u05D4\u05D1\u05D9\u05EA.",
"pwa.installedGeneric": "\u200FSecureBit.chat \u05E0\u05DE\u05E6\u05D0 \u05E2\u05DB\u05E9\u05D9\u05D5 \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8 \u05E9\u05DC\u05DB\u05DD",
"pwa.anytimeTitle": "\u05D4\u05EA\u05E7\u05D9\u05E0\u05D5 \u05DE\u05EA\u05D9 \u05E9\u05EA\u05E8\u05E6\u05D5",
"pwa.anytimeDesc": "\u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05E4\u05E9\u05E8 \u05DC\u05D4\u05EA\u05E7\u05D9\u05DF \u05D0\u05EA SecureBit.chat \u05DE\u05EA\u05E4\u05E8\u05D9\u05D8 \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05DC\u05D7\u05D5\u05D5\u05D9\u05D4 \u05D4\u05D8\u05D5\u05D1\u05D4 \u05D1\u05D9\u05D5\u05EA\u05E8.",
"pwa.ok": "\u05D0\u05D9\u05E9\u05D5\u05E8",
"step.open": "\u05E9\u05DC\u05D1 1 \xB7 \u05E4\u05EA\u05D9\u05D7\u05EA \u05E2\u05E8\u05D5\u05E5",
"step.exchange": "\u05E9\u05DC\u05D1 2 \xB7 \u05D7\u05D9\u05DC\u05D5\u05E4\u05D9\u05DD",
"step.verification": "\u05E9\u05DC\u05D1 3 \xB7 \u05D0\u05D9\u05DE\u05D5\u05EA",
"action.create": "\u05D9\u05E6\u05D9\u05E8\u05D4",
"action.join": "\u05D4\u05E6\u05D8\u05E8\u05E4\u05D5\u05EA",
"action.back": "\u05D7\u05D6\u05E8\u05D4",
"action.copy": "\u05D4\u05E2\u05EA\u05E7\u05D4",
"action.copied": "\u05D4\u05D5\u05E2\u05EA\u05E7",
"action.scan": "\u05E1\u05E8\u05D9\u05E7\u05D4",
"action.downloadDesktop": "\u05D4\u05D5\u05E8\u05D9\u05D3\u05D5 \u05D0\u05EA \u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA \u05E9\u05D5\u05DC\u05D7\u05DF \u05D4\u05E2\u05D1\u05D5\u05D3\u05D4",
"action.advancedSettings": "\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05DE\u05EA\u05E7\u05D3\u05DE\u05D5\u05EA",
"cred.offerTag": "\u05D4\u05E6\u05E2\u05D4 \xB7 \u05D0\u05D5 \u05D4\u05E2\u05EA\u05D9\u05E7\u05D5 \u05D8\u05E7\u05E1\u05D8",
"cred.answerTag": "\u05EA\u05E9\u05D5\u05D1\u05D4 \xB7 \u05D0\u05D5 \u05D4\u05E2\u05EA\u05D9\u05E7\u05D5 \u05D8\u05E7\u05E1\u05D8",
"cred.reveal": "\u05DC\u05D7\u05E6\u05D5 \u05DC\u05D7\u05E9\u05D9\u05E4\u05D4 - \u05E9\u05DE\u05E8\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05D4\u05D6\u05D4 \u05E4\u05E8\u05D8\u05D9",
"qr.title": "\u05E1\u05E8\u05D9\u05E7\u05EA \u05E7\u05D5\u05D3 QR",
"qr.subtitle": "\u05DB\u05D5\u05D5\u05E0\u05D5 \u05D0\u05EA \u05D4\u05DE\u05E6\u05DC\u05DE\u05D4 \u05DC-QR \u05E9\u05DC\u05D4\u05DD",
"qr.scanning": "\u05E1\u05D5\u05E8\u05E7\u2026",
"qr.hint": "\u05D4\u05D7\u05D6\u05D9\u05E7\u05D5 \u05D9\u05E6\u05D9\u05D1 \u05E2\u05D3 \u05E9\u05DB\u05DC \u05D4\u05D7\u05DC\u05E7\u05D9\u05DD \u05D9\u05D9\u05E7\u05DC\u05D8\u05D5. \u05D4\u05D2\u05D9\u05E9\u05D4 \u05DC\u05DE\u05E6\u05DC\u05DE\u05D4 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA - \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05DE\u05D5\u05E2\u05DC\u05D4.",
"mesh.you": "\u05D0\u05EA\u05DD",
"mesh.peer": "\u05E2\u05DE\u05D9\u05EA \xB7 \u05D4\u05E4\u05E2\u05DC\u05D4 1",
"mesh.joined2": "\u200Fmara \u05D4\u05E6\u05D8\u05E8\u05E4\u05D4 \xB7 +2",
"mesh.joined3": "\u200Ftobi \u05D4\u05E6\u05D8\u05E8\u05E3 \xB7 +3",
"ice.title": "\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05E8\u05E9\u05EA",
"ice.subtitle": "\u05DE\u05D5\u05D2\u05D3\u05E8\u05D5\u05EA \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA - \u05DC\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05DE\u05E9\u05D5\u05EA\u05E4\u05D5\u05EA \u05E2\u05DD \u05D4\u05E2\u05DE\u05D9\u05EA",
"ice.intro": "\u200FSecureBit \u05DE\u05E9\u05EA\u05DE\u05E9 \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC \u05D1\u05E9\u05E8\u05EA\u05D9 STUN \u05E6\u05D9\u05D1\u05D5\u05E8\u05D9\u05D9\u05DD \u05DB\u05D3\u05D9 \u05DC\u05EA\u05D0\u05DD \u05D0\u05EA \u05D4\u05E7\u05D9\u05E9\u05D5\u05E8 \u05D1\u05D9\u05DF \u05D4\u05E2\u05DE\u05D9\u05EA\u05D9\u05DD. \u05D4\u05E4\u05E0\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05DC-STUN/TURN \u05E9\u05DC\u05DB\u05DD \u05D0\u05DD \u05D0\u05EA\u05DD \u05DE\u05D0\u05E8\u05D7\u05D9\u05DD \u05D1\u05E2\u05E6\u05DE\u05DB\u05DD.",
"ice.publicTitle": "\u05E9\u05E8\u05EA\u05D9\u05DD \u05E6\u05D9\u05D1\u05D5\u05E8\u05D9\u05D9\u05DD (\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC)",
"ice.publicDesc": "\u05D1\u05DC\u05D9 \u05D4\u05D2\u05D3\u05E8\u05D5\u05EA. \u05DE\u05EA\u05D0\u05D9\u05DD \u05DC\u05E8\u05D5\u05D1 \u05D4\u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD.",
"ice.customTitle": "\u05E9\u05E8\u05EA\u05D9 STUN/TURN \u05DE\u05E9\u05DC\u05D9",
"ice.customDesc": "\u05E2\u05D3 {max} \u05E9\u05E8\u05EA\u05D9\u05DD.",
"ice.turnNote": "\u05DE\u05DE\u05E1\u05E8 TURN \u05E8\u05D5\u05D0\u05D4 \u05D0\u05EA \u05DB\u05EA\u05D5\u05D1\u05D5\u05EA \u05D4-IP \u05E9\u05DC \u05E9\u05E0\u05D9 \u05D4\u05E2\u05DE\u05D9\u05EA\u05D9\u05DD \u05D5\u05D0\u05EA \u05EA\u05D6\u05DE\u05D5\u05DF \u05D4\u05EA\u05E2\u05D1\u05D5\u05E8\u05D4 - \u05D0\u05DA \u05DC\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05D0\u05EA \u05EA\u05D5\u05DB\u05DF \u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA, \u05E9\u05E0\u05E9\u05D0\u05E8 \u05DE\u05D5\u05E6\u05E4\u05DF \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4. \u05E2\u05D3\u05D9\u05E3 ",
"ice.turnNoteTls": " \u200F(TLS).",
"ice.test": "\u05D1\u05D3\u05E7\u05D5 \u05D0\u05EA \u05D4\u05E9\u05E8\u05EA\u05D9\u05DD",
"ice.testing": "\u05D1\u05D5\u05D3\u05E7\u2026",
"ice.relayTitle": "\u05DE\u05E6\u05D1 \u05E8\u05D9\u05DC\u05D9\u05D9 \u05D1\u05DC\u05D1\u05D3",
"ice.relayBadge": "\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA \u05DE\u05E8\u05D1\u05D9\u05EA",
"ice.relayDesc": "\u05DE\u05E0\u05EA\u05D1 \u05D0\u05EA \u05DB\u05DC \u05D4\u05EA\u05E2\u05D1\u05D5\u05E8\u05D4 \u05D3\u05E8\u05DA TURN \u05DB\u05DA \u05E9\u05DB\u05EA\u05D5\u05D1\u05EA \u05D4-IP \u05E9\u05DC\u05DB\u05DD \u05DC\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05E0\u05D7\u05E9\u05E4\u05EA \u05DC\u05E2\u05DE\u05D9\u05EA. \u05D3\u05D5\u05E8\u05E9 \u05E9\u05E8\u05EA TURN.",
"ice.relayWarning": "\u05DE\u05E6\u05D1 \u05E8\u05D9\u05DC\u05D9\u05D9 \u05D1\u05DC\u05D1\u05D3 \u05DE\u05D5\u05E4\u05E2\u05DC \u05D0\u05DA \u05DC\u05D0 \u05D4\u05D5\u05D2\u05D3\u05E8 \u05E9\u05E8\u05EA TURN. \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05DC\u05D0 \u05D9\u05D5\u05DB\u05DC \u05DC\u05D4\u05EA\u05D7\u05D9\u05DC.",
"ice.persist": "\u05E9\u05DE\u05E8\u05D5 \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8 \u05D4\u05D6\u05D4",
"ice.persistDesc": "\u05E0\u05E9\u05DE\u05E8 \u05DE\u05D5\u05E6\u05E4\u05DF \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF \u05D4\u05D6\u05D4. \u05D4\u05E9\u05D0\u05D9\u05E8\u05D5 \u05DB\u05D1\u05D5\u05D9 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05E9\u05EA\u05DE\u05E9 \u05E8\u05E7 \u05D1\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9\u05EA.",
"ice.forget": "\u05E9\u05DB\u05D7\u05D5 \u05D0\u05EA \u05D4\u05E9\u05DE\u05D5\u05E8",
"ice.cancel": "\u05D1\u05D9\u05D8\u05D5\u05DC",
"ice.apply": "\u05D4\u05D7\u05DC\u05D4",
"ice.errUnavailable": "\u200FWebRTC \u05D0\u05D9\u05E0\u05D5 \u05D6\u05DE\u05D9\u05DF \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF \u05D4\u05D6\u05D4",
"ice.errInvalid": "\u05EA\u05E6\u05D5\u05E8\u05EA \u05E9\u05E8\u05EA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05E0\u05D4",
"update.title": "\u05D9\u05E9 \u05E2\u05D3\u05DB\u05D5\u05DF",
"update.desc": "\u05D6\u05D5\u05D4\u05EA\u05D4 \u05D2\u05E8\u05E1\u05D4 \u05D7\u05D3\u05E9\u05D4 \u05D9\u05D5\u05EA\u05E8 \u05E9\u05DC SecureBit.",
"update.currentVersion": "\u05D2\u05E8\u05E1\u05D4 \u05E0\u05D5\u05DB\u05D7\u05D9\u05EA",
"update.newVersion": "\u05D2\u05E8\u05E1\u05D4 \u05D7\u05D3\u05E9\u05D4",
"update.now": "\u05E2\u05D3\u05DB\u05E0\u05D5 \u05E2\u05DB\u05E9\u05D9\u05D5",
"update.later": "\u05DE\u05D0\u05D5\u05D7\u05E8 \u05D9\u05D5\u05EA\u05E8",
"update.unknown": "\u05DC\u05D0 \u05D6\u05DE\u05D9\u05DF",
"update.stepSaving": "\u05E9\u05D5\u05DE\u05E8 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD...",
"update.stepSwCaches": "\u05DE\u05E0\u05E7\u05D4 \u05DE\u05D8\u05DE\u05D5\u05E0\u05D9 Service Worker...",
"update.stepSwUnregister": "\u05DE\u05D1\u05D8\u05DC \u05E8\u05D9\u05E9\u05D5\u05DD Service Workers...",
"update.stepBrowserCache": "\u05DE\u05E0\u05E7\u05D4 \u05D0\u05EA \u05DE\u05D8\u05DE\u05D5\u05DF \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF...",
"update.stepVersion": "\u05DE\u05E2\u05D3\u05DB\u05DF \u05D2\u05E8\u05E1\u05D4...",
"update.stepReload": "\u05D8\u05D5\u05E2\u05DF \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05D9\u05D9\u05E9\u05D5\u05DD...",
"update.error": "\u05E9\u05D2\u05D9\u05D0\u05EA \u05E2\u05D3\u05DB\u05D5\u05DF. \u05E8\u05E2\u05E0\u05E0\u05D5 \u05D0\u05EA \u05D4\u05D3\u05E3 \u05D9\u05D3\u05E0\u05D9\u05EA (Ctrl+F5 \u05D0\u05D5 Cmd+Shift+R)",
"update.confirmSkip": "\u05D9\u05E9 \u05D2\u05E8\u05E1\u05D4 \u05D7\u05D3\u05E9\u05D4. \u05DE\u05D5\u05DE\u05DC\u05E5 \u05DC\u05E2\u05D3\u05DB\u05DF \u05DC\u05DE\u05E2\u05DF \u05D4\u05D0\u05D1\u05D8\u05D7\u05D4 \u05D5\u05D4\u05D9\u05E6\u05D9\u05D1\u05D5\u05EA. \u05DC\u05D4\u05DE\u05E9\u05D9\u05DA \u05D1\u05DC\u05D9 \u05DC\u05E2\u05D3\u05DB\u05DF?",
"offline.backOnline": "\u05D7\u05D6\u05E8\u05E0\u05D5 \u05DC\u05E8\u05E9\u05EA",
"offline.mode": "\u05DE\u05E6\u05D1 \u05DC\u05D0 \u05DE\u05E7\u05D5\u05D5\u05DF",
"offline.dismiss": "\u05D1\u05D9\u05D8\u05D5\u05DC",
"offline.lostTitle": "\u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D0\u05D1\u05D3",
"offline.lostDesc": "\u200FSecureBit \u05D1\u05DE\u05E6\u05D1 \u05DC\u05D0 \u05DE\u05E7\u05D5\u05D5\u05DF. \u05D7\u05DC\u05E7 \u05DE\u05D4\u05D9\u05DB\u05D5\u05DC\u05D5\u05EA \u05DE\u05D5\u05D2\u05D1\u05DC\u05D5\u05EA, \u05D0\u05D1\u05DC \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05DC\u05DB\u05DD \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05D1\u05D8\u05D5\u05D7\u05D9\u05DD.",
"offline.point1": "\u05D4\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D5\u05D4\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05E9\u05DC\u05DB\u05DD \u05E0\u05E9\u05DE\u05E8\u05D9\u05DD",
"offline.point2": "\u05E9\u05D5\u05DD \u05E0\u05EA\u05D5\u05DF \u05DC\u05D0 \u05E0\u05E9\u05DE\u05E8 \u05D1\u05E9\u05E8\u05EA\u05D9\u05DD",
"offline.point3": "\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05D5\u05E7\u05D1\u05E6\u05D9\u05DD \u05DE\u05E1\u05EA\u05E0\u05DB\u05E8\u05E0\u05D9\u05DD \u05DB\u05E9\u05EA\u05EA\u05D7\u05D1\u05E8\u05D5 \u05DE\u05D7\u05D3\u05E9",
"offline.continue": "\u05D4\u05DE\u05E9\u05D9\u05DB\u05D5 \u05D1\u05DE\u05E6\u05D1 \u05DC\u05D0 \u05DE\u05E7\u05D5\u05D5\u05DF",
"offline.restoredTitle": "\u05DB\u05E9\u05EA\u05EA\u05D7\u05D1\u05E8\u05D5 \u05DE\u05D7\u05D3\u05E9",
"offline.restoredDesc": "\u05E0\u05D9\u05EA\u05D5\u05E7 \u05DC\u05D0 \u05E2\u05D5\u05DC\u05D4 \u05DC\u05DB\u05DD \u05D1\u05DB\u05DC\u05D5\u05DD. \u200FSecureBit \u05DE\u05E6\u05D9\u05D1 \u05D4\u05DB\u05DC \u05D1\u05EA\u05D5\u05E8 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05D5\u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D4\u05DE\u05D5\u05E6\u05E4\u05E0\u05EA \u05D1\u05E8\u05D2\u05E2 \u05E9\u05EA\u05D7\u05D6\u05E8\u05D5 \u05DC\u05E8\u05E9\u05EA.",
"offline.r1Title": "\u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E9\u05DC\u05DB\u05DD \u05E0\u05DE\u05E1\u05E8\u05D5\u05EA",
"offline.r1Desc": "\u05DB\u05DC \u05DE\u05D4 \u05E9\u05DB\u05EA\u05D1\u05EA\u05DD \u05D1\u05DE\u05E6\u05D1 \u05DC\u05D0 \u05DE\u05E7\u05D5\u05D5\u05DF \u05E0\u05E9\u05DC\u05D7 \u05DC\u05D0\u05D9\u05E9 \u05D4\u05E7\u05E9\u05E8 \u05E9\u05DC\u05DB\u05DD \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA.",
"offline.r2Title": "\u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05DE\u05E1\u05D9\u05D9\u05DE\u05D9\u05DD \u05DC\u05E2\u05D1\u05D5\u05E8",
"offline.r2Desc": "\u05D4\u05D4\u05E2\u05DC\u05D0\u05D5\u05EA \u05DE\u05DE\u05E9\u05D9\u05DB\u05D5\u05EA \u05DE\u05D4\u05E0\u05E7\u05D5\u05D3\u05D4 \u05E9\u05D1\u05D4 \u05E0\u05E2\u05E6\u05E8\u05D5 - \u05D0\u05D9\u05DF \u05E6\u05D5\u05E8\u05DA \u05DC\u05E9\u05DC\u05D5\u05D7 \u05E9\u05D5\u05D1.",
"offline.r3Title": "\u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05D5\u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05E9\u05DC\u05D4\u05DD \u05DE\u05D2\u05D9\u05E2\u05D9\u05DD",
"offline.r3Desc": "\u05DB\u05DC \u05DE\u05D4 \u05E9\u05D0\u05D9\u05E9 \u05D4\u05E7\u05E9\u05E8 \u05E9\u05DC\u05D7 \u05D1\u05DE\u05D4\u05DC\u05DA \u05D4\u05E0\u05D9\u05EA\u05D5\u05E7 \u05E0\u05DE\u05E1\u05E8 \u05DC\u05DB\u05DD \u05DC\u05E4\u05D9 \u05D4\u05E1\u05D3\u05E8.",
"offline.r4Title": "\u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05D4\u05D5\u05DC\u05DA \u05DC\u05D0\u05D9\u05D1\u05D5\u05D3",
"offline.r4Desc": "\u05D0\u05D7\u05E8\u05D9 \u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05DE\u05D7\u05D3\u05E9 \u05D0\u05D9\u05DF \u05E4\u05E2\u05E8 - \u05D4\u05E9\u05D9\u05D7\u05D4 \u05DE\u05DE\u05E9\u05D9\u05DB\u05D4 \u05D1\u05D3\u05D9\u05D5\u05E7 \u05DE\u05D4\u05DE\u05E7\u05D5\u05DD \u05E9\u05D1\u05D5 \u05E0\u05E2\u05E6\u05E8\u05D4.",
"offline.gotIt": "\u05D4\u05D1\u05E0\u05EA\u05D9",
"qr.showTitle": "\u05D4\u05E6\u05D2\u05EA \u05E7\u05D5\u05D3 QR",
"qr.showSubtitle": "\u05DE\u05E1\u05DA \u05DE\u05DC\u05D0 \xB7 \u05EA\u05E0\u05D5 \u05DC\u05E2\u05DE\u05D9\u05EA \u05DC\u05E1\u05E8\u05D5\u05E7",
"qr.showSubtitleFrames": "\u05DE\u05E1\u05DA \u05DE\u05DC\u05D0 \xB7 \u05EA\u05E0\u05D5 \u05DC\u05E2\u05DE\u05D9\u05EA \u05DC\u05E1\u05E8\u05D5\u05E7 \u05D0\u05EA \u05DB\u05DC {frames} \u05D4\u05E4\u05E8\u05D9\u05D9\u05DE\u05D9\u05DD",
"notify.enabledBody": "\u05D4\u05D4\u05EA\u05E8\u05D0\u05D5\u05EA \u05D4\u05D5\u05E4\u05E2\u05DC\u05D5! \u05EA\u05E7\u05D1\u05DC\u05D5 \u05D4\u05EA\u05E8\u05D0\u05D5\u05EA \u05E2\u05DC \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05D7\u05D3\u05E9\u05D5\u05EA.",
"notify.workingBody": "\u05D4\u05D4\u05EA\u05E8\u05D0\u05D5\u05EA \u05E2\u05D5\u05D1\u05D3\u05D5\u05EA! \u05EA\u05E7\u05D1\u05DC\u05D5 \u05D4\u05EA\u05E8\u05D0\u05D5\u05EA \u05E2\u05DC \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05D7\u05D3\u05E9\u05D5\u05EA.",
"pw.label": "\u05D4\u05D6\u05E0\u05EA \u05E1\u05D9\u05E1\u05DE\u05D4",
"pw.placeholder": "\u05D4\u05D6\u05D9\u05E0\u05D5 \u05E1\u05D9\u05E1\u05DE\u05D4...",
"pw.decrypt": "\u05E4\u05E2\u05E0\u05D5\u05D7",
"pw.cancel": "\u05D1\u05D9\u05D8\u05D5\u05DC",
"file.title": "\u05D4\u05E2\u05D1\u05E8\u05D5\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD",
"file.drop": "\u05D2\u05E8\u05E8\u05D5 \u05D5\u05E9\u05D7\u05E8\u05E8\u05D5 \u05E7\u05D1\u05E6\u05D9\u05DD \u05DB\u05D0\u05DF",
"file.dropHint": "\u05DE\u05D5\u05E6\u05E4\u05E0\u05D9\u05DD \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4 \u05DC\u05E4\u05E0\u05D9 \u05D4\u05D4\u05E2\u05D1\u05E8\u05D4 \xB7 \u05E2\u05D3 100 MB",
"file.browse": "\u05E2\u05D9\u05D5\u05DF \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8",
"file.incoming": "\u05D1\u05E7\u05E9\u05EA \u05E7\u05D5\u05D1\u05E5 \u05E0\u05DB\u05E0\u05E1\u05EA",
"file.accept": "\u05D0\u05D9\u05E9\u05D5\u05E8",
"file.reject": "\u05D3\u05D7\u05D9\u05D9\u05D4",
"file.download": "\u05D4\u05D5\u05E8\u05D3\u05D4",
"file.notReady": "\u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D5\u05DB\u05DF",
"file.tooLarge": "\u05D4\u05E7\u05D5\u05D1\u05E5 \u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9",
"file.typeNotAllowed": "\u05E1\u05D5\u05D2 \u05D4\u05E7\u05D5\u05D1\u05E5 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D5\u05E8\u05E9\u05D4",
"file.maxConcurrent": "\u05DE\u05E7\u05E1\u05D9\u05DE\u05D5\u05DD \u05D4\u05E2\u05D1\u05E8\u05D5\u05EA \u05D1\u05DE\u05E7\u05D1\u05D9\u05DC",
"file.gone": "\u05D4\u05E7\u05D5\u05D1\u05E5 \u05D4\u05D6\u05D4 \u05DB\u05D1\u05E8 \u05D0\u05D9\u05E0\u05D5 \u05D6\u05DE\u05D9\u05DF \u05DC\u05D4\u05D5\u05E8\u05D3\u05D4.",
"call.incoming": "\u05E9\u05D9\u05D7\u05D4 \u05E0\u05DB\u05E0\u05E1\u05EA",
"call.incomingVideo": "\u05E9\u05D9\u05D7\u05EA \u05D5\u05D9\u05D3\u05D0\u05D5 \u05E0\u05DB\u05E0\u05E1\u05EA",
"call.encrypted": "\u05E9\u05D9\u05D7\u05D4 \u05DE\u05D5\u05E6\u05E4\u05E0\u05EA",
"call.encryptedShort": "\u05DE\u05D5\u05E6\u05E4\u05E0\u05EA",
"call.peer": "\u05E2\u05DE\u05D9\u05EA \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7",
"call.connecting": "\u05DE\u05EA\u05D7\u05D1\u05E8\u2026",
"call.ringing": "\u05DE\u05E6\u05DC\u05E6\u05DC\u2026",
"call.accept": "\u05DE\u05E2\u05E0\u05D4",
"call.decline": "\u05D3\u05D7\u05D9\u05D9\u05D4",
"call.end": "\u05E1\u05D9\u05D5\u05DD \u05E9\u05D9\u05D7\u05D4",
"call.camera": "\u05DE\u05E6\u05DC\u05DE\u05D4",
"call.cameraOff": "\u05D4\u05DE\u05E6\u05DC\u05DE\u05D4 \u05DB\u05D1\u05D5\u05D9\u05D4",
"call.peerCameraOff": "\u05D4\u05DE\u05E6\u05DC\u05DE\u05D4 \u05E9\u05DC \u05D4\u05E2\u05DE\u05D9\u05EA \u05DB\u05D1\u05D5\u05D9\u05D4",
"call.flipCamera": "\u05D4\u05D7\u05DC\u05E4\u05EA \u05DE\u05E6\u05DC\u05DE\u05D4",
"call.addVideo": "\u05D4\u05D5\u05E1\u05E4\u05EA \u05D5\u05D9\u05D3\u05D0\u05D5",
"call.video": "\u05D5\u05D9\u05D3\u05D0\u05D5",
"call.muted": "\u05DE\u05D5\u05E9\u05EA\u05E7",
"call.expand": "\u05D4\u05D2\u05D3\u05DC\u05D4",
"call.minimize": "\u05DE\u05D6\u05E2\u05D5\u05E8",
"call.quality": "\u05D0\u05D9\u05DB\u05D5\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8",
"call.qualityExcellent": "\u05DE\u05E6\u05D5\u05D9\u05E0\u05EA",
"call.videoPrefix": "\u05D5\u05D9\u05D3\u05D0\u05D5 \xB7 ",
"call.voicePrefix": "\u05E7\u05D5\u05DC \xB7 ",
"group.new": "\u05E7\u05D1\u05D5\u05E6\u05D4 \u05D7\u05D3\u05E9\u05D4",
"group.create": "\u05D9\u05E6\u05D9\u05E8\u05EA \u05E7\u05D1\u05D5\u05E6\u05D4",
"group.join": "\u05D4\u05E6\u05D8\u05E8\u05E4\u05D5\u05EA \u05DC\u05E7\u05D1\u05D5\u05E6\u05D4",
"group.name": "\u05E9\u05DD \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4",
"group.nameTooLong": "\u05E9\u05DD \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05D0\u05E8\u05D5\u05DA \u05DE\u05D3\u05D9.",
"group.capacity": "\u05E2\u05D3 {max} \u05D0\u05E0\u05E9\u05D9\u05DD, \u05E2\u05DE\u05D9\u05EA\u05BE\u05DC\u05E2\u05DE\u05D9\u05EA. \u05DB\u05D5\u05DC\u05DD \u05D9\u05E9\u05D5\u05D5 \u05E7\u05D5\u05D3 \u05D1\u05D8\u05D9\u05D7\u05D5\u05EA \u05D0\u05D7\u05D3 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05E0\u05E4\u05EA\u05D7\u05EA.",
"group.invite": "\u05D4\u05D6\u05DE\u05E0\u05D4",
"group.inviteMore": "\u05D4\u05D6\u05DE\u05D9\u05E0\u05D5 \u05D7\u05D1\u05E8\u05D9\u05DD \u05E0\u05D5\u05E1\u05E4\u05D9\u05DD",
"group.invitePeople": "\u05D4\u05D6\u05DE\u05D9\u05E0\u05D5 {count} \u05D0\u05E0\u05E9\u05D9\u05DD",
"group.invitation": "\u05D4\u05D6\u05DE\u05E0\u05D4 \u05DC\u05E7\u05D1\u05D5\u05E6\u05D4",
"group.addMembers": "\u05D4\u05D5\u05E1\u05E4\u05EA \u05D7\u05D1\u05E8\u05D9\u05DD",
"group.roomFor": "\u05D9\u05E9 \u05DE\u05E7\u05D5\u05DD \u05DC-{remaining} \u05E0\u05D5\u05E1\u05E4\u05D9\u05DD. \u05DB\u05D5\u05DC\u05DD \u05D9\u05E9\u05D5\u05D5 \u05E7\u05D5\u05D3 \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9 \u05D7\u05D3\u05E9 \u05D1\u05E8\u05D2\u05E2 \u05E9\u05D9\u05E6\u05D8\u05E8\u05E4\u05D5.",
"group.membersCount": "{count} \u05D7\u05D1\u05E8\u05D9\u05DD",
"group.member": "\u05D7\u05D1\u05E8",
"group.members": "\u05D7\u05D1\u05E8\u05D9\u05DD",
"group.remove": "\u05D4\u05E1\u05D9\u05E8\u05D5 \u05D0\u05EA {name}",
"group.message": "\u05E9\u05DC\u05D7\u05D5 \u05D4\u05D5\u05D3\u05E2\u05D4 \u05DC{name}",
"group.leave": "\u05D9\u05E6\u05D9\u05D0\u05D4",
"group.leaveThis": "\u05E6\u05D0\u05D5 \u05DE\u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05D4\u05D6\u05D5",
"group.cancel": "\u05D1\u05D9\u05D8\u05D5\u05DC \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4",
"group.close": "\u05E1\u05D2\u05D9\u05E8\u05D4",
"group.cancelBtn": "\u05D1\u05D9\u05D8\u05D5\u05DC",
"group.decline": "\u05D3\u05D7\u05D9\u05D9\u05D4",
"group.working": "\u05E2\u05D5\u05D1\u05D3\u2026",
"group.sasTitle": "\u05E7\u05D5\u05D3 \u05D1\u05D8\u05D9\u05D7\u05D5\u05EA \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9",
"group.sasEveryone": "\u05DB\u05D5\u05DC\u05DD \u05E8\u05D5\u05D0\u05D9\u05DD \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05D4\u05D6\u05D4",
"group.sasCompare": "\u05D4\u05E9\u05D5\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05D4\u05E7\u05D1\u05D5\u05E6\u05EA\u05D9 \u05E2\u05DD \u05DB\u05DC \u05D7\u05D1\u05E8 \u05DB\u05D3\u05D9 \u05DC\u05E4\u05EA\u05D5\u05D7 \u05D0\u05EA \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4.",
"group.sasReadAloud": "\u05D4\u05E7\u05E8\u05D9\u05D0\u05D5 \u05D0\u05EA \u05D4\u05E1\u05E4\u05E8\u05D5\u05EA \u05D4\u05D0\u05DC\u05D4 \u05D1\u05E7\u05D5\u05DC \u05DC",
"group.sasWarning": "\u05D0\u05DD \u05D0\u05E4\u05D9\u05DC\u05D5 \u05D7\u05D1\u05E8 \u05D0\u05D7\u05D3 \u05DE\u05E7\u05E8\u05D9\u05D0 \u05E7\u05D5\u05D3 \u05E9\u05D5\u05E0\u05D4, \u05DE\u05D9\u05E9\u05D4\u05D5 \u05D9\u05D5\u05E9\u05D1 \u05D1\u05D9\u05E0\u05D9\u05DB\u05DD. \u05D1\u05D8\u05DC\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 - \u05D0\u05DC \u05EA\u05D0\u05E9\u05E8\u05D5.",
"group.confirmFirst": "\u05D0\u05E9\u05E8\u05D5 \u05E7\u05D5\u05D3\u05DD \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05D4\u05E7\u05D1\u05D5\u05E6\u05EA\u05D9",
"group.codeSuffix": " \xB7 \u05E7\u05D5\u05D3 {code}",
"group.exchangingNonces": "\u05DE\u05D7\u05DC\u05D9\u05E3 \u05E2\u05E8\u05DB\u05D9\u05DD \u05D7\u05D3\u05BE\u05E4\u05E2\u05DE\u05D9\u05D9\u05DD\u2026",
"group.waitingCommit": "\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05DB\u05DC \u05D7\u05D1\u05E8 \u05E9\u05D9\u05EA\u05D7\u05D9\u05D9\u05D1\u2026",
"group.waitingJoin": "\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05E9\u05D0\u05E8 \u05D4\u05D7\u05D1\u05E8\u05D9\u05DD \u05E9\u05D9\u05E6\u05D8\u05E8\u05E4\u05D5\u2026",
"group.emptyChat": "\u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05D9\u05DF \u05DB\u05D0\u05DF \u05D3\u05D1\u05E8. \u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05D7\u05EA\u05D5\u05DE\u05D5\u05EA \u05D1\u05D9\u05D3\u05D9 \u05D4\u05E9\u05D5\u05DC\u05D7 \u05D5\u05E2\u05D5\u05D1\u05E8\u05D5\u05EA \u05D1\u05E7\u05D9\u05E9\u05D5\u05E8 \u05D4\u05DE\u05D5\u05E6\u05E4\u05DF \u05D4\u05E4\u05E8\u05D8\u05D9 \u05E9\u05DC \u05DB\u05DC \u05D7\u05D1\u05E8.",
"group.noVerified": "\u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05D9\u05DF \u05E6'\u05D0\u05D8\u05D9\u05DD \u05DE\u05D0\u05D5\u05DE\u05EA\u05D9\u05DD. \u05E4\u05EA\u05D7\u05D5 \u05E6'\u05D0\u05D8 1:1 \u05D5\u05D4\u05E9\u05D5\u05D5 \u05E7\u05D5\u05D3\u05DD \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA \u05E9\u05DC\u05D5 - \u05E7\u05D1\u05D5\u05E6\u05D4 \u05E0\u05D1\u05E0\u05D9\u05EA \u05DE\u05D7\u05D9\u05D1\u05D5\u05E8\u05D9\u05DD \u05E9\u05DB\u05D1\u05E8 \u05D1\u05D3\u05E7\u05EA\u05DD.",
"group.noMoreToAdd": "\u05D0\u05D9\u05DF \u05E6'\u05D0\u05D8\u05D9\u05DD \u05DE\u05D0\u05D5\u05DE\u05EA\u05D9\u05DD \u05E0\u05D5\u05E1\u05E4\u05D9\u05DD \u05DC\u05D4\u05D5\u05E1\u05E4\u05D4. \u05E4\u05EA\u05D7\u05D5 \u05E6'\u05D0\u05D8 1:1 \u05D5\u05D4\u05E9\u05D5\u05D5 \u05E7\u05D5\u05D3\u05DD \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA \u05E9\u05DC\u05D5.",
"group.directLink": "\u05E7\u05D9\u05E9\u05D5\u05E8 \u05D9\u05E9\u05D9\u05E8 \u05E2\u05DE\u05D9\u05EA\u05BE\u05DC\u05E2\u05DE\u05D9\u05EA",
"group.noDirectLink": "\u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05D9\u05DF \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D9\u05E9\u05D9\u05E8 - \u05D7\u05D1\u05E8 \u05D0\u05D7\u05E8 \u05DE\u05E2\u05D1\u05D9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05D1\u05D6\u05DE\u05DF \u05E9\u05E0\u05D1\u05E0\u05D4 \u05E7\u05D9\u05E9\u05D5\u05E8",
"group.relayNote": "\u05DC\u05D7\u05DC\u05E7 \u05DE\u05D4\u05D7\u05D1\u05E8\u05D9\u05DD \u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05D9\u05DF \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D9\u05E9\u05D9\u05E8 \u05D0\u05DC\u05D9\u05DB\u05DD. \u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E9\u05DC\u05D4\u05DD \u05E2\u05D5\u05D1\u05E8\u05D5\u05EA \u05D3\u05E8\u05DA \u05D7\u05D1\u05E8 \u05D0\u05D7\u05E8, \u05E9\u05D9\u05DB\u05D5\u05DC \u05DC\u05E8\u05D0\u05D5\u05EA \u05E9\u05D0\u05EA\u05DD \u05DE\u05D3\u05D1\u05E8\u05D9\u05DD \u05D0\u05DA \u05DC\u05D0 \u05DC\u05E7\u05E8\u05D5\u05D0 \u05DE\u05E2\u05D1\u05E8 \u05DC\u05D7\u05EA\u05D9\u05DE\u05D4 \u05D0\u05D5 \u05DC\u05E9\u05E0\u05D5\u05EA \u05D0\u05EA \u05DE\u05D4 \u05E9\u05D0\u05DE\u05E8\u05EA\u05DD. \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05DE\u05DE\u05E9\u05D9\u05DB\u05D4 \u05DC\u05E0\u05E1\u05D5\u05EA \u05DC\u05D7\u05D1\u05E8 \u05D0\u05D5\u05EA\u05DD \u05D9\u05E9\u05D9\u05E8\u05D5\u05EA.",
"group.relayOnlyOff": "\u05DE\u05E6\u05D1 \u05E8\u05D9\u05DC\u05D9\u05D9 \u05D1\u05DC\u05D1\u05D3 \u05DB\u05D1\u05D5\u05D9, \u05D5\u05DC\u05DB\u05DF \u05DB\u05DC \u05D7\u05D1\u05E8 \u05DE\u05EA\u05D7\u05D1\u05E8 \u05D0\u05DC\u05D9\u05DB\u05DD \u05D9\u05E9\u05D9\u05E8\u05D5\u05EA \u05D5\u05DC\u05D5\u05DE\u05D3 \u05D0\u05EA \u05DB\u05EA\u05D5\u05D1\u05EA \u05D4-IP \u05E9\u05DC\u05DB\u05DD - \u05DB\u05D5\u05DC\u05DC \u05D7\u05D1\u05E8\u05D9\u05DD \u05E9\u05DE\u05D9\u05E9\u05D4\u05D5 \u05D0\u05D7\u05E8 \u05D4\u05D6\u05DE\u05D9\u05DF. \u05D4\u05E4\u05E2\u05D9\u05DC\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05D1\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D4\u05E8\u05E9\u05EA \u05D0\u05DD \u05D6\u05D4 \u05DE\u05E9\u05E0\u05D4 \u05DB\u05D0\u05DF.",
"group.memberOffline": "{name} \u05DC\u05D0 \u05DE\u05D7\u05D5\u05D1\u05E8 \u05D5\u05DC\u05D0 \u05D9\u05E7\u05D1\u05DC \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA. \u05D4\u05DD \u05E2\u05D3\u05D9\u05D9\u05DF \u05D7\u05D1\u05E8\u05D9\u05DD - \u05D4\u05E1\u05E8\u05EA\u05DD \u05DE\u05D9\u05D9\u05E6\u05E8\u05EA \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D7\u05D3\u05E9\u05D9\u05DD \u05DC\u05E7\u05D1\u05D5\u05E6\u05D4.",
"group.joinNote": "\u05E9\u05D0\u05E8 \u05D4\u05D7\u05D1\u05E8\u05D9\u05DD \u05D9\u05D3\u05E2\u05D5 \u05E9\u05D0\u05EA\u05DD \u05D1\u05E7\u05D1\u05D5\u05E6\u05D4. \u05D0\u05D9\u05DF \u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05DC\u05D4\u05E9\u05DC\u05D9\u05DD - \u05E7\u05D1\u05D5\u05E6\u05D4 \u05DE\u05EA\u05D7\u05D9\u05DC\u05D4 \u05E8\u05D9\u05E7\u05D4.",
"group.inviteSentNote": "\u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05DE\u05DE\u05E9\u05D9\u05DB\u05D4 \u05DC\u05E2\u05D1\u05D5\u05D3 \u05E2\u05D3 \u05E9\u05D9\u05D0\u05E9\u05E8\u05D5. \u05D0\u05D9\u05DF \u05DC\u05D4\u05DD \u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D4 \u05DC\u05D4\u05E9\u05DC\u05D9\u05DD - \u05D4\u05DD \u05D9\u05E8\u05D0\u05D5 \u05E8\u05E7 \u05DE\u05D4 \u05E9\u05D9\u05D9\u05E9\u05DC\u05D7 \u05DE\u05E2\u05DB\u05E9\u05D9\u05D5.",
"group.errNotCreated": "\u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05DC\u05D0 \u05E0\u05D5\u05E6\u05E8\u05D4",
"group.errNobodyAccepted": "\u05D0\u05D9\u05E9 \u05DC\u05D0 \u05D0\u05D9\u05E9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05D6\u05DE\u05E0\u05D4 \u05D1\u05D6\u05DE\u05DF.",
"group.errNothingSent": "\u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7 \u05D5\u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05D0\u05D5\u05DE\u05EA. \u05E1\u05D2\u05E8\u05D5 \u05D5\u05E0\u05D9\u05E1\u05D5 \u05E9\u05D5\u05D1 \u05DB\u05E9\u05DB\u05D5\u05DC\u05DD \u05DE\u05D7\u05D5\u05D1\u05E8\u05D9\u05DD.",
"group.errNotFormed": "\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05E7\u05D9\u05DD \u05D0\u05EA \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05D4\u05D6\u05D5.",
"group.errFull": "\u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05D4\u05D6\u05D5 \u05DE\u05DC\u05D0\u05D4.",
"group.errInviteFailed": "\u05D4\u05D4\u05D6\u05DE\u05E0\u05D4 \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7\u05D4 - \u05D4\u05E6'\u05D0\u05D8 \u05D4\u05D6\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D7\u05D5\u05D1\u05E8.",
"group.errNoMemberList": "\u05D1\u05E2\u05DC \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05DE\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05E9\u05DC\u05D7 \u05D0\u05EA \u05E8\u05E9\u05D9\u05DE\u05EA \u05D4\u05D7\u05D1\u05E8\u05D9\u05DD.",
"group.errUnsignedList": "\u05E8\u05E9\u05D9\u05DE\u05EA \u05D4\u05D7\u05D1\u05E8\u05D9\u05DD \u05DC\u05D0 \u05E0\u05D7\u05EA\u05DE\u05D4 \u05D1\u05D9\u05D3\u05D9 \u05D1\u05E2\u05DC \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4. \u05D0\u05DC \u05EA\u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1 - \u05D4\u05D5\u05D3\u05D9\u05E2\u05D5 \u05DC\u05D4\u05DD.",
"group.errNotOwner": "\u05DE\u05D9\u05E9\u05D4\u05D5 \u05E9\u05D0\u05D9\u05E0\u05D5 \u05D1\u05E2\u05DC \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05E0\u05D9\u05E1\u05D4 \u05DC\u05E9\u05E0\u05D5\u05EA \u05D0\u05EA \u05D4\u05D7\u05D1\u05E8\u05D9\u05DD.",
"hdr.tagline": "\u05DE\u05D5\u05E6\u05E4\u05DF \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4",
"hdr.netSettings": "\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05E8\u05E9\u05EA \u05DE\u05EA\u05E7\u05D3\u05DE\u05D5\u05EA",
"hdr.netSettingsTitle": "\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05E8\u05E9\u05EA \u05DE\u05EA\u05E7\u05D3\u05DE\u05D5\u05EA (STUN/TURN)",
"hdr.disconnect": "\u05E0\u05D9\u05EA\u05D5\u05E7",
"status.connected": "\u05DE\u05D7\u05D5\u05D1\u05E8",
"status.connecting": "\u05DE\u05EA\u05D7\u05D1\u05E8...",
"status.notConnected": "\u05DC\u05D0 \u05DE\u05D7\u05D5\u05D1\u05E8",
"status.reconnecting": "\u05DE\u05EA\u05D7\u05D1\u05E8 \u05DE\u05D7\u05D3\u05E9...",
"status.retrying": "\u05DE\u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1...",
"status.verifying": "\u05DE\u05D0\u05DE\u05EA...",
"status.peerDisconnected": "\u05D4\u05E2\u05DE\u05D9\u05EA \u05D4\u05EA\u05E0\u05EA\u05E7",
"sec.replayProtection": "\u05D4\u05D2\u05E0\u05D4 \u05DE\u05E4\u05E0\u05D9 \u05E9\u05D9\u05D3\u05D5\u05E8 \u05D7\u05D5\u05D6\u05E8",
"sec.messageIntegrity": "\u05E9\u05DC\u05DE\u05D5\u05EA \u05D4\u05D4\u05D5\u05D3\u05E2\u05D4 (HMAC)",
"sec.forwardSecrecy": "\u05E1\u05D5\u05D3\u05D9\u05D5\u05EA \u05E7\u05D3\u05D9\u05DE\u05D4 \u05DE\u05D5\u05E9\u05DC\u05DE\u05EA",
"sec.metadataProtection": "\u05D4\u05D2\u05E0\u05EA \u05DE\u05D8\u05D0\u05BE\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD",
"sec.trafficObfuscation": "\u05E2\u05E8\u05E4\u05D5\u05DC \u05EA\u05E2\u05D1\u05D5\u05E8\u05D4",
"sec.realTests": "\u05D1\u05D3\u05D9\u05E7\u05D5\u05EA \u05E7\u05E8\u05D9\u05E4\u05D8\u05D5\u05D2\u05E8\u05E4\u05D9\u05D5\u05EA \u05D0\u05DE\u05D9\u05EA\u05D9\u05D5\u05EA",
"sec.simulatedData": "\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DE\u05D3\u05D5\u05DE\u05D9\u05DD",
"sec.testPassed": "\u05D4\u05D1\u05D3\u05D9\u05E7\u05D4 \u05E2\u05D1\u05E8\u05D4",
"sec.testFailed": "\u05D4\u05D1\u05D3\u05D9\u05E7\u05D4 \u05E0\u05DB\u05E9\u05DC\u05D4 \u05D0\u05D5 \u05D0\u05D9\u05E0\u05D4 \u05D6\u05DE\u05D9\u05E0\u05D4",
"sec.verificationDone": "\u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05E7\u05E8\u05D9\u05E4\u05D8\u05D5\u05D2\u05E8\u05E4\u05D9 \u05D4\u05D0\u05DE\u05D9\u05EA\u05D9 \u05D4\u05D5\u05E9\u05DC\u05DD",
"sec.verificationInProgress": "\u05D0\u05D9\u05DE\u05D5\u05EA \u05D0\u05D1\u05D8\u05D7\u05D4 \u05DE\u05EA\u05D1\u05E6\u05E2...",
"sec.verificationWait": "\u05D0\u05D9\u05DE\u05D5\u05EA \u05D0\u05D1\u05D8\u05D7\u05D4 \u05DE\u05EA\u05D1\u05E6\u05E2...\n\u05D4\u05DE\u05EA\u05D9\u05E0\u05D5 \u05DC\u05E1\u05D9\u05D5\u05DD \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05E7\u05E8\u05D9\u05E4\u05D8\u05D5\u05D2\u05E8\u05E4\u05D9 \u05D1\u05D6\u05DE\u05DF \u05D0\u05DE\u05EA.",
"sec.verificationUnavailable": "\u05D0\u05D9\u05DE\u05D5\u05EA \u05D0\u05D1\u05D8\u05D7\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05D6\u05DE\u05D9\u05DF",
"chat.placeholder": "\u05D4\u05E7\u05DC\u05D9\u05D3\u05D5 \u05D4\u05D5\u05D3\u05E2\u05D4 \u05DE\u05D5\u05E6\u05E4\u05E0\u05EA\u2026",
"chat.send": "\u05E9\u05DC\u05D9\u05D7\u05EA \u05D4\u05D5\u05D3\u05E2\u05D4",
"chat.sendFiles": "\u05E9\u05DC\u05D9\u05D7\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD",
"chat.hideFiles": "\u05D4\u05E1\u05EA\u05E8\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD",
"chat.recordVoice": "\u05D4\u05E7\u05DC\u05D8\u05EA \u05D4\u05D5\u05D3\u05E2\u05D4 \u05E7\u05D5\u05DC\u05D9\u05EA",
"chat.sendVoice": "\u05E9\u05DC\u05D9\u05D7\u05EA \u05D4\u05D5\u05D3\u05E2\u05D4 \u05E7\u05D5\u05DC\u05D9\u05EA",
"chat.discard": "\u05DE\u05D7\u05D9\u05E7\u05D4",
"chat.codeBlock": "\u05E9\u05DC\u05D9\u05D7\u05D4 \u05DB\u05D1\u05DC\u05D5\u05E7 \u05E7\u05D5\u05D3 (\u05DE\u05E8\u05D7\u05D9\u05D1 \u05D0\u05EA \u05E9\u05D3\u05D4 \u05D4\u05E7\u05DC\u05D8)",
"chat.codeHint": "\u05E7\u05D8\u05E2 \u05E7\u05D5\u05D3 \xB7 \u05D4\u05E2\u05D9\u05E6\u05D5\u05D1 \u05E0\u05E9\u05DE\u05E8 \xB7 \u2318\u21B5 \u05DC\u05E9\u05DC\u05D9\u05D7\u05D4",
"chat.viewOnce": "\u05E6\u05E4\u05D9\u05D9\u05D4 \u05D7\u05D3\u05BE\u05E4\u05E2\u05DE\u05D9\u05EA",
"chat.viewOnceTitle": "\u05E6\u05E4\u05D9\u05D9\u05D4 \u05D7\u05D3\u05BE\u05E4\u05E2\u05DE\u05D9\u05EA - \u05E0\u05E2\u05DC\u05DD \u05D0\u05D7\u05E8\u05D9 \u05E9\u05D4\u05E2\u05DE\u05D9\u05EA \u05E7\u05D5\u05E8\u05D0",
"chat.viewOncePrefix": "\u05E6\u05E4\u05D9\u05D9\u05D4 \u05D7\u05D3\u05BE\u05E4\u05E2\u05DE\u05D9\u05EA \xB7 ",
"chat.viewOnceTap": "\u05E6\u05E4\u05D9\u05D9\u05D4 \u05D7\u05D3\u05BE\u05E4\u05E2\u05DE\u05D9\u05EA \xB7 \u05D4\u05E7\u05D9\u05E9\u05D5 \u05DC\u05D7\u05E9\u05D9\u05E4\u05D4",
"chat.viewedOnce": "\u05E0\u05E6\u05E4\u05D4 \u05E4\u05E2\u05DD \u05D0\u05D7\u05EA",
"chat.disappearing": "\u05D4\u05D5\u05D3\u05E2\u05D4 \u05E0\u05E2\u05DC\u05DE\u05EA - \u05E0\u05DE\u05D7\u05E7\u05EA \u05D1\u05E9\u05E0\u05D9 \u05D4\u05E6\u05D3\u05D3\u05D9\u05DD",
"chat.disappearAfter": "\u05D4\u05D9\u05E2\u05DC\u05DE\u05D5\u05EA \u05D0\u05D7\u05E8\u05D9",
"chat.visibleFor": "\u05D2\u05DC\u05D5\u05D9\u05D4 \u05DC\u05DE\u05E9\u05DA",
"chat.timerPrefix": "\u05D8\u05D9\u05D9\u05DE\u05E8 \xB7 ",
"chat.expired": "\u05EA\u05D5\u05E7\u05E3 \u05D4\u05D4\u05D5\u05D3\u05E2\u05D4 \u05D4\u05D6\u05D5 \u05E4\u05D2",
"chat.deleteForEveryone": "\u05DE\u05D7\u05D9\u05E7\u05D4 \u05D0\u05E6\u05DC \u05DB\u05D5\u05DC\u05DD",
"chat.sending": "\u05E9\u05D5\u05DC\u05D7",
"chat.delivered": "\u05E0\u05DE\u05E1\u05E8\u05D4",
"chat.notSent": "\u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7\u05D4",
"chat.notSentReason": "\u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7\u05D4 - \u05D4\u05E2\u05E8\u05D5\u05E5 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D5\u05DB\u05DF. \u05D4\u05EA\u05D7\u05D1\u05E8\u05D5 \u05DE\u05D7\u05D3\u05E9 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05DE\u05E9\u05D9\u05DA.",
"chat.encrypted": "\u05DE\u05D5\u05E6\u05E4\u05E0\u05EA",
"chat.decrypted": "\u05DE\u05E4\u05D5\u05E2\u05E0\u05D7\u05EA",
"chat.encryptedOnDevice": "\u05DE\u05D5\u05E6\u05E4\u05E0\u05EA \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8 \u05E9\u05DC\u05DB\u05DD",
"chat.uploading": "\u05DE\u05E2\u05DC\u05D4",
"chat.downloading": "\u05DE\u05D5\u05E8\u05D9\u05D3",
"chat.transferring": "\u05DE\u05E2\u05D1\u05D9\u05E8\u2026",
"chat.copied": "\u05D4\u05D5\u05E2\u05EA\u05E7!",
"chat.collapse": "\u05DB\u05D9\u05D5\u05D5\u05E5",
"chat.closeMenu": "\u05E1\u05D2\u05D9\u05E8\u05EA \u05D4\u05EA\u05E4\u05E8\u05D9\u05D8",
"chat.newChat": "\u05E6'\u05D0\u05D8 \u05D7\u05D3\u05E9",
"chat.newGroup": "\u05E7\u05D1\u05D5\u05E6\u05D4 \u05D7\u05D3\u05E9\u05D4",
"chat.createGroup": "\u05D9\u05E6\u05D9\u05E8\u05EA \u05E7\u05D1\u05D5\u05E6\u05D4",
"chat.groupChats": "\u05E6'\u05D0\u05D8\u05D9\u05DD \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9\u05D9\u05DD",
"chat.secureChat": "\u05E6'\u05D0\u05D8 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7",
"chat.nameThis": "\u05EA\u05E0\u05D5 \u05E9\u05DD \u05DC\u05E6'\u05D0\u05D8 \u05D4\u05D6\u05D4",
"chat.rename": "\u05E9\u05D9\u05E0\u05D5\u05D9 \u05E9\u05DD \u05D4\u05E6'\u05D0\u05D8 (\u05DE\u05E7\u05D5\u05DE\u05D9 \u05D1\u05DC\u05D1\u05D3)",
"chat.renameHint": "\u05DC\u05D7\u05D9\u05E6\u05D4 \u05DB\u05E4\u05D5\u05DC\u05D4 \u05DC\u05E9\u05D9\u05E0\u05D5\u05D9 \u05D4\u05E9\u05DD",
"chat.localLabel": "\u05EA\u05D5\u05D5\u05D9\u05EA \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \xB7 \u05E0\u05E9\u05DE\u05E8\u05EA \u05E8\u05E7 \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8 \u05D4\u05D6\u05D4",
"chat.setStatus": "\u05E7\u05D1\u05E2\u05D5 \u05D0\u05EA \u05D4\u05E1\u05D8\u05D8\u05D5\u05E1 \u05E9\u05DC\u05DB\u05DD",
"chat.yourStatusPrefix": "\u05D4\u05E1\u05D8\u05D8\u05D5\u05E1 \u05E9\u05DC\u05DB\u05DD - ",
"chat.meshHint": "\u05E2\u05D3 8 \u05E2\u05DE\u05D9\u05EA\u05D9\u05DD \xB7 \u05E8\u05E9\u05EA \u05E2\u05DE\u05D9\u05EA\u05BE\u05DC\u05E2\u05DE\u05D9\u05EA",
"chat.offline": "\u05DC\u05D0 \u05DE\u05E7\u05D5\u05D5\u05DF",
"chat.noNetwork": "\u05D0\u05D9\u05DF \u05E8\u05E9\u05EA \xB7 \u05DE\u05EA\u05D7\u05D1\u05E8 \u05DE\u05D7\u05D3\u05E9",
"chat.startVoiceCall": "\u05D4\u05EA\u05D7\u05D9\u05DC\u05D5 \u05E9\u05D9\u05D7\u05D4 \u05E7\u05D5\u05DC\u05D9\u05EA \u05DE\u05D5\u05E6\u05E4\u05E0\u05EA",
"chat.startVideoCall": "\u05D4\u05EA\u05D7\u05D9\u05DC\u05D5 \u05E9\u05D9\u05D7\u05EA \u05D5\u05D9\u05D3\u05D0\u05D5 \u05DE\u05D5\u05E6\u05E4\u05E0\u05EA",
"chat.verifyForCalls": "\u05D0\u05DE\u05EA\u05D5 \u05D0\u05EA \u05D4\u05D4\u05E4\u05E2\u05DC\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05D0\u05E4\u05E9\u05E8 \u05E9\u05D9\u05D7\u05D5\u05EA",
"chat.e2eeNote": "\u05DB\u05DC \u05D4\u05D5\u05D3\u05E2\u05D4 \u05DE\u05D5\u05E6\u05E4\u05E0\u05EA \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4 \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8 \u05E9\u05DC\u05DB\u05DD \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D4\u05D9\u05D0 \u05D9\u05D5\u05E6\u05D0\u05EA.",
"chat.peersOnly": "\u05E0\u05E9\u05DC\u05D7\u05EA \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4 \u05E8\u05E7 \u05DC\u05E2\u05DE\u05D9\u05EA\u05D9\u05DD \u05DE\u05D7\u05D5\u05D1\u05E8\u05D9\u05DD - \u05DC\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05E0\u05E9\u05DE\u05E8\u05EA \u05D1\u05E9\u05E8\u05EA.",
"flow.invitationCreated": "\u05E0\u05D5\u05E6\u05E8\u05D4 \u05D4\u05D6\u05DE\u05E0\u05D4 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u05EA",
"flow.invitationCreatedBang": "\u05E0\u05D5\u05E6\u05E8\u05D4 \u05D4\u05D6\u05DE\u05E0\u05D4 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u05EA \u05D5\u05DE\u05D5\u05E6\u05E4\u05E0\u05EA!",
"flow.responseCreated": "\u05E0\u05D5\u05E6\u05E8\u05D4 \u05EA\u05E9\u05D5\u05D1\u05D4 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u05EA",
"flow.responseCreatedBang": "\u05E0\u05D5\u05E6\u05E8\u05D4 \u05EA\u05E9\u05D5\u05D1\u05D4 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u05EA!",
"flow.sendInvitation": "\u05E9\u05DC\u05D7\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D4\u05D6\u05DE\u05E0\u05D4 \u05DC\u05D1\u05DF \u05E9\u05D9\u05D7\u05DB\u05DD \u05D1\u05E2\u05E8\u05D5\u05E5 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 (\u05E9\u05D9\u05D7\u05D4 \u05E7\u05D5\u05DC\u05D9\u05EA, SMS \u05D5\u05DB\u05D3\u05D5\u05DE\u05D4).",
"flow.sendResponse": "\u05E9\u05DC\u05D7\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05DC\u05D9\u05D5\u05D6\u05DD \u05D1\u05E2\u05E8\u05D5\u05E5 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05D0\u05D5 \u05EA\u05E0\u05D5 \u05DC\u05D5 \u05DC\u05E1\u05E8\u05D5\u05E7 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4-QR \u05DC\u05DE\u05D8\u05D4.",
"flow.sendEncryptedCode": "\u05E9\u05DC\u05D7\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05D4\u05DE\u05D5\u05E6\u05E4\u05DF",
"flow.sendTheResponse": "\u05E9\u05DC\u05D7\u05D5 \u05D0\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4",
"flow.pasteOrWrite": "\u05D4\u05D3\u05D1\u05D9\u05E7\u05D5 \u05D0\u05D5 \u05DB\u05EA\u05D1\u05D5 \u05E7\u05D5\u05D3\u2026",
"flow.processingInvitation": "\u05DE\u05E2\u05D1\u05D3 \u05D0\u05EA \u05D4\u05D4\u05D6\u05DE\u05E0\u05D4 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u05EA...",
"flow.processingResponse": "\u05DE\u05E2\u05D1\u05D3 \u05D0\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u05EA...",
"flow.finalizing": "\u05DE\u05E9\u05DC\u05D9\u05DD \u05D0\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7...",
"flow.channelEstablished": "\u05D4\u05E2\u05E8\u05D5\u05E5 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05D4\u05D5\u05E7\u05DD",
"flow.channelReady": "\u05D4\u05E2\u05E8\u05D5\u05E5 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05DE\u05D5\u05DB\u05DF",
"flow.restoring": "\u05DE\u05E9\u05D7\u05D6\u05E8 \u05D0\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8\u2026",
"flow.invitationCaptured": "\u05D4\u05D4\u05D6\u05DE\u05E0\u05D4 \u05E0\u05E7\u05DC\u05D8\u05D4.",
"err.needInvitation": "\u05E2\u05DC\u05D9\u05DB\u05DD \u05DC\u05D4\u05D3\u05D1\u05D9\u05E7 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D4\u05D6\u05DE\u05E0\u05D4 \u05DE\u05D1\u05DF \u05E9\u05D9\u05D7\u05DB\u05DD.",
"err.needResponse": "\u05E2\u05DC\u05D9\u05DB\u05DD \u05DC\u05D4\u05D3\u05D1\u05D9\u05E7 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05DE\u05D1\u05DF \u05E9\u05D9\u05D7\u05DB\u05DD.",
"err.responseFormat": "\u05DE\u05D1\u05E0\u05D4 \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05EA\u05E7\u05D9\u05DF - \u05D1\u05D3\u05E7\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3",
"err.responseNoKey": "\u05E7\u05D5\u05D3 \u05EA\u05E9\u05D5\u05D1\u05D4 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF - \u05DE\u05E4\u05EA\u05D7 \u05E7\u05E8\u05D9\u05E4\u05D8\u05D5\u05D2\u05E8\u05E4\u05D9 \u05D7\u05E1\u05E8 \u05D0\u05D5 \u05E4\u05D2\u05D5\u05DD. \u05D1\u05D3\u05E7\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05D5\u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.",
"err.responseNoSignKey": "\u05E7\u05D5\u05D3 \u05EA\u05E9\u05D5\u05D1\u05D4 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF - \u05D7\u05E1\u05E8 \u05DE\u05E4\u05EA\u05D7 \u05DC\u05D0\u05D9\u05DE\u05D5\u05EA \u05D7\u05EA\u05D9\u05DE\u05D4. \u05D1\u05D3\u05E7\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05D5\u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.",
"err.responseOutdated": "\u05E0\u05EA\u05D5\u05E0\u05D9 \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05DE\u05D9\u05D5\u05E9\u05E0\u05D9\u05DD - \u05D4\u05E9\u05EA\u05DE\u05E9\u05D5 \u05D1\u05D4\u05D6\u05DE\u05E0\u05D4 \u05D7\u05D3\u05E9\u05D4",
"err.setupError": "\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D1\u05D4\u05E7\u05DE\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8",
"err.notReady": "\u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D5\u05DB\u05DF",
"err.securityBreach": "\u05D6\u05D5\u05D4\u05EA\u05D4 \u05E4\u05E8\u05E6\u05EA \u05D0\u05D1\u05D8\u05D7\u05D4 - \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05E0\u05D3\u05D7\u05D4",
"err.securityValidation": "\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05D0\u05D1\u05D8\u05D7\u05D4 \u05E0\u05DB\u05E9\u05DC - \u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05D6\u05D5\u05D4\u05EA\u05D4 \u05D4\u05EA\u05E7\u05E4\u05D4",
"err.retiredQr": "\u05E7\u05D5\u05D3 \u05D4-QR \u05D4\u05D6\u05D4 \u05DE\u05E9\u05EA\u05DE\u05E9 \u05D1\u05E4\u05D5\u05E8\u05DE\u05D8 \u05E9\u05D4\u05D5\u05E6\u05D0 \u05DE\u05E9\u05D9\u05DE\u05D5\u05E9 \u05D5\u05DC\u05D0 \u05D4\u05E6\u05DC\u05D9\u05D7 \u05DC\u05D4\u05E2\u05D1\u05D9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05D6\u05DE\u05E0\u05D4. \u05D1\u05E7\u05E9\u05D5 \u05DE\u05D4\u05E2\u05DE\u05D9\u05EA \u05DC\u05D9\u05E6\u05D5\u05E8 \u05D7\u05D3\u05E9, \u05D0\u05D5 \u05D4\u05E9\u05EA\u05DE\u05E9\u05D5 \u05D1\u05D4\u05E2\u05EA\u05E7\u05D4 \u05D5\u05D4\u05D3\u05D1\u05E7\u05D4.",
"err.compressedQrNote": "\u200FQR \u05D3\u05D7\u05D5\u05E1 \u05E2\u05E9\u05D5\u05D9 \u05DC\u05D4\u05E9\u05DE\u05D9\u05D8 SDP \u05DC\u05E9\u05DD \u05E7\u05D9\u05E6\u05D5\u05E8. \u05D4\u05E9\u05EA\u05DE\u05E9\u05D5 \u05D1\u05D4\u05E2\u05EA\u05E7\u05D4 \u05D5\u05D4\u05D3\u05D1\u05E7\u05D4 \u05D0\u05DD \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05E0\u05DB\u05E9\u05DC.",
"err.inviteNotConnected": "\u05D4\u05D4\u05D6\u05DE\u05E0\u05D4 \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7\u05D4. \u05D4\u05E6'\u05D0\u05D8 \u05D4\u05D6\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D7\u05D5\u05D1\u05E8 \u05DB\u05E8\u05D2\u05E2.",
"err.inviteNotConnectedRetry": "\u05D4\u05D4\u05D6\u05DE\u05E0\u05D4 \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7\u05D4. \u05D4\u05E6'\u05D0\u05D8 \u05D4\u05D6\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D7\u05D5\u05D1\u05E8 \u05DB\u05E8\u05D2\u05E2 - \u05E4\u05EA\u05D7\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05DE\u05D7\u05D3\u05E9 \u05D5\u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.",
"err.nobodyAccepted": "\u05D0\u05D9\u05E9 \u05DC\u05D0 \u05D0\u05D9\u05E9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05D6\u05DE\u05E0\u05D4. \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05DC\u05D0 \u05D4\u05E9\u05EA\u05E0\u05EA\u05D4.",
"err.noAudio": "\u05DC\u05D0 \u05E0\u05E7\u05DC\u05D8 \u05E9\u05DE\u05E2 - \u05D1\u05D3\u05E7\u05D5 \u05D0\u05EA \u05D4\u05E8\u05E9\u05D0\u05EA \u05D4\u05DE\u05D9\u05E7\u05E8\u05D5\u05E4\u05D5\u05DF \u05D5\u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.",
"err.voiceNeedsConnection": "\u05D4\u05D5\u05D3\u05E2\u05D4 \u05E7\u05D5\u05DC\u05D9\u05EA \u05D3\u05D5\u05E8\u05E9\u05EA \u05D7\u05D9\u05D1\u05D5\u05E8 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05E4\u05E2\u05D9\u05DC. \u05D4\u05EA\u05D7\u05D1\u05E8\u05D5 \u05DE\u05D7\u05D3\u05E9 \u05D5\u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.",
"err.voiceRestoring": "\u05DE\u05E9\u05D7\u05D6\u05E8 \u05D0\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 - \u05E0\u05E1\u05D5 \u05DC\u05E9\u05DC\u05D5\u05D7 \u05D0\u05EA \u05D4\u05D4\u05D5\u05D3\u05E2\u05D4 \u05D4\u05E7\u05D5\u05DC\u05D9\u05EA \u05E9\u05D5\u05D1 \u05D1\u05E2\u05D5\u05D3 \u05E8\u05D2\u05E2.",
"err.fileTooLarge": "\u05D4\u05E7\u05D5\u05D1\u05E5 \u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9",
"sas.safetyNumber": "\u05DE\u05E1\u05E4\u05E8 \u05D1\u05D8\u05D9\u05D7\u05D5\u05EA",
"sas.incorrect": "\u05E7\u05D5\u05D3 \u05E9\u05D2\u05D5\u05D9. \u05D1\u05D3\u05E7\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05DE\u05D5\u05DC \u05D4\u05E2\u05DE\u05D9\u05EA \u05D5\u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.",
"sas.noMatch": "\u05D4\u05E7\u05D5\u05D3\u05D9\u05DD \u05D0\u05D9\u05E0\u05DD \u05EA\u05D5\u05D0\u05DE\u05D9\u05DD",
"sas.makeSure": "\u05D5\u05D3\u05D0\u05D5 \u05E9\u05D4\u05E7\u05D5\u05D3\u05D9\u05DD \u05EA\u05D5\u05D0\u05DE\u05D9\u05DD \u05D1\u05DE\u05D3\u05D5\u05D9\u05E7.",
"sas.tooManyAttempts": "\u05D9\u05D5\u05EA\u05E8 \u05DE\u05D3\u05D9 \u05E0\u05D9\u05E1\u05D9\u05D5\u05E0\u05D5\u05EA \u05E9\u05D2\u05D5\u05D9\u05D9\u05DD. \u05D4\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D0\u05D5\u05E4\u05E1\u05D4 \u05DE\u05D8\u05E2\u05DE\u05D9 \u05D1\u05D8\u05D9\u05D7\u05D5\u05EA.",
"sas.verificationFailed": "\u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05E0\u05DB\u05E9\u05DC",
"sas.verified": "\u05DE\u05D0\u05D5\u05DE\u05EA \xB7 \u05E1\u05D5\u05D3\u05D9\u05D5\u05EA \u05E7\u05D3\u05D9\u05DE\u05D4 \u05DE\u05D5\u05E9\u05DC\u05DE\u05EA",
"sas.runVerification": "\u05D4\u05E4\u05E2\u05D9\u05DC\u05D5 \u05D0\u05D9\u05DE\u05D5\u05EA \u05D0\u05D1\u05D8\u05D7\u05D4",
"sec.panelTitle": "\u05E4\u05E8\u05D8\u05D9 \u05E8\u05E9\u05EA \u05D5\u05E7\u05E8\u05D9\u05E4\u05D8\u05D5\u05D2\u05E8\u05E4\u05D9\u05D4",
"sec.security": "\u05D0\u05D1\u05D8\u05D7\u05D4",
"sec.transport": "\u05EA\u05E2\u05D1\u05D5\u05E8\u05D4",
"sec.keyExchange": "\u05D7\u05D9\u05DC\u05D5\u05E4\u05D9 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA",
"sec.allEnabled": "\u05DB\u05DC \u05D9\u05DB\u05D5\u05DC\u05D5\u05EA \u05D4\u05D0\u05D1\u05D8\u05D7\u05D4 \u05DE\u05D5\u05E4\u05E2\u05DC\u05D5\u05EA \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC",
"sec.realTimeNote": "\u05D0\u05D9\u05DE\u05D5\u05EA \u05D1\u05D6\u05DE\u05DF \u05D0\u05DE\u05EA \u05D1\u05E2\u05D6\u05E8\u05EA \u05E4\u05D5\u05E0\u05E7\u05E6\u05D9\u05D5\u05EA \u05E7\u05E8\u05D9\u05E4\u05D8\u05D5\u05D2\u05E8\u05E4\u05D9\u05D5\u05EA \u05D0\u05DE\u05D9\u05EA\u05D9\u05D5\u05EA - \u05D1\u05DC\u05D9 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DE\u05D3\u05D5\u05DE\u05D9\u05DD.",
"sec.simulatedWarning": "\u05D0\u05D6\u05D4\u05E8\u05D4: \u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05DC\u05D0 - \u05D4\u05E2\u05E8\u05DB\u05D9\u05DD \u05E2\u05E9\u05D5\u05D9\u05D9\u05DD \u05DC\u05D4\u05D9\u05D5\u05EA \u05DE\u05D3\u05D5\u05DE\u05D9\u05DD.",
"dl.title": "\u05D4\u05D5\u05E8\u05D3\u05EA SecureBit",
"dl.free": "\u05D7\u05D9\u05E0\u05DD \xB7 \u05E7\u05D5\u05D3 \u05E4\u05EA\u05D5\u05D7",
"dl.soon": "\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D5\u05EA \u05DC\u05E0\u05D9\u05D9\u05D3 (iOS, \u05D0\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9\u05D3) \u05D5\u05D4\u05E8\u05D7\u05D1\u05D5\u05EA \u05D3\u05E4\u05D3\u05E4\u05DF (Chrome, Firefox, Opera) \u05D1\u05E7\u05E8\u05D5\u05D1.",
"chatHdr.chat": "\u05E6'\u05D0\u05D8",
"chatHdr.chats": "\u05E6'\u05D0\u05D8\u05D9\u05DD",
"chatHdr.newChat": "+ \u05D7\u05D3\u05E9",
"chatHdr.secure": "\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7",
"chatHdr.p2pSub": "\u05E2\u05DE\u05D9\u05EA\u05BE\u05DC\u05E2\u05DE\u05D9\u05EA \xB7 \u05DE\u05D5\u05E6\u05E4\u05DF \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4",
"chatHdr.save": "\u05E9\u05DE\u05D9\u05E8\u05D4",
"chatHdr.close": "\u05E1\u05D2\u05D9\u05E8\u05D4",
"chatHdr.expand": "\u05D4\u05D2\u05D3\u05DC\u05D4",
"chatHdr.you": "\u05D0\u05EA\u05DD",
"chatHdr.qrCode": "\u05E7\u05D5\u05D3 QR",
"chat.disconnected": "\u05DE\u05E0\u05D5\u05EA\u05E7",
"call.mute": "\u05D4\u05E9\u05EA\u05E7\u05D4",
"call.endShort": "\u05E1\u05D9\u05D5\u05DD",
"group.add": "\u05D4\u05D5\u05E1\u05E4\u05D4",
"group.send": "\u05E9\u05DC\u05D9\u05D7\u05D4",
"sec.pfsShort": "\u05E1\u05D5\u05D3\u05D9\u05D5\u05EA \u05E7\u05D3\u05D9\u05DE\u05D4 \u05DE\u05D5\u05E9\u05DC\u05DE\u05EA",
"sec.cipher": "\u05E6\u05D5\u05E4\u05DF",
"chat.close": "\u05E1\u05D2\u05D9\u05E8\u05D4",
"file.needConnection": "\u05D4\u05E2\u05D1\u05E8\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD \u05D3\u05D5\u05E8\u05E9\u05EA \u05D7\u05D9\u05D1\u05D5\u05E8 \u05E4\u05EA\u05D5\u05D7",
"presence.available": "\u05D6\u05DE\u05D9\u05DF",
"presence.away": "\u05DE\u05E8\u05D5\u05D7\u05E7",
"presence.busy": "\u05E2\u05E1\u05D5\u05E7",
"presence.offline": "\u05DC\u05D0 \u05DE\u05E7\u05D5\u05D5\u05DF",
"presence.invisible": "\u05D1\u05DC\u05EA\u05D9 \u05E0\u05E8\u05D0\u05D4",
"presence.availableDesc": "\u05DE\u05E7\u05D5\u05D5\u05DF \u05D5\u05D6\u05DE\u05D9\u05DF",
"presence.awayDesc": "\u05DC\u05D0 \u05E4\u05E2\u05D9\u05DC \xB7 \u05D9\u05E6\u05D0 \u05DC\u05E8\u05D2\u05E2",
"presence.busyDesc": "\u05E0\u05D0 \u05DC\u05D0 \u05DC\u05D4\u05E4\u05E8\u05D9\u05E2",
"presence.invisibleDesc": "\u05DE\u05D5\u05E4\u05D9\u05E2 \u05DB\u05DC\u05D0 \u05DE\u05E7\u05D5\u05D5\u05DF \u05DC\u05E2\u05DE\u05D9\u05EA\u05D9\u05DD",
"presence.online": "\u05DE\u05E7\u05D5\u05D5\u05DF",
"conn.p2p": "\u05E2\u05DE\u05D9\u05EA\u05BE\u05DC\u05E2\u05DE\u05D9\u05EA \xB7 \u05DE\u05D7\u05D5\u05D1\u05E8",
"conn.verifying": "\u05DE\u05D0\u05DE\u05EA\u2026",
"conn.connecting": "\u05DE\u05EA\u05D7\u05D1\u05E8\u2026",
"conn.reconnecting": "\u05DE\u05EA\u05D7\u05D1\u05E8 \u05DE\u05D7\u05D3\u05E9\u2026",
"conn.peerDisconnected": "\u05D4\u05E2\u05DE\u05D9\u05EA \u05D4\u05EA\u05E0\u05EA\u05E7",
"conn.disconnected": "\u05DE\u05E0\u05D5\u05EA\u05E7",
"chat.defaultLabel": "\u05E6'\u05D0\u05D8",
"groupPhase.forming": "\u05DE\u05EA\u05D2\u05D1\u05E9\u2026",
"groupPhase.commitments": "\u05DE\u05D7\u05DC\u05D9\u05E3 \u05D4\u05EA\u05D7\u05D9\u05D9\u05D1\u05D5\u05D9\u05D5\u05EA\u2026",
"groupPhase.revealing": "\u05D7\u05D5\u05E9\u05E3\u2026",
"groupPhase.compare": "\u05D4\u05E9\u05D5\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05D4\u05E7\u05D1\u05D5\u05E6\u05EA\u05D9",
"groupPhase.ready": "\u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05DE\u05D5\u05DB\u05E0\u05D4",
"groupPhase.failed": "\u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05E0\u05DB\u05E9\u05DC\u05D4",
"call.qualityGood": "\u05D8\u05D5\u05D1\u05D4",
"call.qualityFair": "\u05E1\u05D1\u05D9\u05E8\u05D4",
"call.qualityWeak": "\u05D7\u05DC\u05E9\u05D4",
"msg.code": "\u05E7\u05D5\u05D3",
"msg.timer": "\u05D8\u05D9\u05D9\u05DE\u05E8",
"msg.voice": "\u05E7\u05D5\u05DC",
"msg.play": "\u05E0\u05D2\u05DF",
"msg.sent": "\u05E0\u05E9\u05DC\u05D7\u05D4",
"msg.read": "\u05E0\u05E7\u05E8\u05D0\u05D4",
"report.title": "\u05D0\u05D9\u05DE\u05D5\u05EA \u05D0\u05D1\u05D8\u05D7\u05D4 \u05D1\u05D6\u05DE\u05DF \u05D0\u05DE\u05EA",
"report.active": "\u05E4\u05E2\u05D9\u05DC",
"report.testsPassed": "\u05D1\u05D3\u05D9\u05E7\u05D5\u05EA \u05E9\u05E2\u05D1\u05E8\u05D5",
"report.verifiedAt": "\u05D0\u05D5\u05DE\u05EA \u05D1\u05E9\u05E2\u05D4",
"report.source": "\u05DE\u05E7\u05D5\u05E8",
"secTest.verifyECDHKeyExchange": "\u05D7\u05D9\u05DC\u05D5\u05E4\u05D9 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA ECDH",
"secTest.verifyECDSASignatures": "\u05D7\u05EA\u05D9\u05DE\u05D5\u05EA \u05D3\u05D9\u05D2\u05D9\u05D8\u05DC\u05D9\u05D5\u05EA ECDSA",
"secTest.verifyEncryption": "\u05D4\u05E6\u05E4\u05E0\u05EA AES-GCM",
"secTest.verifyMessageIntegrity": "\u05E9\u05DC\u05DE\u05D5\u05EA \u05D4\u05D4\u05D5\u05D3\u05E2\u05D4",
"secTest.verifyPerfectForwardSecrecy": "\u05E1\u05D5\u05D3\u05D9\u05D5\u05EA \u05E7\u05D3\u05D9\u05DE\u05D4 \u05DE\u05D5\u05E9\u05DC\u05DE\u05EA",
"secTest.verifyPFS": "\u05E1\u05D5\u05D3\u05D9\u05D5\u05EA \u05E7\u05D3\u05D9\u05DE\u05D4 \u05DE\u05D5\u05E9\u05DC\u05DE\u05EA",
"secTest.verifyReplayProtection": "\u05D4\u05D2\u05E0\u05D4 \u05DE\u05E4\u05E0\u05D9 \u05E9\u05D9\u05D3\u05D5\u05E8 \u05D7\u05D5\u05D6\u05E8",
"secTest.verifyDTLSFingerprint": "\u05D8\u05D1\u05D9\u05E2\u05EA \u05D0\u05E6\u05D1\u05E2 DTLS",
"secTest.verifySASVerification": "\u05D0\u05D9\u05DE\u05D5\u05EA SAS",
"secTest.verifyMetadataProtection": "\u05D4\u05D2\u05E0\u05EA \u05DE\u05D8\u05D0\u05BE\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD",
"secTest.verifyTrafficObfuscation": "\u05E2\u05E8\u05E4\u05D5\u05DC \u05EA\u05E2\u05D1\u05D5\u05E8\u05D4",
"secTest.verifyPacketPadding": "\u05E8\u05D9\u05E4\u05D5\u05D3 \u05DE\u05E0\u05D5\u05EA",
"secTest.verifyNestedEncryption": "\u05D4\u05E6\u05E4\u05E0\u05D4 \u05DE\u05E7\u05D5\u05E0\u05E0\u05EA",
"secTest.verifyNonExtractableKeys": "\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05E9\u05D0\u05D9\u05E0\u05DD \u05E0\u05D9\u05EA\u05E0\u05D9\u05DD \u05DC\u05D7\u05D9\u05DC\u05D5\u05E5",
"secTest.verifyRateLimiting": "\u05D4\u05D2\u05D1\u05DC\u05EA \u05E7\u05E6\u05D1",
"secTest.verifyMutualAuth": "\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05D3\u05D3\u05D9",
"secTest.verifyAuthProof": "\u05D4\u05D5\u05DB\u05D7\u05EA \u05D0\u05D9\u05DE\u05D5\u05EA",
"secTest.verifyEnhancedValidation": "\u05D0\u05D9\u05DE\u05D5\u05EA \u05DE\u05D5\u05D2\u05D1\u05E8",
"secTest.verifyAdvancedFeatures": "\u05D9\u05DB\u05D5\u05DC\u05D5\u05EA \u05DE\u05EA\u05E7\u05D3\u05DE\u05D5\u05EA",
"secTest.verifySignature": "\u05D1\u05D3\u05D9\u05E7\u05EA \u05D7\u05EA\u05D9\u05DE\u05D4",
"secDetail.Security system initializing...": "\u05DE\u05E2\u05E8\u05DB\u05EA \u05D4\u05D0\u05D1\u05D8\u05D7\u05D4 \u05DE\u05D0\u05D5\u05EA\u05D7\u05DC\u05EA...",
"secDetail.Nested encryption active": "\u05D4\u05E6\u05E4\u05E0\u05D4 \u05DE\u05E7\u05D5\u05E0\u05E0\u05EA \u05E4\u05E2\u05D9\u05DC\u05D4",
"secDetail.Nested encryption failed": "\u05D4\u05E6\u05E4\u05E0\u05D4 \u05DE\u05E7\u05D5\u05E0\u05E0\u05EA \u05E0\u05DB\u05E9\u05DC\u05D4",
"secDetail.Packet padding active": "\u05E8\u05D9\u05E4\u05D5\u05D3 \u05DE\u05E0\u05D5\u05EA \u05E4\u05E2\u05D9\u05DC",
"secDetail.Packet padding failed": "\u05E8\u05D9\u05E4\u05D5\u05D3 \u05DE\u05E0\u05D5\u05EA \u05E0\u05DB\u05E9\u05DC",
"secDetail.Advanced features active": "\u05D9\u05DB\u05D5\u05DC\u05D5\u05EA \u05DE\u05EA\u05E7\u05D3\u05DE\u05D5\u05EA \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA",
"secDetail.Advanced features failed": "\u05D9\u05DB\u05D5\u05DC\u05D5\u05EA \u05DE\u05EA\u05E7\u05D3\u05DE\u05D5\u05EA \u05E0\u05DB\u05E9\u05DC\u05D5",
"secDetail.No encryption key available": "\u05D0\u05D9\u05DF \u05DE\u05E4\u05EA\u05D7 \u05D4\u05E6\u05E4\u05E0\u05D4 \u05D6\u05DE\u05D9\u05DF",
"secDetail.AES-GCM encryption/decryption working correctly": "\u05D4\u05E6\u05E4\u05E0\u05D4 \u05D5\u05E4\u05E2\u05E0\u05D5\u05D7 AES-GCM \u05E4\u05D5\u05E2\u05DC\u05D9\u05DD \u05DB\u05E9\u05D5\u05E8\u05D4",
"secDetail.No ECDH key pair available": "\u05D0\u05D9\u05DF \u05D6\u05D5\u05D2 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA ECDH \u05D6\u05DE\u05D9\u05DF",
"secDetail.Key derivation failed": "\u05D2\u05D6\u05D9\u05E8\u05EA \u05D4\u05DE\u05E4\u05EA\u05D7 \u05E0\u05DB\u05E9\u05DC\u05D4",
"secDetail.No ECDSA key pair available": "\u05D0\u05D9\u05DF \u05D6\u05D5\u05D2 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA ECDSA \u05D6\u05DE\u05D9\u05DF",
"secDetail.ECDSA digital signatures working correctly": "\u05D7\u05EA\u05D9\u05DE\u05D5\u05EA \u05D3\u05D9\u05D2\u05D9\u05D8\u05DC\u05D9\u05D5\u05EA ECDSA \u05E4\u05D5\u05E2\u05DC\u05D5\u05EA \u05DB\u05E9\u05D5\u05E8\u05D4",
"secDetail.MAC key not available or invalid": "\u05DE\u05E4\u05EA\u05D7 MAC \u05D0\u05D9\u05E0\u05D5 \u05D6\u05DE\u05D9\u05DF \u05D0\u05D5 \u05D0\u05D9\u05E0\u05D5 \u05EA\u05E7\u05D9\u05DF",
"secDetail.Rate limiter did not block a message over the limit": "\u05DE\u05D2\u05D1\u05D9\u05DC \u05D4\u05E7\u05E6\u05D1 \u05DC\u05D0 \u05D7\u05E1\u05DD \u05D4\u05D5\u05D3\u05E2\u05D4 \u05E9\u05D7\u05E8\u05D2\u05D4 \u05DE\u05D4\u05DE\u05D2\u05D1\u05DC\u05D4",
"secDetail.Rate limiter is not available": "\u05DE\u05D2\u05D1\u05D9\u05DC \u05D4\u05E7\u05E6\u05D1 \u05D0\u05D9\u05E0\u05D5 \u05D6\u05DE\u05D9\u05DF",
"secDetail.Replay protection is working correctly": "\u05D4\u05D4\u05D2\u05E0\u05D4 \u05DE\u05E4\u05E0\u05D9 \u05E9\u05D9\u05D3\u05D5\u05E8 \u05D7\u05D5\u05D6\u05E8 \u05E4\u05D5\u05E2\u05DC\u05EA \u05DB\u05E9\u05D5\u05E8\u05D4",
"secDetail.Replay protection not enabled": "\u05D4\u05D4\u05D2\u05E0\u05D4 \u05DE\u05E4\u05E0\u05D9 \u05E9\u05D9\u05D3\u05D5\u05E8 \u05D7\u05D5\u05D6\u05E8 \u05D0\u05D9\u05E0\u05D4 \u05DE\u05D5\u05E4\u05E2\u05DC\u05EA",
"secDetail.SAS code not available": "\u05E7\u05D5\u05D3 SAS \u05D0\u05D9\u05E0\u05D5 \u05D6\u05DE\u05D9\u05DF",
"secDetail.SAS verification code is valid and available": "\u05E7\u05D5\u05D3 \u05D0\u05D9\u05DE\u05D5\u05EA SAS \u05EA\u05E7\u05D9\u05DF \u05D5\u05D6\u05DE\u05D9\u05DF",
"secDetail.Traffic obfuscation is working correctly": "\u05E2\u05E8\u05E4\u05D5\u05DC \u05D4\u05EA\u05E2\u05D1\u05D5\u05E8\u05D4 \u05E4\u05D5\u05E2\u05DC \u05DB\u05E9\u05D5\u05E8\u05D4",
"secDetail.Traffic obfuscation not enabled": "\u05E2\u05E8\u05E4\u05D5\u05DC \u05D4\u05EA\u05E2\u05D1\u05D5\u05E8\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D5\u05E4\u05E2\u05DC",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "\u05D0\u05D9\u05DF \u05D6\u05D5\u05D2 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA ECDH \u05D6\u05DE\u05E0\u05D9 \u05D5\u05D1\u05DC\u05EA\u05D9 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D7\u05D9\u05DC\u05D5\u05E5 \u05DC\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D4\u05D6\u05D5",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "\u05E1\u05D5\u05D3\u05D9\u05D5\u05EA \u05E7\u05D3\u05D9\u05DE\u05D4 \u05D1\u05E8\u05DE\u05EA \u05D4\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D1\u05DC\u05D1\u05D3: \u05D4\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D6\u05DE\u05E0\u05D9\u05D9\u05DD \u05DC\u05DB\u05DC \u05D4\u05E4\u05E2\u05DC\u05D4, \u05D0\u05DA \u05D4-Double Ratchet \u05D0\u05D9\u05E0\u05D5 \u05E4\u05E2\u05D9\u05DC \u05D1\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D4\u05D6\u05D4 (\u05D4\u05E2\u05DE\u05D9\u05EA \u05D1\u05D2\u05E8\u05E1\u05D4 \u05D9\u05E9\u05E0\u05D4), \u05D5\u05DC\u05DB\u05DF \u05DE\u05E4\u05EA\u05D7 \u05D4\u05E4\u05E2\u05DC\u05D4 \u05E9\u05E0\u05D7\u05E9\u05E3 \u05D7\u05D5\u05E9\u05E3 \u05D0\u05EA \u05DB\u05DC \u05D4\u05E9\u05D9\u05D7\u05D4",
"msg.pause": "\u05D4\u05E9\u05D4\u05D9\u05D4",
"msg.failed": "\u05E0\u05DB\u05E9\u05DC\u05D4",
"groupErr.timeout": "\u05D7\u05D1\u05E8 \u05D4\u05E4\u05E1\u05D9\u05E7 \u05DC\u05D4\u05D2\u05D9\u05D1 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D4\u05E7\u05D5\u05D3 \u05D4\u05D9\u05D4 \u05DE\u05D5\u05DB\u05DF.",
"groupErr.keyMismatch": "\u05D4\u05DE\u05E4\u05EA\u05D7 \u05E9\u05DC \u05D7\u05D1\u05E8 \u05DC\u05D0 \u05EA\u05D0\u05DD \u05D0\u05EA \u05D4\u05D6\u05D4\u05D5\u05EA \u05E9\u05E0\u05D8\u05E2\u05E0\u05D4 \u05E2\u05D1\u05D5\u05E8\u05D5.",
"groupErr.revealMismatch": "\u05D4\u05E2\u05E8\u05DA \u05E9\u05D7\u05D1\u05E8 \u05D7\u05E9\u05E3 \u05DC\u05D0 \u05EA\u05D0\u05DD \u05DC\u05DE\u05D4 \u05E9\u05D4\u05EA\u05D7\u05D9\u05D9\u05D1 \u05D0\u05DC\u05D9\u05D5.",
"groupErr.commitChanged": "\u05D7\u05D1\u05E8 \u05E9\u05D9\u05E0\u05D4 \u05D0\u05EA \u05D4\u05D4\u05EA\u05D7\u05D9\u05D9\u05D1\u05D5\u05EA \u05E9\u05DC\u05D5 \u05D1\u05D0\u05DE\u05E6\u05E2.",
"groupErr.missingKey": "\u05E0\u05DB\u05DC\u05DC \u05D7\u05D1\u05E8 \u05E9\u05D4\u05DE\u05E4\u05EA\u05D7 \u05E9\u05DC\u05D5 \u05DE\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05D4\u05D2\u05D9\u05E2.",
"groupErr.outsider": "\u05D4\u05D2\u05D9\u05E2 \u05E4\u05E8\u05D9\u05D9\u05DD \u05DE\u05DE\u05D9\u05E9\u05D4\u05D5 \u05DE\u05D7\u05D5\u05E5 \u05DC\u05E7\u05D1\u05D5\u05E6\u05D4.",
"groupErr.limit": "\u05E7\u05D1\u05D5\u05E6\u05D4 \u05DE\u05D5\u05D2\u05D1\u05DC\u05EA \u05DC\u05E9\u05DE\u05D5\u05E0\u05D4 \u05D7\u05D1\u05E8\u05D9\u05DD.",
"groupErr.tooLarge": "\u05D4\u05D4\u05D5\u05D3\u05E2\u05D4 \u05D4\u05D9\u05D9\u05EA\u05D4 \u05D2\u05D3\u05D5\u05DC\u05D4 \u05DE\u05D3\u05D9 \u05DC\u05E9\u05DC\u05D9\u05D7\u05D4 \u05DC\u05E7\u05D1\u05D5\u05E6\u05D4.",
"fileType.text": "\u05D8\u05E7\u05E1\u05D8 \u05E8\u05D2\u05D9\u05DC",
"fileType.images": "\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA",
"fileType.archives": "\u05D0\u05E8\u05DB\u05D9\u05D5\u05E0\u05D9\u05DD",
"fileType.voice": "\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E7\u05D5\u05DC\u05D9\u05D5\u05EA",
"fileType.unsupported": "\u05DC\u05D0 \u05E0\u05EA\u05DE\u05DA",
"qrScan.title": "\u05E1\u05E8\u05D9\u05E7\u05EA \u05E7\u05D5\u05D3 QR",
"qrScan.auto": "\u05DE\u05E6\u05D1 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9",
"qrScan.reset": "\u05D0\u05D9\u05E4\u05D5\u05E1",
"qrScan.autoScroll": "\u05D2\u05DC\u05D9\u05DC\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA \u05DE\u05D5\u05E4\u05E2\u05DC\u05EA",
"qrScan.starting": "\u05DE\u05E4\u05E2\u05D9\u05DC \u05D0\u05EA \u05D4\u05DE\u05E6\u05DC\u05DE\u05D4...",
"qrScan.point": "\u05DB\u05D5\u05D5\u05E0\u05D5 \u05D0\u05EA \u05D4\u05DE\u05E6\u05DC\u05DE\u05D4 \u05DC\u05E7\u05D5\u05D3 \u05D4-QR",
"qrScan.tapFocus": "\u05D4\u05E7\u05D9\u05E9\u05D5 \u05E2\u05DC \u05D4\u05DE\u05E1\u05DA \u05DC\u05DE\u05D9\u05E7\u05D5\u05D3",
"qrScan.focusing": "\u05DE\u05DE\u05E7\u05D3...",
"iceErr.notArray": "\u05E8\u05E9\u05D9\u05DE\u05EA \u05D4\u05E9\u05E8\u05EA\u05D9\u05DD \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05D9\u05D5\u05EA \u05DE\u05E2\u05E8\u05DA",
"iceErr.invalidJson": "\u200FJSON \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF",
"iceErr.tooMany": "\u05D9\u05D5\u05EA\u05E8 \u05DE\u05D3\u05D9 \u05E9\u05E8\u05EA\u05D9\u05DD (\u05DE\u05E7\u05E1\u05D9\u05DE\u05D5\u05DD {max})",
"iceErr.invalidEntry": "{label}: \u05E8\u05E9\u05D5\u05DE\u05D4 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05E0\u05D4",
"iceErr.urlCount": "{label}: \u05E0\u05D3\u05E8\u05E9\u05D5\u05EA \u05D1\u05D9\u05DF 1 \u05DC-{max} \u05DB\u05EA\u05D5\u05D1\u05D5\u05EA",
"iceErr.turnCreds": "{label}: \u05E9\u05E8\u05EA\u05D9 TURN \u05D3\u05D5\u05E8\u05E9\u05D9\u05DD \u05D1\u05D3\u05E8\u05DA \u05DB\u05DC\u05DC \u05E9\u05DD \u05DE\u05E9\u05EA\u05DE\u05E9 \u05D5\u05D0\u05D9\u05E9\u05D5\u05E8",
"iceUrl.notString": "\u05D4\u05DB\u05EA\u05D5\u05D1\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05D9\u05D5\u05EA \u05DE\u05D7\u05E8\u05D5\u05D6\u05EA",
"iceUrl.empty": "\u05D4\u05DB\u05EA\u05D5\u05D1\u05EA \u05E8\u05D9\u05E7\u05D4",
"iceUrl.tooLong": "\u05D4\u05DB\u05EA\u05D5\u05D1\u05EA \u05D0\u05E8\u05D5\u05DB\u05D4 \u05DE\u05D3\u05D9",
"iceUrl.badChars": "\u05D4\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05DB\u05D9\u05DC\u05D4 \u05EA\u05D5\u05D5\u05D9\u05DD \u05DC\u05D0 \u05EA\u05E7\u05D9\u05E0\u05D9\u05DD",
"iceUrl.badScheme": "\u05D4\u05DB\u05EA\u05D5\u05D1\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05EA\u05D7\u05D9\u05DC \u05D1-stun:\u200F, stuns:\u200F, turn: \u05D0\u05D5 turns:",
"iceUrl.badQuery": "\u05DC\u05DB\u05EA\u05D5\u05D1\u05EA \u05D9\u05E9 \u05E9\u05D0\u05D9\u05DC\u05EA\u05D4 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05E0\u05D4",
"iceUrl.noHost": "\u05DC\u05DB\u05EA\u05D5\u05D1\u05EA \u05D7\u05E1\u05E8 \u05DE\u05D0\u05E8\u05D7",
"iceUrl.badHost": "\u05DC\u05DB\u05EA\u05D5\u05D1\u05EA \u05D9\u05E9 \u05DE\u05D0\u05E8\u05D7 \u05D0\u05D5 \u05E4\u05D5\u05E8\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF",
"iceUrl.badTransport": "\u05E9\u05D0\u05D9\u05DC\u05EA\u05EA \u05D4\u05DB\u05EA\u05D5\u05D1\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05D9\u05D5\u05EA transport=udp \u05D0\u05D5 transport=tcp",
"msg.off": "\u05DB\u05D1\u05D5\u05D9",
"file.consentUnavailable": "\u05D4\u05E1\u05DB\u05DE\u05EA \u05D4\u05DE\u05E9\u05EA\u05DE\u05E9 \u05D0\u05D9\u05E0\u05D4 \u05D6\u05DE\u05D9\u05E0\u05D4",
"secLevel.MAXIMUM": "\u05DE\u05E8\u05D1\u05D9",
"secLevel.INITIALIZING": "\u05DE\u05D0\u05EA\u05D7\u05DC",
"secLevel.ERROR": "\u05E9\u05D2\u05D9\u05D0\u05D4",
"secLevel.UNKNOWN": "\u05DC\u05D0 \u05D9\u05D3\u05D5\u05E2",
"status.error": "\u05E9\u05D2\u05D9\u05D0\u05D4",
"offline.disconnect": "\u05E0\u05D9\u05EA\u05D5\u05E7",
"offline.learnMore": "\u05DE\u05D9\u05D3\u05E2 \u05E0\u05D5\u05E1\u05E3",
"pwa.installApp": "\u05D4\u05EA\u05E7\u05E0\u05EA \u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4",
"chat.onWeb": "\u05D0\u05EA\u05DD \u05D1\u05D2\u05E8\u05E1\u05EA \u05D4\u05D5\u05D5\u05D1",
"groupCall.startVoice": "\u05D4\u05EA\u05D7\u05DC\u05EA \u05E9\u05D9\u05D7\u05D4 \u05E7\u05D5\u05DC\u05D9\u05EA \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9\u05EA",
"groupCall.startVideo": "\u05D4\u05EA\u05D7\u05DC\u05EA \u05E9\u05D9\u05D7\u05EA \u05D5\u05D9\u05D3\u05D0\u05D5 \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9\u05EA",
"groupCall.join": "\u05D4\u05E6\u05D8\u05E8\u05E4\u05D5\u05EA",
"groupCall.dismiss": "\u05DC\u05D0 \u05E2\u05DB\u05E9\u05D9\u05D5",
"groupCall.leave": "\u05D9\u05E6\u05D9\u05D0\u05D4 \u05DE\u05D4\u05E9\u05D9\u05D7\u05D4",
"groupCall.you": "\u05D0\u05EA/\u05D4",
"groupCall.connecting": "\u05DE\u05EA\u05D7\u05D1\u05E8\u2026",
"groupCall.waitingLink": "\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05E7\u05D9\u05E9\u05D5\u05E8 \u05D9\u05E9\u05D9\u05E8\u2026",
"groupCall.legFailed": "\u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05E0\u05DB\u05E9\u05DC\u05D4",
"groupCall.startedVoice": "{name} \u05D4\u05EA\u05D7\u05D9\u05DC \u05E9\u05D9\u05D7\u05D4 \u05E7\u05D5\u05DC\u05D9\u05EA",
"groupCall.startedVideo": "{name} \u05D4\u05EA\u05D7\u05D9\u05DC \u05E9\u05D9\u05D7\u05EA \u05D5\u05D9\u05D3\u05D0\u05D5",
"groupCall.inCall": "{count} \u05D1\u05E9\u05D9\u05D7\u05D4",
"groupCall.err.permission_denied": "\u05D4\u05E9\u05D9\u05D7\u05D4 \u05DC\u05D0 \u05D4\u05EA\u05D7\u05D9\u05DC\u05D4 - \u05D4\u05D2\u05D9\u05E9\u05D4 \u05DC\u05DE\u05D9\u05E7\u05E8\u05D5\u05E4\u05D5\u05DF \u05D5\u05DC\u05DE\u05E6\u05DC\u05DE\u05D4 \u05D7\u05E1\u05D5\u05DE\u05D4. \u05D0\u05E4\u05E9\u05E8\u05D5 \u05D0\u05D5\u05EA\u05D4 \u05DC\u05D0\u05EA\u05E8 \u05D4\u05D6\u05D4 \u05D5\u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.",
"groupCall.err.device_not_found": "\u05D4\u05E9\u05D9\u05D7\u05D4 \u05DC\u05D0 \u05D4\u05EA\u05D7\u05D9\u05DC\u05D4 - \u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0 \u05DE\u05D9\u05E7\u05E8\u05D5\u05E4\u05D5\u05DF \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8 \u05D4\u05D6\u05D4.",
"groupCall.err.device_busy": "\u05D4\u05E9\u05D9\u05D7\u05D4 \u05DC\u05D0 \u05D4\u05EA\u05D7\u05D9\u05DC\u05D4 - \u05D4\u05DE\u05D9\u05E7\u05E8\u05D5\u05E4\u05D5\u05DF \u05D1\u05E9\u05D9\u05DE\u05D5\u05E9 \u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05D0\u05D7\u05E8\u05EA. \u05E1\u05D2\u05E8\u05D5 \u05D0\u05D5\u05EA\u05D4 \u05D5\u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.",
"groupCall.err.media_failed": "\u05D4\u05E9\u05D9\u05D7\u05D4 \u05DC\u05D0 \u05D4\u05EA\u05D7\u05D9\u05DC\u05D4 - \u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E4\u05EA\u05D5\u05D7 \u05D0\u05EA \u05D4\u05DE\u05D9\u05E7\u05E8\u05D5\u05E4\u05D5\u05DF.",
"groupCall.err.call_in_progress": "\u05DB\u05D1\u05E8 \u05DE\u05EA\u05E7\u05D9\u05D9\u05DE\u05EA \u05E9\u05D9\u05D7\u05D4 \u05D1\u05E7\u05D1\u05D5\u05E6\u05D4 \u05D4\u05D6\u05D5. \u05D4\u05E6\u05D8\u05E8\u05E4\u05D5 \u05D0\u05DC\u05D9\u05D4 \u05D1\u05DE\u05E7\u05D5\u05DD \u05DC\u05D4\u05EA\u05D7\u05D9\u05DC \u05D0\u05D7\u05EA \u05D7\u05D3\u05E9\u05D4.",
"groupCall.err.not_ready": "\u05D0\u05E9\u05E8\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D9\u05D7\u05D4.",
"groupCall.speaking": "{name} \u05DE\u05D3\u05D1\u05E8/\u05EA",
"groupCall.pin": "\u05D4\u05E6\u05D2\u05EA {name} \u05D1\u05D2\u05D3\u05D5\u05DC",
"groupCall.unpin": "\u05D7\u05D6\u05E8\u05D4 \u05DC\u05DB\u05D5\u05DC\u05DD",
"groupCall.showEveryone": "\u05DB\u05D5\u05DC\u05DD",
"msg.after5s": "5 \u05E9\u05E0\u05D9\u05D5\u05EA \u05D0\u05D7\u05E8\u05D9 \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4",
"msg.after15s": "15 \u05E9\u05E0\u05D9\u05D5\u05EA \u05D0\u05D7\u05E8\u05D9 \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4",
"msg.after30s": "30 \u05E9\u05E0\u05D9\u05D5\u05EA \u05D0\u05D7\u05E8\u05D9 \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4",
"msg.after1m": "\u05D3\u05E7\u05D4 \u05D0\u05D7\u05E8\u05D9 \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4",
"msg.sec30": "30 \u05E9\u05E0\u05D9\u05D5\u05EA",
"msg.min5": "5 \u05D3\u05E7\u05D5\u05EA",
"msg.hour1": "\u05E9\u05E2\u05D4",
"desktop.shareDesc": "\u05E9\u05DC\u05D7\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05DC\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9. \u05D4\u05D5\u05D0 \u05D7\u05D3-\u05E4\u05E2\u05DE\u05D9 \u05D5\u05E4\u05D2 \u05D1\u05DE\u05D4\u05D9\u05E8\u05D5\u05EA.",
"desktop.invitationCreated": "\u05D4\u05D6\u05DE\u05E0\u05D4 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u05EA \u05E0\u05D5\u05E6\u05E8\u05D4 - \u05E9\u05DC\u05D7\u05D5 \u05D0\u05D5\u05EA\u05D4 \u05DC\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9.",
"desktop.joinDesc": "\u05D4\u05D3\u05D1\u05D9\u05E7\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D4\u05D6\u05DE\u05E0\u05D4 \u05E9\u05DC \u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05DB\u05D3\u05D9 \u05DC\u05D1\u05E0\u05D5\u05EA \u05D0\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u05EA \u05E9\u05DC\u05DB\u05DD.",
"desktop.offerTag": "\u05D4\u05D6\u05DE\u05E0\u05D4 \xB7 \u05D4\u05E2\u05EA\u05E7\u05EA \u05D8\u05E7\u05E1\u05D8",
"desktop.answerTag": "\u05EA\u05E9\u05D5\u05D1\u05D4 \xB7 \u05D4\u05E2\u05EA\u05E7\u05EA \u05D8\u05E7\u05E1\u05D8",
"desktop.offerPlaceholder": "\u05E7\u05D5\u05D3 \u05D4\u05D4\u05D6\u05DE\u05E0\u05D4 \u05D9\u05D5\u05E4\u05D9\u05E2 \u05DB\u05D0\u05DF\u2026",
"desktop.answerPlaceholder": "\u05E7\u05D5\u05D3 \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05D9\u05D5\u05E4\u05D9\u05E2 \u05DB\u05D0\u05DF\u2026",
"desktop.backToChats": "\u05D7\u05D6\u05E8\u05D4 \u05DC\u05E6\u05F3\u05D0\u05D8\u05D9\u05DD",
"desktop.sendFeedback": "\u05E9\u05DC\u05D9\u05D7\u05EA \u05DE\u05E9\u05D5\u05D1",
"desktop.callsNeedVerified": "\u05E9\u05D9\u05D7\u05D5\u05EA \u05D3\u05D5\u05E8\u05E9\u05D5\u05EA \u05E2\u05E8\u05D5\u05E5 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05DE\u05D0\u05D5\u05DE\u05EA.",
"desktop.noOpenChannel": "\u05D0\u05D9\u05DF \u05E2\u05E8\u05D5\u05E5 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05E4\u05EA\u05D5\u05D7.",
"desktop.chatCarriesCall": "\u05D4\u05E6\u05F3\u05D0\u05D8 \u05D4\u05D6\u05D4 \u05E0\u05D5\u05E9\u05D0 \u05E9\u05D9\u05D7\u05D4 \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9\u05EA. \u05E6\u05D0\u05D5 \u05DE\u05D4\u05E9\u05D9\u05D7\u05D4 \u05D4\u05E7\u05D1\u05D5\u05E6\u05EA\u05D9\u05EA \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D9\u05D7\u05D4 \u05D0\u05D7\u05D3-\u05E2\u05DC-\u05D0\u05D7\u05D3.",
"desktop.err.permission_denied": "\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05EA\u05D7\u05D9\u05DC \u05D0\u05EA \u05D4\u05E9\u05D9\u05D7\u05D4 - \u05D4\u05D2\u05D9\u05E9\u05D4 \u05DC\u05DE\u05D9\u05E7\u05E8\u05D5\u05E4\u05D5\u05DF \u05D5\u05DC\u05DE\u05E6\u05DC\u05DE\u05D4 \u05D7\u05E1\u05D5\u05DE\u05D4. \u05D0\u05E4\u05E9\u05E8\u05D5 \u05D0\u05D5\u05EA\u05D4 \u05D1\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D4\u05DE\u05E2\u05E8\u05DB\u05EA \u05D5\u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.",
"desktop.language": "\u05E9\u05E4\u05D4",
"desktop.languageHint": "\u05D7\u05DC \u05DE\u05D9\u05D3. \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E9\u05DB\u05D1\u05E8 \u05E0\u05E9\u05DC\u05D7\u05D5 \u05E0\u05E9\u05D0\u05E8\u05D5\u05EA \u05D1\u05DE\u05D9\u05DC\u05D9\u05DD \u05E9\u05D1\u05D4\u05DF \u05E0\u05DB\u05EA\u05D1\u05D5.",
"desktop.compareCode": "\u05D4\u05E9\u05D5\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05E2\u05DD \u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05D5\u05D0\u05E9\u05E8\u05D5 \u05D0\u05DD \u05D4\u05D5\u05D0 \u05EA\u05D5\u05D0\u05DD.",
"desktop.verifyBeforeFiles": "\u05D4\u05E9\u05DC\u05D9\u05DE\u05D5 \u05D0\u05EA \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05DC\u05E4\u05E0\u05D9 \u05E9\u05DC\u05D9\u05D7\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD.",
"desktop.verifyBeforeSending": "\u05D4\u05E9\u05DC\u05D9\u05DE\u05D5 \u05D0\u05EA \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05DC\u05E4\u05E0\u05D9 \u05E9\u05DC\u05D9\u05D7\u05EA \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA.",
"desktop.disconnectedByBackend": "\u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05E0\u05E1\u05D2\u05E8 \u05D1\u05D1\u05D8\u05D7\u05D4.",
"desktop.restoreFailed": "\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E9\u05D7\u05D6\u05E8 \u05D0\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8. \u05D4\u05E6\u05F3\u05D0\u05D8 \u05D4\u05D6\u05D4 \u05E0\u05E1\u05D2\u05E8.",
"desktop.channelNotReady": "\u05E2\u05E8\u05D5\u05E5 \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05D9\u05E0\u05D5 \u05D6\u05DE\u05D9\u05DF. \u05D4\u05DE\u05EA\u05D9\u05E0\u05D5 \u05E2\u05D3 \u05E9\u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D9\u05D9\u05D5\u05D5\u05E6\u05E8.",
"desktop.enterCode": "\u05D4\u05D6\u05D9\u05E0\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05DC\u05D0\u05D9\u05E9\u05D5\u05E8.",
"desktop.noOffer": "\u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0\u05D4 \u05D4\u05D6\u05DE\u05E0\u05D4. \u05E6\u05E8\u05D5 \u05D0\u05D7\u05EA \u05E7\u05D5\u05D3\u05DD.",
"desktop.notInitiator": "\u05DC\u05D0 \u05D0\u05EA\u05DD \u05D9\u05E6\u05E8\u05EA\u05DD \u05D0\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D4\u05D6\u05D4, \u05D5\u05DC\u05DB\u05DF \u05D0\u05D9\u05DF \u05EA\u05E9\u05D5\u05D1\u05D4 \u05DC\u05D4\u05D7\u05D9\u05DC.",
"desktop.decryptFailed": "\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E4\u05E2\u05E0\u05D7 \u05D4\u05D5\u05D3\u05E2\u05D4 \u05D5\u05D4\u05D9\u05D0 \u05E0\u05D6\u05E8\u05E7\u05D4.",
"desktop.badMessageFormat": "\u05D4\u05D2\u05D9\u05E2\u05D4 \u05DE\u05E1\u05D2\u05E8\u05EA \u05E4\u05D2\u05D5\u05DE\u05D4 \u05D5\u05D4\u05D9\u05D0 \u05E0\u05D6\u05E8\u05E7\u05D4.",
"desktop.notSentNotReady": "\u05D4\u05D4\u05D5\u05D3\u05E2\u05D4 \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7\u05D4: \u05D4\u05E2\u05E8\u05D5\u05E5 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D5\u05DB\u05DF. \u05D4\u05DE\u05EA\u05D9\u05E0\u05D5 \u05DC\u05E1\u05D9\u05D5\u05DD \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05D0\u05D5 \u05D4\u05EA\u05D7\u05D1\u05E8\u05D5 \u05DE\u05D7\u05D3\u05E9.",
"desktop.micDenied": "\u05D4\u05D2\u05D9\u05E9\u05D4 \u05DC\u05DE\u05D9\u05E7\u05E8\u05D5\u05E4\u05D5\u05DF \u05E0\u05D3\u05D7\u05EA\u05D4.",
"desktop.noChannelWait": "\u05D0\u05D9\u05DF \u05E2\u05E8\u05D5\u05E5 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05E4\u05EA\u05D5\u05D7 - \u05D4\u05DE\u05EA\u05D9\u05E0\u05D5 \u05E2\u05D3 \u05E9\u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D9\u05D9\u05D5\u05D5\u05E6\u05E8.",
"desktop.sasFailed": "\u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05E0\u05DB\u05E9\u05DC. \u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05D9\u05E9 \u05DE\u05EA\u05D5\u05D5\u05DA, \u05D5\u05DC\u05DB\u05DF \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D1\u05D5\u05D8\u05DC.",
"desktop.sasOk": "\u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05E6\u05DC\u05D9\u05D7. \u05D4\u05E2\u05E8\u05D5\u05E5 \u05D4\u05D6\u05D4 \u05DE\u05D0\u05D5\u05DE\u05EA \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4.",
"desktop.iceForgotten": "\u05D4\u05E9\u05E8\u05EA\u05D9\u05DD \u05D4\u05E9\u05DE\u05D5\u05E8\u05D9\u05DD \u05E0\u05E9\u05DB\u05D7\u05D5. \u05E0\u05E2\u05E9\u05D4 \u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1\u05E9\u05E8\u05EA\u05D9 ICE \u05E6\u05D9\u05D1\u05D5\u05E8\u05D9\u05D9\u05DD.",
"desktop.icePublic": "\u05E0\u05E2\u05E9\u05D4 \u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1\u05E9\u05E8\u05EA\u05D9 ICE \u05E6\u05D9\u05D1\u05D5\u05E8\u05D9\u05D9\u05DD.",
"desktop.verificationInProgress": "\u05D1\u05D3\u05D9\u05E7\u05EA \u05D4\u05D0\u05D1\u05D8\u05D7\u05D4 \u05E2\u05D3\u05D9\u05D9\u05DF \u05E4\u05D5\u05E2\u05DC\u05EA. \u05D4\u05DE\u05EA\u05D9\u05E0\u05D5 \u05DC\u05E1\u05D9\u05D5\u05DE\u05D4.",
"desktop.fileGone": "\u05D4\u05E7\u05D5\u05D1\u05E5 \u05D4\u05D6\u05D4 \u05DB\u05D1\u05E8 \u05D0\u05D9\u05E0\u05D5 \u05D6\u05DE\u05D9\u05DF \u05DC\u05D4\u05D5\u05E8\u05D3\u05D4.",
"desktop.codeMismatch": "\u05E7\u05D5\u05D3\u05D9 \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05D0\u05D9\u05E0\u05DD \u05EA\u05D5\u05D0\u05DE\u05D9\u05DD. \u05DE\u05EA\u05E0\u05EA\u05E7\u05D9\u05DD \u05DC\u05DE\u05E2\u05DF \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA.",
"desktop.noLocalCode": "\u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05E0\u05DB\u05E9\u05DC: \u05D0\u05D9\u05DF \u05E7\u05D5\u05D3 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05DC\u05D4\u05E9\u05D5\u05D5\u05D0\u05D4. \u05DE\u05EA\u05E0\u05EA\u05E7\u05D9\u05DD \u05DC\u05DE\u05E2\u05DF \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA.",
"desktop.protocolViolation": "\u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05D8\u05E2\u05DF \u05E9\u05D4\u05E7\u05D5\u05D3 \u05D0\u05D5\u05E9\u05E8 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D0\u05D9\u05E9\u05E8\u05EA\u05DD \u05D0\u05D5\u05EA\u05D5. \u05DE\u05EA\u05E0\u05EA\u05E7\u05D9\u05DD \u05DC\u05DE\u05E2\u05DF \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA.",
"desktop.verificationRejected": "\u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05E0\u05D3\u05D7\u05D4. \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D1\u05D5\u05D8\u05DC \u05DC\u05DE\u05E2\u05DF \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA.",
"secLevel.HIGH": "\u05D2\u05D1\u05D5\u05D4\u05D4",
"secLevel.MEDIUM": "\u05D1\u05D9\u05E0\u05D5\u05E0\u05D9\u05EA",
"secLevel.LOW": "\u05E0\u05DE\u05D5\u05DB\u05D4",
"desktop.rerun": "\u05D1\u05D3\u05D9\u05E7\u05D4 \u05D7\u05D5\u05D6\u05E8\u05EA",
"desktop.ice.customDesc": "\u05E2\u05D3 {max} \u05E9\u05E8\u05EA\u05D9\u05DD, \u05DB\u05EA\u05D5\u05D1\u05EA \u05D0\u05D7\u05EA \u05D1\u05DB\u05DC \u05E9\u05D5\u05E8\u05D4 \u05D0\u05D5 JSON.",
"desktop.ice.persistDesc": "\u05E0\u05E9\u05DE\u05E8 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8 \u05D4\u05D6\u05D4. \u05D4\u05E9\u05D0\u05D9\u05E8\u05D5 \u05DB\u05D1\u05D5\u05D9 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05E9\u05EA\u05DE\u05E9 \u05E8\u05E7 \u05D1\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9\u05EA.",
"desktop.group.leaveNote": "\u05DC\u05E9\u05D0\u05E8 \u05D4\u05D7\u05D1\u05E8\u05D9\u05DD \u05E0\u05DE\u05E1\u05E8 \u05E9\u05E2\u05D6\u05D1\u05EA\u05DD. \u05D0\u05D7\u05E8 \u05DB\u05DA \u05DC\u05D0 \u05E0\u05E9\u05D0\u05E8 \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8 \u05D4\u05D6\u05D4 \u05D3\u05D1\u05E8 \u05DE\u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 - \u05D0\u05D9\u05DF \u05E9\u05E8\u05EA \u05E9\u05DE\u05D7\u05D6\u05D9\u05E7 \u05E2\u05D5\u05EA\u05E7 \u05DC\u05D7\u05D6\u05D5\u05E8 \u05D0\u05DC\u05D9\u05D5, \u05D5\u05DC\u05DB\u05DF \u05EA\u05D9\u05D3\u05E8\u05E9 \u05D4\u05D6\u05DE\u05E0\u05D4 \u05D7\u05D3\u05E9\u05D4.",
"desktop.sec.ecdsaOk": "\u05D7\u05EA\u05D9\u05DE\u05EA \u05D7\u05D1\u05D9\u05DC\u05EA \u05D4\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05E9\u05DC \u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05D0\u05D5\u05DE\u05EA\u05D4 \u05D1\u05DC\u05D7\u05D9\u05E6\u05EA \u05D4\u05D9\u05D3 (ECDSA P-384 / SHA-384)",
"desktop.sec.ecdsaNone": "\u05D0\u05D9\u05DF \u05DC\u05D7\u05D9\u05E6\u05EA \u05D9\u05D3 \u05E9\u05D4\u05D5\u05E9\u05DC\u05DE\u05D4",
"desktop.sec.ecdhOk": "\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D4\u05D4\u05E4\u05E2\u05DC\u05D4 \u05E0\u05D2\u05D6\u05E8\u05D5 \u05DE\u05D4\u05D7\u05DC\u05E4\u05EA ECDH P-384 \u05D7\u05D5\u05DC\u05E4\u05EA \u05D3\u05E8\u05DA HKDF-SHA-256",
"desktop.sec.ecdhNone": "\u05DC\u05D0 \u05E0\u05D2\u05D6\u05E8\u05D5 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D4\u05E4\u05E2\u05DC\u05D4",
"desktop.sec.encryptionOk": "\u05D4\u05E6\u05E4\u05E0\u05D4 \u05D5\u05E4\u05E2\u05E0\u05D5\u05D7 AES-GCM \u05D0\u05D5\u05DE\u05EA\u05D5 \u05D1\u05DC\u05D9\u05D1\u05D4",
"desktop.sec.encryptionNa": "\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05E8\u05D9\u05E5 \u05D0\u05EA \u05D4\u05D1\u05D3\u05D9\u05E7\u05D4 \u05D4\u05E2\u05E6\u05DE\u05D9\u05EA \u05E9\u05DC AES-GCM",
"desktop.sec.integrityOk": "\u05E9\u05DC\u05DE\u05D5\u05EA \u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05D0\u05D5\u05DE\u05EA\u05D4 (\u05D0\u05D9\u05DE\u05D5\u05EA AES-GCM)",
"desktop.sec.integrityNa": "\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05E8\u05D9\u05E5 \u05D0\u05EA \u05D1\u05D3\u05D9\u05E7\u05EA \u05D4\u05E9\u05DC\u05DE\u05D5\u05EA",
"desktop.sec.pfsOk": "Double Ratchet \u05E4\u05E2\u05D9\u05DC - \u05DC\u05DB\u05DC \u05D4\u05D5\u05D3\u05E2\u05D4 \u05DE\u05E4\u05EA\u05D7 \u05DE\u05E9\u05DC\u05D4",
"desktop.sec.pfsNa": "\u05DC\u05D0 \u05E0\u05DE\u05D3\u05D3",
"desktop.sec.replayOk": "\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E9\u05DC \u05D4\u05E8\u05D0\u05E6\u05F3\u05D8 \u05DE\u05D5\u05E9\u05DE\u05D3\u05D9\u05DD \u05E2\u05DD \u05D4\u05E9\u05D9\u05DE\u05D5\u05E9, \u05D5\u05DC\u05DB\u05DF \u05D0\u05D9 \u05D0\u05E4\u05E9\u05E8 \u05DC\u05E9\u05D3\u05E8 \u05DE\u05D7\u05D3\u05E9 \u05DE\u05E1\u05D2\u05E8\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D4",
"desktop.sec.replayNa": "\u05DC\u05D0 \u05E0\u05DE\u05D3\u05D3",
"desktop.sec.dtlsPinned": "\u05D8\u05D1\u05D9\u05E2\u05EA \u05D4\u05D0\u05E6\u05D1\u05E2 DTLS \u05E9\u05DC \u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05DE\u05D5\u05E6\u05DE\u05D3\u05EA: {fp}",
"desktop.sec.dtlsNone": "\u05D0\u05D9\u05DF \u05D8\u05D1\u05D9\u05E2\u05EA \u05D0\u05E6\u05D1\u05E2 DTLS \u05DE\u05E8\u05D5\u05D7\u05E7\u05EA",
"desktop.sec.sasBoth": "\u05E9\u05E0\u05D9 \u05D4\u05E6\u05D3\u05D3\u05D9\u05DD \u05D0\u05D9\u05E9\u05E8\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA \u05DE\u05D7\u05D5\u05E5 \u05DC\u05E2\u05E8\u05D5\u05E5",
"desktop.sec.sasIncomplete": "\u05E7\u05D5\u05D3 \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA \u05DC\u05D0 \u05D0\u05D5\u05E9\u05E8 \u05D1\u05D9\u05D3\u05D9 \u05E9\u05E0\u05D9 \u05D4\u05E6\u05D3\u05D3\u05D9\u05DD",
"desktop.sec.metadataOk": "\u05E0\u05D2\u05D6\u05E8 \u05DE\u05E4\u05EA\u05D7 \u05D9\u05D9\u05E2\u05D5\u05D3\u05D9 \u05DC\u05DE\u05D8\u05D0-\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD (HKDF metadata-protection-v4)",
"desktop.sec.metadataNone": "\u05D0\u05D9\u05DF \u05DE\u05E4\u05EA\u05D7 \u05DE\u05D8\u05D0-\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD",
"desktop.sec.coverOn": "\u05EA\u05E2\u05D1\u05D5\u05E8\u05EA \u05D4\u05E1\u05D5\u05D5\u05D0\u05D4 \u05E4\u05E2\u05D9\u05DC\u05D4: \u05DE\u05E1\u05D2\u05E8\u05D5\u05EA \u05DE\u05D6\u05D5\u05D9\u05E4\u05D5\u05EA \u05D0\u05E7\u05E8\u05D0\u05D9\u05D5\u05EA (32-128 \u05D1\u05EA\u05D9\u05DD \u05DB\u05DC 15-30 \u05E9\u05E0\u05D9\u05D5\u05EA) \u05D1\u05E2\u05E8\u05D5\u05E5 \u05D4\u05E8\u05D0\u05E6\u05F3\u05D8",
"desktop.sec.coverOff": "\u05DE\u05D7\u05D5\u05DC\u05DC \u05EA\u05E2\u05D1\u05D5\u05E8\u05EA \u05D4\u05D4\u05E1\u05D5\u05D5\u05D0\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05E4\u05D5\u05E2\u05DC",
"desktop.sec.coverUnsupported": "\u05EA\u05E2\u05D1\u05D5\u05E8\u05EA \u05D4\u05E1\u05D5\u05D5\u05D0\u05D4 \u05DE\u05D7\u05D9\u05D9\u05D1\u05EA \u05D4\u05E4\u05E2\u05DC\u05EA Double Ratchet (\u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05D1\u05D2\u05E8\u05E1\u05D4 \u05D9\u05E9\u05E0\u05D4 \u05D9\u05D5\u05EA\u05E8)",
"desktop.tagline": "\u05D7\u05D5\u05E4\u05E9 \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4"
},
"fa": {
"language.label": "\u0632\u0628\u0627\u0646",
"language.suggest.text": "\u0627\u06CC\u0646 \u0635\u0641\u062D\u0647 \u0628\u0647 \u0641\u0627\u0631\u0633\u06CC \u0647\u0645 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0627\u0633\u062A.",
"language.suggest.cta": "\u062E\u0648\u0627\u0646\u062F\u0646 \u0628\u0647 \u0641\u0627\u0631\u0633\u06CC",
"language.suggest.dismiss": "\u0628\u0633\u062A\u0646",
"community.title": "\u0628\u0647 \u0622\u06CC\u0646\u062F\u0647\u0654 \u062D\u0631\u06CC\u0645 \u062E\u0635\u0648\u0635\u06CC \u0628\u067E\u06CC\u0648\u0646\u062F\u06CC\u062F",
"community.description": "\u200FSecureBit \u0628\u0647\u200C\u0644\u0637\u0641 \u062C\u0627\u0645\u0639\u0647\u200C\u0627\u0634 \u0631\u0634\u062F \u0645\u06CC\u200C\u06A9\u0646\u062F. \u0627\u06CC\u062F\u0647\u200C\u0647\u0627 \u0648 \u0628\u0627\u0632\u062E\u0648\u0631\u062F\u0647\u0627\u06CC \u0634\u0645\u0627 \u0622\u06CC\u0646\u062F\u0647\u0654 \u0627\u0631\u062A\u0628\u0627\u0637 \u0627\u0645\u0646 \u0631\u0627 \u0634\u06A9\u0644 \u0645\u06CC\u200C\u062F\u0647\u062F - \u0633\u0627\u062E\u062A\u0647\u200C\u0634\u062F\u0647 \u062F\u0631 \u0641\u0636\u0627\u06CC \u0628\u0627\u0632\u060C \u0628\u0627 \u0627\u0639\u062A\u0628\u0627\u0631\u0633\u0646\u062C\u06CC \u06A9\u0627\u0645\u0644 ASN.1 \u0627\u0632 \u06CC\u06A9 \u0633\u0631 \u062A\u0627 \u0633\u0631 \u062F\u06CC\u06AF\u0631.",
"community.github": "\u0645\u062E\u0632\u0646 GitHub",
"community.feedback": "\u0628\u0627\u0632\u062E\u0648\u0631\u062F",
"unique.eyebrow": "\u0622\u0646\u0686\u0647 \u0645\u0627 \u0631\u0627 \u0645\u062A\u0645\u0627\u06CC\u0632 \u0645\u06CC\u200C\u06A9\u0646\u062F",
"unique.heading": "\u0686\u0631\u0627 SecureBit \u0628\u06CC\u200C\u0647\u0645\u062A\u0627\u0633\u062A",
"unique.s1.titleTop": "\u0647\u0633\u062A\u0647\u0654 \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC",
"unique.s1.titleBottom": "\u0686\u0646\u062F\u0644\u0627\u06CC\u0647",
"unique.s1.collapsed": "\u0647\u0633\u062A\u0647\u0654 \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC",
"unique.s1.desc": "\u062A\u0628\u0627\u062F\u0644 \u06A9\u0644\u06CC\u062F ECDH P-384\u060C \u0628\u0627\u0631\u0647\u0627\u06CC AES-256-GCM\u060C \u0627\u0645\u0636\u0627\u0647\u0627\u06CC ECDSA \u0648 \u0627\u0639\u062A\u0628\u0627\u0631\u0633\u0646\u062C\u06CC \u06A9\u0627\u0645\u0644 ASN.1 - \u0647\u0645\u0647 \u062F\u0631 \u06CC\u06A9 \u062E\u0637 \u0644\u0648\u0644\u0647\u0654 \u0645\u0642\u0627\u0648\u0645.",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "\u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627\u06CC \u0646\u0627\u0628",
"unique.s2.titleBottom": "\u0631\u0648\u06CC WebRTC",
"unique.s2.collapsed": "\u200FWebRTC \u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627\u06CC \u0646\u0627\u0628",
"unique.s2.desc": "\u067E\u06CC\u0627\u0645\u200C\u0647\u0627 \u0645\u0633\u062A\u0642\u06CC\u0645 \u0645\u06CC\u0627\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647\u200C\u0647\u0627 \u0631\u0648\u06CC WebRTC \u0645\u06CC\u200C\u0631\u0648\u0646\u062F. \u0647\u06CC\u0686 \u0628\u0627\u0632\u067E\u062E\u0634\u06CC \u062F\u0627\u062F\u0647\u200C\u0647\u0627\u06CC \u0634\u0645\u0627 \u0631\u0627 \u0646\u06AF\u0647 \u0646\u0645\u06CC\u200C\u062F\u0627\u0631\u062F - \u0633\u0631\u0648\u0631 \u0641\u0642\u0637 \u06A9\u0645\u06A9 \u0645\u06CC\u200C\u06A9\u0646\u062F \u062F\u0648 \u0647\u0645\u062A\u0627 \u06CC\u06A9\u062F\u06CC\u06AF\u0631 \u0631\u0627 \u0628\u06CC\u0627\u0628\u0646\u062F.",
"unique.s2.tags": [
"DTLS 1.3",
"\u0628\u062F\u0648\u0646 \u0628\u0627\u0632\u067E\u062E\u0634"
],
"unique.s3.titleTop": "\u0631\u0627\u0632\u062F\u0627\u0631\u06CC \u067E\u06CC\u0634\u0631\u0648",
"unique.s3.titleBottom": "\u06A9\u0627\u0645\u0644",
"unique.s3.collapsed": "\u0631\u0627\u0632\u062F\u0627\u0631\u06CC \u067E\u06CC\u0634\u0631\u0648",
"unique.s3.desc": "\u06A9\u0644\u06CC\u062F\u0647\u0627\u06CC \u0646\u0634\u0633\u062A \u067E\u06CC\u0648\u0633\u062A\u0647 \u0645\u06CC\u200C\u0686\u0631\u062E\u0646\u062F \u0648 \u067E\u0633 \u0627\u0632 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u062F\u0648\u0631 \u0631\u06CC\u062E\u062A\u0647 \u0645\u06CC\u200C\u0634\u0648\u0646\u062F\u060C \u067E\u0633 \u06CC\u06A9 \u06A9\u0644\u06CC\u062F \u0644\u0648\u200C\u0631\u0641\u062A\u0647 \u0647\u0631\u06AF\u0632 \u06AF\u0641\u062A\u06AF\u0648\u0647\u0627\u06CC \u06AF\u0630\u0634\u062A\u0647 \u0631\u0627 \u0628\u0627\u0632 \u0646\u0645\u06CC\u200C\u06A9\u0646\u062F.",
"unique.s3.tags": [
"\u06A9\u0644\u06CC\u062F\u0647\u0627\u06CC \u0632\u0648\u062F\u06AF\u0630\u0631",
"\u0686\u0631\u062E\u0634 \u062E\u0648\u062F\u06A9\u0627\u0631"
],
"unique.s4.titleTop": "\u067E\u0646\u0647\u0627\u0646\u200C\u0633\u0627\u0632\u06CC",
"unique.s4.titleBottom": "\u062A\u0631\u0627\u0641\u06CC\u06A9",
"unique.s4.collapsed": "\u067E\u0646\u0647\u0627\u0646\u200C\u0633\u0627\u0632\u06CC \u062A\u0631\u0627\u0641\u06CC\u06A9",
"unique.s4.desc": "\u0627\u0646\u062F\u0627\u0632\u0647 \u0648 \u0632\u0645\u0627\u0646\u200C\u0628\u0646\u062F\u06CC \u0628\u0633\u062A\u0647\u200C\u0647\u0627 \u0644\u0627\u06CC\u06CC\u200C\u06AF\u0630\u0627\u0631\u06CC \u0648 \u062A\u0635\u0627\u062F\u0641\u06CC \u0645\u06CC\u200C\u0634\u0648\u062F \u0648 \u0627\u0644\u06AF\u0648\u0647\u0627\u06CC \u0641\u0631\u0627\u062F\u0627\u062F\u0647 \u0631\u0627 \u0627\u0632 \u062F\u06CC\u062F \u0647\u0631\u06A9\u0633 \u06A9\u0647 \u062E\u0637 \u0631\u0627 \u0645\u06CC\u200C\u067E\u0627\u06CC\u062F \u067E\u0646\u0647\u0627\u0646 \u0645\u06CC\u200C\u06A9\u0646\u062F.",
"unique.s4.tags": [
"\u0644\u0627\u06CC\u06CC\u200C\u06AF\u0630\u0627\u0631\u06CC \u0628\u0633\u062A\u0647",
"\u0644\u0631\u0632\u0634 \u0632\u0645\u0627\u0646\u06CC"
],
"unique.s5.titleTop": "\u0635\u0641\u0631",
"unique.s5.titleBottom": "\u062C\u0645\u0639\u200C\u0622\u0648\u0631\u06CC \u062F\u0627\u062F\u0647",
"unique.s5.collapsed": "\u0635\u0641\u0631 \u062C\u0645\u0639\u200C\u0622\u0648\u0631\u06CC \u062F\u0627\u062F\u0647",
"unique.s5.desc": "\u0628\u062F\u0648\u0646 \u062D\u0633\u0627\u0628\u060C \u0628\u062F\u0648\u0646 \u06AF\u0632\u0627\u0631\u0634\u060C \u0628\u062F\u0648\u0646 \u0630\u062E\u06CC\u0631\u0647\u0654 \u067E\u06CC\u0627\u0645. \u0686\u06CC\u0632\u06CC \u0631\u0648\u06CC \u0633\u0631\u0648\u0631 \u0646\u06CC\u0633\u062A \u06A9\u0647 \u0646\u0634\u062A \u06A9\u0646\u062F\u060C \u0627\u062D\u0636\u0627\u0631 \u0634\u0648\u062F \u06CC\u0627 \u0641\u0631\u0648\u062E\u062A\u0647 \u0634\u0648\u062F.",
"unique.s5.tags": [
"\u0628\u062F\u0648\u0646 \u062D\u0633\u0627\u0628",
"\u0628\u062F\u0648\u0646 \u06AF\u0632\u0627\u0631\u0634"
],
"partners.eyebrow": "\u0634\u0631\u06A9\u0627 \u0648 \u0632\u06CC\u0633\u062A\u200C\u0628\u0648\u0645",
"partners.heading": "\u0645\u0648\u0631\u062F \u0627\u0639\u062A\u0645\u0627\u062F \u0634\u0631\u06A9\u0627\u06CC \u0645\u0627",
"partners.aegis.desc": "\u0634\u0631\u06CC\u06A9 \u0633\u0631\u0645\u0627\u06CC\u0647\u200C\u0627\u06CC \u06A9\u0647 \u0627\u0631\u062A\u0628\u0627\u0637\u0627\u062A \u0645\u0627\u0644\u06CC \u0645\u062D\u0631\u0645\u0627\u0646\u0647 \u0631\u0627 \u062F\u0631 \u0633\u0631\u0627\u0633\u0631 \u0633\u0628\u062F \u062E\u0648\u062F \u0627\u06CC\u0645\u0646 \u0645\u06CC\u200C\u06A9\u0646\u062F.",
"partners.aegis.role": "\u067E\u0634\u062A\u06CC\u0628\u0627\u0646 \u0631\u0627\u0647\u0628\u0631\u062F\u06CC",
"partners.furilabs.desc": "\u06AF\u0648\u0634\u06CC\u200C\u0647\u0627\u06CC \u0644\u06CC\u0646\u0648\u06A9\u0633\u06CC \u0628\u0627 \u0627\u0648\u0644\u0648\u06CC\u062A \u062D\u0631\u06CC\u0645 \u062E\u0635\u0648\u0635\u06CC \u06A9\u0647 SecureBit \u0631\u0627 \u0628\u0647\u200C\u0639\u0646\u0648\u0627\u0646 \u06A9\u0627\u0646\u0627\u0644 \u0627\u0645\u0646 \u067E\u06CC\u0634\u200C\u0641\u0631\u0636 \u0639\u0631\u0636\u0647 \u0645\u06CC\u200C\u06A9\u0646\u0646\u062F.",
"partners.furilabs.role": "\u0634\u0631\u06CC\u06A9 \u0641\u0646\u0627\u0648\u0631\u06CC",
"partners.inviteTitle": "\u0634\u0631\u06CC\u06A9 \u0634\u0648\u06CC\u062F",
"partners.inviteDesc": "\u0633\u062E\u062A\u200C\u0627\u0641\u0632\u0627\u0631 \u06CC\u0627 \u0632\u06CC\u0631\u0633\u0627\u062E\u062A \u062D\u0631\u06CC\u0645 \u062E\u0635\u0648\u0635\u06CC \u0645\u06CC\u200C\u0633\u0627\u0632\u06CC\u062F\u061F \u0628\u06CC\u0627\u06CC\u06CC\u062F SecureBit \u0631\u0627 \u06CC\u06A9\u067E\u0627\u0631\u0686\u0647 \u06A9\u0646\u06CC\u0645.",
"partners.inviteCta": "\u06AF\u0641\u062A\u06AF\u0648 \u0631\u0627 \u0622\u063A\u0627\u0632 \u06A9\u0646\u06CC\u062F",
"roadmap.eyebrow": "\u0646\u0642\u0634\u0647\u0654 \u0631\u0627\u0647 \u062A\u0648\u0633\u0639\u0647",
"roadmap.heading": "\u062A\u06A9\u0627\u0645\u0644 SecureBit",
"roadmap.subheading": "\u0627\u0632 \u0646\u062E\u0633\u062A\u06CC\u0646 \u0646\u0645\u0648\u0646\u0647\u0654 \u0627\u0648\u0644\u06CC\u0647 \u062A\u0627 \u0634\u0628\u06A9\u0647\u200C\u0627\u06CC \u063A\u06CC\u0631\u0645\u062A\u0645\u0631\u06A9\u0632 \u0648 \u0645\u0642\u0627\u0648\u0645 \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u06A9\u0648\u0627\u0646\u062A\u0648\u0645 - \u0628\u0627 \u0627\u0639\u062A\u0628\u0627\u0631\u0633\u0646\u062C\u06CC \u06A9\u0627\u0645\u0644 ASN.1 \u062F\u0631 \u0647\u0631 \u0644\u0627\u06CC\u0647.",
"roadmap.progress": "{shipped} \u0627\u0632 {total} \u0646\u0642\u0637\u0647\u0654 \u0639\u0637\u0641 \u0627\u0646\u062C\u0627\u0645 \u0634\u062F",
"roadmap.upcoming": "{upcoming} \u062F\u0631 \u0631\u0627\u0647 \u0627\u0633\u062A",
"roadmap.keyFeatures": "\u0648\u06CC\u0698\u06AF\u06CC\u200C\u0647\u0627\u06CC \u06A9\u0644\u06CC\u062F\u06CC",
"roadmap.status.released": "\u0645\u0646\u062A\u0634\u0631 \u0634\u062F",
"roadmap.status.current": "\u06A9\u0646\u0648\u0646\u06CC",
"roadmap.status.dev": "\u062F\u0631 \u062F\u0633\u062A \u062A\u0648\u0633\u0639\u0647",
"roadmap.status.planned": "\u0628\u0631\u0646\u0627\u0645\u0647\u200C\u0631\u06CC\u0632\u06CC\u200C\u0634\u062F\u0647",
"roadmap.status.research": "\u067E\u0698\u0648\u0647\u0634",
"hero.headlineTop": "\u062E\u0637\u06CC \u0645\u0633\u062A\u0642\u06CC\u0645",
"hero.headlineBottom": "\u06A9\u0647 \u0641\u0642\u0637 \u0634\u0645\u0627 \u062F\u0648 \u0646\u0641\u0631 \u0645\u06CC\u200C\u062E\u0648\u0627\u0646\u06CC\u062F.",
"hero.subheading": "\u06A9\u0644\u06CC\u062F\u0647\u0627 \u0631\u0648\u06CC \u062F\u0633\u062A\u06AF\u0627\u0647 \u0634\u0645\u0627 \u0633\u0627\u062E\u062A\u0647 \u0648 \u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627 \u0645\u0628\u0627\u062F\u0644\u0647 \u0645\u06CC\u200C\u0634\u0648\u0646\u062F. \u0628\u062F\u0648\u0646 \u062D\u0633\u0627\u0628\u060C \u0628\u062F\u0648\u0646 \u0633\u0631\u0648\u0631\u06CC \u06A9\u0647 \u067E\u06CC\u0627\u0645\u200C\u0647\u0627\u06CC\u062A\u0627\u0646 \u0631\u0627 \u0646\u06AF\u0647 \u062F\u0627\u0631\u062F.",
"hero.diagramAlt": "\u06CC\u06A9 \u062E\u0637 \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647\u0654 \u0645\u0633\u062A\u0642\u06CC\u0645 \u0628\u0647 \u06CC\u06A9 \u0647\u0645\u062A\u0627\u060C \u062F\u0631 \u062D\u0627\u0644\u06CC \u06A9\u0647 \u062F\u0648 \u0647\u0645\u062A\u0627\u06CC \u062F\u06CC\u06AF\u0631 \u0628\u0647 \u0634\u0628\u06A9\u0647 \u0645\u06CC\u200C\u067E\u06CC\u0648\u0646\u062F\u0646\u062F",
"intro.createTitle": "\u06A9\u0627\u0646\u0627\u0644 \u062A\u0627\u0632\u0647\u200C\u0627\u06CC \u0628\u0633\u0627\u0632\u06CC\u062F",
"intro.createDesc": "\u062F\u0633\u062A\u06AF\u0627\u0647 \u0634\u0645\u0627 \u06A9\u0644\u06CC\u062F\u0647\u0627 \u0648 \u06CC\u06A9 \u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647\u0654 \u06CC\u06A9\u200C\u0628\u0627\u0631\u0645\u0635\u0631\u0641 \u0645\u06CC\u200C\u0633\u0627\u0632\u062F. \u0647\u06CC\u0686\u200C\u0686\u06CC\u0632 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0646\u0645\u06CC\u200C\u0631\u0633\u062F.",
"intro.createCta": "\u0633\u0627\u062E\u062A \u06A9\u0644\u06CC\u062F \u0648 \u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647",
"intro.joinTitle": "\u0628\u0647 \u06A9\u0627\u0646\u0627\u0644\u06CC \u0628\u067E\u06CC\u0648\u0646\u062F\u06CC\u062F",
"intro.scanTitle": "\u200FQR \u0631\u0627 \u0628\u0627 \u062F\u0648\u0631\u0628\u06CC\u0646 \u0628\u062E\u0648\u0627\u0646\u06CC\u062F",
"intro.scanSubtitle": "\u0633\u0631\u06CC\u0639\u200C\u062A\u0631\u06CC\u0646 \u0631\u0627\u0647 - \u0628\u0647 \u0635\u0641\u062D\u0647\u0654 \u0647\u0645\u062A\u0627\u06CC\u062A\u0627\u0646 \u0628\u06AF\u06CC\u0631\u06CC\u062F",
"intro.orPasteCode": "\u06CC\u0627 \u06A9\u062F \u0631\u0627 \u0628\u0686\u0633\u0628\u0627\u0646\u06CC\u062F",
"intro.pastePlaceholder": "\u06A9\u062F \u062F\u0639\u0648\u062A \u0631\u0627 \u0627\u06CC\u0646\u062C\u0627 \u0628\u0686\u0633\u0628\u0627\u0646\u06CC\u062F\u2026",
"intro.connect": "\u0627\u062A\u0635\u0627\u0644",
"intro.connecting": "\u062F\u0631 \u062D\u0627\u0644 \u067E\u0631\u062F\u0627\u0632\u0634\u2026",
"roadmap.r1.title": "\u0622\u063A\u0627\u0632 \u062A\u0648\u0633\u0639\u0647",
"roadmap.r1.sub": "\u0627\u06CC\u062F\u0647\u060C \u0646\u0645\u0648\u0646\u0647\u0654 \u0627\u0648\u0644\u06CC\u0647 \u0648 \u0628\u0631\u067E\u0627\u06CC\u06CC \u0632\u06CC\u0631\u0633\u0627\u062E\u062A",
"roadmap.r1.date": "\u0627\u0648\u0627\u06CC\u0644 \u06F2\u06F0\u06F2\u06F5",
"roadmap.r1.features": [
"\u0634\u06A9\u0644\u200C\u06AF\u06CC\u0631\u06CC \u0627\u06CC\u062F\u0647 \u0648 \u0646\u06CC\u0627\u0632\u0645\u0646\u062F\u06CC\u200C\u0647\u0627",
"\u06AF\u0632\u06CC\u0646\u0634 \u067E\u0634\u062A\u0647: WebRTC\u060C P2P\u060C \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC",
"\u0646\u062E\u0633\u062A\u06CC\u0646 \u0646\u0645\u0648\u0646\u0647\u200C\u0647\u0627\u06CC \u067E\u06CC\u0627\u0645\u200C\u0631\u0633\u0627\u0646\u06CC",
"\u0633\u0627\u062E\u062A \u0645\u062E\u0632\u0646 \u0648 \u06CC\u06A9\u067E\u0627\u0631\u0686\u0647\u200C\u0633\u0627\u0632\u06CC \u067E\u06CC\u0648\u0633\u062A\u0647",
"\u0645\u0639\u0645\u0627\u0631\u06CC \u067E\u0627\u06CC\u0647\u0654 \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC",
"\u0637\u0631\u0627\u062D\u06CC \u062A\u062C\u0631\u0628\u0647 \u0648 \u0631\u0627\u0628\u0637 \u06A9\u0627\u0631\u0628\u0631\u06CC"
],
"roadmap.r2.title": "\u0627\u0646\u062A\u0634\u0627\u0631 \u0622\u0644\u0641\u0627",
"roadmap.r2.sub": "\u0646\u062E\u0633\u062A\u06CC\u0646 \u0622\u0644\u0641\u0627\u06CC \u0639\u0645\u0648\u0645\u06CC: \u06AF\u0641\u062A\u06AF\u0648\u06CC \u067E\u0627\u06CC\u0647 \u0648 \u062A\u0628\u0627\u062F\u0644 \u06A9\u0644\u06CC\u062F",
"roadmap.r2.date": "\u0628\u0647\u0627\u0631 \u06F2\u06F0\u06F2\u06F5",
"roadmap.r2.features": [
"\u067E\u06CC\u0627\u0645\u200C\u0631\u0633\u0627\u0646\u06CC \u067E\u0627\u06CC\u0647\u0654 \u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627 \u0631\u0648\u06CC WebRTC",
"\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u0633\u0627\u062F\u0647\u0654 \u0633\u0631\u062A\u0627\u0633\u0631\u06CC (\u0637\u0631\u062D \u0646\u0645\u0627\u06CC\u0634\u06CC)",
"\u0633\u06CC\u06AF\u0646\u0627\u0644\u06CC\u0646\u06AF \u067E\u0627\u06CC\u062F\u0627\u0631 \u0648 \u0627\u062A\u0635\u0627\u0644 \u062F\u0648\u0628\u0627\u0631\u0647",
"\u0631\u0627\u0628\u0637 \u06A9\u0645\u06CC\u0646\u0647 \u0628\u0631\u0627\u06CC \u0622\u0632\u0645\u0648\u0646",
"\u06AF\u0631\u062F\u0622\u0648\u0631\u06CC \u0628\u0627\u0632\u062E\u0648\u0631\u062F \u0627\u0632 \u0622\u0632\u0645\u0627\u06CC\u0646\u062F\u06AF\u0627\u0646 \u0646\u062E\u0633\u062A\u06CC\u0646"
],
"roadmap.r3.title": "\u0633\u062E\u062A\u200C\u0633\u0627\u0632\u06CC \u0627\u0645\u0646\u06CC\u062A\u06CC",
"roadmap.r3.sub": "\u062A\u0642\u0648\u06CC\u062A \u0627\u0645\u0646\u06CC\u062A \u0648 \u0627\u0646\u062A\u0634\u0627\u0631 \u0634\u0627\u062E\u0647\u0654 \u067E\u0627\u06CC\u062F\u0627\u0631",
"roadmap.r3.date": "\u062A\u0627\u0628\u0633\u062A\u0627\u0646 \u06F2\u06F0\u06F2\u06F5",
"roadmap.r3.features": [
"\u067E\u06CC\u0627\u062F\u0647\u200C\u0633\u0627\u0632\u06CC ECDH/ECDSA \u062F\u0631 \u0645\u062D\u06CC\u0637 \u0639\u0645\u0644\u06CC\u0627\u062A\u06CC",
"\u0631\u0627\u0632\u062F\u0627\u0631\u06CC \u067E\u06CC\u0634\u0631\u0648 \u06A9\u0627\u0645\u0644 \u0648 \u0686\u0631\u062E\u0634 \u06A9\u0644\u06CC\u062F",
"\u0628\u0647\u0628\u0648\u062F \u0628\u0631\u0631\u0633\u06CC\u200C\u0647\u0627\u06CC \u0627\u062D\u0631\u0627\u0632 \u0647\u0648\u06CC\u062A",
"\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u0641\u0627\u06CC\u0644 \u0648 \u0627\u0646\u062A\u0642\u0627\u0644 \u0628\u0627\u0631\u0647\u0627\u06CC \u0628\u0632\u0631\u06AF",
"\u0645\u0645\u06CC\u0632\u06CC \u0641\u0631\u0627\u06CC\u0646\u062F\u0647\u0627\u06CC \u067E\u0627\u06CC\u0647\u0654 \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC"
],
"roadmap.r4.title": "\u0645\u0642\u06CC\u0627\u0633\u200C\u067E\u0630\u06CC\u0631\u06CC \u0648 \u067E\u0627\u06CC\u062F\u0627\u0631\u06CC",
"roadmap.r4.sub": "\u06AF\u0633\u062A\u0631\u0634 \u0634\u0628\u06A9\u0647 \u0648 \u0628\u0647\u0628\u0648\u062F \u067E\u0627\u06CC\u062F\u0627\u0631\u06CC",
"roadmap.r4.date": "\u067E\u0627\u06CC\u06CC\u0632 \u06F2\u06F0\u06F2\u06F5",
"roadmap.r4.features": [
"\u0628\u0647\u06CC\u0646\u0647\u200C\u0633\u0627\u0632\u06CC \u0627\u062A\u0635\u0627\u0644\u200C\u0647\u0627\u06CC P2P \u0648 \u06AF\u0630\u0631 \u0627\u0632 NAT",
"\u0633\u0627\u0632\u0648\u06A9\u0627\u0631\u0647\u0627\u06CC \u0627\u062A\u0635\u0627\u0644 \u062F\u0648\u0628\u0627\u0631\u0647 \u0648 \u0635\u0641 \u067E\u06CC\u0627\u0645",
"\u06A9\u0627\u0647\u0634 \u0645\u0635\u0631\u0641 \u0628\u0627\u062A\u0631\u06CC \u0631\u0648\u06CC \u0645\u0648\u0628\u0627\u06CC\u0644",
"\u067E\u0634\u062A\u06CC\u0628\u0627\u0646\u06CC \u0627\u0632 \u0647\u0645\u06AF\u0627\u0645\u200C\u0633\u0627\u0632\u06CC \u0686\u0646\u062F\u062F\u0633\u062A\u06AF\u0627\u0647\u06CC",
"\u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06CC \u067E\u0627\u06CC\u0634 \u0648 \u062B\u0628\u062A \u0628\u0631\u0627\u06CC \u062A\u0648\u0633\u0639\u0647\u200C\u062F\u0647\u0646\u062F\u06AF\u0627\u0646"
],
"roadmap.r5.title": "\u0627\u0646\u062A\u0634\u0627\u0631 \u0628\u0627 \u0627\u0648\u0644\u0648\u06CC\u062A \u062D\u0631\u06CC\u0645 \u062E\u0635\u0648\u0635\u06CC",
"roadmap.r5.sub": "\u062A\u0645\u0631\u06A9\u0632 \u0628\u0631 \u062D\u0631\u06CC\u0645 \u062E\u0635\u0648\u0635\u06CC: \u06A9\u0645\u06CC\u0646\u0647\u200C\u0633\u0627\u0632\u06CC \u0641\u0631\u0627\u062F\u0627\u062F\u0647",
"roadmap.r5.date": "\u0632\u0645\u0633\u062A\u0627\u0646 \u06F2\u06F0\u06F2\u06F5",
"roadmap.r5.features": [
"\u062D\u0641\u0627\u0638\u062A \u0627\u0632 \u0641\u0631\u0627\u062F\u0627\u062F\u0647 \u0648 \u06A9\u0627\u0647\u0634 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A",
"\u0622\u0632\u0645\u0627\u06CC\u0634 \u0645\u0633\u06CC\u0631\u06CC\u0627\u0628\u06CC \u067E\u06CC\u0627\u0632\u06CC \u0648 DHT",
"\u06AF\u0632\u06CC\u0646\u0647\u200C\u0647\u0627\u06CC\u06CC \u0628\u0631\u0627\u06CC \u0627\u062A\u0635\u0627\u0644\u200C\u0647\u0627\u06CC \u0646\u0627\u0634\u0646\u0627\u0633",
"\u0622\u0645\u0627\u062F\u0647\u200C\u0633\u0627\u0632\u06CC \u0628\u0631\u0627\u06CC \u0645\u0645\u06CC\u0632\u06CC \u0628\u0627\u0632 \u06A9\u062F",
"\u0628\u0647\u0628\u0648\u062F \u0641\u0631\u0627\u06CC\u0646\u062F\u0647\u0627\u06CC \u062A\u0623\u06CC\u06CC\u062F \u06A9\u0627\u0631\u0628\u0631"
],
"roadmap.r6.title": "\u0646\u0633\u062E\u0647\u0654 \u0627\u0645\u0646\u06CC\u062A \u067E\u06CC\u0634\u0631\u0641\u062A\u0647",
"roadmap.r6.sub": "\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u06F1\u06F8 \u0644\u0627\u06CC\u0647 \u062F\u0631 \u0633\u0637\u062D \u0646\u0638\u0627\u0645\u06CC \u0628\u0627 \u0627\u0639\u062A\u0628\u0627\u0631\u0633\u0646\u062C\u06CC \u06A9\u0627\u0645\u0644 ASN.1",
"roadmap.r6.date": "\u0627\u0648\u0627\u062E\u0631 \u06F2\u06F0\u06F2\u06F5",
"roadmap.r6.features": [
"\u0627\u0645\u0646\u06CC\u062A \u0633\u0647\u200C\u0644\u0627\u06CC\u0647: ECDH\u060C DTLS \u0648 SAS",
"\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC ECDH P-384 \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 AES-GCM \u06F2\u06F5\u06F6 \u0628\u06CC\u062A\u06CC",
"\u062A\u0623\u06CC\u06CC\u062F \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A DTLS",
"\u062A\u0623\u06CC\u06CC\u062F SAS (\u0631\u0634\u062A\u0647\u0654 \u06A9\u0648\u062A\u0627\u0647 \u0627\u062D\u0631\u0627\u0632 \u0647\u0648\u06CC\u062A)",
"\u0631\u0627\u0632\u062F\u0627\u0631\u06CC \u067E\u06CC\u0634\u0631\u0648 \u06A9\u0627\u0645\u0644 \u0628\u0627 \u0686\u0631\u062E\u0634 \u06A9\u0644\u06CC\u062F",
"\u067E\u06CC\u0634\u06AF\u06CC\u0631\u06CC \u067E\u06CC\u0634\u0631\u0641\u062A\u0647 \u0627\u0632 \u062D\u0645\u0644\u0647\u0654 \u0645\u0631\u062F \u0645\u06CC\u0627\u0646\u06CC",
"\u0627\u0639\u062A\u0628\u0627\u0631\u0633\u0646\u062C\u06CC \u06A9\u0627\u0645\u0644 ASN.1 DER",
"\u062A\u0623\u06CC\u06CC\u062F OID \u0648 \u0646\u0642\u0627\u0637 \u0645\u0646\u062D\u0646\u06CC",
"\u0627\u0639\u062A\u0628\u0627\u0631\u0633\u0646\u062C\u06CC \u0633\u0627\u062E\u062A\u0627\u0631 SPKI",
"\u0645\u0639\u0645\u0627\u0631\u06CC WebRTC \u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627",
"\u062D\u0641\u0627\u0638\u062A \u0627\u0632 \u0641\u0631\u0627\u062F\u0627\u062F\u0647",
"\u06A9\u062F \u06F1\u06F0\u06F0\u066A \u0645\u062A\u0646\u200C\u0628\u0627\u0632"
],
"roadmap.r7.title": "\u0646\u0633\u062E\u0647\u0654 \u0631\u0648\u0645\u06CC\u0632\u06CC",
"roadmap.r7.sub": "\u0628\u0631\u0646\u0627\u0645\u0647\u200C\u0647\u0627\u06CC \u0628\u0648\u0645\u06CC \u0628\u0631\u0627\u06CC \u0648\u06CC\u0646\u062F\u0648\u0632\u060C \u0645\u06A9\u200C\u0627\u0648\u0627\u0633 \u0648 \u0644\u06CC\u0646\u0648\u06A9\u0633",
"roadmap.r7.date": "\u0627\u0648\u0627\u06CC\u0644 \u06F2\u06F0\u06F2\u06F6",
"roadmap.r7.features": [
"\u0628\u0631\u0646\u0627\u0645\u0647\u0654 \u0648\u06CC\u0646\u062F\u0648\u0632 (Tauri v2)",
"\u0628\u0631\u0646\u0627\u0645\u0647\u0654 macOS (Tauri v2)",
"\u067E\u0634\u062A\u06CC\u0628\u0627\u0646\u06CC AppImage \u0644\u06CC\u0646\u0648\u06A9\u0633 (Tauri v2)",
"\u0627\u0639\u0644\u0627\u0646\u200C\u0647\u0627\u06CC \u0628\u06CC\u200C\u062F\u0631\u0646\u06AF",
"\u0627\u062A\u0635\u0627\u0644 \u062F\u0648\u0628\u0627\u0631\u0647\u0654 \u062E\u0648\u062F\u06A9\u0627\u0631",
"\u0647\u0645\u06AF\u0627\u0645\u200C\u0633\u0627\u0632\u06CC \u0645\u06CC\u0627\u0646\u200C\u062F\u0633\u062A\u06AF\u0627\u0647\u06CC",
"\u0628\u0647\u0628\u0648\u062F \u062A\u062C\u0631\u0628\u0647 \u0648 \u0631\u0627\u0628\u0637 \u06A9\u0627\u0631\u0628\u0631\u06CC",
"\u067E\u0634\u062A\u06CC\u0628\u0627\u0646\u06CC \u0627\u0632 \u0641\u0627\u06CC\u0644 \u062A\u0627 \u06F1\u06F0\u06F0 \u0645\u06AF\u0627\u0628\u0627\u06CC\u062A"
],
"roadmap.r8.title": "\u0635\u062F\u0627 \u0648 \u062A\u0645\u0627\u0633 \u0627\u0645\u0646",
"roadmap.r8.sub": "\u067E\u06CC\u0627\u0645 \u0635\u0648\u062A\u06CC \u0648 \u062A\u0645\u0627\u0633 \u0635\u0648\u062A\u06CC \u0648 \u062A\u0635\u0648\u06CC\u0631\u06CC \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647",
"roadmap.r8.date": "\u0627\u0648\u0627\u06CC\u0644 \u06F2\u06F0\u06F2\u06F6",
"roadmap.r8.features": [
"\u067E\u06CC\u0627\u0645\u200C\u0647\u0627\u06CC \u0635\u0648\u062A\u06CC \u0628\u0627 \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u0633\u0631\u062A\u0627\u0633\u0631\u06CC",
"\u062A\u0645\u0627\u0633 \u0635\u0648\u062A\u06CC \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647\u0654 \u062F\u0648\u0646\u0641\u0631\u0647 (WebRTC)",
"\u062A\u0645\u0627\u0633 \u062A\u0635\u0648\u06CC\u0631\u06CC \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647\u0654 \u062F\u0648\u0646\u0641\u0631\u0647 (WebRTC)",
"\u0631\u0627\u0632\u062F\u0627\u0631\u06CC \u067E\u06CC\u0634\u0631\u0648 \u06A9\u0627\u0645\u0644 \u0628\u0631\u0627\u06CC \u0631\u0633\u0627\u0646\u0647\u0654 \u0632\u0646\u062F\u0647",
"\u062C\u0631\u06CC\u0627\u0646\u200C\u0647\u0627\u06CC \u0631\u0633\u0627\u0646\u0647\u200C\u0627\u06CC \u0645\u062D\u0627\u0641\u0638\u062A\u200C\u0634\u062F\u0647 \u0628\u0627 SRTP/DTLS",
"\u062A\u0623\u06CC\u06CC\u062F SAS \u062F\u0631 \u062D\u06CC\u0646 \u062A\u0645\u0627\u0633",
"\u0627\u0639\u0644\u0627\u0646 \u062A\u0645\u0627\u0633 \u0648 \u0627\u062A\u0635\u0627\u0644 \u062F\u0648\u0628\u0627\u0631\u0647\u0654 \u062E\u0648\u062F\u06A9\u0627\u0631",
"\u0631\u0633\u0627\u0646\u0647\u0654 \u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627 \u0628\u0627 \u062A\u0623\u062E\u06CC\u0631 \u06A9\u0645"
],
"roadmap.r9.title": "\u0627\u0631\u062A\u0628\u0627\u0637 \u06AF\u0631\u0648\u0647\u06CC",
"roadmap.r9.sub": "\u06AF\u0641\u062A\u06AF\u0648\u06CC \u06AF\u0631\u0648\u0647\u06CC \u0628\u0627 \u062D\u0641\u0638 \u062D\u0631\u06CC\u0645 \u062E\u0635\u0648\u0635\u06CC",
"roadmap.r9.date": "\u0647\u0645\u200C\u0627\u06A9\u0646\u0648\u0646",
"roadmap.r9.features": [
"\u06AF\u0641\u062A\u06AF\u0648\u06CC \u06AF\u0631\u0648\u0647\u06CC \u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627 \u062A\u0627 \u06F8 \u0634\u0631\u06A9\u062A\u200C\u06A9\u0646\u0646\u062F\u0647",
"\u062A\u062D\u0648\u06CC\u0644 \u0634\u0628\u06A9\u0647\u200C\u0627\u06CC \u0628\u0627 \u0628\u0627\u0632\u067E\u062E\u0634 \u0627\u0645\u0636\u0627\u0634\u062F\u0647 \u0628\u0647\u200C\u0639\u0646\u0648\u0627\u0646 \u062C\u0627\u06CC\u06AF\u0632\u06CC\u0646",
"\u06CC\u06A9 \u06A9\u062F \u0627\u06CC\u0645\u0646\u06CC \u06AF\u0631\u0648\u0647 \u06A9\u0647 \u0647\u0645\u0647 \u0645\u0642\u0627\u06CC\u0633\u0647 \u0645\u06CC\u200C\u06A9\u0646\u0646\u062F",
"\u0622\u06CC\u06CC\u0646 \u062A\u0639\u0647\u062F\u200C\u0633\u067E\u0633\u200C\u0627\u0641\u0634\u0627 \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u062D\u062F\u0633 \u0632\u062F\u0646 \u06A9\u062F",
"\u06A9\u0644\u06CC\u062F\u0647\u0627\u06CC \u0647\u0648\u06CC\u062A \u062C\u062F\u0627\u06AF\u0627\u0646\u0647 \u0628\u0631\u0627\u06CC \u0647\u0631 \u06AF\u0631\u0648\u0647\u060C \u0632\u0648\u062F\u06AF\u0630\u0631 \u0628\u0647\u200C\u0637\u0631\u0627\u062D\u06CC",
"\u0639\u0636\u0648\u06CC\u062A \u0627\u0645\u0636\u0627\u0634\u062F\u0647 \u0628\u0627 \u062A\u0631\u062A\u06CC\u0628 \u062F\u0648\u0631\u0647\u200C\u0627\u06CC",
"\u067E\u06CC\u0627\u0645\u200C\u0647\u0627\u06CC \u0627\u0645\u0636\u0627\u0634\u062F\u0647\u060C \u067E\u0633 \u0631\u0648\u0646\u0648\u0634\u062A \u062F\u0648\u067E\u0627\u0631\u0647 \u0627\u062B\u0628\u0627\u062A\u200C\u067E\u0630\u06CC\u0631 \u0627\u0633\u062A",
"\u0628\u062F\u0648\u0646 \u0633\u0631\u0648\u0631\u060C \u0628\u062F\u0648\u0646 \u06A9\u0644\u06CC\u062F \u06AF\u0631\u0648\u0647\u06CC \u0645\u0634\u062A\u0631\u06A9\u060C \u0628\u062F\u0648\u0646 \u067E\u06CC\u0634\u06CC\u0646\u0647"
],
"roadmap.r10.title": "\u0646\u0633\u062E\u0647\u0654 \u0645\u0648\u0628\u0627\u06CC\u0644",
"roadmap.r10.sub": "\u0628\u0631\u0646\u0627\u0645\u0647\u200C\u0647\u0627\u06CC \u0628\u0648\u0645\u06CC \u0628\u0631\u0627\u06CC iOS \u0648 \u0627\u0646\u062F\u0631\u0648\u06CC\u062F",
"roadmap.r10.date": "\u0633\u0647\u200C\u0645\u0627\u0647\u0647\u0654 \u062F\u0648\u0645 \u06F2\u06F0\u06F2\u06F7",
"roadmap.r10.features": [
"\u0628\u0631\u0646\u0627\u0645\u0647\u0654 \u0628\u0648\u0645\u06CC iOS (Swift/SwiftUI)",
"\u0628\u0631\u0646\u0627\u0645\u0647\u0654 \u0628\u0648\u0645\u06CC \u0627\u0646\u062F\u0631\u0648\u06CC\u062F (Kotlin/Jetpack Compose)",
"\u067E\u0634\u062A\u06CC\u0628\u0627\u0646\u06CC PWA \u0628\u0631\u0627\u06CC \u0645\u0631\u0648\u0631\u06AF\u0631\u0647\u0627\u06CC \u0645\u0648\u0628\u0627\u06CC\u0644",
"\u0627\u0639\u0644\u0627\u0646\u200C\u0647\u0627\u06CC \u0641\u0648\u0631\u06CC \u0628\u06CC\u200C\u062F\u0631\u0646\u06AF",
"\u0628\u0647\u06CC\u0646\u0647\u200C\u0633\u0627\u0632\u06CC \u0628\u0627\u062A\u0631\u06CC",
"\u0631\u0627\u0628\u0637 \u0628\u0647\u06CC\u0646\u0647\u200C\u0634\u062F\u0647 \u0628\u0631\u0627\u06CC \u0645\u0648\u0628\u0627\u06CC\u0644",
"\u0635\u0641 \u067E\u06CC\u0627\u0645 \u0628\u0631\u0648\u0646\u200C\u062E\u0637",
"\u0627\u062D\u0631\u0627\u0632 \u0647\u0648\u06CC\u062A \u0632\u06CC\u0633\u062A\u200C\u0633\u0646\u062C\u06CC"
],
"roadmap.r11.title": "\u0646\u0633\u062E\u0647\u0654 \u0645\u0642\u0627\u0648\u0645 \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u06A9\u0648\u0627\u0646\u062A\u0648\u0645",
"roadmap.r11.sub": "\u062D\u0641\u0627\u0638\u062A \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u0631\u0627\u06CC\u0627\u0646\u0647\u200C\u0647\u0627\u06CC \u06A9\u0648\u0627\u0646\u062A\u0648\u0645\u06CC",
"roadmap.r11.date": "\u0633\u0647\u200C\u0645\u0627\u0647\u0647\u0654 \u0686\u0647\u0627\u0631\u0645 \u06F2\u06F0\u06F2\u06F7",
"roadmap.r11.features": [
"\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u067E\u0633\u0627\u06A9\u0648\u0627\u0646\u062A\u0648\u0645\u06CC CRYSTALS-Kyber",
"\u0627\u0645\u0636\u0627\u06CC \u062F\u06CC\u062C\u06CC\u062A\u0627\u0644 SPHINCS+",
"\u0637\u0631\u062D \u062A\u0631\u06A9\u06CC\u0628\u06CC: \u06A9\u0644\u0627\u0633\u06CC\u06A9 + \u067E\u0633\u0627\u06A9\u0648\u0627\u0646\u062A\u0648\u0645\u06CC",
"\u062A\u0628\u0627\u062F\u0644 \u06A9\u0644\u06CC\u062F \u0627\u0645\u0646 \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u06A9\u0648\u0627\u0646\u062A\u0648\u0645",
"\u0627\u0644\u06AF\u0648\u0631\u06CC\u062A\u0645\u200C\u0647\u0627\u06CC \u062F\u0631\u0647\u0645\u200C\u0633\u0627\u0632\u06CC \u0628\u0647\u200C\u0631\u0648\u0632",
"\u06A9\u0648\u0686 \u0646\u0634\u0633\u062A\u200C\u0647\u0627\u06CC \u0645\u0648\u062C\u0648\u062F",
"\u0633\u0627\u0632\u06AF\u0627\u0631\u06CC \u0628\u0627 \u0646\u0633\u062E\u0647\u0654 \u06F5.x",
"\u067E\u0631\u0648\u062A\u06A9\u0644\u200C\u0647\u0627\u06CC \u0645\u0642\u0627\u0648\u0645 \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u06A9\u0648\u0627\u0646\u062A\u0648\u0645"
],
"roadmap.r12.title": "\u0634\u0628\u06A9\u0647\u0654 \u063A\u06CC\u0631\u0645\u062A\u0645\u0631\u06A9\u0632",
"roadmap.r12.sub": "\u0634\u0628\u06A9\u0647\u0654 \u06A9\u0627\u0645\u0644\u0627\u064B \u063A\u06CC\u0631\u0645\u062A\u0645\u0631\u06A9\u0632",
"roadmap.r12.date": "\u06F2\u06F0\u06F2\u06F8",
"roadmap.r12.features": [
"\u0634\u0628\u06A9\u0647\u0654 \u0645\u0650\u0634 \u06AF\u0631\u0647\u200C\u0647\u0627",
"\u200FDHT \u0628\u0631\u0627\u06CC \u06CC\u0627\u0641\u062A\u0646 \u0647\u0645\u062A\u0627",
"\u0645\u0633\u06CC\u0631\u06CC\u0627\u0628\u06CC \u067E\u06CC\u0627\u0632\u06CC \u062F\u0631\u0648\u0646\u200C\u0633\u0627\u062E\u062A",
"\u0627\u0642\u062A\u0635\u0627\u062F \u062A\u0648\u06A9\u0646 \u0648 \u0627\u0646\u06AF\u06CC\u0632\u0647 \u0628\u0631\u0627\u06CC \u06AF\u0631\u0647\u200C\u0647\u0627",
"\u0631\u0627\u0647\u0628\u0631\u06CC \u0627\u0632 \u0631\u0627\u0647 DAO",
"\u0647\u0645\u200C\u06A9\u0646\u0634\u200C\u067E\u0630\u06CC\u0631\u06CC \u0628\u0627 \u0634\u0628\u06A9\u0647\u200C\u0647\u0627\u06CC \u062F\u06CC\u06AF\u0631",
"\u0633\u0627\u0632\u06AF\u0627\u0631\u06CC \u0686\u0646\u062F\u0633\u06A9\u0648\u06CC\u06CC",
"\u0634\u0628\u06A9\u0647\u0654 \u062E\u0648\u062F\u062A\u0631\u0645\u06CC\u0645"
],
"roadmap.r13.title": "\u062F\u0633\u062A\u06CC\u0627\u0631 \u062D\u0631\u06CC\u0645 \u062E\u0635\u0648\u0635\u06CC \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06CC",
"roadmap.r13.sub": "\u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06CC \u0628\u0631\u0627\u06CC \u062D\u0631\u06CC\u0645 \u062E\u0635\u0648\u0635\u06CC \u0648 \u0627\u0645\u0646\u06CC\u062A",
"roadmap.r13.date": "\u06F2\u06F0\u06F2\u06F8 \u0628\u0647 \u0628\u0639\u062F",
"roadmap.r13.features": [
"\u062A\u062D\u0644\u06CC\u0644 \u0645\u062D\u0644\u06CC \u062A\u0647\u062F\u06CC\u062F \u0628\u0627 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06CC",
"\u062A\u0634\u062E\u06CC\u0635 \u062E\u0648\u062F\u06A9\u0627\u0631 \u062D\u0645\u0644\u0647\u0654 \u0645\u0631\u062F \u0645\u06CC\u0627\u0646\u06CC",
"\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u0633\u0627\u0632\u06AF\u0627\u0631\u0634\u0648\u0646\u062F\u0647",
"\u062A\u0648\u0635\u06CC\u0647\u200C\u0647\u0627\u06CC \u0627\u0645\u0646\u06CC\u062A\u06CC \u0634\u062E\u0635\u06CC\u200C\u0633\u0627\u0632\u06CC\u200C\u0634\u062F\u0647",
"\u06CC\u0627\u062F\u06AF\u06CC\u0631\u06CC \u0645\u0627\u0634\u06CC\u0646 \u0628\u0627 \u062F\u0627\u0646\u0634 \u0635\u0641\u0631",
"\u062F\u0633\u062A\u06CC\u0627\u0631 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06CC \u062E\u0635\u0648\u0635\u06CC",
"\u0627\u0645\u0646\u06CC\u062A \u067E\u06CC\u0634\u200C\u0628\u06CC\u0646\u0627\u0646\u0647",
"\u062D\u0641\u0627\u0638\u062A \u062E\u0648\u062F\u06AF\u0631\u062F\u0627\u0646 \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u062D\u0645\u0644\u0647"
],
"handshake.step1": "\u0633\u0627\u062E\u062A \u062C\u0641\u062A \u06A9\u0644\u06CC\u062F ECDH P-384",
"handshake.step2": "\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u06A9\u062F \u062A\u0623\u06CC\u06CC\u062F",
"handshake.step3": "\u062A\u062B\u0628\u06CC\u062A \u0631\u0627\u0632\u062F\u0627\u0631\u06CC \u067E\u06CC\u0634\u0631\u0648 \u06A9\u0627\u0645\u0644",
"handshake.securingTitle": "\u062F\u0631 \u062D\u0627\u0644 \u0627\u06CC\u0645\u0646\u200C\u0633\u0627\u0632\u06CC \u06A9\u0627\u0646\u0627\u0644 \u0634\u0645\u0627",
"handshake.answerTitle": "\u062F\u0631 \u062D\u0627\u0644 \u0633\u0627\u062E\u062A \u067E\u0627\u0633\u062E \u0634\u0645\u0627",
"handshake.securingDesc": "\u06A9\u0644\u06CC\u062F\u0647\u0627\u06CC\u06CC \u0645\u06CC\u200C\u0633\u0627\u0632\u06CC\u0645 \u06A9\u0647 \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u062F\u0633\u062A\u06A9\u0627\u0631\u06CC \u062A\u0627\u0628 \u0628\u06CC\u0627\u0648\u0631\u0646\u062F.",
"handshake.shareTitle": "\u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647\u200C\u062A\u0627\u0646 \u0631\u0627 \u0628\u0647 \u0627\u0634\u062A\u0631\u0627\u06A9 \u0628\u06AF\u0630\u0627\u0631\u06CC\u062F",
"handshake.sendAnswerTitle": "\u067E\u0627\u0633\u062E \u062E\u0648\u062F \u0631\u0627 \u0628\u0631\u06AF\u0631\u062F\u0627\u0646\u06CC\u062F",
"handshake.shareDesc": "\u200FQR \u0631\u0627 \u0646\u0634\u0627\u0646 \u062F\u0647\u06CC\u062F \u06CC\u0627 \u06A9\u062F \u0631\u0627 \u0628\u0631\u0627\u06CC \u0647\u0645\u062A\u0627\u06CC\u062A\u0627\u0646 \u0628\u0641\u0631\u0633\u062A\u06CC\u062F. \u06CC\u06A9\u200C\u0628\u0627\u0631\u0645\u0635\u0631\u0641 \u0627\u0633\u062A \u0648 \u0628\u0647\u200C\u0632\u0648\u062F\u06CC \u0645\u0646\u0642\u0636\u06CC \u0645\u06CC\u200C\u0634\u0648\u062F.",
"handshake.sendAnswerDesc": "\u0627\u06CC\u0646 \u067E\u0627\u0633\u062E \u0631\u0627 \u0628\u0647 \u0633\u0627\u0632\u0646\u062F\u0647\u0654 \u06A9\u0627\u0646\u0627\u0644 \u0628\u062F\u0647\u06CC\u062F \u062A\u0627 \u062F\u0633\u062A\u200C\u062F\u0627\u062F\u0646 \u0631\u0627 \u06A9\u0627\u0645\u0644 \u06A9\u0646\u062F.",
"handshake.establish": "\u0628\u0631\u0642\u0631\u0627\u0631\u06CC \u0627\u062A\u0635\u0627\u0644",
"handshake.thenReceive": "\u0633\u067E\u0633 \u067E\u0627\u0633\u062E\u06CC \u0631\u0627 \u06A9\u0647 \u0647\u0645\u062A\u0627\u06CC\u062A\u0627\u0646 \u0628\u0631\u0645\u06CC\u200C\u06AF\u0631\u062F\u0627\u0646\u062F \u062F\u0631\u06CC\u0627\u0641\u062A \u06A9\u0646\u06CC\u062F",
"handshake.pasteAnswerPlaceholder": "\u06A9\u062F \u067E\u0627\u0633\u062E \u0647\u0645\u062A\u0627 \u0631\u0627 \u0628\u0686\u0633\u0628\u0627\u0646\u06CC\u062F\u2026",
"handshake.answerSentNote": "\u0627\u06CC\u0646 \u067E\u0627\u0633\u062E \u0631\u0627 \u0628\u0631\u0627\u06CC \u0633\u0627\u0632\u0646\u062F\u0647 \u0628\u0641\u0631\u0633\u062A\u06CC\u062F \u0648 \u0645\u0646\u062A\u0638\u0631 \u0628\u0645\u0627\u0646\u06CC\u062F - \u06AF\u0641\u062A\u06AF\u0648 \u0628\u0647\u200C\u0645\u062D\u0636 \u0627\u062A\u0635\u0627\u0644 \u0627\u0648 \u0628\u0627\u0632 \u0645\u06CC\u200C\u0634\u0648\u062F.",
"handshake.qrHint": "\u0627\u06CC\u0646 \u0631\u0627 \u0628\u0627\u0632 \u0646\u06AF\u0647 \u062F\u0627\u0631\u06CC\u062F \u062A\u0627 \u0647\u0645\u062A\u0627\u06CC\u062A\u0627\u0646 \u06A9\u062F \u0631\u0627 \u0628\u06AF\u06CC\u0631\u062F.",
"handshake.qrHintFrames": "\u062F\u0633\u062A\u200C\u062F\u0627\u062F\u0646 \u0645\u06CC\u0627\u0646 {frames} \u0641\u0631\u06CC\u0645 \u067E\u062E\u0634 \u0634\u062F\u0647 \u0627\u0633\u062A - \u0627\u06CC\u0646 \u0631\u0627 \u0628\u0627\u0632 \u0646\u06AF\u0647 \u062F\u0627\u0631\u06CC\u062F \u062A\u0627 \u0647\u0645\u062A\u0627\u06CC\u062A\u0627\u0646 \u0647\u0645\u0647\u0654 \u0622\u0646\u200C\u0647\u0627 \u0631\u0627 \u0628\u06AF\u06CC\u0631\u062F.",
"verify.title": "\u062A\u0623\u06CC\u06CC\u062F \u0627\u0645\u0646\u06CC\u062A\u06CC",
"verify.desc": "\u0627\u06CC\u0646 \u06A9\u062F \u0627\u06CC\u0645\u0646\u06CC \u0631\u0627 \u0627\u0632 \u0631\u0627\u0647 \u06A9\u0627\u0646\u0627\u0644\u06CC \u062C\u062F\u0627\u06AF\u0627\u0646\u0647 (\u062A\u0645\u0627\u0633 \u0635\u0648\u062A\u06CC / \u062D\u0636\u0648\u0631\u06CC) \u0628\u0627 \u0647\u0645\u062A\u0627\u06CC\u062A\u0627\u0646 \u0645\u0642\u0627\u06CC\u0633\u0647 \u06A9\u0646\u06CC\u062F\u060C \u0633\u067E\u0633 \u0622\u0646 \u0631\u0627 \u0628\u0646\u0648\u06CC\u0633\u06CC\u062F \u062A\u0627 \u06AF\u0641\u062A\u06AF\u0648 \u0628\u0627\u0632 \u0634\u0648\u062F.",
"verify.enterLabel": "\u06A9\u062F \u062A\u0623\u06CC\u06CC\u062F\u0634\u062F\u0647 \u0631\u0627 \u0648\u0627\u0631\u062F \u06A9\u0646\u06CC\u062F",
"verify.placeholder": "\u06A9\u062F \u0631\u0627 \u0627\u06CC\u0646\u062C\u0627 \u0628\u0646\u0648\u06CC\u0633\u06CC\u062F",
"verify.confirm": "\u062A\u0623\u06CC\u06CC\u062F \u06A9\u062F",
"verify.confirmed": "\u062A\u0623\u06CC\u06CC\u062F \u0634\u062F",
"verify.mismatch": "\u0647\u0645\u200C\u062E\u0648\u0627\u0646 \u0646\u06CC\u0633\u062A\u0646\u062F",
"verify.yours": "\u062A\u0623\u06CC\u06CC\u062F \u0634\u0645\u0627",
"verify.peer": "\u062A\u0623\u06CC\u06CC\u062F \u0647\u0645\u062A\u0627",
"verify.pending": "\u062F\u0631 \u0627\u0646\u062A\u0638\u0627\u0631",
"verify.waiting": "\u062F\u0631 \u0627\u0646\u062A\u0638\u0627\u0631 \u06A9\u062F\u2026",
"verify.verified": "\u06A9\u0627\u0646\u0627\u0644 \u062A\u0623\u06CC\u06CC\u062F \u0634\u062F",
"verify.bothConfirmed": "\u0647\u0631 \u062F\u0648 \u0637\u0631\u0641 \u062A\u0623\u06CC\u06CC\u062F \u06A9\u0631\u062F\u0646\u062F. \u06AF\u0641\u062A\u06AF\u0648\u06CC \u0627\u0645\u0646 \u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0632 \u0634\u062F\u0646\u2026",
"pwa.bannerTitle": "\u200FSecureBit.chat \u0631\u0627 \u0646\u0635\u0628 \u06A9\u0646\u06CC\u062F",
"pwa.bannerDesc": "\u062A\u062C\u0631\u0628\u0647\u0654 \u0628\u0631\u0646\u0627\u0645\u0647\u0654 \u0628\u0648\u0645\u06CC \u0628\u0627 \u0627\u0645\u0646\u06CC\u062A \u0628\u06CC\u0634\u062A\u0631",
"pwa.install": "\u0646\u0635\u0628",
"pwa.dismiss": "\u0628\u0633\u062A\u0646",
"pwa.close": "\u0628\u0633\u062A\u0646",
"pwa.iosTitle": "\u0646\u0635\u0628 \u0631\u0648\u06CC iOS",
"pwa.iosStep1": "\u062F\u06A9\u0645\u0647\u0654 \u0647\u0645\u200C\u0631\u0633\u0627\u0646\u06CC \u0631\u0627 \u0628\u0632\u0646\u06CC\u062F",
"pwa.iosStep1Hint": "\u0645\u0639\u0645\u0648\u0644\u0627\u064B \u067E\u0627\u06CC\u06CC\u0646 \u0633\u0627\u0641\u0627\u0631\u06CC",
"pwa.iosStep2": "\xAB\u0627\u0641\u0632\u0648\u062F\u0646 \u0628\u0647 \u0635\u0641\u062D\u0647\u0654 \u0627\u0635\u0644\u06CC\xBB \u0631\u0627 \u067E\u06CC\u062F\u0627 \u06A9\u0646\u06CC\u062F",
"pwa.iosStep2Hint": "\u062F\u0631 \u0645\u0646\u0648\u06CC \u0647\u0645\u200C\u0631\u0633\u0627\u0646\u06CC \u067E\u0627\u06CC\u06CC\u0646 \u0628\u0631\u0648\u06CC\u062F",
"pwa.iosStep3": "\xAB\u0627\u0641\u0632\u0648\u062F\u0646\xBB \u0631\u0627 \u0628\u0632\u0646\u06CC\u062F",
"pwa.iosStep3Hint": "\u0628\u0631\u0627\u06CC \u0646\u0635\u0628 SecureBit.chat \u062A\u0623\u06CC\u06CC\u062F \u06A9\u0646\u06CC\u062F",
"pwa.genericTitle": "\u0646\u0635\u0628 SecureBit",
"pwa.genericDesc": "\u0647\u0631 \u0645\u0631\u0648\u0631\u06AF\u0631 \u0631\u0648\u0634 \u0646\u0635\u0628 \u062E\u0648\u062F\u0634 \u0631\u0627 \u062F\u0627\u0631\u062F. \u06AF\u0627\u0645\u200C\u0647\u0627\u06CC\u06CC \u0631\u0627 \u0628\u0631\u06AF\u0632\u06CC\u0646\u06CC\u062F \u06A9\u0647 \u0628\u0627 \u0645\u0631\u0648\u0631\u06AF\u0631 \u0634\u0645\u0627 \u0645\u06CC\u200C\u062E\u0648\u0627\u0646\u062F.",
"pwa.gotIt": "\u0645\u062A\u0648\u062C\u0647 \u0634\u062F\u0645",
"pwa.installedTitle": "\u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0635\u0628 \u0634\u062F!",
"pwa.installedIos": "\u0628\u0631\u0646\u0627\u0645\u0647\u0654 iOS \u0646\u0635\u0628 \u0634\u062F! \u0627\u0632 \u0635\u0641\u062D\u0647\u0654 \u0627\u0635\u0644\u06CC \u0628\u0627\u0632\u0634 \u06A9\u0646\u06CC\u062F.",
"pwa.installedGeneric": "\u200FSecureBit.chat \u0627\u06A9\u0646\u0648\u0646 \u0631\u0648\u06CC \u062F\u0633\u062A\u06AF\u0627\u0647 \u0634\u0645\u0627\u0633\u062A",
"pwa.anytimeTitle": "\u0647\u0631 \u0648\u0642\u062A \u062E\u0648\u0627\u0633\u062A\u06CC\u062F \u0646\u0635\u0628 \u06A9\u0646\u06CC\u062F",
"pwa.anytimeDesc": "\u0647\u0646\u0648\u0632 \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u06CC\u062F SecureBit.chat \u0631\u0627 \u0627\u0632 \u0645\u0646\u0648\u06CC \u0645\u0631\u0648\u0631\u06AF\u0631\u062A\u0627\u0646 \u0646\u0635\u0628 \u06A9\u0646\u06CC\u062F \u062A\u0627 \u0628\u0647\u062A\u0631\u06CC\u0646 \u062A\u062C\u0631\u0628\u0647 \u0631\u0627 \u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u06CC\u062F.",
"pwa.ok": "\u0628\u0627\u0634\u0647",
"step.open": "\u06AF\u0627\u0645 \u06F1 \xB7 \u06AF\u0634\u0648\u062F\u0646 \u06A9\u0627\u0646\u0627\u0644",
"step.exchange": "\u06AF\u0627\u0645 \u06F2 \xB7 \u062A\u0628\u0627\u062F\u0644",
"step.verification": "\u06AF\u0627\u0645 \u06F3 \xB7 \u062A\u0623\u06CC\u06CC\u062F",
"action.create": "\u0633\u0627\u062E\u062A",
"action.join": "\u067E\u06CC\u0648\u0633\u062A\u0646",
"action.back": "\u0628\u0627\u0632\u06AF\u0634\u062A",
"action.copy": "\u0631\u0648\u0646\u0648\u0634\u062A",
"action.copied": "\u0631\u0648\u0646\u0648\u0634\u062A \u0634\u062F",
"action.scan": "\u062E\u0648\u0627\u0646\u062F\u0646",
"action.downloadDesktop": "\u062F\u0631\u06CC\u0627\u0641\u062A \u0628\u0631\u0646\u0627\u0645\u0647\u0654 \u0631\u0648\u0645\u06CC\u0632\u06CC",
"action.advancedSettings": "\u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u067E\u06CC\u0634\u0631\u0641\u062A\u0647",
"cred.offerTag": "\u067E\u06CC\u0634\u0646\u0647\u0627\u062F \xB7 \u06CC\u0627 \u0645\u062A\u0646 \u0631\u0627 \u0631\u0648\u0646\u0648\u0634\u062A \u06A9\u0646\u06CC\u062F",
"cred.answerTag": "\u067E\u0627\u0633\u062E \xB7 \u06CC\u0627 \u0645\u062A\u0646 \u0631\u0627 \u0631\u0648\u0646\u0648\u0634\u062A \u06A9\u0646\u06CC\u062F",
"cred.reveal": "\u0628\u0631\u0627\u06CC \u0646\u0645\u0627\u06CC\u0634 \u06A9\u0644\u06CC\u06A9 \u06A9\u0646\u06CC\u062F - \u0627\u06CC\u0646 \u06A9\u062F \u0631\u0627 \u062E\u0635\u0648\u0635\u06CC \u0646\u06AF\u0647 \u062F\u0627\u0631\u06CC\u062F",
"qr.title": "\u062E\u0648\u0627\u0646\u062F\u0646 \u06A9\u062F QR",
"qr.subtitle": "\u062F\u0648\u0631\u0628\u06CC\u0646 \u0631\u0627 \u0628\u0647 QR \u0622\u0646\u200C\u0647\u0627 \u0628\u06AF\u06CC\u0631\u06CC\u062F",
"qr.scanning": "\u062F\u0631 \u062D\u0627\u0644 \u062E\u0648\u0627\u0646\u062F\u0646\u2026",
"qr.hint": "\u062B\u0627\u0628\u062A \u0646\u06AF\u0647 \u062F\u0627\u0631\u06CC\u062F \u062A\u0627 \u0647\u0645\u0647\u0654 \u0628\u062E\u0634\u200C\u0647\u0627 \u06AF\u0631\u0641\u062A\u0647 \u0634\u0648\u062F. \u062F\u0633\u062A\u0631\u0633\u06CC \u0628\u0647 \u062F\u0648\u0631\u0628\u06CC\u0646 \u0645\u062D\u0644\u06CC \u0627\u0633\u062A - \u0686\u06CC\u0632\u06CC \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u0646\u0645\u06CC\u200C\u0634\u0648\u062F.",
"mesh.you": "\u0634\u0645\u0627",
"mesh.peer": "\u0647\u0645\u062A\u0627 \xB7 \u0646\u0634\u0633\u062A \u06F1",
"mesh.joined2": "\u200Fmara \u067E\u06CC\u0648\u0633\u062A \xB7 +\u06F2",
"mesh.joined3": "\u200Ftobi \u067E\u06CC\u0648\u0633\u062A \xB7 +\u06F3",
"ice.title": "\u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u0634\u0628\u06A9\u0647",
"ice.subtitle": "\u0628\u0647\u200C\u0635\u0648\u0631\u062A \u0645\u062D\u0644\u06CC \u062A\u0646\u0638\u06CC\u0645 \u0645\u06CC\u200C\u0634\u0648\u062F - \u0647\u0631\u06AF\u0632 \u0628\u0627 \u0647\u0645\u062A\u0627\u06CC \u0634\u0645\u0627 \u0628\u0647 \u0627\u0634\u062A\u0631\u0627\u06A9 \u06AF\u0630\u0627\u0634\u062A\u0647 \u0646\u0645\u06CC\u200C\u0634\u0648\u062F",
"ice.intro": "\u200FSecureBit \u0628\u0647\u200C\u0637\u0648\u0631 \u067E\u06CC\u0634\u200C\u0641\u0631\u0636 \u0627\u0632 \u0633\u0631\u0648\u0631\u0647\u0627\u06CC \u0639\u0645\u0648\u0645\u06CC STUN \u0628\u0631\u0627\u06CC \u0645\u0630\u0627\u06A9\u0631\u0647\u0654 \u067E\u06CC\u0648\u0646\u062F \u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627 \u0628\u0647\u0631\u0647 \u0645\u06CC\u200C\u0628\u0631\u062F. \u0627\u06AF\u0631 \u062E\u0648\u062F\u062A\u0627\u0646 \u0645\u06CC\u0632\u0628\u0627\u0646\u06CC \u0645\u06CC\u200C\u06A9\u0646\u06CC\u062F\u060C \u0622\u0646 \u0631\u0627 \u0628\u0647 STUN/TURN \u062E\u0648\u062F\u062A\u0627\u0646 \u0628\u0633\u067E\u0627\u0631\u06CC\u062F.",
"ice.publicTitle": "\u0633\u0631\u0648\u0631\u0647\u0627\u06CC \u0639\u0645\u0648\u0645\u06CC (\u067E\u06CC\u0634\u200C\u0641\u0631\u0636)",
"ice.publicDesc": "\u0628\u062F\u0648\u0646 \u067E\u06CC\u06A9\u0631\u0628\u0646\u062F\u06CC. \u0628\u0631\u0627\u06CC \u0628\u06CC\u0634\u062A\u0631 \u06A9\u0627\u0631\u0628\u0631\u0627\u0646 \u0645\u0646\u0627\u0633\u0628 \u0627\u0633\u062A.",
"ice.customTitle": "\u0633\u0631\u0648\u0631\u0647\u0627\u06CC STUN/TURN \u062E\u0648\u062F\u0645",
"ice.customDesc": "\u062A\u0627 {max} \u0633\u0631\u0648\u0631.",
"ice.turnNote": "\u06CC\u06A9 \u0628\u0627\u0632\u067E\u062E\u0634 TURN \u0646\u0634\u0627\u0646\u06CC IP \u0647\u0631 \u062F\u0648 \u0647\u0645\u062A\u0627 \u0648 \u0632\u0645\u0627\u0646\u200C\u0628\u0646\u062F\u06CC \u062A\u0631\u0627\u0641\u06CC\u06A9 \u0631\u0627 \u0645\u06CC\u200C\u0628\u06CC\u0646\u062F - \u0627\u0645\u0627 \u0647\u0631\u06AF\u0632 \u0645\u062D\u062A\u0648\u0627\u06CC \u067E\u06CC\u0627\u0645\u200C\u0647\u0627 \u0631\u0627\u060C \u06A9\u0647 \u0633\u0631\u062A\u0627\u0633\u0631\u06CC \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647 \u0645\u06CC\u200C\u0645\u0627\u0646\u0646\u062F. \u062A\u0631\u062C\u06CC\u062D \u0628\u0627 ",
"ice.turnNoteTls": " \u200F(TLS) \u0627\u0633\u062A.",
"ice.test": "\u0622\u0632\u0645\u0648\u062F\u0646 \u0633\u0631\u0648\u0631\u0647\u0627",
"ice.testing": "\u062F\u0631 \u062D\u0627\u0644 \u0622\u0632\u0645\u0648\u062F\u0646\u2026",
"ice.relayTitle": "\u062D\u0627\u0644\u062A \u0641\u0642\u0637 \u0628\u0627\u0632\u067E\u062E\u0634",
"ice.relayBadge": "\u0628\u06CC\u0634\u062A\u0631\u06CC\u0646 \u062D\u0631\u06CC\u0645 \u062E\u0635\u0648\u0635\u06CC",
"ice.relayDesc": "\u0647\u0645\u0647\u0654 \u062A\u0631\u0627\u0641\u06CC\u06A9 \u0631\u0627 \u0627\u0632 \u0631\u0627\u0647 TURN \u0645\u06CC\u200C\u0641\u0631\u0633\u062A\u062F \u062A\u0627 \u0646\u0634\u0627\u0646\u06CC IP \u0634\u0645\u0627 \u0647\u0631\u06AF\u0632 \u0628\u0647 \u0647\u0645\u062A\u0627 \u0641\u0627\u0634 \u0646\u0634\u0648\u062F. \u0646\u06CC\u0627\u0632\u0645\u0646\u062F \u0633\u0631\u0648\u0631 TURN \u0627\u0633\u062A.",
"ice.relayWarning": "\u062D\u0627\u0644\u062A \u0641\u0642\u0637 \u0628\u0627\u0632\u067E\u062E\u0634 \u0631\u0648\u0634\u0646 \u0627\u0633\u062A \u0627\u0645\u0627 \u0647\u06CC\u0686 \u0633\u0631\u0648\u0631 TURN \u062A\u0646\u0638\u06CC\u0645 \u0646\u0634\u062F\u0647. \u0627\u062A\u0635\u0627\u0644 \u0646\u062E\u0648\u0627\u0647\u062F \u062A\u0648\u0627\u0646\u0633\u062A \u0622\u063A\u0627\u0632 \u0634\u0648\u062F.",
"ice.persist": "\u0631\u0648\u06CC \u0627\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647 \u0630\u062E\u06CC\u0631\u0647 \u06A9\u0646",
"ice.persistDesc": "\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647 \u062F\u0631 \u0647\u0645\u06CC\u0646 \u0645\u0631\u0648\u0631\u06AF\u0631 \u0630\u062E\u06CC\u0631\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F. \u062E\u0627\u0645\u0648\u0634 \u0628\u06AF\u0630\u0627\u0631\u06CC\u062F \u062A\u0627 \u0641\u0642\u0637 \u062F\u0631 \u0647\u0645\u06CC\u0646 \u0646\u0634\u0633\u062A \u0628\u0647\u200C\u06A9\u0627\u0631 \u0631\u0648\u062F.",
"ice.forget": "\u0630\u062E\u06CC\u0631\u0647\u200C\u0634\u062F\u0647 \u0631\u0627 \u0641\u0631\u0627\u0645\u0648\u0634 \u06A9\u0646",
"ice.cancel": "\u0627\u0646\u0635\u0631\u0627\u0641",
"ice.apply": "\u0627\u0639\u0645\u0627\u0644",
"ice.errUnavailable": "\u200FWebRTC \u062F\u0631 \u0627\u06CC\u0646 \u0645\u0631\u0648\u0631\u06AF\u0631 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A",
"ice.errInvalid": "\u067E\u06CC\u06A9\u0631\u0628\u0646\u062F\u06CC \u0633\u0631\u0648\u0631 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",
"update.title": "\u0628\u0647\u200C\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u0645\u0648\u062C\u0648\u062F \u0627\u0633\u062A",
"update.desc": "\u0646\u0633\u062E\u0647\u0654 \u062A\u0627\u0632\u0647\u200C\u062A\u0631\u06CC \u0627\u0632 SecureBit \u06CC\u0627\u0641\u062A \u0634\u062F.",
"update.currentVersion": "\u0646\u0633\u062E\u0647\u0654 \u06A9\u0646\u0648\u0646\u06CC",
"update.newVersion": "\u0646\u0633\u062E\u0647\u0654 \u062A\u0627\u0632\u0647",
"update.now": "\u0627\u06A9\u0646\u0648\u0646 \u0628\u0647\u200C\u0631\u0648\u0632 \u06A9\u0646",
"update.later": "\u0628\u0639\u062F\u0627\u064B",
"update.unknown": "\u0646\u0627\u0645\u0634\u062E\u0635",
"update.stepSaving": "\u062F\u0631 \u062D\u0627\u0644 \u0630\u062E\u06CC\u0631\u0647\u0654 \u062F\u0627\u062F\u0647\u200C\u0647\u0627...",
"update.stepSwCaches": "\u062F\u0631 \u062D\u0627\u0644 \u067E\u0627\u06A9\u200C\u0633\u0627\u0632\u06CC \u062D\u0627\u0641\u0638\u0647\u0654 \u0646\u0647\u0627\u0646 Service Worker...",
"update.stepSwUnregister": "\u062F\u0631 \u062D\u0627\u0644 \u0644\u063A\u0648 \u062B\u0628\u062A Service Worker\u200C\u0647\u0627...",
"update.stepBrowserCache": "\u062F\u0631 \u062D\u0627\u0644 \u067E\u0627\u06A9\u200C\u0633\u0627\u0632\u06CC \u062D\u0627\u0641\u0638\u0647\u0654 \u0646\u0647\u0627\u0646 \u0645\u0631\u0648\u0631\u06AF\u0631...",
"update.stepVersion": "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0647\u200C\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u0646\u0633\u062E\u0647...",
"update.stepReload": "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u062F\u0648\u0628\u0627\u0631\u0647\u0654 \u0628\u0631\u0646\u0627\u0645\u0647...",
"update.error": "\u062E\u0637\u0627\u06CC \u0628\u0647\u200C\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC. \u0644\u0637\u0641\u0627\u064B \u0635\u0641\u062D\u0647 \u0631\u0627 \u062F\u0633\u062A\u06CC \u062A\u0627\u0632\u0647 \u06A9\u0646\u06CC\u062F (Ctrl+F5 \u06CC\u0627 Cmd+Shift+R)",
"update.confirmSkip": "\u0646\u0633\u062E\u0647\u0654 \u062A\u0627\u0632\u0647\u200C\u0627\u06CC \u0645\u0648\u062C\u0648\u062F \u0627\u0633\u062A. \u0628\u0647\u200C\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u0628\u0631\u0627\u06CC \u0627\u0645\u0646\u06CC\u062A \u0648 \u067E\u0627\u06CC\u062F\u0627\u0631\u06CC \u062A\u0648\u0635\u06CC\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F. \u0628\u062F\u0648\u0646 \u0628\u0647\u200C\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u0627\u062F\u0627\u0645\u0647 \u0645\u06CC\u200C\u062F\u0647\u06CC\u062F\u061F",
"offline.backOnline": "\u062F\u0648\u0628\u0627\u0631\u0647 \u0628\u0631\u062E\u0637",
"offline.mode": "\u062D\u0627\u0644\u062A \u0628\u0631\u0648\u0646\u200C\u062E\u0637",
"offline.dismiss": "\u0628\u0633\u062A\u0646",
"offline.lostTitle": "\u0627\u062A\u0635\u0627\u0644 \u0642\u0637\u0639 \u0634\u062F",
"offline.lostDesc": "\u200FSecureBit \u0627\u06A9\u0646\u0648\u0646 \u062F\u0631 \u062D\u0627\u0644\u062A \u0628\u0631\u0648\u0646\u200C\u062E\u0637 \u0627\u0633\u062A. \u0628\u0631\u062E\u06CC \u0627\u0645\u06A9\u0627\u0646\u0627\u062A \u0645\u062D\u062F\u0648\u062F \u0627\u0633\u062A\u060C \u0627\u0645\u0627 \u062F\u0627\u062F\u0647\u200C\u0647\u0627\u06CC \u0634\u0645\u0627 \u0627\u0645\u0646 \u0645\u06CC\u200C\u0645\u0627\u0646\u062F.",
"offline.point1": "\u0646\u0634\u0633\u062A \u0648 \u06A9\u0644\u06CC\u062F\u0647\u0627\u06CC \u0634\u0645\u0627 \u0646\u06AF\u0647 \u062F\u0627\u0634\u062A\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F",
"offline.point2": "\u0647\u06CC\u0686 \u062F\u0627\u062F\u0647\u200C\u0627\u06CC \u0631\u0648\u06CC \u0633\u0631\u0648\u0631\u0647\u0627 \u0630\u062E\u06CC\u0631\u0647 \u0646\u0645\u06CC\u200C\u0634\u0648\u062F",
"offline.point3": "\u067E\u06CC\u0627\u0645\u200C\u0647\u0627 \u0648 \u0641\u0627\u06CC\u0644\u200C\u0647\u0627 \u0647\u0646\u06AF\u0627\u0645 \u0627\u062A\u0635\u0627\u0644 \u062F\u0648\u0628\u0627\u0631\u0647 \u0647\u0645\u06AF\u0627\u0645 \u0645\u06CC\u200C\u0634\u0648\u0646\u062F",
"offline.continue": "\u0628\u0631\u0648\u0646\u200C\u062E\u0637 \u0627\u062F\u0627\u0645\u0647 \u0628\u062F\u0647",
"offline.restoredTitle": "\u0648\u0642\u062A\u06CC \u062F\u0648\u0628\u0627\u0631\u0647 \u0648\u0635\u0644 \u0634\u0648\u06CC\u062F",
"offline.restoredDesc": "\u0642\u0637\u0639 \u0627\u062A\u0635\u0627\u0644 \u0686\u06CC\u0632\u06CC \u0627\u0632 \u0634\u0645\u0627 \u0646\u0645\u06CC\u200C\u06AF\u06CC\u0631\u062F. \u200FSecureBit \u0647\u0645\u0647\u200C\u0686\u06CC\u0632 \u0631\u0627 \u0645\u062D\u0644\u06CC \u062F\u0631 \u0635\u0641 \u0645\u06CC\u200C\u06AF\u0630\u0627\u0631\u062F \u0648 \u0644\u062D\u0638\u0647\u200C\u0627\u06CC \u06A9\u0647 \u0628\u0631\u06AF\u0631\u062F\u06CC\u062F \u0646\u0634\u0633\u062A \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647 \u0631\u0627 \u0627\u0632 \u0633\u0631 \u0645\u06CC\u200C\u06AF\u06CC\u0631\u062F.",
"offline.r1Title": "\u067E\u06CC\u0627\u0645\u200C\u0647\u0627\u06CC \u0634\u0645\u0627 \u0645\u06CC\u200C\u0631\u0633\u062F",
"offline.r1Desc": "\u0647\u0631\u0686\u0647 \u062F\u0631 \u062D\u0627\u0644\u062A \u0628\u0631\u0648\u0646\u200C\u062E\u0637 \u0646\u0648\u0634\u062A\u06CC\u062F \u062E\u0648\u062F\u06A9\u0627\u0631 \u0628\u0631\u0627\u06CC \u0645\u062E\u0627\u0637\u0628\u062A\u0627\u0646 \u0641\u0631\u0633\u062A\u0627\u062F\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F.",
"offline.r2Title": "\u0641\u0627\u06CC\u0644\u200C\u0647\u0627 \u06A9\u0627\u0645\u0644 \u0645\u0646\u062A\u0642\u0644 \u0645\u06CC\u200C\u0634\u0648\u0646\u062F",
"offline.r2Desc": "\u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC\u200C\u0647\u0627 \u0627\u0632 \u0647\u0645\u0627\u0646\u200C\u062C\u0627 \u06A9\u0647 \u0627\u06CC\u0633\u062A\u0627\u062F\u0646\u062F \u0627\u062F\u0627\u0645\u0647 \u0645\u06CC\u200C\u06CC\u0627\u0628\u062F - \u0646\u06CC\u0627\u0632\u06CC \u0628\u0647 \u0641\u0631\u0633\u062A\u0627\u062F\u0646 \u062F\u0648\u0628\u0627\u0631\u0647 \u0646\u06CC\u0633\u062A.",
"offline.r3Title": "\u067E\u06CC\u0627\u0645\u200C\u0647\u0627 \u0648 \u0641\u0627\u06CC\u0644\u200C\u0647\u0627\u06CC \u0622\u0646\u200C\u0647\u0627 \u0645\u06CC\u200C\u0631\u0633\u062F",
"offline.r3Desc": "\u0647\u0631\u0686\u0647 \u0645\u062E\u0627\u0637\u0628\u062A\u0627\u0646 \u062F\u0631 \u0632\u0645\u0627\u0646 \u0642\u0637\u0639\u06CC \u0641\u0631\u0633\u062A\u0627\u062F\u0647\u060C \u0628\u0647\u200C\u062A\u0631\u062A\u06CC\u0628 \u0628\u0647 \u0634\u0645\u0627 \u0645\u06CC\u200C\u0631\u0633\u062F.",
"offline.r4Title": "\u0647\u06CC\u0686\u200C\u0686\u06CC\u0632 \u06AF\u0645 \u0646\u0645\u06CC\u200C\u0634\u0648\u062F",
"offline.r4Desc": "\u067E\u0633 \u0627\u0632 \u0627\u062A\u0635\u0627\u0644 \u062F\u0648\u0628\u0627\u0631\u0647 \u0647\u06CC\u0686 \u0634\u06A9\u0627\u0641\u06CC \u0646\u06CC\u0633\u062A - \u06AF\u0641\u062A\u06AF\u0648 \u062F\u0642\u06CC\u0642\u0627\u064B \u0627\u0632 \u0647\u0645\u0627\u0646\u200C\u062C\u0627 \u06A9\u0647 \u0645\u06A9\u062B \u06A9\u0631\u062F \u0627\u062F\u0627\u0645\u0647 \u0645\u06CC\u200C\u06CC\u0627\u0628\u062F.",
"offline.gotIt": "\u0645\u062A\u0648\u062C\u0647 \u0634\u062F\u0645",
"qr.showTitle": "\u0646\u0645\u0627\u06CC\u0634 \u06A9\u062F QR",
"qr.showSubtitle": "\u062A\u0645\u0627\u0645\u200C\u0635\u0641\u062D\u0647 \xB7 \u0628\u06AF\u0630\u0627\u0631\u06CC\u062F \u0647\u0645\u062A\u0627\u06CC\u062A\u0627\u0646 \u0628\u062E\u0648\u0627\u0646\u062F",
"qr.showSubtitleFrames": "\u062A\u0645\u0627\u0645\u200C\u0635\u0641\u062D\u0647 \xB7 \u0628\u06AF\u0630\u0627\u0631\u06CC\u062F \u0647\u0645\u062A\u0627\u06CC\u062A\u0627\u0646 \u0647\u0631 {frames} \u0641\u0631\u06CC\u0645 \u0631\u0627 \u0628\u062E\u0648\u0627\u0646\u062F",
"notify.enabledBody": "\u0627\u0639\u0644\u0627\u0646\u200C\u0647\u0627 \u0631\u0648\u0634\u0646 \u0634\u062F! \u0628\u0631\u0627\u06CC \u067E\u06CC\u0627\u0645\u200C\u0647\u0627\u06CC \u062A\u0627\u0632\u0647 \u0622\u06AF\u0627\u0647 \u0645\u06CC\u200C\u0634\u0648\u06CC\u062F.",
"notify.workingBody": "\u0627\u0639\u0644\u0627\u0646\u200C\u0647\u0627 \u06A9\u0627\u0631 \u0645\u06CC\u200C\u06A9\u0646\u062F! \u0628\u0631\u0627\u06CC \u067E\u06CC\u0627\u0645\u200C\u0647\u0627\u06CC \u062A\u0627\u0632\u0647 \u0622\u06AF\u0627\u0647 \u0645\u06CC\u200C\u0634\u0648\u06CC\u062F.",
"pw.label": "\u0648\u0631\u0648\u062F \u06AF\u0630\u0631\u0648\u0627\u0698\u0647",
"pw.placeholder": "\u06AF\u0630\u0631\u0648\u0627\u0698\u0647 \u0631\u0627 \u0648\u0627\u0631\u062F \u06A9\u0646\u06CC\u062F...",
"pw.decrypt": "\u0631\u0645\u0632\u06AF\u0634\u0627\u06CC\u06CC",
"pw.cancel": "\u0627\u0646\u0635\u0631\u0627\u0641",
"file.title": "\u0627\u0646\u062A\u0642\u0627\u0644 \u0641\u0627\u06CC\u0644",
"file.drop": "\u0641\u0627\u06CC\u0644\u200C\u0647\u0627 \u0631\u0627 \u0627\u06CC\u0646\u062C\u0627 \u0628\u06A9\u0634\u06CC\u062F \u0648 \u0631\u0647\u0627 \u06A9\u0646\u06CC\u062F",
"file.dropHint": "\u067E\u06CC\u0634 \u0627\u0632 \u0627\u0646\u062A\u0642\u0627\u0644 \u0633\u0631\u062A\u0627\u0633\u0631\u06CC \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u0645\u06CC\u200C\u0634\u0648\u062F \xB7 \u062A\u0627 \u06F1\u06F0\u06F0 \u0645\u06AF\u0627\u0628\u0627\u06CC\u062A",
"file.browse": "\u0645\u0631\u0648\u0631 \u062F\u0633\u062A\u06AF\u0627\u0647",
"file.incoming": "\u062F\u0631\u062E\u0648\u0627\u0633\u062A \u0641\u0627\u06CC\u0644 \u0648\u0631\u0648\u062F\u06CC",
"file.accept": "\u067E\u0630\u06CC\u0631\u0634",
"file.reject": "\u0631\u062F",
"file.download": "\u062F\u0631\u06CC\u0627\u0641\u062A",
"file.notReady": "\u0627\u062A\u0635\u0627\u0644 \u0622\u0645\u0627\u062F\u0647 \u0646\u06CC\u0633\u062A",
"file.tooLarge": "\u0641\u0627\u06CC\u0644 \u0628\u06CC\u0634 \u0627\u0632 \u062D\u062F \u0628\u0632\u0631\u06AF \u0627\u0633\u062A",
"file.typeNotAllowed": "\u0627\u06CC\u0646 \u0646\u0648\u0639 \u0641\u0627\u06CC\u0644 \u0645\u062C\u0627\u0632 \u0646\u06CC\u0633\u062A",
"file.maxConcurrent": "\u0628\u06CC\u0634\u062A\u0631\u06CC\u0646 \u0627\u0646\u062A\u0642\u0627\u0644 \u0647\u0645\u200C\u0632\u0645\u0627\u0646",
"file.gone": "\u0627\u06CC\u0646 \u0641\u0627\u06CC\u0644 \u062F\u06CC\u06AF\u0631 \u0628\u0631\u0627\u06CC \u062F\u0631\u06CC\u0627\u0641\u062A \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A.",
"call.incoming": "\u062A\u0645\u0627\u0633 \u0648\u0631\u0648\u062F\u06CC",
"call.incomingVideo": "\u062A\u0645\u0627\u0633 \u062A\u0635\u0648\u06CC\u0631\u06CC \u0648\u0631\u0648\u062F\u06CC",
"call.encrypted": "\u062A\u0645\u0627\u0633 \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647",
"call.encryptedShort": "\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647",
"call.peer": "\u0647\u0645\u062A\u0627\u06CC \u0627\u0645\u0646",
"call.connecting": "\u062F\u0631 \u062D\u0627\u0644 \u0627\u062A\u0635\u0627\u0644\u2026",
"call.ringing": "\u062F\u0631 \u062D\u0627\u0644 \u0632\u0646\u06AF \u0632\u062F\u0646\u2026",
"call.accept": "\u067E\u0627\u0633\u062E",
"call.decline": "\u0631\u062F",
"call.end": "\u067E\u0627\u06CC\u0627\u0646 \u062A\u0645\u0627\u0633",
"call.camera": "\u062F\u0648\u0631\u0628\u06CC\u0646",
"call.cameraOff": "\u062F\u0648\u0631\u0628\u06CC\u0646 \u062E\u0627\u0645\u0648\u0634",
"call.peerCameraOff": "\u062F\u0648\u0631\u0628\u06CC\u0646 \u0647\u0645\u062A\u0627 \u062E\u0627\u0645\u0648\u0634 \u0627\u0633\u062A",
"call.flipCamera": "\u062A\u0639\u0648\u06CC\u0636 \u062F\u0648\u0631\u0628\u06CC\u0646",
"call.addVideo": "\u0627\u0641\u0632\u0648\u062F\u0646 \u062A\u0635\u0648\u06CC\u0631",
"call.video": "\u062A\u0635\u0648\u06CC\u0631",
"call.muted": "\u0628\u06CC\u200C\u0635\u062F\u0627",
"call.expand": "\u0628\u0632\u0631\u06AF\u200C\u0646\u0645\u0627\u06CC\u06CC",
"call.minimize": "\u06A9\u0648\u0686\u06A9\u200C\u0646\u0645\u0627\u06CC\u06CC",
"call.quality": "\u06A9\u06CC\u0641\u06CC\u062A \u0627\u062A\u0635\u0627\u0644",
"call.qualityExcellent": "\u0639\u0627\u0644\u06CC",
"call.videoPrefix": "\u062A\u0635\u0648\u06CC\u0631\u06CC \xB7 ",
"call.voicePrefix": "\u0635\u0648\u062A\u06CC \xB7 ",
"group.new": "\u06AF\u0631\u0648\u0647 \u062A\u0627\u0632\u0647",
"group.create": "\u0633\u0627\u062E\u062A \u06AF\u0631\u0648\u0647",
"group.join": "\u067E\u06CC\u0648\u0633\u062A\u0646 \u0628\u0647 \u06AF\u0631\u0648\u0647",
"group.name": "\u0646\u0627\u0645 \u06AF\u0631\u0648\u0647",
"group.nameTooLong": "\u0646\u0627\u0645 \u06AF\u0631\u0648\u0647 \u0628\u06CC\u0634 \u0627\u0632 \u062D\u062F \u0628\u0644\u0646\u062F \u0627\u0633\u062A.",
"group.capacity": "\u062A\u0627 {max} \u0646\u0641\u0631\u060C \u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627. \u067E\u06CC\u0634 \u0627\u0632 \u0628\u0627\u0632 \u0634\u062F\u0646 \u06AF\u0631\u0648\u0647\u060C \u0647\u0645\u0647 \u06CC\u06A9 \u06A9\u062F \u0627\u06CC\u0645\u0646\u06CC \u0631\u0627 \u0645\u0642\u0627\u06CC\u0633\u0647 \u0645\u06CC\u200C\u06A9\u0646\u0646\u062F.",
"group.invite": "\u062F\u0639\u0648\u062A",
"group.inviteMore": "\u0627\u0639\u0636\u0627\u06CC \u0628\u06CC\u0634\u062A\u0631\u06CC \u062F\u0639\u0648\u062A \u06A9\u0646\u06CC\u062F",
"group.invitePeople": "\u062F\u0639\u0648\u062A {count} \u0646\u0641\u0631",
"group.invitation": "\u062F\u0639\u0648\u062A \u06AF\u0631\u0648\u0647",
"group.addMembers": "\u0627\u0641\u0632\u0648\u062F\u0646 \u0639\u0636\u0648",
"group.roomFor": "\u062C\u0627 \u0628\u0631\u0627\u06CC {remaining} \u0646\u0641\u0631 \u062F\u06CC\u06AF\u0631 \u0647\u0633\u062A. \u0628\u0647\u200C\u0645\u062D\u0636 \u067E\u06CC\u0648\u0633\u062A\u0646 \u0622\u0646\u200C\u0647\u0627 \u0647\u0645\u0647 \u06A9\u062F \u06AF\u0631\u0648\u0647 \u062A\u0627\u0632\u0647\u200C\u0627\u06CC \u0631\u0627 \u0645\u0642\u0627\u06CC\u0633\u0647 \u0645\u06CC\u200C\u06A9\u0646\u0646\u062F.",
"group.membersCount": "{count} \u0639\u0636\u0648",
"group.member": "\u0639\u0636\u0648",
"group.members": "\u0627\u0639\u0636\u0627",
"group.remove": "\u062D\u0630\u0641 {name}",
"group.message": "\u067E\u06CC\u0627\u0645 \u0628\u0647 {name}",
"group.leave": "\u062E\u0631\u0648\u062C",
"group.leaveThis": "\u0627\u0632 \u0627\u06CC\u0646 \u06AF\u0631\u0648\u0647 \u062E\u0627\u0631\u062C \u0634\u0648\u06CC\u062F",
"group.cancel": "\u0644\u063A\u0648 \u06AF\u0631\u0648\u0647",
"group.close": "\u0628\u0633\u062A\u0646",
"group.cancelBtn": "\u0627\u0646\u0635\u0631\u0627\u0641",
"group.decline": "\u0631\u062F",
"group.working": "\u062F\u0631 \u062D\u0627\u0644 \u06A9\u0627\u0631\u2026",
"group.sasTitle": "\u06A9\u062F \u0627\u06CC\u0645\u0646\u06CC \u06AF\u0631\u0648\u0647",
"group.sasEveryone": "\u0647\u0645\u0647 \u0627\u06CC\u0646 \u06A9\u062F \u0631\u0627 \u0645\u06CC\u200C\u0628\u06CC\u0646\u0646\u062F",
"group.sasCompare": "\u0628\u0631\u0627\u06CC \u06AF\u0634\u0648\u062F\u0646 \u0627\u06CC\u0646 \u06AF\u0631\u0648\u0647\u060C \u06A9\u062F \u06AF\u0631\u0648\u0647 \u0631\u0627 \u0628\u0627 \u0647\u0631 \u0639\u0636\u0648 \u0645\u0642\u0627\u06CC\u0633\u0647 \u06A9\u0646\u06CC\u062F.",
"group.sasReadAloud": "\u0627\u06CC\u0646 \u0631\u0642\u0645\u200C\u0647\u0627 \u0631\u0627 \u0628\u0644\u0646\u062F \u0628\u062E\u0648\u0627\u0646\u06CC\u062F \u0628\u0631\u0627\u06CC ",
"group.sasWarning": "\u0627\u06AF\u0631 \u062D\u062A\u06CC \u06CC\u06A9 \u0639\u0636\u0648 \u06A9\u062F \u062F\u06CC\u06AF\u0631\u06CC \u0628\u062E\u0648\u0627\u0646\u062F\u060C \u06A9\u0633\u06CC \u0645\u06CC\u0627\u0646 \u0634\u0645\u0627 \u0646\u0634\u0633\u062A\u0647 \u0627\u0633\u062A. \u06AF\u0631\u0648\u0647 \u0631\u0627 \u0644\u063A\u0648 \u06A9\u0646\u06CC\u062F - \u062A\u0623\u06CC\u06CC\u062F \u0646\u06A9\u0646\u06CC\u062F.",
"group.confirmFirst": "\u0646\u062E\u0633\u062A \u06A9\u062F \u06AF\u0631\u0648\u0647 \u0631\u0627 \u062A\u0623\u06CC\u06CC\u062F \u06A9\u0646\u06CC\u062F",
"group.codeSuffix": " \xB7 \u06A9\u062F {code}",
"group.exchangingNonces": "\u062F\u0631 \u062D\u0627\u0644 \u062A\u0628\u0627\u062F\u0644 \u0645\u0642\u0627\u062F\u06CC\u0631 \u06CC\u06A9\u200C\u0628\u0627\u0631\u0645\u0635\u0631\u0641\u2026",
"group.waitingCommit": "\u062F\u0631 \u0627\u0646\u062A\u0638\u0627\u0631 \u062A\u0639\u0647\u062F \u0647\u0645\u0647\u0654 \u0627\u0639\u0636\u0627\u2026",
"group.waitingJoin": "\u062F\u0631 \u0627\u0646\u062A\u0638\u0627\u0631 \u067E\u06CC\u0648\u0633\u062A\u0646 \u062F\u06CC\u06AF\u0631 \u0627\u0639\u0636\u0627\u2026",
"group.emptyChat": "\u0647\u0646\u0648\u0632 \u0686\u06CC\u0632\u06CC \u0627\u06CC\u0646\u062C\u0627 \u0646\u06CC\u0633\u062A. \u067E\u06CC\u0627\u0645\u200C\u0647\u0627 \u0631\u0627 \u0641\u0631\u0633\u062A\u0646\u062F\u0647 \u0627\u0645\u0636\u0627 \u0645\u06CC\u200C\u06A9\u0646\u062F \u0648 \u0627\u0632 \u0631\u0627\u0647 \u067E\u06CC\u0648\u0646\u062F \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647\u0654 \u062E\u0648\u062F \u0647\u0631 \u0639\u0636\u0648 \u0645\u06CC\u200C\u0631\u0648\u0646\u062F.",
"group.noVerified": "\u0647\u0646\u0648\u0632 \u06AF\u0641\u062A\u06AF\u0648\u06CC \u062A\u0623\u06CC\u06CC\u062F\u0634\u062F\u0647\u200C\u0627\u06CC \u0646\u06CC\u0633\u062A. \u0646\u062E\u0633\u062A \u06CC\u06A9 \u06AF\u0641\u062A\u06AF\u0648\u06CC \u062F\u0648\u0646\u0641\u0631\u0647 \u0628\u0627\u0632 \u06A9\u0646\u06CC\u062F \u0648 \u06A9\u062F \u0627\u06CC\u0645\u0646\u06CC\u200C\u0627\u0634 \u0631\u0627 \u0645\u0642\u0627\u06CC\u0633\u0647 \u06A9\u0646\u06CC\u062F - \u06AF\u0631\u0648\u0647 \u0627\u0632 \u0627\u062A\u0635\u0627\u0644\u200C\u0647\u0627\u06CC\u06CC \u0633\u0627\u062E\u062A\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F \u06A9\u0647 \u067E\u06CC\u0634\u200C\u062A\u0631 \u0648\u0627\u0631\u0633\u06CC \u06A9\u0631\u062F\u0647\u200C\u0627\u06CC\u062F.",
"group.noMoreToAdd": "\u06AF\u0641\u062A\u06AF\u0648\u06CC \u062A\u0623\u06CC\u06CC\u062F\u0634\u062F\u0647\u0654 \u062F\u06CC\u06AF\u0631\u06CC \u0628\u0631\u0627\u06CC \u0627\u0641\u0632\u0648\u062F\u0646 \u0646\u06CC\u0633\u062A. \u0646\u062E\u0633\u062A \u06CC\u06A9 \u06AF\u0641\u062A\u06AF\u0648\u06CC \u062F\u0648\u0646\u0641\u0631\u0647 \u0628\u0627\u0632 \u06A9\u0646\u06CC\u062F \u0648 \u06A9\u062F \u0627\u06CC\u0645\u0646\u06CC\u200C\u0627\u0634 \u0631\u0627 \u0645\u0642\u0627\u06CC\u0633\u0647 \u06A9\u0646\u06CC\u062F.",
"group.directLink": "\u067E\u06CC\u0648\u0646\u062F \u0645\u0633\u062A\u0642\u06CC\u0645 \u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627",
"group.noDirectLink": "\u0647\u0646\u0648\u0632 \u067E\u06CC\u0648\u0646\u062F \u0645\u0633\u062A\u0642\u06CC\u0645\u06CC \u0646\u06CC\u0633\u062A - \u062A\u0627 \u0633\u0627\u062E\u062A\u0647 \u0634\u0648\u062F\u060C \u0639\u0636\u0648 \u062F\u06CC\u06AF\u0631\u06CC \u067E\u06CC\u0627\u0645\u200C\u0647\u0627 \u0631\u0627 \u0628\u0627\u0632\u067E\u062E\u0634 \u0645\u06CC\u200C\u06A9\u0646\u062F",
"group.relayNote": "\u0628\u0631\u062E\u06CC \u0627\u0639\u0636\u0627 \u0647\u0646\u0648\u0632 \u067E\u06CC\u0648\u0646\u062F \u0645\u0633\u062A\u0642\u06CC\u0645\u06CC \u0628\u0627 \u0634\u0645\u0627 \u0646\u062F\u0627\u0631\u0646\u062F. \u067E\u06CC\u0627\u0645\u200C\u0647\u0627\u06CC\u0634\u0627\u0646 \u0627\u0632 \u0631\u0627\u0647 \u0639\u0636\u0648 \u062F\u06CC\u06AF\u0631\u06CC \u0645\u06CC\u200C\u06AF\u0630\u0631\u062F \u06A9\u0647 \u0645\u06CC\u200C\u0628\u06CC\u0646\u062F \u0634\u0645\u0627 \u062F\u0631 \u062D\u0627\u0644 \u06AF\u0641\u062A\u06AF\u0648\u06CC\u06CC\u062F \u0627\u0645\u0627 \u0646\u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u062F \u0641\u0631\u0627\u062A\u0631 \u0627\u0632 \u0627\u0645\u0636\u0627 \u0631\u0627 \u0628\u062E\u0648\u0627\u0646\u062F \u06CC\u0627 \u06AF\u0641\u062A\u0647\u0654 \u0634\u0645\u0627 \u0631\u0627 \u062A\u063A\u06CC\u06CC\u0631 \u062F\u0647\u062F. \u06AF\u0631\u0648\u0647 \u067E\u06CC\u0648\u0633\u062A\u0647 \u0645\u06CC\u200C\u06A9\u0648\u0634\u062F \u0622\u0646\u200C\u0647\u0627 \u0631\u0627 \u0645\u0633\u062A\u0642\u06CC\u0645 \u0648\u0635\u0644 \u06A9\u0646\u062F.",
"group.relayOnlyOff": "\u062D\u0627\u0644\u062A \u0641\u0642\u0637 \u0628\u0627\u0632\u067E\u062E\u0634 \u062E\u0627\u0645\u0648\u0634 \u0627\u0633\u062A\u060C \u067E\u0633 \u0647\u0631 \u0639\u0636\u0648 \u0645\u0633\u062A\u0642\u06CC\u0645 \u0628\u0647 \u0634\u0645\u0627 \u0648\u0635\u0644 \u0645\u06CC\u200C\u0634\u0648\u062F \u0648 \u0646\u0634\u0627\u0646\u06CC IP \u0634\u0645\u0627 \u0631\u0627 \u0645\u06CC\u200C\u062F\u0627\u0646\u062F - \u0627\u0632 \u062C\u0645\u0644\u0647 \u0627\u0639\u0636\u0627\u06CC\u06CC \u06A9\u0647 \u06A9\u0633 \u062F\u06CC\u06AF\u0631\u06CC \u062F\u0639\u0648\u062A \u06A9\u0631\u062F\u0647. \u0627\u06AF\u0631 \u0627\u06CC\u0646\u062C\u0627 \u0645\u0647\u0645 \u0627\u0633\u062A\u060C \u0622\u0646 \u0631\u0627 \u062F\u0631 \u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u0634\u0628\u06A9\u0647 \u0631\u0648\u0634\u0646 \u06A9\u0646\u06CC\u062F.",
"group.memberOffline": "{name} \u0628\u0631\u0648\u0646\u200C\u062E\u0637 \u0627\u0633\u062A \u0648 \u067E\u06CC\u0627\u0645\u200C\u0647\u0627 \u0631\u0627 \u062F\u0631\u06CC\u0627\u0641\u062A \u0646\u0645\u06CC\u200C\u06A9\u0646\u062F. \u0627\u0648 \u0647\u0645\u0686\u0646\u0627\u0646 \u0639\u0636\u0648 \u0627\u0633\u062A - \u062D\u0630\u0641\u0634 \u06A9\u0644\u06CC\u062F\u0647\u0627\u06CC \u06AF\u0631\u0648\u0647 \u0631\u0627 \u0627\u0632 \u0646\u0648 \u0645\u06CC\u200C\u0633\u0627\u0632\u062F.",
"group.joinNote": "\u062F\u06CC\u06AF\u0631 \u0627\u0639\u0636\u0627 \u0627\u0632 \u062D\u0636\u0648\u0631 \u0634\u0645\u0627 \u062F\u0631 \u0627\u06CC\u0646 \u06AF\u0631\u0648\u0647 \u0622\u06AF\u0627\u0647 \u0645\u06CC\u200C\u0634\u0648\u0646\u062F. \u067E\u06CC\u0634\u06CC\u0646\u0647\u0654 \u067E\u06CC\u0627\u0645\u06CC \u0628\u0631\u0627\u06CC \u062C\u0628\u0631\u0627\u0646 \u0646\u06CC\u0633\u062A - \u06AF\u0631\u0648\u0647 \u062E\u0627\u0644\u06CC \u0622\u063A\u0627\u0632 \u0645\u06CC\u200C\u0634\u0648\u062F.",
"group.inviteSentNote": "\u06AF\u0631\u0648\u0647 \u062A\u0627 \u067E\u0630\u06CC\u0631\u0634 \u0622\u0646\u200C\u0647\u0627 \u0628\u0647 \u06A9\u0627\u0631 \u062E\u0648\u062F \u0627\u062F\u0627\u0645\u0647 \u0645\u06CC\u200C\u062F\u0647\u062F. \u067E\u06CC\u0634\u06CC\u0646\u0647\u200C\u0627\u06CC \u0628\u0631\u0627\u06CC \u062C\u0628\u0631\u0627\u0646 \u0646\u062F\u0627\u0631\u0646\u062F - \u062A\u0646\u0647\u0627 \u0622\u0646\u0686\u0647 \u0627\u0632 \u0627\u06CC\u0646 \u067E\u0633 \u0641\u0631\u0633\u062A\u0627\u062F\u0647 \u0634\u0648\u062F \u0631\u0627 \u0645\u06CC\u200C\u0628\u06CC\u0646\u0646\u062F.",
"group.errNotCreated": "\u06AF\u0631\u0648\u0647 \u0633\u0627\u062E\u062A\u0647 \u0646\u0634\u062F",
"group.errNobodyAccepted": "\u0647\u06CC\u0686\u200C\u06A9\u0633 \u0628\u0647\u200C\u0645\u0648\u0642\u0639 \u062F\u0639\u0648\u062A \u0631\u0627 \u0646\u067E\u0630\u06CC\u0631\u0641\u062A.",
"group.errNothingSent": "\u0686\u06CC\u0632\u06CC \u0641\u0631\u0633\u062A\u0627\u062F\u0647 \u0646\u0634\u062F \u0648 \u0686\u06CC\u0632\u06CC \u062A\u0623\u06CC\u06CC\u062F \u0646\u0634\u062F. \u0627\u06CC\u0646 \u0631\u0627 \u0628\u0628\u0646\u062F\u06CC\u062F \u0648 \u067E\u0633 \u0627\u0632 \u0627\u062A\u0635\u0627\u0644 \u0647\u0645\u0647 \u062F\u0648\u0628\u0627\u0631\u0647 \u0628\u06A9\u0648\u0634\u06CC\u062F.",
"group.errNotFormed": "\u0627\u06CC\u0646 \u06AF\u0631\u0648\u0647 \u0634\u06A9\u0644 \u0646\u06AF\u0631\u0641\u062A.",
"group.errFull": "\u0627\u06CC\u0646 \u06AF\u0631\u0648\u0647 \u067E\u0631 \u0627\u0633\u062A.",
"group.errInviteFailed": "\u062F\u0639\u0648\u062A \u0641\u0631\u0633\u062A\u0627\u062F\u0647 \u0646\u0634\u062F - \u0622\u0646 \u06AF\u0641\u062A\u06AF\u0648 \u0648\u0635\u0644 \u0646\u06CC\u0633\u062A.",
"group.errNoMemberList": "\u0645\u0627\u0644\u06A9 \u06AF\u0631\u0648\u0647 \u0647\u0631\u06AF\u0632 \u0641\u0647\u0631\u0633\u062A \u0627\u0639\u0636\u0627 \u0631\u0627 \u0646\u0641\u0631\u0633\u062A\u0627\u062F.",
"group.errUnsignedList": "\u0641\u0647\u0631\u0633\u062A \u0627\u0639\u0636\u0627 \u0631\u0627 \u0645\u0627\u0644\u06A9 \u06AF\u0631\u0648\u0647 \u0627\u0645\u0636\u0627 \u0646\u06A9\u0631\u062F\u0647 \u0628\u0648\u062F. \u062F\u0648\u0628\u0627\u0631\u0647 \u0646\u06A9\u0648\u0634\u06CC\u062F - \u0628\u0647 \u0627\u0648 \u0628\u06AF\u0648\u06CC\u06CC\u062F.",
"group.errNotOwner": "\u06A9\u0633\u06CC \u062C\u0632 \u0645\u0627\u0644\u06A9 \u06AF\u0631\u0648\u0647 \u06A9\u0648\u0634\u06CC\u062F \u0627\u0639\u0636\u0627 \u0631\u0627 \u062A\u063A\u06CC\u06CC\u0631 \u062F\u0647\u062F.",
"hdr.tagline": "\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647 \u0627\u0632 \u0633\u0631 \u062A\u0627 \u0633\u0631",
"hdr.netSettings": "\u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u067E\u06CC\u0634\u0631\u0641\u062A\u0647\u0654 \u0634\u0628\u06A9\u0647",
"hdr.netSettingsTitle": "\u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u067E\u06CC\u0634\u0631\u0641\u062A\u0647\u0654 \u0634\u0628\u06A9\u0647 (STUN/TURN)",
"hdr.disconnect": "\u0642\u0637\u0639 \u0627\u062A\u0635\u0627\u0644",
"status.connected": "\u0645\u062A\u0635\u0644",
"status.connecting": "\u062F\u0631 \u062D\u0627\u0644 \u0627\u062A\u0635\u0627\u0644...",
"status.notConnected": "\u0645\u062A\u0635\u0644 \u0646\u06CC\u0633\u062A",
"status.reconnecting": "\u062F\u0631 \u062D\u0627\u0644 \u0627\u062A\u0635\u0627\u0644 \u062F\u0648\u0628\u0627\u0631\u0647...",
"status.retrying": "\u062F\u0631 \u062D\u0627\u0644 \u062A\u0644\u0627\u0634 \u062F\u0648\u0628\u0627\u0631\u0647...",
"status.verifying": "\u062F\u0631 \u062D\u0627\u0644 \u062A\u0623\u06CC\u06CC\u062F...",
"status.peerDisconnected": "\u0647\u0645\u062A\u0627 \u0642\u0637\u0639 \u0634\u062F",
"sec.replayProtection": "\u062D\u0641\u0627\u0638\u062A \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u0628\u0627\u0632\u067E\u062E\u0634",
"sec.messageIntegrity": "\u06CC\u06A9\u067E\u0627\u0631\u0686\u06AF\u06CC \u067E\u06CC\u0627\u0645 (HMAC)",
"sec.forwardSecrecy": "\u0631\u0627\u0632\u062F\u0627\u0631\u06CC \u067E\u06CC\u0634\u0631\u0648 \u06A9\u0627\u0645\u0644",
"sec.metadataProtection": "\u062D\u0641\u0627\u0638\u062A \u0627\u0632 \u0641\u0631\u0627\u062F\u0627\u062F\u0647",
"sec.trafficObfuscation": "\u067E\u0646\u0647\u0627\u0646\u200C\u0633\u0627\u0632\u06CC \u062A\u0631\u0627\u0641\u06CC\u06A9",
"sec.realTests": "\u0622\u0632\u0645\u0648\u0646\u200C\u0647\u0627\u06CC \u0648\u0627\u0642\u0639\u06CC \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC",
"sec.simulatedData": "\u062F\u0627\u062F\u0647\u0654 \u0634\u0628\u06CC\u0647\u200C\u0633\u0627\u0632\u06CC\u200C\u0634\u062F\u0647",
"sec.testPassed": "\u0622\u0632\u0645\u0648\u0646 \u0645\u0648\u0641\u0642",
"sec.testFailed": "\u0622\u0632\u0645\u0648\u0646 \u0646\u0627\u0645\u0648\u0641\u0642 \u06CC\u0627 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A",
"sec.verificationDone": "\u062A\u0623\u06CC\u06CC\u062F \u0648\u0627\u0642\u0639\u06CC \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u06A9\u0627\u0645\u0644 \u0634\u062F",
"sec.verificationInProgress": "\u062A\u0623\u06CC\u06CC\u062F \u0627\u0645\u0646\u06CC\u062A\u06CC \u062F\u0631 \u062C\u0631\u06CC\u0627\u0646 \u0627\u0633\u062A...",
"sec.verificationWait": "\u062A\u0623\u06CC\u06CC\u062F \u0627\u0645\u0646\u06CC\u062A\u06CC \u062F\u0631 \u062C\u0631\u06CC\u0627\u0646 \u0627\u0633\u062A...\n\u0644\u0637\u0641\u0627\u064B \u062A\u0627 \u067E\u0627\u06CC\u0627\u0646 \u062A\u0623\u06CC\u06CC\u062F \u0628\u06CC\u200C\u062F\u0631\u0646\u06AF \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u0635\u0628\u0631 \u06A9\u0646\u06CC\u062F.",
"sec.verificationUnavailable": "\u062A\u0623\u06CC\u06CC\u062F \u0627\u0645\u0646\u06CC\u062A\u06CC \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A",
"chat.placeholder": "\u06CC\u06A9 \u067E\u06CC\u0627\u0645 \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647 \u0628\u0646\u0648\u06CC\u0633\u06CC\u062F\u2026",
"chat.send": "\u0641\u0631\u0633\u062A\u0627\u062F\u0646 \u067E\u06CC\u0627\u0645",
"chat.sendFiles": "\u0641\u0631\u0633\u062A\u0627\u062F\u0646 \u0641\u0627\u06CC\u0644",
"chat.hideFiles": "\u067E\u0646\u0647\u0627\u0646 \u06A9\u0631\u062F\u0646 \u0641\u0627\u06CC\u0644\u200C\u0647\u0627",
"chat.recordVoice": "\u0636\u0628\u0637 \u067E\u06CC\u0627\u0645 \u0635\u0648\u062A\u06CC",
"chat.sendVoice": "\u0641\u0631\u0633\u062A\u0627\u062F\u0646 \u067E\u06CC\u0627\u0645 \u0635\u0648\u062A\u06CC",
"chat.discard": "\u062F\u0648\u0631 \u0627\u0646\u062F\u0627\u062E\u062A\u0646",
"chat.codeBlock": "\u0628\u0647\u200C\u0635\u0648\u0631\u062A \u0628\u0644\u0648\u06A9 \u06A9\u062F \u0628\u0641\u0631\u0633\u062A (\u0648\u0631\u0648\u062F\u06CC \u0631\u0627 \u06AF\u0633\u062A\u0631\u062F\u0647 \u0645\u06CC\u200C\u06A9\u0646\u062F)",
"chat.codeHint": "\u0642\u0637\u0639\u0647 \u06A9\u062F \xB7 \u0642\u0627\u0644\u0628\u200C\u0628\u0646\u062F\u06CC \u062D\u0641\u0638 \u0645\u06CC\u200C\u0634\u0648\u062F \xB7 \u2318\u21B5 \u0628\u0631\u0627\u06CC \u0641\u0631\u0633\u062A\u0627\u062F\u0646",
"chat.viewOnce": "\u06CC\u06A9\u200C\u0628\u0627\u0631 \u062F\u06CC\u062F\u0646",
"chat.viewOnceTitle": "\u06CC\u06A9\u200C\u0628\u0627\u0631 \u062F\u06CC\u062F\u0646 - \u067E\u0633 \u0627\u0632 \u062E\u0648\u0627\u0646\u062F\u0646 \u0647\u0645\u062A\u0627 \u0646\u0627\u067E\u062F\u06CC\u062F \u0645\u06CC\u200C\u0634\u0648\u062F",
"chat.viewOncePrefix": "\u06CC\u06A9\u200C\u0628\u0627\u0631 \u062F\u06CC\u062F\u0646 \xB7 ",
"chat.viewOnceTap": "\u06CC\u06A9\u200C\u0628\u0627\u0631 \u062F\u06CC\u062F\u0646 \xB7 \u0628\u0631\u0627\u06CC \u0646\u0645\u0627\u06CC\u0634 \u0628\u0632\u0646\u06CC\u062F",
"chat.viewedOnce": "\u06CC\u06A9\u200C\u0628\u0627\u0631 \u062F\u06CC\u062F\u0647 \u0634\u062F",
"chat.disappearing": "\u067E\u06CC\u0627\u0645 \u0646\u0627\u067E\u062F\u06CC\u062F\u0634\u0648\u0646\u062F\u0647 - \u062F\u0631 \u0647\u0631 \u062F\u0648 \u0633\u0648 \u067E\u0627\u06A9 \u0645\u06CC\u200C\u0634\u0648\u062F",
"chat.disappearAfter": "\u0646\u0627\u067E\u062F\u06CC\u062F \u0634\u062F\u0646 \u067E\u0633 \u0627\u0632",
"chat.visibleFor": "\u0646\u0645\u0627\u06CC\u0627\u0646 \u0628\u0647 \u0645\u062F\u062A",
"chat.timerPrefix": "\u0632\u0645\u0627\u0646\u200C\u0633\u0646\u062C \xB7 ",
"chat.expired": "\u0627\u06CC\u0646 \u067E\u06CC\u0627\u0645 \u0645\u0646\u0642\u0636\u06CC \u0634\u062F\u0647 \u0627\u0633\u062A",
"chat.deleteForEveryone": "\u062D\u0630\u0641 \u0628\u0631\u0627\u06CC \u0647\u0645\u0647",
"chat.sending": "\u062F\u0631 \u062D\u0627\u0644 \u0641\u0631\u0633\u062A\u0627\u062F\u0646",
"chat.delivered": "\u0631\u0633\u06CC\u062F",
"chat.notSent": "\u0641\u0631\u0633\u062A\u0627\u062F\u0647 \u0646\u0634\u062F",
"chat.notSentReason": "\u0641\u0631\u0633\u062A\u0627\u062F\u0647 \u0646\u0634\u062F - \u06A9\u0627\u0646\u0627\u0644 \u0627\u0645\u0646 \u0622\u0645\u0627\u062F\u0647 \u0646\u06CC\u0633\u062A. \u0628\u0631\u0627\u06CC \u0627\u062F\u0627\u0645\u0647 \u062F\u0648\u0628\u0627\u0631\u0647 \u0648\u0635\u0644 \u0634\u0648\u06CC\u062F.",
"chat.encrypted": "\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647",
"chat.decrypted": "\u0631\u0645\u0632\u06AF\u0634\u0627\u06CC\u06CC\u200C\u0634\u062F\u0647",
"chat.encryptedOnDevice": "\u0631\u0648\u06CC \u062F\u0633\u062A\u06AF\u0627\u0647 \u0634\u0645\u0627 \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u0634\u062F",
"chat.uploading": "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",
"chat.downloading": "\u062F\u0631 \u062D\u0627\u0644 \u062F\u0631\u06CC\u0627\u0641\u062A",
"chat.transferring": "\u062F\u0631 \u062D\u0627\u0644 \u0627\u0646\u062A\u0642\u0627\u0644\u2026",
"chat.copied": "\u0631\u0648\u0646\u0648\u0634\u062A \u0634\u062F!",
"chat.collapse": "\u062C\u0645\u0639 \u06A9\u0631\u062F\u0646",
"chat.closeMenu": "\u0628\u0633\u062A\u0646 \u0645\u0646\u0648",
"chat.newChat": "\u06AF\u0641\u062A\u06AF\u0648\u06CC \u062A\u0627\u0632\u0647",
"chat.newGroup": "\u06AF\u0631\u0648\u0647 \u062A\u0627\u0632\u0647",
"chat.createGroup": "\u0633\u0627\u062E\u062A \u06AF\u0631\u0648\u0647",
"chat.groupChats": "\u06AF\u0641\u062A\u06AF\u0648\u0647\u0627\u06CC \u06AF\u0631\u0648\u0647\u06CC",
"chat.secureChat": "\u06AF\u0641\u062A\u06AF\u0648\u06CC \u0627\u0645\u0646",
"chat.nameThis": "\u0628\u0647 \u0627\u06CC\u0646 \u06AF\u0641\u062A\u06AF\u0648 \u0646\u0627\u0645 \u0628\u062F\u0647\u06CC\u062F",
"chat.rename": "\u062A\u063A\u06CC\u06CC\u0631 \u0646\u0627\u0645 \u06AF\u0641\u062A\u06AF\u0648 (\u0641\u0642\u0637 \u0645\u062D\u0644\u06CC)",
"chat.renameHint": "\u0628\u0631\u0627\u06CC \u062A\u063A\u06CC\u06CC\u0631 \u0646\u0627\u0645 \u062F\u0648\u0628\u0627\u0631 \u06A9\u0644\u06CC\u06A9 \u06A9\u0646\u06CC\u062F",
"chat.localLabel": "\u0628\u0631\u0686\u0633\u0628 \u0645\u062D\u0644\u06CC \xB7 \u0641\u0642\u0637 \u0631\u0648\u06CC \u0627\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647 \u0630\u062E\u06CC\u0631\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F",
"chat.setStatus": "\u0648\u0636\u0639\u06CC\u062A \u062E\u0648\u062F \u0631\u0627 \u062A\u0639\u06CC\u06CC\u0646 \u06A9\u0646\u06CC\u062F",
"chat.yourStatusPrefix": "\u0648\u0636\u0639\u06CC\u062A \u0634\u0645\u0627 - ",
"chat.meshHint": "\u062A\u0627 \u06F8 \u0647\u0645\u062A\u0627 \xB7 \u0645\u0650\u0634 \u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627",
"chat.offline": "\u0628\u0631\u0648\u0646\u200C\u062E\u0637",
"chat.noNetwork": "\u0628\u062F\u0648\u0646 \u0634\u0628\u06A9\u0647 \xB7 \u062F\u0631 \u062D\u0627\u0644 \u0627\u062A\u0635\u0627\u0644 \u062F\u0648\u0628\u0627\u0631\u0647",
"chat.startVoiceCall": "\u062A\u0645\u0627\u0633 \u0635\u0648\u062A\u06CC \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647 \u0631\u0627 \u0622\u063A\u0627\u0632 \u06A9\u0646\u06CC\u062F",
"chat.startVideoCall": "\u062A\u0645\u0627\u0633 \u062A\u0635\u0648\u06CC\u0631\u06CC \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647 \u0631\u0627 \u0622\u063A\u0627\u0632 \u06A9\u0646\u06CC\u062F",
"chat.verifyForCalls": "\u0628\u0631\u0627\u06CC \u0641\u0639\u0627\u0644 \u0634\u062F\u0646 \u062A\u0645\u0627\u0633\u060C \u0646\u0634\u0633\u062A \u0631\u0627 \u062A\u0623\u06CC\u06CC\u062F \u06A9\u0646\u06CC\u062F",
"chat.e2eeNote": "\u0647\u0631 \u067E\u06CC\u0627\u0645 \u067E\u06CC\u0634 \u0627\u0632 \u062E\u0631\u0648\u062C\u060C \u0631\u0648\u06CC \u062F\u0633\u062A\u06AF\u0627\u0647 \u0634\u0645\u0627 \u0633\u0631\u062A\u0627\u0633\u0631\u06CC \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u0645\u06CC\u200C\u0634\u0648\u062F.",
"chat.peersOnly": "\u062A\u0646\u0647\u0627 \u0633\u0631\u062A\u0627\u0633\u0631\u06CC \u0628\u0631\u0627\u06CC \u0647\u0645\u062A\u0627\u06CC\u0627\u0646 \u0645\u062A\u0635\u0644 \u0641\u0631\u0633\u062A\u0627\u062F\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F - \u0647\u0631\u06AF\u0632 \u0631\u0648\u06CC \u0633\u0631\u0648\u0631 \u0630\u062E\u06CC\u0631\u0647 \u0646\u0645\u06CC\u200C\u0634\u0648\u062F.",
"flow.invitationCreated": "\u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647\u0654 \u0627\u0645\u0646 \u0633\u0627\u062E\u062A\u0647 \u0634\u062F",
"flow.invitationCreatedBang": "\u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647\u0654 \u0627\u0645\u0646 \u0633\u0627\u062E\u062A\u0647 \u0648 \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u0634\u062F!",
"flow.responseCreated": "\u067E\u0627\u0633\u062E \u0627\u0645\u0646 \u0633\u0627\u062E\u062A\u0647 \u0634\u062F",
"flow.responseCreatedBang": "\u067E\u0627\u0633\u062E \u0627\u0645\u0646 \u0633\u0627\u062E\u062A\u0647 \u0634\u062F!",
"flow.sendInvitation": "\u06A9\u062F \u062F\u0639\u0648\u062A \u0631\u0627 \u0627\u0632 \u0631\u0627\u0647 \u06A9\u0627\u0646\u0627\u0644\u06CC \u0627\u0645\u0646 (\u062A\u0645\u0627\u0633 \u0635\u0648\u062A\u06CC\u060C \u067E\u06CC\u0627\u0645\u06A9 \u0648 \u0645\u0627\u0646\u0646\u062F \u0622\u0646) \u0628\u0631\u0627\u06CC \u0647\u0645\u200C\u0635\u062D\u0628\u062A\u062A\u0627\u0646 \u0628\u0641\u0631\u0633\u062A\u06CC\u062F.",
"flow.sendResponse": "\u06A9\u062F \u067E\u0627\u0633\u062E \u0631\u0627 \u0627\u0632 \u0631\u0627\u0647 \u06A9\u0627\u0646\u0627\u0644\u06CC \u0627\u0645\u0646 \u0628\u0631\u0627\u06CC \u0622\u063A\u0627\u0632\u06AF\u0631 \u0628\u0641\u0631\u0633\u062A\u06CC\u062F \u06CC\u0627 \u0628\u06AF\u0630\u0627\u0631\u06CC\u062F \u06A9\u062F QR \u0632\u06CC\u0631 \u0631\u0627 \u0628\u062E\u0648\u0627\u0646\u062F.",
"flow.sendEncryptedCode": "\u06A9\u062F \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647 \u0631\u0627 \u0628\u0641\u0631\u0633\u062A\u06CC\u062F",
"flow.sendTheResponse": "\u067E\u0627\u0633\u062E \u0631\u0627 \u0628\u0641\u0631\u0633\u062A\u06CC\u062F",
"flow.pasteOrWrite": "\u06A9\u062F \u0631\u0627 \u0628\u0686\u0633\u0628\u0627\u0646\u06CC\u062F \u06CC\u0627 \u0628\u0646\u0648\u06CC\u0633\u06CC\u062F\u2026",
"flow.processingInvitation": "\u062F\u0631 \u062D\u0627\u0644 \u067E\u0631\u062F\u0627\u0632\u0634 \u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647\u0654 \u0627\u0645\u0646...",
"flow.processingResponse": "\u062F\u0631 \u062D\u0627\u0644 \u067E\u0631\u062F\u0627\u0632\u0634 \u067E\u0627\u0633\u062E \u0627\u0645\u0646...",
"flow.finalizing": "\u062F\u0631 \u062D\u0627\u0644 \u0646\u0647\u0627\u06CC\u06CC \u06A9\u0631\u062F\u0646 \u0627\u062A\u0635\u0627\u0644 \u0627\u0645\u0646...",
"flow.channelEstablished": "\u06A9\u0627\u0646\u0627\u0644 \u0627\u0645\u0646 \u0628\u0631\u0642\u0631\u0627\u0631 \u0634\u062F",
"flow.channelReady": "\u06A9\u0627\u0646\u0627\u0644 \u0627\u0645\u0646 \u0622\u0645\u0627\u062F\u0647 \u0627\u0633\u062A",
"flow.restoring": "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0632\u06CC\u0627\u0628\u06CC \u0627\u062A\u0635\u0627\u0644\u2026",
"flow.invitationCaptured": "\u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647 \u06AF\u0631\u0641\u062A\u0647 \u0634\u062F.",
"err.needInvitation": "\u0628\u0627\u06CC\u062F \u06A9\u062F \u062F\u0639\u0648\u062A \u0631\u0627 \u0627\u0632 \u0647\u0645\u200C\u0635\u062D\u0628\u062A\u062A\u0627\u0646 \u0628\u0686\u0633\u0628\u0627\u0646\u06CC\u062F.",
"err.needResponse": "\u0628\u0627\u06CC\u062F \u06A9\u062F \u067E\u0627\u0633\u062E \u0631\u0627 \u0627\u0632 \u0647\u0645\u200C\u0635\u062D\u0628\u062A\u062A\u0627\u0646 \u0628\u0686\u0633\u0628\u0627\u0646\u06CC\u062F.",
"err.responseFormat": "\u0642\u0627\u0644\u0628 \u067E\u0627\u0633\u062E \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A - \u06A9\u062F \u0631\u0627 \u0648\u0627\u0631\u0633\u06CC \u06A9\u0646\u06CC\u062F",
"err.responseNoKey": "\u06A9\u062F \u067E\u0627\u0633\u062E \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A - \u06A9\u0644\u06CC\u062F \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u0646\u0628\u0648\u062F \u06CC\u0627 \u062E\u0631\u0627\u0628 \u0627\u0633\u062A. \u06A9\u062F \u0631\u0627 \u0648\u0627\u0631\u0633\u06CC \u06A9\u0646\u06CC\u062F \u0648 \u062F\u0648\u0628\u0627\u0631\u0647 \u0628\u06A9\u0648\u0634\u06CC\u062F.",
"err.responseNoSignKey": "\u06A9\u062F \u067E\u0627\u0633\u062E \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A - \u06A9\u0644\u06CC\u062F \u062A\u0623\u06CC\u06CC\u062F \u0627\u0645\u0636\u0627 \u0646\u0628\u0648\u062F. \u06A9\u062F \u0631\u0627 \u0648\u0627\u0631\u0633\u06CC \u06A9\u0646\u06CC\u062F \u0648 \u062F\u0648\u0628\u0627\u0631\u0647 \u0628\u06A9\u0648\u0634\u06CC\u062F.",
"err.responseOutdated": "\u062F\u0627\u062F\u0647\u0654 \u067E\u0627\u0633\u062E \u06A9\u0647\u0646\u0647 \u0627\u0633\u062A - \u0627\u0632 \u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647\u0654 \u062A\u0627\u0632\u0647\u200C\u0627\u06CC \u0628\u0647\u0631\u0647 \u0628\u0628\u0631\u06CC\u062F",
"err.setupError": "\u062E\u0637\u0627 \u062F\u0631 \u0628\u0631\u067E\u0627\u06CC\u06CC \u0627\u062A\u0635\u0627\u0644",
"err.notReady": "\u0627\u062A\u0635\u0627\u0644 \u0622\u0645\u0627\u062F\u0647 \u0646\u06CC\u0633\u062A",
"err.securityBreach": "\u0646\u0642\u0636 \u0627\u0645\u0646\u06CC\u062A\u06CC \u0634\u0646\u0627\u0633\u0627\u06CC\u06CC \u0634\u062F - \u0627\u062A\u0635\u0627\u0644 \u0631\u062F \u0634\u062F",
"err.securityValidation": "\u0627\u0639\u062A\u0628\u0627\u0631\u0633\u0646\u062C\u06CC \u0627\u0645\u0646\u06CC\u062A\u06CC \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F - \u0627\u062D\u062A\u0645\u0627\u0644 \u062D\u0645\u0644\u0647 \u0647\u0633\u062A",
"err.retiredQr": "\u0627\u06CC\u0646 \u06A9\u062F QR \u0627\u0632 \u0642\u0627\u0644\u0628\u06CC \u0628\u0627\u0632\u0646\u0634\u0633\u062A\u0647 \u0628\u0647\u0631\u0647 \u0645\u06CC\u200C\u0628\u0631\u062F \u06A9\u0647 \u0646\u062A\u0648\u0627\u0646\u0633\u062A \u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647 \u0631\u0627 \u0645\u0646\u062A\u0642\u0644 \u06A9\u0646\u062F. \u0627\u0632 \u0647\u0645\u062A\u0627\u06CC\u062A\u0627\u0646 \u0628\u062E\u0648\u0627\u0647\u06CC\u062F \u06A9\u062F \u062A\u0627\u0632\u0647\u200C\u0627\u06CC \u0628\u0633\u0627\u0632\u062F\u060C \u06CC\u0627 \u0627\u0632 \u0631\u0648\u0646\u0648\u0634\u062A \u0648 \u0686\u0633\u0628\u0627\u0646\u062F\u0646 \u0628\u0647\u0631\u0647 \u0628\u0628\u0631\u06CC\u062F.",
"err.compressedQrNote": "\u200FQR \u0641\u0634\u0631\u062F\u0647 \u0645\u0645\u06A9\u0646 \u0627\u0633\u062A \u0628\u0631\u0627\u06CC \u06A9\u0648\u062A\u0627\u0647\u06CC SDP \u0631\u0627 \u062D\u0630\u0641 \u06A9\u0646\u062F. \u0627\u06AF\u0631 \u0627\u062A\u0635\u0627\u0644 \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F \u0627\u0632 \u0631\u0648\u0646\u0648\u0634\u062A \u0648 \u0686\u0633\u0628\u0627\u0646\u062F\u0646 \u0628\u0647\u0631\u0647 \u0628\u0628\u0631\u06CC\u062F.",
"err.inviteNotConnected": "\u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647 \u0641\u0631\u0633\u062A\u0627\u062F\u0647 \u0646\u0634\u062F. \u0622\u0646 \u06AF\u0641\u062A\u06AF\u0648 \u0647\u0645\u200C\u0627\u06A9\u0646\u0648\u0646 \u0648\u0635\u0644 \u0646\u06CC\u0633\u062A.",
"err.inviteNotConnectedRetry": "\u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647 \u0641\u0631\u0633\u062A\u0627\u062F\u0647 \u0646\u0634\u062F. \u0622\u0646 \u06AF\u0641\u062A\u06AF\u0648 \u0647\u0645\u200C\u0627\u06A9\u0646\u0648\u0646 \u0648\u0635\u0644 \u0646\u06CC\u0633\u062A - \u062F\u0648\u0628\u0627\u0631\u0647 \u0628\u0627\u0632\u0634 \u06A9\u0646\u06CC\u062F \u0648 \u0628\u06A9\u0648\u0634\u06CC\u062F.",
"err.nobodyAccepted": "\u0647\u06CC\u0686\u200C\u06A9\u0633 \u062F\u0639\u0648\u062A \u0631\u0627 \u0646\u067E\u0630\u06CC\u0631\u0641\u062A. \u06AF\u0631\u0648\u0647 \u0628\u06CC\u200C\u062A\u063A\u06CC\u06CC\u0631 \u0627\u0633\u062A.",
"err.noAudio": "\u0635\u062F\u0627\u06CC\u06CC \u0636\u0628\u0637 \u0646\u0634\u062F - \u0627\u062C\u0627\u0632\u0647\u0654 \u0645\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0631\u0627 \u0648\u0627\u0631\u0633\u06CC \u06A9\u0646\u06CC\u062F \u0648 \u062F\u0648\u0628\u0627\u0631\u0647 \u0628\u06A9\u0648\u0634\u06CC\u062F.",
"err.voiceNeedsConnection": "\u067E\u06CC\u0627\u0645 \u0635\u0648\u062A\u06CC \u0628\u0647 \u0627\u062A\u0635\u0627\u0644 \u0627\u0645\u0646 \u0641\u0639\u0627\u0644 \u0646\u06CC\u0627\u0632 \u062F\u0627\u0631\u062F. \u062F\u0648\u0628\u0627\u0631\u0647 \u0648\u0635\u0644 \u0634\u0648\u06CC\u062F \u0648 \u0628\u06A9\u0648\u0634\u06CC\u062F.",
"err.voiceRestoring": "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0632\u06CC\u0627\u0628\u06CC \u0627\u062A\u0635\u0627\u0644 - \u0644\u062D\u0638\u0647\u200C\u0627\u06CC \u062F\u06CC\u06AF\u0631 \u062F\u0648\u0628\u0627\u0631\u0647 \u067E\u06CC\u0627\u0645 \u0635\u0648\u062A\u06CC \u0631\u0627 \u0628\u0641\u0631\u0633\u062A\u06CC\u062F.",
"err.fileTooLarge": "\u0641\u0627\u06CC\u0644 \u0628\u06CC\u0634 \u0627\u0632 \u062D\u062F \u0628\u0632\u0631\u06AF \u0627\u0633\u062A",
"sas.safetyNumber": "\u0634\u0645\u0627\u0631\u0647\u0654 \u0627\u06CC\u0645\u0646\u06CC",
"sas.incorrect": "\u06A9\u062F \u0646\u0627\u062F\u0631\u0633\u062A \u0627\u0633\u062A. \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0647\u0645\u062A\u0627\u06CC\u062A\u0627\u0646 \u0648\u0627\u0631\u0633\u06CC \u06A9\u0646\u06CC\u062F \u0648 \u062F\u0648\u0628\u0627\u0631\u0647 \u0628\u06A9\u0648\u0634\u06CC\u062F.",
"sas.noMatch": "\u06A9\u062F\u0647\u0627 \u0647\u0645\u200C\u062E\u0648\u0627\u0646 \u0646\u06CC\u0633\u062A\u0646\u062F",
"sas.makeSure": "\u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06CC\u062F \u06A9\u062F\u0647\u0627 \u062F\u0642\u06CC\u0642\u0627\u064B \u06CC\u06A9\u0633\u0627\u0646\u200C\u0627\u0646\u062F.",
"sas.tooManyAttempts": "\u062A\u0644\u0627\u0634 \u0646\u0627\u062F\u0631\u0633\u062A \u0628\u06CC\u0634 \u0627\u0632 \u062D\u062F. \u0646\u0634\u0633\u062A \u0628\u0631\u0627\u06CC \u0627\u06CC\u0645\u0646\u06CC \u0628\u0627\u0632\u0646\u0634\u0627\u0646\u06CC \u0634\u062F.",
"sas.verificationFailed": "\u062A\u0623\u06CC\u06CC\u062F \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F",
"sas.verified": "\u062A\u0623\u06CC\u06CC\u062F\u0634\u062F\u0647 \xB7 \u0631\u0627\u0632\u062F\u0627\u0631\u06CC \u067E\u06CC\u0634\u0631\u0648 \u06A9\u0627\u0645\u0644",
"sas.runVerification": "\u062A\u0623\u06CC\u06CC\u062F \u0627\u0645\u0646\u06CC\u062A\u06CC \u0631\u0627 \u0627\u062C\u0631\u0627 \u06A9\u0646\u06CC\u062F",
"sec.panelTitle": "\u062C\u0632\u0626\u06CC\u0627\u062A \u0634\u0628\u06A9\u0647 \u0648 \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC",
"sec.security": "\u0627\u0645\u0646\u06CC\u062A",
"sec.transport": "\u0627\u0646\u062A\u0642\u0627\u0644",
"sec.keyExchange": "\u062A\u0628\u0627\u062F\u0644 \u06A9\u0644\u06CC\u062F",
"sec.allEnabled": "\u0647\u0645\u0647\u0654 \u0627\u0645\u06A9\u0627\u0646\u0627\u062A \u0627\u0645\u0646\u06CC\u062A\u06CC \u0628\u0647\u200C\u0637\u0648\u0631 \u067E\u06CC\u0634\u200C\u0641\u0631\u0636 \u0631\u0648\u0634\u0646\u200C\u0627\u0646\u062F",
"sec.realTimeNote": "\u062A\u0623\u06CC\u06CC\u062F \u0628\u06CC\u200C\u062F\u0631\u0646\u06AF \u0628\u0627 \u062A\u0648\u0627\u0628\u0639 \u0648\u0627\u0642\u0639\u06CC \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC - \u0628\u062F\u0648\u0646 \u062F\u0627\u062F\u0647\u0654 \u0633\u0627\u062E\u062A\u06AF\u06CC.",
"sec.simulatedWarning": "\u0647\u0634\u062F\u0627\u0631: \u0634\u0627\u06CC\u062F \u0627\u062A\u0635\u0627\u0644 \u0628\u0647\u200C\u0637\u0648\u0631 \u06A9\u0627\u0645\u0644 \u0628\u0631\u0642\u0631\u0627\u0631 \u0646\u0634\u062F\u0647 \u0628\u0627\u0634\u062F - \u0645\u0642\u0627\u062F\u06CC\u0631 \u0645\u0645\u06A9\u0646 \u0627\u0633\u062A \u0634\u0628\u06CC\u0647\u200C\u0633\u0627\u0632\u06CC\u200C\u0634\u062F\u0647 \u0628\u0627\u0634\u0646\u062F.",
"dl.title": "\u062F\u0631\u06CC\u0627\u0641\u062A SecureBit",
"dl.free": "\u0631\u0627\u06CC\u06AF\u0627\u0646 \xB7 \u0645\u062A\u0646\u200C\u0628\u0627\u0632",
"dl.soon": "\u0628\u0631\u0646\u0627\u0645\u0647\u200C\u0647\u0627\u06CC \u0645\u0648\u0628\u0627\u06CC\u0644 (iOS\u060C \u0627\u0646\u062F\u0631\u0648\u06CC\u062F) \u0648 \u0627\u0641\u0632\u0648\u0646\u0647\u200C\u0647\u0627\u06CC \u0645\u0631\u0648\u0631\u06AF\u0631 (Chrome\u060C Firefox\u060C Opera) \u0628\u0647\u200C\u0632\u0648\u062F\u06CC \u0645\u06CC\u200C\u0622\u06CC\u0646\u062F.",
"chatHdr.chat": "\u06AF\u0641\u062A\u06AF\u0648",
"chatHdr.chats": "\u06AF\u0641\u062A\u06AF\u0648\u0647\u0627",
"chatHdr.newChat": "+ \u062A\u0627\u0632\u0647",
"chatHdr.secure": "\u0627\u0645\u0646",
"chatHdr.p2pSub": "\u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627 \xB7 \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC\u200C\u0634\u062F\u0647 \u0627\u0632 \u0633\u0631 \u062A\u0627 \u0633\u0631",
"chatHdr.save": "\u0630\u062E\u06CC\u0631\u0647",
"chatHdr.close": "\u0628\u0633\u062A\u0646",
"chatHdr.expand": "\u0628\u0632\u0631\u06AF\u200C\u0646\u0645\u0627\u06CC\u06CC",
"chatHdr.you": "\u0634\u0645\u0627",
"chatHdr.qrCode": "\u06A9\u062F QR",
"chat.disconnected": "\u0642\u0637\u0639\u200C\u0634\u062F\u0647",
"call.mute": "\u0628\u06CC\u200C\u0635\u062F\u0627",
"call.endShort": "\u067E\u0627\u06CC\u0627\u0646",
"group.add": "\u0627\u0641\u0632\u0648\u062F\u0646",
"group.send": "\u0641\u0631\u0633\u062A\u0627\u062F\u0646",
"sec.pfsShort": "\u0631\u0627\u0632\u062F\u0627\u0631\u06CC \u067E\u06CC\u0634\u0631\u0648 \u06A9\u0627\u0645\u0644",
"sec.cipher": "\u0631\u0645\u0632",
"chat.close": "\u0628\u0633\u062A\u0646",
"file.needConnection": "\u0627\u0646\u062A\u0642\u0627\u0644 \u0641\u0627\u06CC\u0644 \u0628\u0647 \u0627\u062A\u0635\u0627\u0644 \u0628\u0627\u0632 \u0646\u06CC\u0627\u0632 \u062F\u0627\u0631\u062F",
"presence.available": "\u062F\u0631 \u062F\u0633\u062A\u0631\u0633",
"presence.away": "\u062F\u0648\u0631 \u0627\u0632 \u062F\u0633\u062A\u0631\u0633",
"presence.busy": "\u0645\u0634\u063A\u0648\u0644",
"presence.offline": "\u0628\u0631\u0648\u0646\u200C\u062E\u0637",
"presence.invisible": "\u0646\u0627\u0645\u0631\u0626\u06CC",
"presence.availableDesc": "\u0628\u0631\u062E\u0637 \u0648 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633",
"presence.awayDesc": "\u0628\u06CC\u200C\u06A9\u0627\u0631 \xB7 \u0644\u062D\u0638\u0647\u200C\u0627\u06CC \u062F\u0648\u0631 \u0634\u062F\u0647",
"presence.busyDesc": "\u0645\u0632\u0627\u062D\u0645 \u0646\u0634\u0648\u06CC\u062F",
"presence.invisibleDesc": "\u0628\u0631\u0627\u06CC \u0647\u0645\u062A\u0627\u06CC\u0627\u0646 \u0628\u0631\u0648\u0646\u200C\u062E\u0637 \u062F\u06CC\u062F\u0647 \u0645\u06CC\u200C\u0634\u0648\u06CC\u062F",
"presence.online": "\u0628\u0631\u062E\u0637",
"conn.p2p": "\u0647\u0645\u062A\u0627\u200C\u0628\u0647\u200C\u0647\u0645\u062A\u0627 \xB7 \u0645\u062A\u0635\u0644",
"conn.verifying": "\u062F\u0631 \u062D\u0627\u0644 \u062A\u0623\u06CC\u06CC\u062F\u2026",
"conn.connecting": "\u062F\u0631 \u062D\u0627\u0644 \u0627\u062A\u0635\u0627\u0644\u2026",
"conn.reconnecting": "\u062F\u0631 \u062D\u0627\u0644 \u0627\u062A\u0635\u0627\u0644 \u062F\u0648\u0628\u0627\u0631\u0647\u2026",
"conn.peerDisconnected": "\u0647\u0645\u062A\u0627 \u0642\u0637\u0639 \u0634\u062F",
"conn.disconnected": "\u0642\u0637\u0639\u200C\u0634\u062F\u0647",
"chat.defaultLabel": "\u06AF\u0641\u062A\u06AF\u0648",
"groupPhase.forming": "\u062F\u0631 \u062D\u0627\u0644 \u0634\u06A9\u0644\u200C\u06AF\u06CC\u0631\u06CC\u2026",
"groupPhase.commitments": "\u062F\u0631 \u062D\u0627\u0644 \u062A\u0628\u0627\u062F\u0644 \u062A\u0639\u0647\u062F\u0647\u0627\u2026",
"groupPhase.revealing": "\u062F\u0631 \u062D\u0627\u0644 \u0627\u0641\u0634\u0627\u2026",
"groupPhase.compare": "\u06A9\u062F \u06AF\u0631\u0648\u0647 \u0631\u0627 \u0645\u0642\u0627\u06CC\u0633\u0647 \u06A9\u0646\u06CC\u062F",
"groupPhase.ready": "\u06AF\u0631\u0648\u0647 \u0622\u0645\u0627\u062F\u0647 \u0627\u0633\u062A",
"groupPhase.failed": "\u06AF\u0631\u0648\u0647 \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F",
"call.qualityGood": "\u062E\u0648\u0628",
"call.qualityFair": "\u0645\u062A\u0648\u0633\u0637",
"call.qualityWeak": "\u0636\u0639\u06CC\u0641",
"msg.code": "\u06A9\u062F",
"msg.timer": "\u0632\u0645\u0627\u0646\u200C\u0633\u0646\u062C",
"msg.voice": "\u0635\u062F\u0627",
"msg.play": "\u067E\u062E\u0634",
"msg.sent": "\u0641\u0631\u0633\u062A\u0627\u062F\u0647 \u0634\u062F",
"msg.read": "\u062E\u0648\u0627\u0646\u062F\u0647 \u0634\u062F",
"report.title": "\u062A\u0623\u06CC\u06CC\u062F \u0627\u0645\u0646\u06CC\u062A\u06CC \u0628\u06CC\u200C\u062F\u0631\u0646\u06AF",
"report.active": "\u0641\u0639\u0627\u0644",
"report.testsPassed": "\u0622\u0632\u0645\u0648\u0646\u200C\u0647\u0627\u06CC \u0645\u0648\u0641\u0642",
"report.verifiedAt": "\u062A\u0623\u06CC\u06CC\u062F \u062F\u0631 \u0633\u0627\u0639\u062A",
"report.source": "\u0645\u0646\u0628\u0639",
"secTest.verifyECDHKeyExchange": "\u062A\u0628\u0627\u062F\u0644 \u06A9\u0644\u06CC\u062F ECDH",
"secTest.verifyECDSASignatures": "\u0627\u0645\u0636\u0627\u06CC \u062F\u06CC\u062C\u06CC\u062A\u0627\u0644 ECDSA",
"secTest.verifyEncryption": "\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC AES-GCM",
"secTest.verifyMessageIntegrity": "\u06CC\u06A9\u067E\u0627\u0631\u0686\u06AF\u06CC \u067E\u06CC\u0627\u0645",
"secTest.verifyPerfectForwardSecrecy": "\u0631\u0627\u0632\u062F\u0627\u0631\u06CC \u067E\u06CC\u0634\u0631\u0648 \u06A9\u0627\u0645\u0644",
"secTest.verifyPFS": "\u0631\u0627\u0632\u062F\u0627\u0631\u06CC \u067E\u06CC\u0634\u0631\u0648 \u06A9\u0627\u0645\u0644",
"secTest.verifyReplayProtection": "\u062D\u0641\u0627\u0638\u062A \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u0628\u0627\u0632\u067E\u062E\u0634",
"secTest.verifyDTLSFingerprint": "\u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A DTLS",
"secTest.verifySASVerification": "\u062A\u0623\u06CC\u06CC\u062F SAS",
"secTest.verifyMetadataProtection": "\u062D\u0641\u0627\u0638\u062A \u0627\u0632 \u0641\u0631\u0627\u062F\u0627\u062F\u0647",
"secTest.verifyTrafficObfuscation": "\u067E\u0646\u0647\u0627\u0646\u200C\u0633\u0627\u0632\u06CC \u062A\u0631\u0627\u0641\u06CC\u06A9",
"secTest.verifyPacketPadding": "\u0644\u0627\u06CC\u06CC\u200C\u06AF\u0630\u0627\u0631\u06CC \u0628\u0633\u062A\u0647",
"secTest.verifyNestedEncryption": "\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u062A\u0648\u062F\u0631\u062A\u0648",
"secTest.verifyNonExtractableKeys": "\u06A9\u0644\u06CC\u062F\u0647\u0627\u06CC \u063A\u06CC\u0631\u0642\u0627\u0628\u0644\u200C\u0627\u0633\u062A\u062E\u0631\u0627\u062C",
"secTest.verifyRateLimiting": "\u0645\u062D\u062F\u0648\u062F\u0633\u0627\u0632\u06CC \u0646\u0631\u062E",
"secTest.verifyMutualAuth": "\u0627\u062D\u0631\u0627\u0632 \u0647\u0648\u06CC\u062A \u062F\u0648\u0637\u0631\u0641\u0647",
"secTest.verifyAuthProof": "\u0627\u062B\u0628\u0627\u062A \u0627\u062D\u0631\u0627\u0632 \u0647\u0648\u06CC\u062A",
"secTest.verifyEnhancedValidation": "\u0627\u0639\u062A\u0628\u0627\u0631\u0633\u0646\u062C\u06CC \u067E\u06CC\u0634\u0631\u0641\u062A\u0647",
"secTest.verifyAdvancedFeatures": "\u0627\u0645\u06A9\u0627\u0646\u0627\u062A \u067E\u06CC\u0634\u0631\u0641\u062A\u0647",
"secTest.verifySignature": "\u0628\u0631\u0631\u0633\u06CC \u0627\u0645\u0636\u0627",
"secDetail.Security system initializing...": "\u0633\u0627\u0645\u0627\u0646\u0647\u0654 \u0627\u0645\u0646\u06CC\u062A\u06CC \u062F\u0631 \u062D\u0627\u0644 \u0631\u0627\u0647\u200C\u0627\u0646\u062F\u0627\u0632\u06CC...",
"secDetail.Nested encryption active": "\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u062A\u0648\u062F\u0631\u062A\u0648 \u0641\u0639\u0627\u0644 \u0627\u0633\u062A",
"secDetail.Nested encryption failed": "\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u062A\u0648\u062F\u0631\u062A\u0648 \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F",
"secDetail.Packet padding active": "\u0644\u0627\u06CC\u06CC\u200C\u06AF\u0630\u0627\u0631\u06CC \u0628\u0633\u062A\u0647 \u0641\u0639\u0627\u0644 \u0627\u0633\u062A",
"secDetail.Packet padding failed": "\u0644\u0627\u06CC\u06CC\u200C\u06AF\u0630\u0627\u0631\u06CC \u0628\u0633\u062A\u0647 \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F",
"secDetail.Advanced features active": "\u0627\u0645\u06A9\u0627\u0646\u0627\u062A \u067E\u06CC\u0634\u0631\u0641\u062A\u0647 \u0641\u0639\u0627\u0644 \u0627\u0633\u062A",
"secDetail.Advanced features failed": "\u0627\u0645\u06A9\u0627\u0646\u0627\u062A \u067E\u06CC\u0634\u0631\u0641\u062A\u0647 \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F",
"secDetail.No encryption key available": "\u06A9\u0644\u06CC\u062F \u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A",
"secDetail.AES-GCM encryption/decryption working correctly": "\u0631\u0645\u0632\u0646\u06AF\u0627\u0631\u06CC \u0648 \u0631\u0645\u0632\u06AF\u0634\u0627\u06CC\u06CC AES-GCM \u062F\u0631\u0633\u062A \u06A9\u0627\u0631 \u0645\u06CC\u200C\u06A9\u0646\u062F",
"secDetail.No ECDH key pair available": "\u062C\u0641\u062A \u06A9\u0644\u06CC\u062F ECDH \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A",
"secDetail.Key derivation failed": "\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u06A9\u0644\u06CC\u062F \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F",
"secDetail.No ECDSA key pair available": "\u062C\u0641\u062A \u06A9\u0644\u06CC\u062F ECDSA \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A",
"secDetail.ECDSA digital signatures working correctly": "\u0627\u0645\u0636\u0627\u06CC \u062F\u06CC\u062C\u06CC\u062A\u0627\u0644 ECDSA \u062F\u0631\u0633\u062A \u06A9\u0627\u0631 \u0645\u06CC\u200C\u06A9\u0646\u062F",
"secDetail.MAC key not available or invalid": "\u06A9\u0644\u06CC\u062F MAC \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A \u06CC\u0627 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",
"secDetail.Rate limiter did not block a message over the limit": "\u0645\u062D\u062F\u0648\u062F\u06A9\u0646\u0646\u062F\u0647\u0654 \u0646\u0631\u062E \u067E\u06CC\u0627\u0645\u06CC \u0641\u0631\u0627\u062A\u0631 \u0627\u0632 \u062D\u062F \u0631\u0627 \u0645\u0633\u062F\u0648\u062F \u0646\u06A9\u0631\u062F",
"secDetail.Rate limiter is not available": "\u0645\u062D\u062F\u0648\u062F\u06A9\u0646\u0646\u062F\u0647\u0654 \u0646\u0631\u062E \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A",
"secDetail.Replay protection is working correctly": "\u062D\u0641\u0627\u0638\u062A \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u0628\u0627\u0632\u067E\u062E\u0634 \u062F\u0631\u0633\u062A \u06A9\u0627\u0631 \u0645\u06CC\u200C\u06A9\u0646\u062F",
"secDetail.Replay protection not enabled": "\u062D\u0641\u0627\u0638\u062A \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u0628\u0627\u0632\u067E\u062E\u0634 \u0631\u0648\u0634\u0646 \u0646\u06CC\u0633\u062A",
"secDetail.SAS code not available": "\u06A9\u062F SAS \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A",
"secDetail.SAS verification code is valid and available": "\u06A9\u062F \u062A\u0623\u06CC\u06CC\u062F SAS \u0645\u0639\u062A\u0628\u0631 \u0648 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0627\u0633\u062A",
"secDetail.Traffic obfuscation is working correctly": "\u067E\u0646\u0647\u0627\u0646\u200C\u0633\u0627\u0632\u06CC \u062A\u0631\u0627\u0641\u06CC\u06A9 \u062F\u0631\u0633\u062A \u06A9\u0627\u0631 \u0645\u06CC\u200C\u06A9\u0646\u062F",
"secDetail.Traffic obfuscation not enabled": "\u067E\u0646\u0647\u0627\u0646\u200C\u0633\u0627\u0632\u06CC \u062A\u0631\u0627\u0641\u06CC\u06A9 \u0631\u0648\u0634\u0646 \u0646\u06CC\u0633\u062A",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "\u0628\u0631\u0627\u06CC \u0627\u06CC\u0646 \u0646\u0634\u0633\u062A \u062C\u0641\u062A \u06A9\u0644\u06CC\u062F ECDH \u0632\u0648\u062F\u06AF\u0630\u0631 \u0648 \u063A\u06CC\u0631\u0642\u0627\u0628\u0644\u200C\u0627\u0633\u062A\u062E\u0631\u0627\u062C\u06CC \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "\u0631\u0627\u0632\u062F\u0627\u0631\u06CC \u067E\u06CC\u0634\u0631\u0648 \u062A\u0646\u0647\u0627 \u062F\u0631 \u0633\u0637\u062D \u0646\u0634\u0633\u062A: \u06A9\u0644\u06CC\u062F\u0647\u0627 \u0628\u0631\u0627\u06CC \u0647\u0631 \u0646\u0634\u0633\u062A \u0632\u0648\u062F\u06AF\u0630\u0631\u0646\u062F\u060C \u0627\u0645\u0627 Double Ratchet \u062F\u0631 \u0627\u06CC\u0646 \u0627\u062A\u0635\u0627\u0644 \u0641\u0639\u0627\u0644 \u0646\u06CC\u0633\u062A (\u0647\u0645\u062A\u0627 \u0631\u0648\u06CC \u0646\u0633\u062E\u0647\u200C\u0627\u06CC \u0642\u062F\u06CC\u0645\u06CC\u200C\u062A\u0631 \u0627\u0633\u062A)\u060C \u067E\u0633 \u0644\u0648 \u0631\u0641\u062A\u0646 \u06CC\u06A9 \u06A9\u0644\u06CC\u062F \u0646\u0634\u0633\u062A \u06A9\u0644 \u06AF\u0641\u062A\u06AF\u0648 \u0631\u0627 \u0622\u0634\u06A9\u0627\u0631 \u0645\u06CC\u200C\u06A9\u0646\u062F",
"msg.pause": "\u0645\u06A9\u062B",
"msg.failed": "\u0646\u0627\u0645\u0648\u0641\u0642",
"groupErr.timeout": "\u0639\u0636\u0648\u06CC \u067E\u06CC\u0634 \u0627\u0632 \u0622\u0645\u0627\u062F\u0647 \u0634\u062F\u0646 \u06A9\u062F \u0627\u0632 \u067E\u0627\u0633\u062E\u200C\u062F\u0627\u062F\u0646 \u0628\u0627\u0632\u0645\u0627\u0646\u062F.",
"groupErr.keyMismatch": "\u06A9\u0644\u06CC\u062F \u06CC\u06A9\u06CC \u0627\u0632 \u0627\u0639\u0636\u0627 \u0628\u0627 \u0647\u0648\u06CC\u062A\u06CC \u06A9\u0647 \u0628\u0631\u0627\u06CC\u0634 \u0627\u062F\u0639\u0627 \u0634\u062F\u0647 \u0628\u0648\u062F \u0646\u062E\u0648\u0627\u0646\u062F.",
"groupErr.revealMismatch": "\u0645\u0642\u062F\u0627\u0631\u06CC \u06A9\u0647 \u0639\u0636\u0648\u06CC \u0627\u0641\u0634\u0627 \u06A9\u0631\u062F \u0628\u0627 \u0622\u0646\u0686\u0647 \u0628\u0647 \u0622\u0646 \u0645\u062A\u0639\u0647\u062F \u0634\u062F\u0647 \u0628\u0648\u062F \u0646\u062E\u0648\u0627\u0646\u062F.",
"groupErr.commitChanged": "\u0639\u0636\u0648\u06CC \u062F\u0631 \u0645\u06CC\u0627\u0646\u0647\u0654 \u06A9\u0627\u0631 \u062A\u0639\u0647\u062F \u062E\u0648\u062F \u0631\u0627 \u062A\u063A\u06CC\u06CC\u0631 \u062F\u0627\u062F.",
"groupErr.missingKey": "\u0639\u0636\u0648\u06CC \u0641\u0647\u0631\u0633\u062A \u0634\u062F \u06A9\u0647 \u06A9\u0644\u06CC\u062F\u0634 \u0647\u0631\u06AF\u0632 \u0646\u0631\u0633\u06CC\u062F.",
"groupErr.outsider": "\u0641\u0631\u06CC\u0645\u06CC \u0627\u0632 \u06A9\u0633\u06CC \u0628\u06CC\u0631\u0648\u0646 \u06AF\u0631\u0648\u0647 \u0631\u0633\u06CC\u062F.",
"groupErr.limit": "\u06AF\u0631\u0648\u0647 \u0628\u0647 \u0647\u0634\u062A \u0639\u0636\u0648 \u0645\u062D\u062F\u0648\u062F \u0627\u0633\u062A.",
"groupErr.tooLarge": "\u067E\u06CC\u0627\u0645 \u0628\u0631\u0627\u06CC \u0641\u0631\u0633\u062A\u0627\u062F\u0646 \u0628\u0647 \u06AF\u0631\u0648\u0647 \u0628\u06CC\u0634 \u0627\u0632 \u062D\u062F \u0628\u0632\u0631\u06AF \u0628\u0648\u062F.",
"fileType.text": "\u0645\u062A\u0646 \u0633\u0627\u062F\u0647",
"fileType.images": "\u062A\u0635\u0627\u0648\u06CC\u0631",
"fileType.archives": "\u0628\u0627\u06CC\u06AF\u0627\u0646\u06CC\u200C\u0647\u0627",
"fileType.voice": "\u067E\u06CC\u0627\u0645\u200C\u0647\u0627\u06CC \u0635\u0648\u062A\u06CC",
"fileType.unsupported": "\u067E\u0634\u062A\u06CC\u0628\u0627\u0646\u06CC\u200C\u0646\u0634\u062F\u0647",
"qrScan.title": "\u062E\u0648\u0627\u0646\u062F\u0646 \u06A9\u062F QR",
"qrScan.auto": "\u062D\u0627\u0644\u062A \u062E\u0648\u062F\u06A9\u0627\u0631",
"qrScan.reset": "\u0628\u0627\u0632\u0646\u0634\u0627\u0646\u06CC",
"qrScan.autoScroll": "\u067E\u06CC\u0645\u0627\u06CC\u0634 \u062E\u0648\u062F\u06A9\u0627\u0631 \u0631\u0648\u0634\u0646 \u0627\u0633\u062A",
"qrScan.starting": "\u062F\u0631 \u062D\u0627\u0644 \u0631\u0648\u0634\u0646 \u06A9\u0631\u062F\u0646 \u062F\u0648\u0631\u0628\u06CC\u0646...",
"qrScan.point": "\u062F\u0648\u0631\u0628\u06CC\u0646 \u0631\u0627 \u0628\u0647 \u06A9\u062F QR \u0628\u06AF\u06CC\u0631\u06CC\u062F",
"qrScan.tapFocus": "\u0628\u0631\u0627\u06CC \u062A\u0645\u0631\u06A9\u0632 \u0631\u0648\u06CC \u0635\u0641\u062D\u0647 \u0628\u0632\u0646\u06CC\u062F",
"qrScan.focusing": "\u062F\u0631 \u062D\u0627\u0644 \u062A\u0645\u0631\u06A9\u0632...",
"iceErr.notArray": "\u0641\u0647\u0631\u0633\u062A \u0633\u0631\u0648\u0631\u0647\u0627 \u0628\u0627\u06CC\u062F \u0622\u0631\u0627\u06CC\u0647 \u0628\u0627\u0634\u062F",
"iceErr.invalidJson": "\u200FJSON \u0646\u0627\u0645\u0639\u062A\u0628\u0631",
"iceErr.tooMany": "\u0633\u0631\u0648\u0631\u0647\u0627\u06CC \u0628\u06CC\u0634 \u0627\u0632 \u062D\u062F (\u0628\u06CC\u0634\u06CC\u0646\u0647 {max})",
"iceErr.invalidEntry": "{label}: \u0645\u062F\u062E\u0644 \u0646\u0627\u0645\u0639\u062A\u0628\u0631",
"iceErr.urlCount": "{label}: \u0645\u06CC\u0627\u0646 \u06F1 \u062A\u0627 {max} \u0646\u0634\u0627\u0646\u06CC \u0644\u0627\u0632\u0645 \u0627\u0633\u062A",
"iceErr.turnCreds": "{label}: \u0633\u0631\u0648\u0631\u0647\u0627\u06CC TURN \u0645\u0639\u0645\u0648\u0644\u0627\u064B \u0628\u0647 \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC \u0648 \u06AF\u0648\u0627\u0647\u06CC \u0646\u06CC\u0627\u0632 \u062F\u0627\u0631\u0646\u062F",
"iceUrl.notString": "\u0646\u0634\u0627\u0646\u06CC \u0628\u0627\u06CC\u062F \u0631\u0634\u062A\u0647 \u0628\u0627\u0634\u062F",
"iceUrl.empty": "\u0646\u0634\u0627\u0646\u06CC \u062E\u0627\u0644\u06CC \u0627\u0633\u062A",
"iceUrl.tooLong": "\u0646\u0634\u0627\u0646\u06CC \u0628\u06CC\u0634 \u0627\u0632 \u062D\u062F \u0628\u0644\u0646\u062F \u0627\u0633\u062A",
"iceUrl.badChars": "\u0646\u0634\u0627\u0646\u06CC \u0646\u0648\u06CC\u0633\u0647\u200C\u0647\u0627\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u062F\u0627\u0631\u062F",
"iceUrl.badScheme": "\u0646\u0634\u0627\u0646\u06CC \u0628\u0627\u06CC\u062F \u0628\u0627 stun:\u200F\u060C stuns:\u200F\u060C turn: \u06CC\u0627 turns: \u0622\u063A\u0627\u0632 \u0634\u0648\u062F",
"iceUrl.badQuery": "\u067E\u0631\u0633\u200C\u0648\u062C\u0648\u06CC \u0646\u0634\u0627\u0646\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",
"iceUrl.noHost": "\u0646\u0634\u0627\u0646\u06CC \u0645\u06CC\u0632\u0628\u0627\u0646 \u0646\u062F\u0627\u0631\u062F",
"iceUrl.badHost": "\u0645\u06CC\u0632\u0628\u0627\u0646 \u06CC\u0627 \u062F\u0631\u06AF\u0627\u0647 \u0646\u0634\u0627\u0646\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",
"iceUrl.badTransport": "\u067E\u0631\u0633\u200C\u0648\u062C\u0648\u06CC \u0646\u0634\u0627\u0646\u06CC \u0628\u0627\u06CC\u062F transport=udp \u06CC\u0627 transport=tcp \u0628\u0627\u0634\u062F",
"msg.off": "\u062E\u0627\u0645\u0648\u0634",
"file.consentUnavailable": "\u0631\u0636\u0627\u06CC\u062A \u06A9\u0627\u0631\u0628\u0631 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A",
"secLevel.MAXIMUM": "\u0628\u06CC\u0634\u06CC\u0646\u0647",
"secLevel.INITIALIZING": "\u062F\u0631 \u062D\u0627\u0644 \u0631\u0627\u0647\u200C\u0627\u0646\u062F\u0627\u0632\u06CC",
"secLevel.ERROR": "\u062E\u0637\u0627",
"secLevel.UNKNOWN": "\u0646\u0627\u0645\u0634\u062E\u0635",
"status.error": "\u062E\u0637\u0627",
"offline.disconnect": "\u0642\u0637\u0639 \u0627\u062A\u0635\u0627\u0644",
"offline.learnMore": "\u0628\u06CC\u0634\u062A\u0631 \u0628\u062F\u0627\u0646\u06CC\u062F",
"pwa.installApp": "\u0646\u0635\u0628 \u0628\u0631\u0646\u0627\u0645\u0647",
"chat.onWeb": "\u0634\u0645\u0627 \u0631\u0648\u06CC \u0646\u0633\u062E\u0647\u0654 \u0648\u0628 \u0647\u0633\u062A\u06CC\u062F",
"groupCall.startVoice": "\u0634\u0631\u0648\u0639 \u062A\u0645\u0627\u0633 \u0635\u0648\u062A\u06CC \u06AF\u0631\u0648\u0647\u06CC",
"groupCall.startVideo": "\u0634\u0631\u0648\u0639 \u062A\u0645\u0627\u0633 \u062A\u0635\u0648\u06CC\u0631\u06CC \u06AF\u0631\u0648\u0647\u06CC",
"groupCall.join": "\u067E\u06CC\u0648\u0633\u062A\u0646",
"groupCall.dismiss": "\u0627\u0644\u0627\u0646 \u0646\u0647",
"groupCall.leave": "\u062E\u0631\u0648\u062C \u0627\u0632 \u062A\u0645\u0627\u0633",
"groupCall.you": "\u0634\u0645\u0627",
"groupCall.connecting": "\u062F\u0631 \u062D\u0627\u0644 \u0627\u062A\u0635\u0627\u0644\u2026",
"groupCall.waitingLink": "\u062F\u0631 \u0627\u0646\u062A\u0638\u0627\u0631 \u06CC\u06A9 \u067E\u06CC\u0648\u0646\u062F \u0645\u0633\u062A\u0642\u06CC\u0645\u2026",
"groupCall.legFailed": "\u0627\u062A\u0635\u0627\u0644 \u0628\u0631\u0642\u0631\u0627\u0631 \u0646\u0634\u062F",
"groupCall.startedVoice": "{name} \u06CC\u06A9 \u062A\u0645\u0627\u0633 \u0635\u0648\u062A\u06CC \u0622\u063A\u0627\u0632 \u06A9\u0631\u062F",
"groupCall.startedVideo": "{name} \u06CC\u06A9 \u062A\u0645\u0627\u0633 \u062A\u0635\u0648\u06CC\u0631\u06CC \u0622\u063A\u0627\u0632 \u06A9\u0631\u062F",
"groupCall.inCall": "{count} \u0646\u0641\u0631 \u062F\u0631 \u062A\u0645\u0627\u0633",
"groupCall.err.permission_denied": "\u062A\u0645\u0627\u0633 \u0622\u063A\u0627\u0632 \u0646\u0634\u062F - \u062F\u0633\u062A\u0631\u0633\u06CC \u0628\u0647 \u0645\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0648 \u062F\u0648\u0631\u0628\u06CC\u0646 \u0645\u0633\u062F\u0648\u062F \u0627\u0633\u062A. \u0622\u0646 \u0631\u0627 \u0628\u0631\u0627\u06CC \u0627\u06CC\u0646 \u0633\u0627\u06CC\u062A \u0645\u062C\u0627\u0632 \u06A9\u0646\u06CC\u062F \u0648 \u062F\u0648\u0628\u0627\u0631\u0647 \u062A\u0644\u0627\u0634 \u06A9\u0646\u06CC\u062F.",
"groupCall.err.device_not_found": "\u062A\u0645\u0627\u0633 \u0622\u063A\u0627\u0632 \u0646\u0634\u062F - \u0645\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646\u06CC \u0631\u0648\u06CC \u0627\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647 \u067E\u06CC\u062F\u0627 \u0646\u0634\u062F.",
"groupCall.err.device_busy": "\u062A\u0645\u0627\u0633 \u0622\u063A\u0627\u0632 \u0646\u0634\u062F - \u0645\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0634\u0645\u0627 \u062F\u0631 \u062D\u0627\u0644 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u062A\u0648\u0633\u0637 \u0628\u0631\u0646\u0627\u0645\u0647 \u062F\u06CC\u06AF\u0631\u06CC \u0627\u0633\u062A. \u0622\u0646 \u0631\u0627 \u0628\u0628\u0646\u062F\u06CC\u062F \u0648 \u062F\u0648\u0628\u0627\u0631\u0647 \u062A\u0644\u0627\u0634 \u06A9\u0646\u06CC\u062F.",
"groupCall.err.media_failed": "\u062A\u0645\u0627\u0633 \u0622\u063A\u0627\u0632 \u0646\u0634\u062F - \u0645\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0628\u0627\u0632 \u0646\u0634\u062F.",
"groupCall.err.call_in_progress": "\u0647\u0645\u06CC\u0646 \u062D\u0627\u0644\u0627 \u062A\u0645\u0627\u0633\u06CC \u062F\u0631 \u0627\u06CC\u0646 \u06AF\u0631\u0648\u0647 \u062F\u0631 \u062C\u0631\u06CC\u0627\u0646 \u0627\u0633\u062A. \u0628\u0647\u200C\u062C\u0627\u06CC \u0634\u0631\u0648\u0639 \u062A\u0645\u0627\u0633 \u062A\u0627\u0632\u0647\u060C \u0628\u0647 \u0622\u0646 \u0628\u067E\u06CC\u0648\u0646\u062F\u06CC\u062F.",
"groupCall.err.not_ready": "\u067E\u06CC\u0634 \u0627\u0632 \u062A\u0645\u0627\u0633\u060C \u06A9\u062F \u06AF\u0631\u0648\u0647 \u0631\u0627 \u062A\u0623\u06CC\u06CC\u062F \u06A9\u0646\u06CC\u062F.",
"groupCall.speaking": "{name} \u062F\u0631 \u062D\u0627\u0644 \u0635\u062D\u0628\u062A \u0627\u0633\u062A",
"groupCall.pin": "\u0646\u0645\u0627\u06CC\u0634 \u0628\u0632\u0631\u06AF {name}",
"groupCall.unpin": "\u0628\u0627\u0632\u06AF\u0634\u062A \u0628\u0647 \u0647\u0645\u0647",
"groupCall.showEveryone": "\u0647\u0645\u0647",
"msg.after5s": "\u06F5 \u062B\u0627\u0646\u06CC\u0647 \u067E\u0633 \u0627\u0632 \u062E\u0648\u0627\u0646\u062F\u0646",
"msg.after15s": "\u06F1\u06F5 \u062B\u0627\u0646\u06CC\u0647 \u067E\u0633 \u0627\u0632 \u062E\u0648\u0627\u0646\u062F\u0646",
"msg.after30s": "\u06F3\u06F0 \u062B\u0627\u0646\u06CC\u0647 \u067E\u0633 \u0627\u0632 \u062E\u0648\u0627\u0646\u062F\u0646",
"msg.after1m": "\u06F1 \u062F\u0642\u06CC\u0642\u0647 \u067E\u0633 \u0627\u0632 \u062E\u0648\u0627\u0646\u062F\u0646",
"msg.sec30": "\u06F3\u06F0 \u062B\u0627\u0646\u06CC\u0647",
"msg.min5": "\u06F5 \u062F\u0642\u06CC\u0642\u0647",
"msg.hour1": "\u06F1 \u0633\u0627\u0639\u062A",
"desktop.shareDesc": "\u06A9\u062F \u0631\u0627 \u0628\u0631\u0627\u06CC \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0628\u0641\u0631\u0633\u062A\u06CC\u062F. \u06CC\u06A9\u200C\u0628\u0627\u0631\u0645\u0635\u0631\u0641 \u0627\u0633\u062A \u0648 \u0632\u0648\u062F \u0645\u0646\u0642\u0636\u06CC \u0645\u06CC\u200C\u0634\u0648\u062F.",
"desktop.invitationCreated": "\u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647\u0654 \u0627\u0645\u0646 \u0633\u0627\u062E\u062A\u0647 \u0634\u062F - \u0622\u0646 \u0631\u0627 \u0628\u0631\u0627\u06CC \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0628\u0641\u0631\u0633\u062A\u06CC\u062F.",
"desktop.joinDesc": "\u06A9\u062F \u062F\u0639\u0648\u062A \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0631\u0627 \u0628\u0686\u0633\u0628\u0627\u0646\u06CC\u062F \u062A\u0627 \u067E\u0627\u0633\u062E \u0627\u0645\u0646 \u0634\u0645\u0627 \u0633\u0627\u062E\u062A\u0647 \u0634\u0648\u062F.",
"desktop.offerTag": "\u062F\u0639\u0648\u062A \xB7 \u06A9\u067E\u06CC \u0645\u062A\u0646",
"desktop.answerTag": "\u067E\u0627\u0633\u062E \xB7 \u06A9\u067E\u06CC \u0645\u062A\u0646",
"desktop.offerPlaceholder": "\u06A9\u062F \u062F\u0639\u0648\u062A \u0627\u06CC\u0646\u062C\u0627 \u0646\u0645\u0627\u06CC\u0627\u0646 \u0645\u06CC\u200C\u0634\u0648\u062F\u2026",
"desktop.answerPlaceholder": "\u06A9\u062F \u067E\u0627\u0633\u062E \u0627\u06CC\u0646\u062C\u0627 \u0646\u0645\u0627\u06CC\u0627\u0646 \u0645\u06CC\u200C\u0634\u0648\u062F\u2026",
"desktop.backToChats": "\u0628\u0627\u0632\u06AF\u0634\u062A \u0628\u0647 \u06AF\u0641\u062A\u200C\u0648\u06AF\u0648\u0647\u0627",
"desktop.sendFeedback": "\u0627\u0631\u0633\u0627\u0644 \u0628\u0627\u0632\u062E\u0648\u0631\u062F",
"desktop.callsNeedVerified": "\u062A\u0645\u0627\u0633\u200C\u0647\u0627 \u0628\u0647 \u06CC\u06A9 \u06A9\u0627\u0646\u0627\u0644 \u0627\u0645\u0646\u0650 \u062A\u0623\u06CC\u06CC\u062F\u0634\u062F\u0647 \u0646\u06CC\u0627\u0632 \u062F\u0627\u0631\u0646\u062F.",
"desktop.noOpenChannel": "\u0647\u06CC\u0686 \u06A9\u0627\u0646\u0627\u0644 \u0627\u0645\u0646 \u0628\u0627\u0632\u06CC \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F.",
"desktop.chatCarriesCall": "\u0627\u06CC\u0646 \u06AF\u0641\u062A\u200C\u0648\u06AF\u0648 \u062D\u0627\u0645\u0644 \u06CC\u06A9 \u062A\u0645\u0627\u0633 \u06AF\u0631\u0648\u0647\u06CC \u0627\u0633\u062A. \u067E\u06CC\u0634 \u0627\u0632 \u062A\u0645\u0627\u0633 \u062F\u0648\u0646\u0641\u0631\u0647\u060C \u0627\u0632 \u062A\u0645\u0627\u0633 \u06AF\u0631\u0648\u0647\u06CC \u062E\u0627\u0631\u062C \u0634\u0648\u06CC\u062F.",
"desktop.err.permission_denied": "\u062A\u0645\u0627\u0633 \u0622\u063A\u0627\u0632 \u0646\u0634\u062F - \u062F\u0633\u062A\u0631\u0633\u06CC \u0628\u0647 \u0645\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0648 \u062F\u0648\u0631\u0628\u06CC\u0646 \u0645\u0633\u062F\u0648\u062F \u0627\u0633\u062A. \u0622\u0646 \u0631\u0627 \u062F\u0631 \u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u0633\u06CC\u0633\u062A\u0645 \u0645\u062C\u0627\u0632 \u06A9\u0646\u06CC\u062F \u0648 \u062F\u0648\u0628\u0627\u0631\u0647 \u062A\u0644\u0627\u0634 \u06A9\u0646\u06CC\u062F.",
"desktop.language": "\u0632\u0628\u0627\u0646",
"desktop.languageHint": "\u0628\u06CC\u200C\u062F\u0631\u0646\u06AF \u0627\u0639\u0645\u0627\u0644 \u0645\u06CC\u200C\u0634\u0648\u062F. \u067E\u06CC\u0627\u0645\u200C\u0647\u0627\u06CC \u0627\u0631\u0633\u0627\u0644\u200C\u0634\u062F\u0647 \u0628\u0627 \u0647\u0645\u0627\u0646 \u0648\u0627\u0698\u0647\u200C\u0647\u0627 \u0628\u0627\u0642\u06CC \u0645\u06CC\u200C\u0645\u0627\u0646\u0646\u062F.",
"desktop.compareCode": "\u06A9\u062F \u062A\u0623\u06CC\u06CC\u062F \u0631\u0627 \u0628\u0627 \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0645\u0642\u0627\u06CC\u0633\u0647 \u06A9\u0646\u06CC\u062F \u0648 \u0627\u06AF\u0631 \u06CC\u06A9\u0633\u0627\u0646 \u0628\u0648\u062F \u062A\u0623\u06CC\u06CC\u062F \u06A9\u0646\u06CC\u062F.",
"desktop.verifyBeforeFiles": "\u067E\u06CC\u0634 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u0641\u0627\u06CC\u0644\u060C \u062A\u0623\u06CC\u06CC\u062F \u0631\u0627 \u06A9\u0627\u0645\u0644 \u06A9\u0646\u06CC\u062F.",
"desktop.verifyBeforeSending": "\u067E\u06CC\u0634 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u067E\u06CC\u0627\u0645\u060C \u062A\u0623\u06CC\u06CC\u062F \u0631\u0627 \u06A9\u0627\u0645\u0644 \u06A9\u0646\u06CC\u062F.",
"desktop.disconnectedByBackend": "\u0627\u062A\u0635\u0627\u0644 \u0628\u0647\u200C\u0637\u0648\u0631 \u0627\u0645\u0646 \u0642\u0637\u0639 \u0634\u062F.",
"desktop.restoreFailed": "\u0627\u062A\u0635\u0627\u0644 \u0628\u0627\u0632\u06CC\u0627\u0628\u06CC \u0646\u0634\u062F. \u0627\u06CC\u0646 \u06AF\u0641\u062A\u200C\u0648\u06AF\u0648 \u0628\u0633\u062A\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F.",
"desktop.channelNotReady": "\u06A9\u0627\u0646\u0627\u0644 \u062F\u0627\u062F\u0647 \u0647\u0646\u0648\u0632 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A. \u062A\u0627 \u0628\u0631\u0642\u0631\u0627\u0631\u06CC \u0627\u062A\u0635\u0627\u0644 \u0635\u0628\u0631 \u06A9\u0646\u06CC\u062F.",
"desktop.enterCode": "\u0628\u0631\u0627\u06CC \u062A\u0623\u06CC\u06CC\u062F\u060C \u06A9\u062F \u062A\u0623\u06CC\u06CC\u062F \u0631\u0627 \u0648\u0627\u0631\u062F \u06A9\u0646\u06CC\u062F.",
"desktop.noOffer": "\u062F\u0639\u0648\u062A\u06CC \u06CC\u0627\u0641\u062A \u0646\u0634\u062F. \u0646\u062E\u0633\u062A \u06CC\u06A9\u06CC \u0628\u0633\u0627\u0632\u06CC\u062F.",
"desktop.notInitiator": "\u0627\u06CC\u0646 \u0627\u062A\u0635\u0627\u0644 \u0631\u0627 \u0634\u0645\u0627 \u0646\u0633\u0627\u062E\u062A\u0647\u200C\u0627\u06CC\u062F\u060C \u067E\u0633 \u067E\u0627\u0633\u062E\u06CC \u0628\u0631\u0627\u06CC \u0627\u0639\u0645\u0627\u0644 \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F.",
"desktop.decryptFailed": "\u0631\u0645\u0632\u06AF\u0634\u0627\u06CC\u06CC \u06CC\u06A9 \u067E\u06CC\u0627\u0645 \u0645\u0645\u06A9\u0646 \u0646\u0634\u062F \u0648 \u06A9\u0646\u0627\u0631 \u06AF\u0630\u0627\u0634\u062A\u0647 \u0634\u062F.",
"desktop.badMessageFormat": "\u0642\u0627\u0628\u06CC \u0646\u0627\u062F\u0631\u0633\u062A \u0631\u0633\u06CC\u062F \u0648 \u06A9\u0646\u0627\u0631 \u06AF\u0630\u0627\u0634\u062A\u0647 \u0634\u062F.",
"desktop.notSentNotReady": "\u067E\u06CC\u0627\u0645 \u0627\u0631\u0633\u0627\u0644 \u0646\u0634\u062F: \u06A9\u0627\u0646\u0627\u0644 \u0627\u0645\u0646 \u0622\u0645\u0627\u062F\u0647 \u0646\u06CC\u0633\u062A. \u062A\u0627 \u067E\u0627\u06CC\u0627\u0646 \u062A\u0623\u06CC\u06CC\u062F \u0635\u0628\u0631 \u06A9\u0646\u06CC\u062F \u06CC\u0627 \u062F\u0648\u0628\u0627\u0631\u0647 \u0648\u0635\u0644 \u0634\u0648\u06CC\u062F.",
"desktop.micDenied": "\u062F\u0633\u062A\u0631\u0633\u06CC \u0628\u0647 \u0645\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0631\u062F \u0634\u062F.",
"desktop.noChannelWait": "\u06A9\u0627\u0646\u0627\u0644 \u0627\u0645\u0646\u0650 \u0628\u0627\u0632\u06CC \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F - \u062A\u0627 \u0628\u0631\u0642\u0631\u0627\u0631\u06CC \u0627\u062A\u0635\u0627\u0644 \u0635\u0628\u0631 \u06A9\u0646\u06CC\u062F.",
"desktop.sasFailed": "\u062A\u0623\u06CC\u06CC\u062F \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F. \u0634\u0627\u06CC\u062F \u0648\u0627\u0633\u0637\u0647\u200C\u0627\u06CC \u062F\u0631 \u0645\u06CC\u0627\u0646 \u0628\u0627\u0634\u062F\u060C \u0628\u0646\u0627\u0628\u0631\u0627\u06CC\u0646 \u0627\u062A\u0635\u0627\u0644 \u0642\u0637\u0639 \u0634\u062F.",
"desktop.sasOk": "\u062A\u0623\u06CC\u06CC\u062F \u0645\u0648\u0641\u0642 \u0628\u0648\u062F. \u0627\u06CC\u0646 \u06A9\u0627\u0646\u0627\u0644 \u0633\u0631\u062A\u0627\u0633\u0631\u06CC \u0627\u062D\u0631\u0627\u0632 \u0647\u0648\u06CC\u062A \u0634\u062F\u0647 \u0627\u0633\u062A.",
"desktop.iceForgotten": "\u0633\u0631\u0648\u0631\u0647\u0627\u06CC \u0630\u062E\u06CC\u0631\u0647\u200C\u0634\u062F\u0647 \u0641\u0631\u0627\u0645\u0648\u0634 \u0634\u062F\u0646\u062F. \u0627\u0632 \u0633\u0631\u0648\u0631\u0647\u0627\u06CC \u0639\u0645\u0648\u0645\u06CC ICE \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F.",
"desktop.icePublic": "\u0627\u0632 \u0633\u0631\u0648\u0631\u0647\u0627\u06CC \u0639\u0645\u0648\u0645\u06CC ICE \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F.",
"desktop.verificationInProgress": "\u0628\u0631\u0631\u0633\u06CC \u0627\u0645\u0646\u06CC\u062A\u06CC \u0647\u0646\u0648\u0632 \u062F\u0631 \u062C\u0631\u06CC\u0627\u0646 \u0627\u0633\u062A. \u062A\u0627 \u067E\u0627\u06CC\u0627\u0646 \u0622\u0646 \u0635\u0628\u0631 \u06A9\u0646\u06CC\u062F.",
"desktop.fileGone": "\u0627\u06CC\u0646 \u0641\u0627\u06CC\u0644 \u062F\u06CC\u06AF\u0631 \u0628\u0631\u0627\u06CC \u062F\u0627\u0646\u0644\u0648\u062F \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A.",
"desktop.codeMismatch": "\u06A9\u062F\u0647\u0627\u06CC \u062A\u0623\u06CC\u06CC\u062F \u06CC\u06A9\u0633\u0627\u0646 \u0646\u06CC\u0633\u062A\u0646\u062F. \u0628\u0631\u0627\u06CC \u0627\u06CC\u0645\u0646\u06CC \u0642\u0637\u0639 \u0645\u06CC\u200C\u0634\u0648\u062F.",
"desktop.noLocalCode": "\u062A\u0623\u06CC\u06CC\u062F \u0646\u0627\u0645\u0648\u0641\u0642: \u06A9\u062F \u0645\u062D\u0644\u06CC\u200C\u0627\u06CC \u0628\u0631\u0627\u06CC \u0645\u0642\u0627\u06CC\u0633\u0647 \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F. \u0628\u0631\u0627\u06CC \u0627\u06CC\u0645\u0646\u06CC \u0642\u0637\u0639 \u0645\u06CC\u200C\u0634\u0648\u062F.",
"desktop.protocolViolation": "\u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u067E\u06CC\u0634 \u0627\u0632 \u062A\u0623\u06CC\u06CC\u062F \u0634\u0645\u0627 \u0627\u062F\u0639\u0627\u06CC \u062A\u0623\u06CC\u06CC\u062F \u06A9\u062F \u0631\u0627 \u06A9\u0631\u062F. \u0628\u0631\u0627\u06CC \u0627\u06CC\u0645\u0646\u06CC \u0642\u0637\u0639 \u0645\u06CC\u200C\u0634\u0648\u062F.",
"desktop.verificationRejected": "\u062A\u0623\u06CC\u06CC\u062F \u0631\u062F \u0634\u062F. \u0627\u062A\u0635\u0627\u0644 \u0628\u0631\u0627\u06CC \u0627\u06CC\u0645\u0646\u06CC \u0642\u0637\u0639 \u0634\u062F.",
"secLevel.HIGH": "\u0628\u0627\u0644\u0627",
"secLevel.MEDIUM": "\u0645\u062A\u0648\u0633\u0637",
"secLevel.LOW": "\u067E\u0627\u06CC\u06CC\u0646",
"desktop.rerun": "\u0628\u0631\u0631\u0633\u06CC \u062F\u0648\u0628\u0627\u0631\u0647",
"desktop.ice.customDesc": "\u062A\u0627 {max} \u0633\u0631\u0648\u0631\u060C \u062F\u0631 \u0647\u0631 \u062E\u0637 \u06CC\u06A9 \u0646\u0634\u0627\u0646\u06CC \u06CC\u0627 \u0628\u0627 \u0642\u0627\u0644\u0628 JSON.",
"desktop.ice.persistDesc": "\u0628\u0647\u200C\u0635\u0648\u0631\u062A \u0645\u062D\u0644\u06CC \u0631\u0648\u06CC \u0647\u0645\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647 \u0630\u062E\u06CC\u0631\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F. \u0628\u0631\u0627\u06CC \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0641\u0642\u0637 \u062F\u0631 \u0627\u06CC\u0646 \u0646\u0634\u0633\u062A\u060C \u062E\u0627\u0645\u0648\u0634 \u0628\u06AF\u0630\u0627\u0631\u06CC\u062F.",
"desktop.group.leaveNote": "\u0628\u0647 \u0628\u0642\u06CC\u0647\u0654 \u0627\u0639\u0636\u0627 \u0627\u0637\u0644\u0627\u0639 \u062F\u0627\u062F\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F \u06A9\u0647 \u062E\u0627\u0631\u062C \u0634\u062F\u0647\u200C\u0627\u06CC\u062F. \u067E\u0633 \u0627\u0632 \u0622\u0646 \u0686\u06CC\u0632\u06CC \u0627\u0632 \u0627\u06CC\u0646 \u06AF\u0631\u0648\u0647 \u0631\u0648\u06CC \u0627\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647 \u0646\u0645\u06CC\u200C\u0645\u0627\u0646\u062F - \u0647\u06CC\u0686 \u0633\u0631\u0648\u0631\u06CC \u0646\u0633\u062E\u0647\u200C\u0627\u06CC \u0646\u062F\u0627\u0631\u062F \u06A9\u0647 \u0628\u062A\u0648\u0627\u0646 \u0627\u0632 \u0622\u0646 \u0628\u0627\u0632\u06AF\u0634\u062A\u060C \u067E\u0633 \u0628\u0647 \u062F\u0639\u0648\u062A \u062A\u0627\u0632\u0647 \u0646\u06CC\u0627\u0632 \u062E\u0648\u0627\u0647\u06CC\u062F \u062F\u0627\u0634\u062A.",
"desktop.sec.ecdsaOk": "\u0627\u0645\u0636\u0627\u06CC \u0628\u0633\u062A\u0647\u0654 \u06A9\u0644\u06CC\u062F \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0647\u0646\u06AF\u0627\u0645 \u062F\u0633\u062A\u200C\u062F\u0627\u062F\u0646 \u0628\u0631\u0631\u0633\u06CC \u0634\u062F (ECDSA P-384 / SHA-384)",
"desktop.sec.ecdsaNone": "\u062F\u0633\u062A\u200C\u062F\u0627\u062F\u0646\u06CC \u06A9\u0627\u0645\u0644 \u0646\u0634\u062F\u0647 \u0627\u0633\u062A",
"desktop.sec.ecdhOk": "\u06A9\u0644\u06CC\u062F\u0647\u0627\u06CC \u0646\u0634\u0633\u062A \u0627\u0632 \u062A\u0628\u0627\u062F\u0644 \u06AF\u0630\u0631\u0627\u06CC ECDH P-384 \u0628\u0627 HKDF-SHA-256 \u0645\u0634\u062A\u0642 \u0634\u062F\u0646\u062F",
"desktop.sec.ecdhNone": "\u06A9\u0644\u06CC\u062F \u0646\u0634\u0633\u062A\u06CC \u0645\u0634\u062A\u0642 \u0646\u0634\u062F",
"desktop.sec.encryptionOk": "\u0631\u0645\u0632\u06AF\u0630\u0627\u0631\u06CC \u0648 \u0631\u0645\u0632\u06AF\u0634\u0627\u06CC\u06CC AES-GCM \u062F\u0631 \u0647\u0633\u062A\u0647 \u0628\u0631\u0631\u0633\u06CC \u0634\u062F",
"desktop.sec.encryptionNa": "\u062E\u0648\u062F\u0622\u0632\u0645\u0648\u0646 AES-GCM \u0627\u062C\u0631\u0627 \u0646\u0634\u062F",
"desktop.sec.integrityOk": "\u06CC\u06A9\u067E\u0627\u0631\u0686\u06AF\u06CC \u067E\u06CC\u0627\u0645\u200C\u0647\u0627 \u0628\u0631\u0631\u0633\u06CC \u0634\u062F (\u0627\u062D\u0631\u0627\u0632 AES-GCM)",
"desktop.sec.integrityNa": "\u062E\u0648\u062F\u0622\u0632\u0645\u0648\u0646 \u06CC\u06A9\u067E\u0627\u0631\u0686\u06AF\u06CC \u0627\u062C\u0631\u0627 \u0646\u0634\u062F",
"desktop.sec.pfsOk": "Double Ratchet \u0641\u0639\u0627\u0644 \u0627\u0633\u062A - \u0647\u0631 \u067E\u06CC\u0627\u0645 \u06A9\u0644\u06CC\u062F \u062E\u0648\u062F\u0634 \u0631\u0627 \u062F\u0627\u0631\u062F",
"desktop.sec.pfsNa": "\u0627\u0646\u062F\u0627\u0632\u0647\u200C\u06AF\u06CC\u0631\u06CC \u0646\u0634\u062F",
"desktop.sec.replayOk": "\u06A9\u0644\u06CC\u062F\u0647\u0627\u06CC \u067E\u06CC\u0627\u0645 \u0631\u0686\u062A \u067E\u0633 \u0627\u0632 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0646\u0627\u0628\u0648\u062F \u0645\u06CC\u200C\u0634\u0648\u0646\u062F\u060C \u067E\u0633 \u0642\u0627\u0628\u06CC \u06A9\u0647 \u0634\u0646\u0648\u062F \u0634\u062F\u0647 \u062F\u0648\u0628\u0627\u0631\u0647 \u067E\u062E\u0634 \u0646\u0645\u06CC\u200C\u0634\u0648\u062F",
"desktop.sec.replayNa": "\u0627\u0646\u062F\u0627\u0632\u0647\u200C\u06AF\u06CC\u0631\u06CC \u0646\u0634\u062F",
"desktop.sec.dtlsPinned": "\u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A DTLS \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u067E\u06CC\u0646 \u0634\u062F: {fp}",
"desktop.sec.dtlsNone": "\u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A DTLS \u0637\u0631\u0641 \u062F\u0648\u0631 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A",
"desktop.sec.sasBoth": "\u0647\u0631 \u062F\u0648 \u0637\u0631\u0641 \u06A9\u062F \u0627\u06CC\u0645\u0646\u06CC \u0631\u0627 \u0628\u06CC\u0631\u0648\u0646 \u0627\u0632 \u06A9\u0627\u0646\u0627\u0644 \u062A\u0623\u06CC\u06CC\u062F \u06A9\u0631\u062F\u0646\u062F",
"desktop.sec.sasIncomplete": "\u06A9\u062F \u0627\u06CC\u0645\u0646\u06CC \u0631\u0627 \u0647\u0631 \u062F\u0648 \u0637\u0631\u0641 \u062A\u0623\u06CC\u06CC\u062F \u0646\u06A9\u0631\u062F\u0647\u200C\u0627\u0646\u062F",
"desktop.sec.metadataOk": "\u06A9\u0644\u06CC\u062F \u0627\u062E\u062A\u0635\u0627\u0635\u06CC \u0641\u0631\u0627\u062F\u0627\u062F\u0647 \u0645\u0634\u062A\u0642 \u0634\u062F (HKDF metadata-protection-v4)",
"desktop.sec.metadataNone": "\u06A9\u0644\u06CC\u062F \u0641\u0631\u0627\u062F\u0627\u062F\u0647 \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F",
"desktop.sec.coverOn": "\u062A\u0631\u0627\u0641\u06CC\u06A9 \u067E\u0648\u0634\u0634\u06CC \u0641\u0639\u0627\u0644 \u0627\u0633\u062A: \u0642\u0627\u0628\u200C\u0647\u0627\u06CC \u0633\u0627\u062E\u062A\u06AF\u06CC \u062A\u0635\u0627\u062F\u0641\u06CC (\u06F3\u06F2 \u062A\u0627 \u06F1\u06F2\u06F8 \u0628\u0627\u06CC\u062A \u0647\u0631 \u06F1\u06F5 \u062A\u0627 \u06F3\u06F0 \u062B\u0627\u0646\u06CC\u0647) \u0631\u0648\u06CC \u06A9\u0627\u0646\u0627\u0644 \u0631\u0686\u062A",
"desktop.sec.coverOff": "\u0645\u0648\u0644\u062F \u062A\u0631\u0627\u0641\u06CC\u06A9 \u067E\u0648\u0634\u0634\u06CC \u062F\u0631 \u062D\u0627\u0644 \u0627\u062C\u0631\u0627 \u0646\u06CC\u0633\u062A",
"desktop.sec.coverUnsupported": "\u062A\u0631\u0627\u0641\u06CC\u06A9 \u067E\u0648\u0634\u0634\u06CC \u0628\u0647 \u0646\u0634\u0633\u062A Double Ratchet \u0646\u06CC\u0627\u0632 \u062F\u0627\u0631\u062F (\u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0646\u0633\u062E\u0647\u0654 \u0642\u062F\u06CC\u0645\u06CC\u200C\u062A\u0631\u06CC \u062F\u0627\u0631\u062F)",
"desktop.tagline": "\u0622\u0632\u0627\u062F\u06CC \u0633\u0631\u062A\u0627\u0633\u0631\u06CC"
},
"ur": {
"language.label": "\u0632\u0628\u0627\u0646",
"language.suggest.text": "\u06CC\u06C1 \u0635\u0641\u062D\u06C1 \u0627\u0631\u062F\u0648 \u0645\u06CC\u06BA \u0628\u06BE\u06CC \u062F\u0633\u062A\u06CC\u0627\u0628 \u06C1\u06D2\u06D4",
"language.suggest.cta": "\u0627\u0631\u062F\u0648 \u0645\u06CC\u06BA \u067E\u0691\u06BE\u06CC\u06BA",
"language.suggest.dismiss": "\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",
"community.title": "\u0646\u062C\u06CC\u062A \u06A9\u06D2 \u0645\u0633\u062A\u0642\u0628\u0644 \u0645\u06CC\u06BA \u0634\u0627\u0645\u0644 \u06C1\u0648\u06BA",
"community.description": "\u200FSecureBit \u0627\u067E\u0646\u06CC \u0628\u0631\u0627\u062F\u0631\u06CC \u06A9\u06CC \u0628\u062F\u0648\u0644\u062A \u0628\u0691\u06BE\u062A\u0627 \u06C1\u06D2\u06D4 \u0622\u067E \u06A9\u06D2 \u062E\u06CC\u0627\u0644\u0627\u062A \u0627\u0648\u0631 \u0622\u0631\u0627\u0621 \u0645\u062D\u0641\u0648\u0638 \u0631\u0627\u0628\u0637\u06D2 \u06A9\u0627 \u0645\u0633\u062A\u0642\u0628\u0644 \u062A\u0634\u06A9\u06CC\u0644 \u062F\u06CC\u062A\u06D2 \u06C1\u06CC\u06BA - \u06A9\u06BE\u0644\u06D2 \u0639\u0627\u0645 \u0628\u0646\u0627\u06CC\u0627 \u06AF\u06CC\u0627\u060C \u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u0645\u06A9\u0645\u0644 ASN.1 \u062A\u0648\u062B\u06CC\u0642 \u06A9\u06D2 \u0633\u0627\u062A\u06BE\u06D4",
"community.github": "\u200FGitHub \u0645\u062E\u0632\u0646",
"community.feedback": "\u0631\u0627\u0626\u06D2",
"unique.eyebrow": "\u06C1\u0645\u06CC\u06BA \u06A9\u06CC\u0627 \u0645\u0645\u062A\u0627\u0632 \u06A9\u0631\u062A\u0627 \u06C1\u06D2",
"unique.heading": "\u200FSecureBit \u0645\u0646\u0641\u0631\u062F \u06A9\u06CC\u0648\u06BA \u06C1\u06D2",
"unique.s1.titleTop": "\u06A9\u062B\u06CC\u0631 \u067E\u0631\u062A",
"unique.s1.titleBottom": "\u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC \u06A9\u0627 \u0645\u0631\u06A9\u0632",
"unique.s1.collapsed": "\u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC \u06A9\u0627 \u0645\u0631\u06A9\u0632",
"unique.s1.desc": "\u200FECDH P-384 \u06A9\u0644\u06CC\u062F \u062A\u0628\u0627\u062F\u0644\u06C1\u060C AES-256-GCM \u0688\u06CC\u0679\u0627\u060C ECDSA \u062F\u0633\u062A\u062E\u0637 \u0627\u0648\u0631 \u0645\u06A9\u0645\u0644 ASN.1 \u062A\u0648\u062B\u06CC\u0642 - \u0633\u0628 \u0627\u06CC\u06A9 \u0645\u0636\u0628\u0648\u0637 \u0633\u0644\u0633\u0644\u06D2 \u0645\u06CC\u06BA \u062C\u0691\u06D2 \u06C1\u0648\u0626\u06D2\u06D4",
"unique.s1.tags": [
"ECDH P-384",
"AES-256-GCM",
"ECDSA",
"ASN.1"
],
"unique.s2.titleTop": "\u062E\u0627\u0644\u0635 \u06C1\u0645\u200C\u0633\u0637\u062D",
"unique.s2.titleBottom": "\u200FWebRTC",
"unique.s2.collapsed": "\u062E\u0627\u0644\u0635 \u06C1\u0645\u200C\u0633\u0637\u062D WebRTC",
"unique.s2.desc": "\u067E\u06CC\u063A\u0627\u0645 WebRTC \u06A9\u06D2 \u0630\u0631\u06CC\u0639\u06D2 \u0628\u0631\u0627\u06C1\u0650 \u0631\u0627\u0633\u062A \u0622\u0644\u0627\u062A \u06A9\u06D2 \u062F\u0631\u0645\u06CC\u0627\u0646 \u0633\u0641\u0631 \u06A9\u0631\u062A\u06D2 \u06C1\u06CC\u06BA\u06D4 \u06A9\u0648\u0626\u06CC \u0631\u06CC\u0644\u06D2 \u0622\u067E \u06A9\u0627 \u0688\u06CC\u0679\u0627 \u0646\u06C1\u06CC\u06BA \u0631\u06A9\u06BE\u062A\u0627 - \u0633\u0631\u0648\u0631 \u0635\u0631\u0641 \u062F\u0648 \u0641\u0631\u06CC\u0642\u0648\u06BA \u06A9\u0648 \u0627\u06CC\u06A9 \u062F\u0648\u0633\u0631\u06D2 \u062A\u06A9 \u067E\u06C1\u0646\u0686\u0646\u06D2 \u0645\u06CC\u06BA \u0645\u062F\u062F \u062F\u06CC\u062A\u0627 \u06C1\u06D2\u06D4",
"unique.s2.tags": [
"DTLS 1.3",
"\u0628\u063A\u06CC\u0631 \u0631\u06CC\u0644\u06D2"
],
"unique.s3.titleTop": "\u0645\u06A9\u0645\u0644 \u0641\u0627\u0631\u0648\u0631\u0688",
"unique.s3.titleBottom": "\u0633\u06CC\u06A9\u0631\u0633\u06CC",
"unique.s3.collapsed": "\u0641\u0627\u0631\u0648\u0631\u0688 \u0633\u06CC\u06A9\u0631\u0633\u06CC",
"unique.s3.desc": "\u0633\u06CC\u0634\u0646 \u06A9\u06CC \u06A9\u0644\u06CC\u062F\u06CC\u06BA \u0645\u0633\u0644\u0633\u0644 \u0628\u062F\u0644\u062A\u06CC \u06C1\u06CC\u06BA \u0627\u0648\u0631 \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06A9\u06D2 \u0628\u0639\u062F \u0636\u0627\u0626\u0639 \u06A9\u0631 \u062F\u06CC \u062C\u0627\u062A\u06CC \u06C1\u06CC\u06BA\u060C \u0627\u0633 \u0644\u06CC\u06D2 \u0627\u06CC\u06A9 \u0628\u06BE\u06CC \u0627\u0641\u0634\u0627 \u0634\u062F\u06C1 \u06A9\u0644\u06CC\u062F \u0645\u0627\u0636\u06CC \u06A9\u06CC \u06AF\u0641\u062A\u06AF\u0648 \u0646\u06C1\u06CC\u06BA \u06A9\u06BE\u0648\u0644 \u0633\u06A9\u062A\u06CC\u06D4",
"unique.s3.tags": [
"\u0639\u0627\u0631\u0636\u06CC \u06A9\u0644\u06CC\u062F\u06CC\u06BA",
"\u062E\u0648\u062F\u06A9\u0627\u0631 \u062A\u0628\u062F\u06CC\u0644\u06CC"
],
"unique.s4.titleTop": "\u0679\u0631\u06CC\u0641\u06A9 \u06A9\u06CC",
"unique.s4.titleBottom": "\u062F\u06BE\u0646\u062F\u0644\u0627\u06C1\u0679",
"unique.s4.collapsed": "\u0679\u0631\u06CC\u0641\u06A9 \u06A9\u06CC \u062F\u06BE\u0646\u062F\u0644\u0627\u06C1\u0679",
"unique.s4.desc": "\u067E\u06CC\u06A9\u0679 \u06A9\u06D2 \u062D\u062C\u0645 \u0627\u0648\u0631 \u0627\u0648\u0642\u0627\u062A \u0645\u06CC\u06BA \u0628\u06BE\u0631\u062A\u06CC \u0627\u0648\u0631 \u0628\u06D2 \u062A\u0631\u062A\u06CC\u0628\u06CC \u0688\u0627\u0644\u06CC \u062C\u0627\u062A\u06CC \u06C1\u06D2\u060C \u062C\u0633 \u0633\u06D2 \u062A\u0627\u0631 \u067E\u0631 \u0646\u0638\u0631 \u0631\u06A9\u06BE\u0646\u06D2 \u0648\u0627\u0644\u06D2 \u0633\u06D2 \u0645\u06CC\u0679\u0627 \u0688\u06CC\u0679\u0627 \u06A9\u06D2 \u0646\u0645\u0648\u0646\u06D2 \u0686\u06BE\u067E \u062C\u0627\u062A\u06D2 \u06C1\u06CC\u06BA\u06D4",
"unique.s4.tags": [
"\u067E\u06CC\u06A9\u0679 \u0628\u06BE\u0631\u062A\u06CC",
"\u0648\u0642\u062A\u06CC \u062C\u06BE\u0648\u0644"
],
"unique.s5.titleTop": "\u0635\u0641\u0631",
"unique.s5.titleBottom": "\u0688\u06CC\u0679\u0627 \u062C\u0645\u0639 \u06A9\u0631\u0646\u0627",
"unique.s5.collapsed": "\u0635\u0641\u0631 \u0688\u06CC\u0679\u0627 \u062C\u0645\u0639 \u06A9\u0631\u0646\u0627",
"unique.s5.desc": "\u0646\u06C1 \u0627\u06A9\u0627\u0624\u0646\u0679\u060C \u0646\u06C1 \u0646\u0648\u0634\u062A\u06C1\u060C \u0646\u06C1 \u067E\u06CC\u063A\u0627\u0645 \u06A9\u0627 \u0630\u062E\u06CC\u0631\u06C1\u06D4 \u0633\u0631\u0648\u0631 \u067E\u0631 \u0627\u06CC\u0633\u0627 \u06A9\u0686\u06BE \u0646\u06C1\u06CC\u06BA \u062C\u0648 \u0627\u0641\u0634\u0627 \u06C1\u0648\u060C \u0637\u0644\u0628 \u06A9\u06CC\u0627 \u062C\u0627\u0626\u06D2 \u06CC\u0627 \u0628\u06CC\u0686\u0627 \u062C\u0627\u0626\u06D2\u06D4",
"unique.s5.tags": [
"\u0628\u063A\u06CC\u0631 \u0627\u06A9\u0627\u0624\u0646\u0679",
"\u0628\u063A\u06CC\u0631 \u0646\u0648\u0634\u062A\u06C1"
],
"partners.eyebrow": "\u0634\u0631\u0627\u06A9\u062A \u062F\u0627\u0631 \u0627\u0648\u0631 \u0645\u0627\u062D\u0648\u0644",
"partners.heading": "\u06C1\u0645\u0627\u0631\u06D2 \u0634\u0631\u0627\u06A9\u062A \u062F\u0627\u0631\u0648\u06BA \u06A9\u0627 \u0627\u0639\u062A\u0645\u0627\u062F",
"partners.aegis.desc": "\u0633\u0631\u0645\u0627\u06CC\u06C1 \u06A9\u0627\u0631 \u0634\u0631\u0627\u06A9\u062A \u062F\u0627\u0631 \u062C\u0648 \u0627\u067E\u0646\u06D2 \u067E\u0648\u0631\u06D2 \u067E\u0648\u0631\u0679 \u0641\u0648\u0644\u06CC\u0648 \u0645\u06CC\u06BA \u062E\u0641\u06CC\u06C1 \u0645\u0627\u0644\u06CC \u0631\u0627\u0628\u0637\u06D2 \u0645\u062D\u0641\u0648\u0638 \u0628\u0646\u0627\u062A\u0627 \u06C1\u06D2\u06D4",
"partners.aegis.role": "\u062A\u0632\u0648\u06CC\u0631\u0627\u062A\u06CC \u0645\u0639\u0627\u0648\u0646",
"partners.furilabs.desc": "\u0646\u062C\u06CC\u062A \u06A9\u0648 \u0645\u0642\u062F\u0645 \u0631\u06A9\u06BE\u0646\u06D2 \u0648\u0627\u0644\u06D2 \u0644\u06CC\u0646\u06A9\u0633 \u0641\u0648\u0646 \u062C\u0648 SecureBit \u06A9\u0648 \u0637\u06D2 \u0634\u062F\u06C1 \u0645\u062D\u0641\u0648\u0638 \u0686\u06CC\u0646\u0644 \u06A9\u06D2 \u0637\u0648\u0631 \u067E\u0631 \u067E\u06CC\u0634 \u06A9\u0631\u062A\u06D2 \u06C1\u06CC\u06BA\u06D4",
"partners.furilabs.role": "\u062A\u06A9\u0646\u06CC\u06A9\u06CC \u0634\u0631\u0627\u06A9\u062A \u062F\u0627\u0631",
"partners.inviteTitle": "\u0634\u0631\u0627\u06A9\u062A \u062F\u0627\u0631 \u0628\u0646\u06CC\u06BA",
"partners.inviteDesc": "\u0646\u062C\u06CC\u062A \u06A9\u0627 \u06C1\u0627\u0631\u0688\u0648\u06CC\u0626\u0631 \u06CC\u0627 \u0688\u06BE\u0627\u0646\u0686\u06C1 \u0628\u0646\u0627 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA\u061F \u0622\u0626\u06CC\u06D2 SecureBit \u06A9\u0648 \u06CC\u06A9\u062C\u0627 \u06A9\u0631\u06CC\u06BA\u06D4",
"partners.inviteCta": "\u06AF\u0641\u062A\u06AF\u0648 \u0634\u0631\u0648\u0639 \u06A9\u0631\u06CC\u06BA",
"roadmap.eyebrow": "\u062A\u0631\u0642\u06CC \u06A9\u0627 \u0644\u0627\u0626\u062D\u06C1 \u0639\u0645\u0644",
"roadmap.heading": "\u200FSecureBit \u06A9\u0627 \u0627\u0631\u062A\u0642\u0627",
"roadmap.subheading": "\u067E\u06C1\u0644\u06D2 \u0646\u0645\u0648\u0646\u06D2 \u0633\u06D2 \u0644\u06D2 \u06A9\u0631 \u06A9\u0648\u0627\u0646\u0679\u0645 \u0645\u0632\u0627\u062D\u0645\u060C \u063A\u06CC\u0631 \u0645\u0631\u06A9\u0632\u06CC \u0646\u06CC\u0679 \u0648\u0631\u06A9 \u062A\u06A9 - \u06C1\u0631 \u067E\u0631\u062A \u067E\u0631 \u0645\u06A9\u0645\u0644 ASN.1 \u062A\u0648\u062B\u06CC\u0642 \u06A9\u06D2 \u0633\u0627\u062A\u06BE\u06D4",
"roadmap.progress": "{total} \u0645\u06CC\u06BA \u0633\u06D2 {shipped} \u0633\u0646\u06AF\u0650 \u0645\u06CC\u0644 \u0645\u06A9\u0645\u0644",
"roadmap.upcoming": "{upcoming} \u0631\u0627\u0633\u062A\u06D2 \u0645\u06CC\u06BA",
"roadmap.keyFeatures": "\u0646\u0645\u0627\u06CC\u0627\u06BA \u062E\u0635\u0648\u0635\u06CC\u0627\u062A",
"roadmap.status.released": "\u062C\u0627\u0631\u06CC \u06C1\u0648\u0627",
"roadmap.status.current": "\u0645\u0648\u062C\u0648\u062F\u06C1",
"roadmap.status.dev": "\u0632\u06CC\u0631\u0650 \u062A\u0639\u0645\u06CC\u0631",
"roadmap.status.planned": "\u0645\u0646\u0635\u0648\u0628\u06C1 \u0628\u0646\u062F",
"roadmap.status.research": "\u062A\u062D\u0642\u06CC\u0642",
"hero.headlineTop": "\u0627\u06CC\u06A9 \u0633\u06CC\u062F\u06BE\u06CC \u0644\u06A9\u06CC\u0631",
"hero.headlineBottom": "\u062C\u0633\u06D2 \u0635\u0631\u0641 \u0622\u067E \u062F\u0648\u0646\u0648\u06BA \u067E\u0691\u06BE \u0633\u06A9\u062A\u06D2 \u06C1\u06CC\u06BA\u06D4",
"hero.subheading": "\u06A9\u0644\u06CC\u062F\u06CC\u06BA \u0622\u067E \u06A9\u06D2 \u0622\u0644\u06D2 \u067E\u0631 \u0628\u0646\u062A\u06CC \u06C1\u06CC\u06BA \u0627\u0648\u0631 \u06C1\u0645\u200C\u0633\u0637\u062D \u062A\u0628\u0627\u062F\u0644\u06C1 \u06C1\u0648\u062A\u0627 \u06C1\u06D2\u06D4 \u0646\u06C1 \u0627\u06A9\u0627\u0624\u0646\u0679\u060C \u0646\u06C1 \u06A9\u0648\u0626\u06CC \u0633\u0631\u0648\u0631 \u062C\u0648 \u0622\u067E \u06A9\u06D2 \u067E\u06CC\u063A\u0627\u0645 \u0645\u062D\u0641\u0648\u0638 \u06A9\u0631\u06D2\u06D4",
"hero.diagramAlt": "\u0627\u06CC\u06A9 \u0641\u0631\u06CC\u0642 \u062A\u06A9 \u0628\u0631\u0627\u06C1\u0650 \u0631\u0627\u0633\u062A \u062E\u0641\u06CC\u06C1 \u0644\u06A9\u06CC\u0631\u060C \u062C\u0628\u06A9\u06C1 \u062F\u0648 \u0645\u0632\u06CC\u062F \u0641\u0631\u06CC\u0642 \u062C\u0627\u0644 \u0645\u06CC\u06BA \u0634\u0627\u0645\u0644 \u06C1\u0648 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA",
"intro.createTitle": "\u0646\u06CC\u0627 \u0686\u06CC\u0646\u0644 \u0628\u0646\u0627\u0626\u06CC\u06BA",
"intro.createDesc": "\u0622\u067E \u06A9\u0627 \u0622\u0644\u06C1 \u06A9\u0644\u06CC\u062F\u06CC\u06BA \u0627\u0648\u0631 \u0627\u06CC\u06A9 \u0628\u0627\u0631 \u06A9\u06CC \u062F\u0639\u0648\u062A \u0628\u0646\u0627\u062A\u0627 \u06C1\u06D2\u06D4 \u06A9\u0686\u06BE \u0628\u06BE\u06CC \u0633\u0631\u0648\u0631 \u06A9\u0648 \u0646\u06C1\u06CC\u06BA \u0686\u06BE\u0648\u062A\u0627\u06D4",
"intro.createCta": "\u06A9\u0644\u06CC\u062F\u06CC\u06BA \u0627\u0648\u0631 \u062F\u0639\u0648\u062A \u0628\u0646\u0627\u0626\u06CC\u06BA",
"intro.joinTitle": "\u0686\u06CC\u0646\u0644 \u0645\u06CC\u06BA \u0634\u0627\u0645\u0644 \u06C1\u0648\u06BA",
"intro.scanTitle": "\u06A9\u06CC\u0645\u0631\u06D2 \u0633\u06D2 QR \u067E\u0691\u06BE\u06CC\u06BA",
"intro.scanSubtitle": "\u0633\u0628 \u0633\u06D2 \u062A\u06CC\u0632 - \u0633\u0627\u062A\u06BE\u06CC \u06A9\u06CC \u0633\u06A9\u0631\u06CC\u0646 \u06A9\u06CC \u0637\u0631\u0641 \u06A9\u0631\u06CC\u06BA",
"intro.orPasteCode": "\u06CC\u0627 \u06A9\u0648\u0688 \u0686\u0633\u067E\u0627\u06BA \u06A9\u0631\u06CC\u06BA",
"intro.pastePlaceholder": "\u062F\u0639\u0648\u062A\u06CC \u06A9\u0648\u0688 \u06CC\u06C1\u0627\u06BA \u0686\u0633\u067E\u0627\u06BA \u06A9\u0631\u06CC\u06BA\u2026",
"intro.connect": "\u062C\u0648\u0691\u06CC\u06BA",
"intro.connecting": "\u06A9\u0627\u0631\u0631\u0648\u0627\u0626\u06CC \u062C\u0627\u0631\u06CC\u2026",
"roadmap.r1.title": "\u062A\u0631\u0642\u06CC \u06A9\u0627 \u0622\u063A\u0627\u0632",
"roadmap.r1.sub": "\u062E\u06CC\u0627\u0644\u060C \u0646\u0645\u0648\u0646\u06C1 \u0627\u0648\u0631 \u0688\u06BE\u0627\u0646\u0686\u06D2 \u06A9\u06CC \u062A\u06CC\u0627\u0631\u06CC",
"roadmap.r1.date": "\u200F2025 \u06A9\u0627 \u0622\u063A\u0627\u0632",
"roadmap.r1.features": [
"\u062A\u0635\u0648\u0631 \u0627\u0648\u0631 \u0636\u0631\u0648\u0631\u06CC\u0627\u062A \u06A9\u06CC \u062A\u0634\u06A9\u06CC\u0644",
"\u0627\u0646\u062A\u062E\u0627\u0628: WebRTC\u060C P2P\u060C \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC",
"\u067E\u06CC\u063A\u0627\u0645 \u0631\u0633\u0627\u0646\u06CC \u06A9\u06D2 \u067E\u06C1\u0644\u06D2 \u0646\u0645\u0648\u0646\u06D2",
"\u0645\u062E\u0632\u0646 \u06A9\u06CC \u062A\u062E\u0644\u06CC\u0642 \u0627\u0648\u0631 \u0645\u0633\u0644\u0633\u0644 \u0627\u0646\u0636\u0645\u0627\u0645",
"\u0628\u0646\u06CC\u0627\u062F\u06CC \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC \u06A9\u0627 \u0688\u06BE\u0627\u0646\u0686\u06C1",
"\u062A\u062C\u0631\u0628\u06C1 \u0627\u0648\u0631 \u062E\u0627\u06A9\u06C1 \u06A9\u06CC \u0688\u06CC\u0632\u0627\u0626\u0646"
],
"roadmap.r2.title": "\u0627\u0644\u0641\u0627 \u0627\u062C\u0631\u0627",
"roadmap.r2.sub": "\u067E\u06C1\u0644\u0627 \u0639\u0648\u0627\u0645\u06CC \u0627\u0644\u0641\u0627: \u0628\u0646\u06CC\u0627\u062F\u06CC \u06AF\u0641\u062A\u06AF\u0648 \u0627\u0648\u0631 \u06A9\u0644\u06CC\u062F \u062A\u0628\u0627\u062F\u0644\u06C1",
"roadmap.r2.date": "\u0628\u06C1\u0627\u0631 2025",
"roadmap.r2.features": [
"\u200FWebRTC \u067E\u0631 \u0628\u0646\u06CC\u0627\u062F\u06CC \u06C1\u0645\u200C\u0633\u0637\u062D \u067E\u06CC\u063A\u0627\u0645 \u0631\u0633\u0627\u0646\u06CC",
"\u0633\u0627\u062F\u06C1 \u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC (\u0646\u0645\u0627\u0626\u0634\u06CC \u062E\u0627\u06A9\u06C1)",
"\u0645\u0633\u062A\u062D\u06A9\u0645 \u0627\u0634\u0627\u0631\u06C1 \u0631\u0633\u0627\u0646\u06CC \u0627\u0648\u0631 \u062F\u0648\u0628\u0627\u0631\u06C1 \u0627\u062A\u0635\u0627\u0644",
"\u062C\u0627\u0646\u0686 \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0645 \u0633\u06D2 \u06A9\u0645 \u062E\u0627\u06A9\u06C1",
"\u0627\u0628\u062A\u062F\u0627\u0626\u06CC \u062C\u0627\u0646\u0686 \u06A9\u0627\u0631\u0648\u06BA \u0633\u06D2 \u0631\u0627\u0626\u06D2 \u062C\u0645\u0639 \u06A9\u0631\u0646\u0627"
],
"roadmap.r3.title": "\u0633\u0644\u0627\u0645\u062A\u06CC \u06A9\u06CC \u0645\u0636\u0628\u0648\u0637\u06CC",
"roadmap.r3.sub": "\u0633\u0644\u0627\u0645\u062A\u06CC \u06A9\u06CC \u062A\u0642\u0648\u06CC\u062A \u0627\u0648\u0631 \u0645\u0633\u062A\u062D\u06A9\u0645 \u0634\u0627\u062E \u06A9\u0627 \u0627\u062C\u0631\u0627",
"roadmap.r3.date": "\u06AF\u0631\u0645\u0627 2025",
"roadmap.r3.features": [
"\u200FECDH/ECDSA \u06A9\u0627 \u0639\u0645\u0644\u06CC \u0646\u0641\u0627\u0630",
"\u0645\u06A9\u0645\u0644 \u0641\u0627\u0631\u0648\u0631\u0688 \u0633\u06CC\u06A9\u0631\u0633\u06CC \u0627\u0648\u0631 \u06A9\u0644\u06CC\u062F \u06A9\u06CC \u062A\u0628\u062F\u06CC\u0644\u06CC",
"\u062A\u0648\u062B\u06CC\u0642\u06CC \u062C\u0627\u0646\u0686 \u0645\u06CC\u06BA \u0628\u06C1\u062A\u0631\u06CC",
"\u0641\u0627\u0626\u0644 \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC \u0627\u0648\u0631 \u0628\u0691\u06D2 \u0688\u06CC\u0679\u0627 \u06A9\u06CC \u0645\u0646\u062A\u0642\u0644\u06CC",
"\u0628\u0646\u06CC\u0627\u062F\u06CC \u062E\u0641\u06CC\u06C1 \u0639\u0645\u0644 \u06A9\u0627 \u062C\u0627\u0626\u0632\u06C1"
],
"roadmap.r4.title": "\u0648\u0633\u0639\u062A \u0627\u0648\u0631 \u0627\u0633\u062A\u062D\u06A9\u0627\u0645",
"roadmap.r4.sub": "\u0646\u06CC\u0679 \u0648\u0631\u06A9 \u06A9\u06CC \u0648\u0633\u0639\u062A \u0627\u0648\u0631 \u0627\u0633\u062A\u062D\u06A9\u0627\u0645 \u0645\u06CC\u06BA \u0628\u06C1\u062A\u0631\u06CC",
"roadmap.r4.date": "\u062E\u0632\u0627\u06BA 2025",
"roadmap.r4.features": [
"\u200FP2P \u0627\u062A\u0635\u0627\u0644 \u0627\u0648\u0631 NAT \u06AF\u0632\u0631 \u06A9\u06CC \u0628\u06C1\u062A\u0631\u06CC",
"\u062F\u0648\u0628\u0627\u0631\u06C1 \u0627\u062A\u0635\u0627\u0644 \u06A9\u06D2 \u0637\u0631\u06CC\u0642\u06D2 \u0627\u0648\u0631 \u067E\u06CC\u063A\u0627\u0645 \u0642\u0637\u0627\u0631\u06CC\u06BA",
"\u0645\u0648\u0628\u0627\u0626\u0644 \u067E\u0631 \u0628\u06CC\u0679\u0631\u06CC \u06A9\u06CC \u06A9\u0645 \u06A9\u06BE\u067E\u062A",
"\u06A9\u0626\u06CC \u0622\u0644\u0627\u062A \u06A9\u06D2 \u062F\u0631\u0645\u06CC\u0627\u0646 \u06C1\u0645 \u0622\u06C1\u0646\u06AF\u06CC",
"\u0688\u0648\u06CC\u0644\u067E\u0631\u0632 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0646\u06AF\u0631\u0627\u0646\u06CC \u0627\u0648\u0631 \u0646\u0648\u0634\u062A\u06C1 \u0627\u0648\u0632\u0627\u0631"
],
"roadmap.r5.title": "\u0646\u062C\u06CC\u062A \u0633\u0628 \u0633\u06D2 \u067E\u06C1\u0644\u06D2",
"roadmap.r5.sub": "\u0646\u062C\u06CC\u062A \u067E\u0631 \u062A\u0648\u062C\u06C1: \u0645\u06CC\u0679\u0627 \u0688\u06CC\u0679\u0627 \u06A9\u0645 \u0633\u06D2 \u06A9\u0645",
"roadmap.r5.date": "\u0633\u0631\u0645\u0627 2025",
"roadmap.r5.features": [
"\u0645\u06CC\u0679\u0627 \u0688\u06CC\u0679\u0627 \u06A9\u0627 \u062A\u062D\u0641\u0638 \u0627\u0648\u0631 \u0634\u0646\u0627\u062E\u062A \u0645\u06CC\u06BA \u06A9\u0645\u06CC",
"\u067E\u06CC\u0627\u0632\u06CC \u0631\u0627\u0633\u062A\u06C1 \u0628\u0646\u062F\u06CC \u0627\u0648\u0631 DHT \u06A9\u06D2 \u062A\u062C\u0631\u0628\u0627\u062A",
"\u06AF\u0645\u0646\u0627\u0645 \u0627\u062A\u0635\u0627\u0644 \u06A9\u06D2 \u0627\u062E\u062A\u06CC\u0627\u0631\u0627\u062A",
"\u06A9\u06BE\u0644\u06D2 \u06A9\u0648\u0688 \u062C\u0627\u0626\u0632\u06D2 \u06A9\u06CC \u062A\u06CC\u0627\u0631\u06CC",
"\u0635\u0627\u0631\u0641 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u06D2 \u0639\u0645\u0644 \u0645\u06CC\u06BA \u0628\u06C1\u062A\u0631\u06CC"
],
"roadmap.r6.title": "\u0628\u0691\u06BE\u06CC \u06C1\u0648\u0626\u06CC \u0633\u0644\u0627\u0645\u062A\u06CC \u06A9\u0627 \u0627\u06CC\u0688\u06CC\u0634\u0646",
"roadmap.r6.sub": "\u0645\u06A9\u0645\u0644 ASN.1 \u062A\u0648\u062B\u06CC\u0642 \u06A9\u06D2 \u0633\u0627\u062A\u06BE 18 \u067E\u0631\u062A\u0648\u06BA \u06A9\u06CC \u0641\u0648\u062C\u06CC \u062F\u0631\u062C\u06D2 \u06A9\u06CC \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC",
"roadmap.r6.date": "\u200F2025 \u06A9\u06D2 \u0627\u0648\u0627\u062E\u0631",
"roadmap.r6.features": [
"\u200FECDH + DTLS + SAS \u062A\u06C1\u0631\u06CC \u0633\u0644\u0627\u0645\u062A\u06CC",
"\u200FECDH P-384 \u0645\u0639 AES-GCM 256 \u0628\u0679 \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC",
"\u200FDTLS \u0646\u0642\u0634\u0650 \u0627\u0646\u06AF\u0634\u062A \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642",
"\u200FSAS (\u0645\u062E\u062A\u0635\u0631 \u062A\u0648\u062B\u06CC\u0642\u06CC \u0633\u0644\u0633\u0644\u06C1) \u062A\u0635\u062F\u06CC\u0642",
"\u06A9\u0644\u06CC\u062F \u062A\u0628\u062F\u06CC\u0644\u06CC \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u0645\u06A9\u0645\u0644 \u0641\u0627\u0631\u0648\u0631\u0688 \u0633\u06CC\u06A9\u0631\u0633\u06CC",
"\u062F\u0631\u0645\u06CC\u0627\u0646\u06CC \u062D\u0645\u0644\u06D2 \u0633\u06D2 \u0628\u06C1\u062A\u0631 \u062A\u062D\u0641\u0638",
"\u0645\u06A9\u0645\u0644 ASN.1 DER \u062A\u0648\u062B\u06CC\u0642",
"\u200FOID \u0627\u0648\u0631 EC \u0646\u0642\u0627\u0637 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642",
"\u200FSPKI \u0633\u0627\u062E\u062A \u06A9\u06CC \u062A\u0648\u062B\u06CC\u0642",
"\u06C1\u0645\u200C\u0633\u0637\u062D WebRTC \u0688\u06BE\u0627\u0646\u0686\u06C1",
"\u0645\u06CC\u0679\u0627 \u0688\u06CC\u0679\u0627 \u06A9\u0627 \u062A\u062D\u0641\u0638",
"\u200F100% \u06A9\u06BE\u0644\u0627 \u0645\u0627\u062E\u0630 \u06A9\u0648\u0688"
],
"roadmap.r7.title": "\u0688\u06CC\u0633\u06A9 \u0679\u0627\u067E \u0627\u06CC\u0688\u06CC\u0634\u0646",
"roadmap.r7.sub": "\u0648\u0646\u0688\u0648\u0632\u060C \u0645\u06CC\u06A9 \u0627\u0648 \u0627\u06CC\u0633 \u0627\u0648\u0631 \u0644\u06CC\u0646\u06A9\u0633 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0645\u0642\u0627\u0645\u06CC \u0627\u06CC\u067E\u0644\u06CC \u06A9\u06CC\u0634\u0646\u0632",
"roadmap.r7.date": "\u200F2026 \u06A9\u0627 \u0622\u063A\u0627\u0632",
"roadmap.r7.features": [
"\u0648\u0646\u0688\u0648\u0632 \u0627\u06CC\u067E (Tauri v2)",
"\u200FmacOS \u0627\u06CC\u067E (Tauri v2)",
"\u0644\u06CC\u0646\u06A9\u0633 AppImage \u0645\u0639\u0627\u0648\u0646\u062A (Tauri v2)",
"\u0641\u0648\u0631\u06CC \u0627\u0637\u0644\u0627\u0639\u0627\u062A",
"\u062E\u0648\u062F\u06A9\u0627\u0631 \u062F\u0648\u0628\u0627\u0631\u06C1 \u0627\u062A\u0635\u0627\u0644",
"\u0622\u0644\u0627\u062A \u06A9\u06D2 \u062F\u0631\u0645\u06CC\u0627\u0646 \u06C1\u0645 \u0622\u06C1\u0646\u06AF\u06CC",
"\u0628\u06C1\u062A\u0631 \u062A\u062C\u0631\u0628\u06C1 \u0627\u0648\u0631 \u062E\u0627\u06A9\u06C1",
"\u200F100MB \u062A\u06A9 \u0641\u0627\u0626\u0644\u0648\u06BA \u06A9\u06CC \u0645\u0639\u0627\u0648\u0646\u062A"
],
"roadmap.r8.title": "\u0645\u062D\u0641\u0648\u0638 \u0622\u0648\u0627\u0632 \u0627\u0648\u0631 \u06A9\u0627\u0644\u06CC\u06BA",
"roadmap.r8.sub": "\u062E\u0641\u06CC\u06C1 \u0635\u0648\u062A\u06CC \u067E\u06CC\u063A\u0627\u0645\u060C \u0622\u0688\u06CC\u0648 \u06A9\u0627\u0644 \u0627\u0648\u0631 \u0648\u06CC\u0688\u06CC\u0648 \u06A9\u0627\u0644",
"roadmap.r8.date": "\u200F2026 \u06A9\u0627 \u0622\u063A\u0627\u0632",
"roadmap.r8.features": [
"\u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u062E\u0641\u06CC\u06C1 \u0635\u0648\u062A\u06CC \u067E\u06CC\u063A\u0627\u0645",
"\u200F1:1 \u062E\u0641\u06CC\u06C1 \u0622\u0688\u06CC\u0648 \u06A9\u0627\u0644 (WebRTC)",
"\u200F1:1 \u062E\u0641\u06CC\u06C1 \u0648\u06CC\u0688\u06CC\u0648 \u06A9\u0627\u0644 (WebRTC)",
"\u0628\u0631\u0627\u06C1\u0650 \u0631\u0627\u0633\u062A \u0645\u06CC\u0688\u06CC\u0627 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0645\u06A9\u0645\u0644 \u0641\u0627\u0631\u0648\u0631\u0688 \u0633\u06CC\u06A9\u0631\u0633\u06CC",
"\u200FSRTP/DTLS \u0633\u06D2 \u0645\u062D\u0641\u0648\u0638 \u0645\u06CC\u0688\u06CC\u0627 \u0628\u06C1\u0627\u0624",
"\u06A9\u0627\u0644 \u06A9\u06D2 \u062F\u0648\u0631\u0627\u0646 SAS \u062A\u0635\u062F\u06CC\u0642",
"\u06A9\u0627\u0644 \u0627\u0637\u0644\u0627\u0639\u0627\u062A \u0627\u0648\u0631 \u062E\u0648\u062F\u06A9\u0627\u0631 \u062F\u0648\u0628\u0627\u0631\u06C1 \u0627\u062A\u0635\u0627\u0644",
"\u06A9\u0645 \u062A\u0627\u062E\u06CC\u0631 \u0648\u0627\u0644\u0627 \u06C1\u0645\u200C\u0633\u0637\u062D \u0645\u06CC\u0688\u06CC\u0627"
],
"roadmap.r9.title": "\u06AF\u0631\u0648\u06C1\u06CC \u0631\u0627\u0628\u0637\u06C1",
"roadmap.r9.sub": "\u0646\u062C\u06CC\u062A \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06A9\u06BE\u062A\u06D2 \u06C1\u0648\u0626\u06D2 \u06AF\u0631\u0648\u06C1\u06CC \u06AF\u0641\u062A\u06AF\u0648",
"roadmap.r9.date": "\u0627\u0628\u06BE\u06CC",
"roadmap.r9.features": [
"\u200F8 \u0634\u0631\u06A9\u0627\u0621 \u062A\u06A9 \u06C1\u0645\u200C\u0633\u0637\u062D \u06AF\u0631\u0648\u06C1\u06CC \u06AF\u0641\u062A\u06AF\u0648",
"\u062F\u0633\u062A\u062E\u0637 \u0634\u062F\u06C1 \u0631\u06CC\u0644\u06D2 \u0645\u062A\u0628\u0627\u062F\u0644 \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u062C\u0627\u0644 \u062A\u0631\u0633\u06CC\u0644",
"\u0627\u06CC\u06A9 \u06AF\u0631\u0648\u06C1\u06CC \u062D\u0641\u0627\u0638\u062A\u06CC \u06A9\u0648\u0688\u060C \u062C\u0633\u06D2 \u0633\u0628 \u0645\u0648\u0627\u0632\u0646\u06C1 \u06A9\u0631\u062A\u06D2 \u06C1\u06CC\u06BA",
"\u06A9\u0648\u0688 \u06A9\u06D2 \u0627\u0646\u062F\u0627\u0632\u06D2 \u06A9\u06D2 \u062E\u0644\u0627\u0641 \u0639\u06C1\u062F\u200C\u067E\u06BE\u0631\u200C\u0627\u0641\u0634\u0627 \u06A9\u06CC \u0631\u0633\u0645",
"\u06C1\u0631 \u06AF\u0631\u0648\u06C1 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0644\u06AF \u0634\u0646\u0627\u062E\u062A\u06CC \u06A9\u0644\u06CC\u062F\u06CC\u06BA\u060C \u0628\u0646\u06CC\u0627\u062F\u06CC \u0637\u0648\u0631 \u067E\u0631 \u0639\u0627\u0631\u0636\u06CC",
"\u062F\u0648\u0631 \u06A9\u06CC \u062A\u0631\u062A\u06CC\u0628 \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u062F\u0633\u062A\u062E\u0637 \u0634\u062F\u06C1 \u0631\u06A9\u0646\u06CC\u062A",
"\u062F\u0633\u062A\u062E\u0637 \u0634\u062F\u06C1 \u067E\u06CC\u063A\u0627\u0645\u060C \u062A\u0627\u06A9\u06C1 \u0645\u0646\u0642\u0633\u0645 \u0645\u062A\u0646 \u062B\u0627\u0628\u062A \u06A9\u06CC\u0627 \u062C\u0627 \u0633\u06A9\u06D2",
"\u0646\u06C1 \u0633\u0631\u0648\u0631\u060C \u0646\u06C1 \u0645\u0634\u062A\u0631\u06A9\u06C1 \u06AF\u0631\u0648\u06C1\u06CC \u06A9\u0644\u06CC\u062F\u060C \u0646\u06C1 \u062A\u0627\u0631\u06CC\u062E"
],
"roadmap.r10.title": "\u0645\u0648\u0628\u0627\u0626\u0644 \u0627\u06CC\u0688\u06CC\u0634\u0646",
"roadmap.r10.sub": "\u200FiOS \u0627\u0648\u0631 \u0627\u06CC\u0646\u0688\u0631\u0627\u0626\u06CC\u0688 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0645\u0642\u0627\u0645\u06CC \u0627\u06CC\u067E\u0644\u06CC \u06A9\u06CC\u0634\u0646\u0632",
"roadmap.r10.date": "\u062F\u0648\u0633\u0631\u06CC \u0633\u06C1 \u0645\u0627\u06C1\u06CC 2027",
"roadmap.r10.features": [
"\u200FiOS \u0645\u0642\u0627\u0645\u06CC \u0627\u06CC\u067E (Swift/SwiftUI)",
"\u0627\u06CC\u0646\u0688\u0631\u0627\u0626\u06CC\u0688 \u0645\u0642\u0627\u0645\u06CC \u0627\u06CC\u067E (Kotlin/Jetpack Compose)",
"\u0645\u0648\u0628\u0627\u0626\u0644 \u0628\u0631\u0627\u0624\u0632\u0631\u0632 \u06A9\u06D2 \u0644\u06CC\u06D2 PWA \u0645\u0639\u0627\u0648\u0646\u062A",
"\u0641\u0648\u0631\u06CC \u067E\u0634 \u0627\u0637\u0644\u0627\u0639\u0627\u062A",
"\u0628\u06CC\u0679\u0631\u06CC \u06A9\u06CC \u0628\u06C1\u062A\u0631\u06CC",
"\u0645\u0648\u0628\u0627\u0626\u0644 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0628\u06C1\u062A\u0631 \u062E\u0627\u06A9\u06C1",
"\u0622\u0641 \u0644\u0627\u0626\u0646 \u067E\u06CC\u063A\u0627\u0645 \u0642\u0637\u0627\u0631",
"\u062D\u06CC\u0627\u062A\u06CC\u0627\u062A\u06CC \u062A\u0648\u062B\u06CC\u0642"
],
"roadmap.r11.title": "\u06A9\u0648\u0627\u0646\u0679\u0645 \u0645\u0632\u0627\u062D\u0645 \u0627\u06CC\u0688\u06CC\u0634\u0646",
"roadmap.r11.sub": "\u06A9\u0648\u0627\u0646\u0679\u0645 \u06A9\u0645\u067E\u06CC\u0648\u0679\u0631\u0632 \u0633\u06D2 \u062A\u062D\u0641\u0638",
"roadmap.r11.date": "\u0686\u0648\u062A\u06BE\u06CC \u0633\u06C1 \u0645\u0627\u06C1\u06CC 2027",
"roadmap.r11.features": [
"\u0645\u0627\u0628\u0639\u062F \u06A9\u0648\u0627\u0646\u0679\u0645 \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC CRYSTALS-Kyber",
"\u200FSPHINCS+ \u0688\u06CC\u062C\u06CC\u0679\u0644 \u062F\u0633\u062A\u062E\u0637",
"\u0645\u062E\u0644\u0648\u0637 \u062E\u0627\u06A9\u06C1: \u06A9\u0644\u0627\u0633\u06CC\u06A9\u06CC + \u0645\u0627\u0628\u0639\u062F \u06A9\u0648\u0627\u0646\u0679\u0645",
"\u06A9\u0648\u0627\u0646\u0679\u0645 \u0645\u062D\u0641\u0648\u0638 \u06A9\u0644\u06CC\u062F \u062A\u0628\u0627\u062F\u0644\u06C1",
"\u062A\u0627\u0632\u06C1 \u06A9\u0631\u062F\u06C1 \u06C1\u06CC\u0634\u0646\u06AF \u0627\u0644\u06AF\u0648\u0631\u062A\u06BE\u0645",
"\u0645\u0648\u062C\u0648\u062F\u06C1 \u0633\u06CC\u0634\u0646\u0632 \u06A9\u06CC \u0645\u0646\u062A\u0642\u0644\u06CC",
"\u200Fv5.x \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u0645\u0637\u0627\u0628\u0642\u062A",
"\u06A9\u0648\u0627\u0646\u0679\u0645 \u0645\u0632\u0627\u062D\u0645 \u067E\u0631\u0648\u0679\u0648\u06A9\u0648\u0644"
],
"roadmap.r12.title": "\u063A\u06CC\u0631 \u0645\u0631\u06A9\u0632\u06CC \u0646\u06CC\u0679 \u0648\u0631\u06A9",
"roadmap.r12.sub": "\u0645\u06A9\u0645\u0644 \u063A\u06CC\u0631 \u0645\u0631\u06A9\u0632\u06CC \u0646\u06CC\u0679 \u0648\u0631\u06A9",
"roadmap.r12.date": "2028",
"roadmap.r12.features": [
"\u0646\u0648\u0688 \u062C\u0627\u0644 \u0646\u06CC\u0679 \u0648\u0631\u06A9",
"\u0633\u0627\u062A\u06BE\u06CC \u062A\u0644\u0627\u0634 \u06A9\u06D2 \u0644\u06CC\u06D2 DHT",
"\u0627\u0646\u062F\u0631\u0648\u0646\u06CC \u067E\u06CC\u0627\u0632\u06CC \u0631\u0627\u0633\u062A\u06C1 \u0628\u0646\u062F\u06CC",
"\u0679\u0648\u06A9\u0646 \u0645\u0639\u06CC\u0634\u062A \u0627\u0648\u0631 \u0646\u0648\u0688 \u062A\u0631\u063A\u06CC\u0628\u0627\u062A",
"\u200FDAO \u06A9\u06D2 \u0630\u0631\u06CC\u0639\u06D2 \u0646\u0638\u0645",
"\u062F\u0648\u0633\u0631\u06D2 \u0646\u06CC\u0679 \u0648\u0631\u06A9\u0633 \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u06C1\u0645 \u0622\u06C1\u0646\u06AF\u06CC",
"\u06A9\u062B\u06CC\u0631 \u067E\u0644\u06CC\u0679 \u0641\u0627\u0631\u0645 \u0645\u0637\u0627\u0628\u0642\u062A",
"\u062E\u0648\u062F \u0645\u0631\u0645\u062A \u06A9\u0631\u0646\u06D2 \u0648\u0627\u0644\u0627 \u0646\u06CC\u0679 \u0648\u0631\u06A9"
],
"roadmap.r13.title": "\u200FAI \u0646\u062C\u06CC\u062A \u0645\u0639\u0627\u0648\u0646",
"roadmap.r13.sub": "\u0646\u062C\u06CC\u062A \u0627\u0648\u0631 \u0633\u0644\u0627\u0645\u062A\u06CC \u06A9\u06D2 \u0644\u06CC\u06D2 \u0645\u0635\u0646\u0648\u0639\u06CC \u0630\u06C1\u0627\u0646\u062A",
"roadmap.r13.date": "\u200F2028 \u0627\u0648\u0631 \u0627\u0633 \u06A9\u06D2 \u0628\u0639\u062F",
"roadmap.r13.features": [
"\u0645\u0642\u0627\u0645\u06CC AI \u062E\u0637\u0631\u06D2 \u06A9\u0627 \u062A\u062C\u0632\u06CC\u06C1",
"\u062F\u0631\u0645\u06CC\u0627\u0646\u06CC \u062D\u0645\u0644\u06D2 \u06A9\u06CC \u062E\u0648\u062F\u06A9\u0627\u0631 \u0634\u0646\u0627\u062E\u062A",
"\u0645\u0648\u0627\u0641\u0642\u062A \u067E\u0630\u06CC\u0631 \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC",
"\u0630\u0627\u062A\u06CC \u0646\u0648\u0639\u06CC\u062A \u06A9\u06CC \u062D\u0641\u0627\u0638\u062A\u06CC \u062A\u062C\u0627\u0648\u06CC\u0632",
"\u0635\u0641\u0631 \u0639\u0644\u0645 \u0645\u0634\u06CC\u0646 \u0644\u0631\u0646\u0646\u06AF",
"\u0646\u062C\u06CC AI \u0645\u0639\u0627\u0648\u0646",
"\u067E\u06CC\u0634 \u06AF\u0648\u0626\u06CC \u06A9\u0631\u0646\u06D2 \u0648\u0627\u0644\u06CC \u0633\u0644\u0627\u0645\u062A\u06CC",
"\u062D\u0645\u0644\u0648\u06BA \u0633\u06D2 \u062E\u0648\u062F\u0645\u062E\u062A\u0627\u0631 \u062A\u062D\u0641\u0638"
],
"handshake.step1": "\u200FECDH P-384 \u06A9\u0644\u06CC\u062F \u062C\u0648\u0691\u0627 \u0628\u0646\u0627\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2",
"handshake.step2": "\u062A\u0635\u062F\u06CC\u0642\u06CC \u06A9\u0648\u0688 \u0627\u062E\u0630 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2",
"handshake.step3": "\u0645\u06A9\u0645\u0644 \u0641\u0627\u0631\u0648\u0631\u0688 \u0633\u06CC\u06A9\u0631\u0633\u06CC \u0637\u06D2 \u06A9\u06CC \u062C\u0627 \u0631\u06C1\u06CC \u06C1\u06D2",
"handshake.securingTitle": "\u0622\u067E \u06A9\u0627 \u0686\u06CC\u0646\u0644 \u0645\u062D\u0641\u0648\u0638 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2",
"handshake.answerTitle": "\u0622\u067E \u06A9\u0627 \u062C\u0648\u0627\u0628 \u062A\u06CC\u0627\u0631 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2",
"handshake.securingDesc": "\u0627\u06CC\u0633\u06CC \u06A9\u0644\u06CC\u062F\u06CC\u06BA \u0688\u06BE\u0627\u0644\u06CC \u062C\u0627 \u0631\u06C1\u06CC \u06C1\u06CC\u06BA \u062C\u0648 \u0686\u06BE\u06CC\u0691 \u0686\u06BE\u0627\u0691 \u0628\u0631\u062F\u0627\u0634\u062A \u06A9\u0631 \u0633\u06A9\u06CC\u06BA\u06D4",
"handshake.shareTitle": "\u0627\u067E\u0646\u06CC \u062F\u0639\u0648\u062A \u0628\u0627\u0646\u0679\u06CC\u06BA",
"handshake.sendAnswerTitle": "\u0627\u067E\u0646\u0627 \u062C\u0648\u0627\u0628 \u0648\u0627\u067E\u0633 \u0628\u06BE\u06CC\u062C\u06CC\u06BA",
"handshake.shareDesc": "\u200FQR \u062F\u06A9\u06BE\u0627\u0626\u06CC\u06BA \u06CC\u0627 \u06A9\u0648\u0688 \u0627\u067E\u0646\u06D2 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u0648 \u0628\u06BE\u06CC\u062C\u06CC\u06BA\u06D4 \u06CC\u06C1 \u0627\u06CC\u06A9 \u0628\u0627\u0631 \u06A9\u0627 \u06C1\u06D2 \u0627\u0648\u0631 \u062C\u0644\u062F \u062E\u062A\u0645 \u06C1\u0648 \u062C\u0627\u062A\u0627 \u06C1\u06D2\u06D4",
"handshake.sendAnswerDesc": "\u06CC\u06C1 \u062C\u0648\u0627\u0628 \u0686\u06CC\u0646\u0644 \u0628\u0646\u0627\u0646\u06D2 \u0648\u0627\u0644\u06D2 \u06A9\u0648 \u062F\u06CC\u06BA \u062A\u0627\u06A9\u06C1 \u0648\u06C1 \u0645\u0635\u0627\u0641\u062D\u06C1 \u0645\u06A9\u0645\u0644 \u06A9\u0631 \u0633\u06A9\u06D2\u06D4",
"handshake.establish": "\u0627\u062A\u0635\u0627\u0644 \u0642\u0627\u0626\u0645 \u06A9\u0631\u06CC\u06BA",
"handshake.thenReceive": "\u067E\u06BE\u0631 \u0648\u06C1 \u062C\u0648\u0627\u0628 \u0648\u0635\u0648\u0644 \u06A9\u0631\u06CC\u06BA \u062C\u0648 \u0622\u067E \u06A9\u0627 \u0633\u0627\u062A\u06BE\u06CC \u0648\u0627\u067E\u0633 \u0628\u06BE\u06CC\u062C\u062A\u0627 \u06C1\u06D2",
"handshake.pasteAnswerPlaceholder": "\u0633\u0627\u062A\u06BE\u06CC \u06A9\u0627 \u062C\u0648\u0627\u0628\u06CC \u06A9\u0648\u0688 \u0686\u0633\u067E\u0627\u06BA \u06A9\u0631\u06CC\u06BA\u2026",
"handshake.answerSentNote": "\u06CC\u06C1 \u062C\u0648\u0627\u0628 \u0628\u0646\u0627\u0646\u06D2 \u0648\u0627\u0644\u06D2 \u06A9\u0648 \u0628\u06BE\u06CC\u062C\u06CC\u06BA\u060C \u067E\u06BE\u0631 \u0627\u0646\u062A\u0638\u0627\u0631 \u06A9\u0631\u06CC\u06BA - \u0627\u0646 \u06A9\u06D2 \u062C\u0691\u062A\u06D2 \u06C1\u06CC \u06AF\u0641\u062A\u06AF\u0648 \u06A9\u06BE\u0644 \u062C\u0627\u0626\u06D2 \u06AF\u06CC\u06D4",
"handshake.qrHint": "\u06CC\u06C1 \u0627\u0633 \u0648\u0642\u062A \u062A\u06A9 \u06A9\u06BE\u0644\u0627 \u0631\u06A9\u06BE\u06CC\u06BA \u062C\u0628 \u062A\u06A9 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u0648\u0688 \u0646\u06C1 \u067E\u06A9\u0691 \u0644\u06D2\u06D4",
"handshake.qrHintFrames": "\u0645\u0635\u0627\u0641\u062D\u06C1 {frames} \u0641\u0631\u06CC\u0645\u0648\u06BA \u0645\u06CC\u06BA \u0628\u0679\u0627 \u06C1\u06D2 - \u06CC\u06C1 \u0627\u0633 \u0648\u0642\u062A \u062A\u06A9 \u06A9\u06BE\u0644\u0627 \u0631\u06A9\u06BE\u06CC\u06BA \u062C\u0628 \u062A\u06A9 \u0633\u0627\u062A\u06BE\u06CC \u0633\u0628 \u0646\u06C1 \u067E\u06A9\u0691 \u0644\u06D2\u06D4",
"verify.title": "\u062D\u0641\u0627\u0638\u062A\u06CC \u062A\u0635\u062F\u06CC\u0642",
"verify.desc": "\u06CC\u06C1 \u062D\u0641\u0627\u0638\u062A\u06CC \u06A9\u0648\u0688 \u06A9\u0633\u06CC \u0627\u0644\u06AF \u0630\u0631\u06CC\u0639\u06D2 (\u0622\u0648\u0627\u0632 / \u0628\u0627\u0644\u0645\u0634\u0627\u0641\u06C1) \u0633\u06D2 \u0627\u067E\u0646\u06D2 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u0645\u0644\u0627\u0626\u06CC\u06BA\u060C \u067E\u06BE\u0631 \u06AF\u0641\u062A\u06AF\u0648 \u06A9\u06BE\u0648\u0644\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0644\u06A9\u06BE\u06CC\u06BA\u06D4",
"verify.enterLabel": "\u062A\u0635\u062F\u06CC\u0642 \u0634\u062F\u06C1 \u06A9\u0648\u0688 \u062F\u0631\u062C \u06A9\u0631\u06CC\u06BA",
"verify.placeholder": "\u06A9\u0648\u0688 \u06CC\u06C1\u0627\u06BA \u0644\u06A9\u06BE\u06CC\u06BA",
"verify.confirm": "\u06A9\u0648\u0688 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642",
"verify.confirmed": "\u062A\u0635\u062F\u06CC\u0642 \u06C1\u0648 \u06AF\u0626\u06CC",
"verify.mismatch": "\u0645\u0637\u0627\u0628\u0642\u062A \u0646\u06C1\u06CC\u06BA",
"verify.yours": "\u0622\u067E \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642",
"verify.peer": "\u0633\u0627\u062A\u06BE\u06CC \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642",
"verify.pending": "\u0632\u06CC\u0631\u0650 \u0627\u0644\u062A\u0648\u0627",
"verify.waiting": "\u06A9\u0648\u0688 \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631\u2026",
"verify.verified": "\u0686\u06CC\u0646\u0644 \u062A\u0635\u062F\u06CC\u0642 \u0634\u062F\u06C1",
"verify.bothConfirmed": "\u062F\u0648\u0646\u0648\u06BA \u0641\u0631\u06CC\u0642\u0648\u06BA \u0646\u06D2 \u062A\u0635\u062F\u06CC\u0642 \u06A9\u06CC\u06D4 \u0645\u062D\u0641\u0648\u0638 \u06AF\u0641\u062A\u06AF\u0648 \u06A9\u06BE\u0648\u0644\u06CC \u062C\u0627 \u0631\u06C1\u06CC \u06C1\u06D2\u2026",
"pwa.bannerTitle": "\u200FSecureBit.chat \u0646\u0635\u0628 \u06A9\u0631\u06CC\u06BA",
"pwa.bannerDesc": "\u0628\u06C1\u062A\u0631 \u0633\u0644\u0627\u0645\u062A\u06CC \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u0645\u0642\u0627\u0645\u06CC \u0627\u06CC\u067E \u06A9\u0627 \u062A\u062C\u0631\u0628\u06C1 \u062D\u0627\u0635\u0644 \u06A9\u0631\u06CC\u06BA",
"pwa.install": "\u0646\u0635\u0628",
"pwa.dismiss": "\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",
"pwa.close": "\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",
"pwa.iosTitle": "\u200FiOS \u067E\u0631 \u0646\u0635\u0628 \u06A9\u0631\u06CC\u06BA",
"pwa.iosStep1": "\u0627\u0634\u062A\u0631\u0627\u06A9 \u06A9\u0627 \u0628\u0679\u0646 \u062F\u0628\u0627\u0626\u06CC\u06BA",
"pwa.iosStep1Hint": "\u0639\u0645\u0648\u0645\u0627\u064B \u0633\u0641\u0627\u0631\u06CC \u06A9\u06D2 \u0646\u06CC\u0686\u06D2",
"pwa.iosStep2": "\xAB\u06C1\u0648\u0645 \u0633\u06A9\u0631\u06CC\u0646 \u0645\u06CC\u06BA \u0634\u0627\u0645\u0644 \u06A9\u0631\u06CC\u06BA\xBB \u062A\u0644\u0627\u0634 \u06A9\u0631\u06CC\u06BA",
"pwa.iosStep2Hint": "\u0627\u0634\u062A\u0631\u0627\u06A9 \u0645\u06CC\u0646\u0648 \u0645\u06CC\u06BA \u0646\u06CC\u0686\u06D2 \u062C\u0627\u0626\u06CC\u06BA",
"pwa.iosStep3": "\xAB\u0634\u0627\u0645\u0644 \u06A9\u0631\u06CC\u06BA\xBB \u062F\u0628\u0627\u0626\u06CC\u06BA",
"pwa.iosStep3Hint": "\u200FSecureBit.chat \u0646\u0635\u0628 \u06A9\u0631\u0646\u06D2 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u0631\u06CC\u06BA",
"pwa.genericTitle": "\u200FSecureBit \u0646\u0635\u0628 \u06A9\u0631\u06CC\u06BA",
"pwa.genericDesc": "\u06C1\u0631 \u0628\u0631\u0627\u0624\u0632\u0631 \u0627\u067E\u0646\u06D2 \u0627\u0646\u062F\u0627\u0632 \u0645\u06CC\u06BA \u0646\u0635\u0628 \u06A9\u0631\u062A\u0627 \u06C1\u06D2\u06D4 \u0648\u06C1 \u0645\u0631\u0627\u062D\u0644 \u0686\u0646\u06CC\u06BA \u062C\u0648 \u0622\u067E \u06A9\u06D2 \u0628\u0631\u0627\u0624\u0632\u0631 \u0633\u06D2 \u0645\u06CC\u0644 \u06A9\u06BE\u0627\u062A\u06D2 \u06C1\u0648\u06BA\u06D4",
"pwa.gotIt": "\u0633\u0645\u062C\u06BE \u06AF\u06CC\u0627",
"pwa.installedTitle": "\u0627\u06CC\u067E \u0646\u0635\u0628 \u06C1\u0648 \u06AF\u0626\u06CC!",
"pwa.installedIos": "\u200FiOS \u0627\u06CC\u067E \u0646\u0635\u0628 \u06C1\u0648 \u06AF\u0626\u06CC! \u06C1\u0648\u0645 \u0633\u06A9\u0631\u06CC\u0646 \u0633\u06D2 \u06A9\u06BE\u0648\u0644\u06CC\u06BA\u06D4",
"pwa.installedGeneric": "\u200FSecureBit.chat \u0627\u0628 \u0622\u067E \u06A9\u06D2 \u0622\u0644\u06D2 \u067E\u0631 \u06C1\u06D2",
"pwa.anytimeTitle": "\u06A9\u0633\u06CC \u0628\u06BE\u06CC \u0648\u0642\u062A \u0646\u0635\u0628 \u06A9\u0631\u06CC\u06BA",
"pwa.anytimeDesc": "\u0628\u06C1\u062A\u0631\u06CC\u0646 \u062A\u062C\u0631\u0628\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0622\u067E \u0627\u0628 \u0628\u06BE\u06CC SecureBit.chat \u0627\u067E\u0646\u06D2 \u0628\u0631\u0627\u0624\u0632\u0631 \u06A9\u06D2 \u0645\u06CC\u0646\u0648 \u0633\u06D2 \u0646\u0635\u0628 \u06A9\u0631 \u0633\u06A9\u062A\u06D2 \u06C1\u06CC\u06BA\u06D4",
"pwa.ok": "\u0679\u06BE\u06CC\u06A9 \u06C1\u06D2",
"step.open": "\u0645\u0631\u062D\u0644\u06C1 1 \xB7 \u0686\u06CC\u0646\u0644 \u06A9\u06BE\u0648\u0644\u06CC\u06BA",
"step.exchange": "\u0645\u0631\u062D\u0644\u06C1 2 \xB7 \u062A\u0628\u0627\u062F\u0644\u06C1",
"step.verification": "\u0645\u0631\u062D\u0644\u06C1 3 \xB7 \u062A\u0635\u062F\u06CC\u0642",
"action.create": "\u0628\u0646\u0627\u0626\u06CC\u06BA",
"action.join": "\u0634\u0627\u0645\u0644 \u06C1\u0648\u06BA",
"action.back": "\u0648\u0627\u067E\u0633",
"action.copy": "\u0646\u0642\u0644",
"action.copied": "\u0646\u0642\u0644 \u06C1\u0648 \u06AF\u06CC\u0627",
"action.scan": "\u067E\u0691\u06BE\u06CC\u06BA",
"action.downloadDesktop": "\u0688\u06CC\u0633\u06A9 \u0679\u0627\u067E \u0627\u06CC\u067E \u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u06A9\u0631\u06CC\u06BA",
"action.advancedSettings": "\u0627\u0639\u0644\u06CC\u0670 \u062A\u0631\u062A\u06CC\u0628\u0627\u062A",
"cred.offerTag": "\u067E\u06CC\u0634\u06A9\u0634 \xB7 \u06CC\u0627 \u0645\u062A\u0646 \u0646\u0642\u0644 \u06A9\u0631\u06CC\u06BA",
"cred.answerTag": "\u062C\u0648\u0627\u0628 \xB7 \u06CC\u0627 \u0645\u062A\u0646 \u0646\u0642\u0644 \u06A9\u0631\u06CC\u06BA",
"cred.reveal": "\u062F\u06A9\u06BE\u0627\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u062F\u0628\u0627\u0626\u06CC\u06BA - \u06CC\u06C1 \u06A9\u0648\u0688 \u0646\u062C\u06CC \u0631\u06A9\u06BE\u06CC\u06BA",
"qr.title": "\u200FQR \u06A9\u0648\u0688 \u067E\u0691\u06BE\u06CC\u06BA",
"qr.subtitle": "\u0627\u067E\u0646\u0627 \u06A9\u06CC\u0645\u0631\u06C1 \u0627\u0646 \u06A9\u06D2 QR \u06A9\u06CC \u0637\u0631\u0641 \u06A9\u0631\u06CC\u06BA",
"qr.scanning": "\u067E\u0691\u06BE\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2\u2026",
"qr.hint": "\u062A\u0645\u0627\u0645 \u062D\u0635\u06D2 \u067E\u06A9\u0691\u06D2 \u062C\u0627\u0646\u06D2 \u062A\u06A9 \u06C1\u0627\u062A\u06BE \u0633\u0627\u06A9\u062A \u0631\u06A9\u06BE\u06CC\u06BA\u06D4 \u06A9\u06CC\u0645\u0631\u06D2 \u06A9\u06CC \u0631\u0633\u0627\u0626\u06CC \u0645\u0642\u0627\u0645\u06CC \u06C1\u06D2 - \u06A9\u0686\u06BE \u0627\u067E \u0644\u0648\u0688 \u0646\u06C1\u06CC\u06BA \u06C1\u0648\u062A\u0627\u06D4",
"mesh.you": "\u0622\u067E",
"mesh.peer": "\u0633\u0627\u062A\u06BE\u06CC \xB7 \u0633\u06CC\u0634\u0646 1",
"mesh.joined2": "\u200Fmara \u0634\u0627\u0645\u0644 \u06C1\u0648\u0626\u06CC \xB7 +2",
"mesh.joined3": "\u200Ftobi \u0634\u0627\u0645\u0644 \u06C1\u0648\u0627 \xB7 +3",
"ice.title": "\u0646\u06CC\u0679 \u0648\u0631\u06A9 \u06A9\u06CC \u062A\u0631\u062A\u06CC\u0628\u0627\u062A",
"ice.subtitle": "\u0645\u0642\u0627\u0645\u06CC \u0637\u0648\u0631 \u067E\u0631 \u062A\u0631\u062A\u06CC\u0628 \u062F\u06CC \u062C\u0627\u062A\u06CC \u06C1\u06CC\u06BA - \u06A9\u0628\u06BE\u06CC \u0622\u067E \u06A9\u06D2 \u0633\u0627\u062A\u06BE\u06CC \u0633\u06D2 \u0634\u0631\u06CC\u06A9 \u0646\u06C1\u06CC\u06BA \u06A9\u06CC \u062C\u0627\u062A\u06CC\u06BA",
"ice.intro": "\u200FSecureBit \u0637\u06D2 \u0634\u062F\u06C1 \u0637\u0648\u0631 \u067E\u0631 \u0639\u0648\u0627\u0645\u06CC STUN \u0633\u0631\u0648\u0631 \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06A9\u0631\u062A\u0627 \u06C1\u06D2 \u062A\u0627\u06A9\u06C1 \u06C1\u0645\u200C\u0633\u0637\u062D \u0631\u0627\u0628\u0637\u06C1 \u0637\u06D2 \u06C1\u0648 \u0633\u06A9\u06D2\u06D4 \u0627\u06AF\u0631 \u0622\u067E \u062E\u0648\u062F \u0645\u06CC\u0632\u0628\u0627\u0646\u06CC \u06A9\u0631\u062A\u06D2 \u06C1\u06CC\u06BA \u062A\u0648 \u0627\u0633\u06D2 \u0627\u067E\u0646\u06D2 STUN/TURN \u06A9\u06CC \u0637\u0631\u0641 \u0645\u0648\u0691 \u062F\u06CC\u06BA\u06D4",
"ice.publicTitle": "\u0639\u0648\u0627\u0645\u06CC \u0633\u0631\u0648\u0631 (\u0637\u06D2 \u0634\u062F\u06C1)",
"ice.publicDesc": "\u0628\u063A\u06CC\u0631 \u062A\u0631\u062A\u06CC\u0628\u06D4 \u0632\u06CC\u0627\u062F\u06C1 \u062A\u0631 \u0635\u0627\u0631\u0641\u06CC\u0646 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0645\u0648\u0632\u0648\u06BA\u06D4",
"ice.customTitle": "\u0645\u06CC\u0631\u06D2 \u0627\u067E\u0646\u06D2 STUN/TURN \u0633\u0631\u0648\u0631",
"ice.customDesc": "\u0632\u06CC\u0627\u062F\u06C1 \u0633\u06D2 \u0632\u06CC\u0627\u062F\u06C1 {max} \u0633\u0631\u0648\u0631\u06D4",
"ice.turnNote": "\u200FTURN \u0631\u06CC\u0644\u06D2 \u062F\u0648\u0646\u0648\u06BA \u0641\u0631\u06CC\u0642\u0648\u06BA \u06A9\u0627 IP \u0627\u0648\u0631 \u0679\u0631\u06CC\u0641\u06A9 \u06A9\u0627 \u0648\u0642\u062A \u062F\u06CC\u06A9\u06BE\u062A\u0627 \u06C1\u06D2 - \u0645\u06AF\u0631 \u067E\u06CC\u063A\u0627\u0645 \u06A9\u0627 \u0645\u0648\u0627\u062F \u06A9\u0628\u06BE\u06CC \u0646\u06C1\u06CC\u06BA\u060C \u062C\u0648 \u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u062E\u0641\u06CC\u06C1 \u0631\u06C1\u062A\u0627 \u06C1\u06D2\u06D4 \u062A\u0631\u062C\u06CC\u062D \u062F\u06CC\u06BA ",
"ice.turnNoteTls": " \u200F(TLS)\u06D4",
"ice.test": "\u0633\u0631\u0648\u0631 \u062C\u0627\u0646\u0686\u06CC\u06BA",
"ice.testing": "\u062C\u0627\u0646\u0686 \u062C\u0627\u0631\u06CC\u2026",
"ice.relayTitle": "\u0635\u0631\u0641 \u0631\u06CC\u0644\u06D2 \u0645\u0648\u0688",
"ice.relayBadge": "\u0632\u06CC\u0627\u062F\u06C1 \u0633\u06D2 \u0632\u06CC\u0627\u062F\u06C1 \u0646\u062C\u06CC\u062A",
"ice.relayDesc": "\u062A\u0645\u0627\u0645 \u0679\u0631\u06CC\u0641\u06A9 TURN \u0633\u06D2 \u06AF\u0632\u0627\u0631\u062A\u0627 \u06C1\u06D2 \u062A\u0627\u06A9\u06C1 \u0622\u067E \u06A9\u0627 IP \u06A9\u0628\u06BE\u06CC \u0633\u0627\u062A\u06BE\u06CC \u067E\u0631 \u0638\u0627\u06C1\u0631 \u0646\u06C1 \u06C1\u0648\u06D4 \u0627\u0633 \u06A9\u06D2 \u0644\u06CC\u06D2 TURN \u0633\u0631\u0648\u0631 \u062F\u0631\u06A9\u0627\u0631 \u06C1\u06D2\u06D4",
"ice.relayWarning": "\u0635\u0631\u0641 \u0631\u06CC\u0644\u06D2 \u0645\u0648\u0688 \u0686\u0627\u0644\u0648 \u06C1\u06D2 \u0645\u06AF\u0631 \u06A9\u0648\u0626\u06CC TURN \u0633\u0631\u0648\u0631 \u062A\u0631\u062A\u06CC\u0628 \u0646\u06C1\u06CC\u06BA \u062F\u06CC\u0627 \u06AF\u06CC\u0627\u06D4 \u0627\u062A\u0635\u0627\u0644 \u0634\u0631\u0648\u0639 \u0646\u06C1\u06CC\u06BA \u06C1\u0648 \u0633\u06A9\u06D2 \u06AF\u0627\u06D4",
"ice.persist": "\u0627\u0633 \u0622\u0644\u06D2 \u067E\u0631 \u0645\u062D\u0641\u0648\u0638 \u06A9\u0631\u06CC\u06BA",
"ice.persistDesc": "\u0627\u0633\u06CC \u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u06CC\u06BA \u062E\u0641\u06CC\u06C1 \u0635\u0648\u0631\u062A \u0645\u06CC\u06BA \u0645\u062D\u0641\u0648\u0638 \u06C1\u0648\u062A\u0627 \u06C1\u06D2\u06D4 \u0635\u0631\u0641 \u0627\u0633 \u0633\u06CC\u0634\u0646 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06A9\u0631\u0646\u0627 \u06C1\u0648 \u062A\u0648 \u0628\u0646\u062F \u0631\u06C1\u0646\u06D2 \u062F\u06CC\u06BA\u06D4",
"ice.forget": "\u0645\u062D\u0641\u0648\u0638 \u0634\u062F\u06C1 \u0628\u06BE\u0648\u0644 \u062C\u0627\u0626\u06CC\u06BA",
"ice.cancel": "\u0645\u0646\u0633\u0648\u062E",
"ice.apply": "\u0644\u0627\u06AF\u0648 \u06A9\u0631\u06CC\u06BA",
"ice.errUnavailable": "\u0627\u0633 \u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u06CC\u06BA WebRTC \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA",
"ice.errInvalid": "\u0633\u0631\u0648\u0631 \u06A9\u06CC \u062A\u0631\u062A\u06CC\u0628 \u063A\u0644\u0637 \u06C1\u06D2",
"update.title": "\u062A\u0627\u0632\u06C1 \u06A9\u0627\u0631\u06CC \u062F\u0633\u062A\u06CC\u0627\u0628 \u06C1\u06D2",
"update.desc": "\u200FSecureBit \u06A9\u0627 \u0646\u06CC\u0627 \u0646\u0633\u062E\u06C1 \u0645\u0644\u0627 \u06C1\u06D2\u06D4",
"update.currentVersion": "\u0645\u0648\u062C\u0648\u062F\u06C1 \u0646\u0633\u062E\u06C1",
"update.newVersion": "\u0646\u06CC\u0627 \u0646\u0633\u062E\u06C1",
"update.now": "\u0627\u0628\u06BE\u06CC \u062A\u0627\u0632\u06C1 \u06A9\u0631\u06CC\u06BA",
"update.later": "\u0628\u0639\u062F \u0645\u06CC\u06BA",
"update.unknown": "\u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA",
"update.stepSaving": "\u0688\u06CC\u0679\u0627 \u0645\u062D\u0641\u0648\u0638 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2...",
"update.stepSwCaches": "\u200FService Worker \u06A9\u06D2 \u0630\u062E\u06CC\u0631\u06D2 \u0635\u0627\u0641 \u06A9\u06CC\u06D2 \u062C\u0627 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA...",
"update.stepSwUnregister": "\u200FService Workers \u06A9\u0627 \u0627\u0646\u062F\u0631\u0627\u062C \u0645\u0646\u0633\u0648\u062E \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2...",
"update.stepBrowserCache": "\u0628\u0631\u0627\u0624\u0632\u0631 \u06A9\u0627 \u0630\u062E\u06CC\u0631\u06C1 \u0635\u0627\u0641 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2...",
"update.stepVersion": "\u0646\u0633\u062E\u06C1 \u062A\u0627\u0632\u06C1 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2...",
"update.stepReload": "\u0627\u06CC\u067E\u0644\u06CC \u06A9\u06CC\u0634\u0646 \u062F\u0648\u0628\u0627\u0631\u06C1 \u0644\u0648\u0688 \u06C1\u0648 \u0631\u06C1\u06CC \u06C1\u06D2...",
"update.error": "\u062A\u0627\u0632\u06C1 \u06A9\u0627\u0631\u06CC \u0645\u06CC\u06BA \u062E\u0631\u0627\u0628\u06CC\u06D4 \u0628\u0631\u0627\u06C1\u0650 \u06A9\u0631\u0645 \u0635\u0641\u062D\u06C1 \u062E\u0648\u062F \u062A\u0627\u0632\u06C1 \u06A9\u0631\u06CC\u06BA (Ctrl+F5 \u06CC\u0627 Cmd+Shift+R)",
"update.confirmSkip": "\u0646\u06CC\u0627 \u0646\u0633\u062E\u06C1 \u062F\u0633\u062A\u06CC\u0627\u0628 \u06C1\u06D2\u06D4 \u0633\u0644\u0627\u0645\u062A\u06CC \u0627\u0648\u0631 \u0627\u0633\u062A\u062D\u06A9\u0627\u0645 \u06A9\u06D2 \u0644\u06CC\u06D2 \u062A\u0627\u0632\u06C1 \u06A9\u0627\u0631\u06CC \u06A9\u06CC \u0633\u0641\u0627\u0631\u0634 \u06C1\u06D2\u06D4 \u0628\u063A\u06CC\u0631 \u062A\u0627\u0632\u06C1 \u06A9\u0627\u0631\u06CC \u062C\u0627\u0631\u06CC \u0631\u06A9\u06BE\u06CC\u06BA\u061F",
"offline.backOnline": "\u062F\u0648\u0628\u0627\u0631\u06C1 \u0622\u0646 \u0644\u0627\u0626\u0646",
"offline.mode": "\u0622\u0641 \u0644\u0627\u0626\u0646 \u0645\u0648\u0688",
"offline.dismiss": "\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",
"offline.lostTitle": "\u0627\u062A\u0635\u0627\u0644 \u0679\u0648\u0679 \u06AF\u06CC\u0627",
"offline.lostDesc": "\u200FSecureBit \u0627\u0628 \u0622\u0641 \u0644\u0627\u0626\u0646 \u0645\u0648\u0688 \u0645\u06CC\u06BA \u06C1\u06D2\u06D4 \u06A9\u0686\u06BE \u062E\u0635\u0648\u0635\u06CC\u0627\u062A \u0645\u062D\u062F\u0648\u062F \u06C1\u06CC\u06BA\u060C \u0645\u06AF\u0631 \u0622\u067E \u06A9\u0627 \u0688\u06CC\u0679\u0627 \u0645\u062D\u0641\u0648\u0638 \u0631\u06C1\u062A\u0627 \u06C1\u06D2\u06D4",
"offline.point1": "\u0622\u067E \u06A9\u0627 \u0633\u06CC\u0634\u0646 \u0627\u0648\u0631 \u06A9\u0644\u06CC\u062F\u06CC\u06BA \u0645\u062D\u0641\u0648\u0638 \u06C1\u06CC\u06BA",
"offline.point2": "\u06A9\u0648\u0626\u06CC \u0688\u06CC\u0679\u0627 \u0633\u0631\u0648\u0631\u0632 \u067E\u0631 \u0630\u062E\u06CC\u0631\u06C1 \u0646\u06C1\u06CC\u06BA \u06C1\u0648\u062A\u0627",
"offline.point3": "\u062F\u0648\u0628\u0627\u0631\u06C1 \u062C\u0691\u0646\u06D2 \u067E\u0631 \u067E\u06CC\u063A\u0627\u0645 \u0627\u0648\u0631 \u0641\u0627\u0626\u0644\u06CC\u06BA \u06C1\u0645 \u0622\u06C1\u0646\u06AF \u06C1\u0648 \u062C\u0627\u0626\u06CC\u06BA \u06AF\u06CC",
"offline.continue": "\u0622\u0641 \u0644\u0627\u0626\u0646 \u062C\u0627\u0631\u06CC \u0631\u06A9\u06BE\u06CC\u06BA",
"offline.restoredTitle": "\u062C\u0628 \u0622\u067E \u062F\u0648\u0628\u0627\u0631\u06C1 \u062C\u0691\u06CC\u06BA \u06AF\u06D2",
"offline.restoredDesc": "\u0627\u062A\u0635\u0627\u0644 \u0679\u0648\u0679\u0646\u06D2 \u0633\u06D2 \u0622\u067E \u06A9\u0627 \u06A9\u0686\u06BE \u0646\u06C1\u06CC\u06BA \u062C\u0627\u062A\u0627\u06D4 \u200FSecureBit \u0633\u0628 \u06A9\u0686\u06BE \u0645\u0642\u0627\u0645\u06CC \u0642\u0637\u0627\u0631 \u0645\u06CC\u06BA \u0631\u06A9\u06BE\u062A\u0627 \u06C1\u06D2 \u0627\u0648\u0631 \u0622\u067E \u06A9\u06D2 \u0648\u0627\u067E\u0633 \u0622\u062A\u06D2 \u06C1\u06CC \u062E\u0641\u06CC\u06C1 \u0633\u06CC\u0634\u0646 \u0628\u062D\u0627\u0644 \u06A9\u0631 \u062F\u06CC\u062A\u0627 \u06C1\u06D2\u06D4",
"offline.r1Title": "\u0622\u067E \u06A9\u06D2 \u067E\u06CC\u063A\u0627\u0645 \u067E\u06C1\u0646\u0686 \u062C\u0627\u062A\u06D2 \u06C1\u06CC\u06BA",
"offline.r1Desc": "\u0622\u0641 \u0644\u0627\u0626\u0646 \u062C\u0648 \u06A9\u0686\u06BE \u0622\u067E \u0646\u06D2 \u0644\u06A9\u06BE\u0627 \u0648\u06C1 \u062E\u0648\u062F\u06A9\u0627\u0631 \u0637\u0648\u0631 \u067E\u0631 \u0622\u067E \u06A9\u06D2 \u0631\u0627\u0628\u0637\u06D2 \u06A9\u0648 \u0628\u06BE\u06CC\u062C \u062F\u06CC\u0627 \u062C\u0627\u062A\u0627 \u06C1\u06D2\u06D4",
"offline.r2Title": "\u0641\u0627\u0626\u0644\u0648\u06BA \u06A9\u06CC \u0645\u0646\u062A\u0642\u0644\u06CC \u0645\u06A9\u0645\u0644 \u06C1\u0648\u062A\u06CC \u06C1\u06D2",
"offline.r2Desc": "\u0627\u067E \u0644\u0648\u0688 \u0648\u06C1\u06CC\u06BA \u0633\u06D2 \u062C\u0627\u0631\u06CC \u06C1\u0648\u062A\u06D2 \u06C1\u06CC\u06BA \u062C\u06C1\u0627\u06BA \u0631\u06A9\u06D2 \u062A\u06BE\u06D2 - \u062F\u0648\u0628\u0627\u0631\u06C1 \u0628\u06BE\u06CC\u062C\u0646\u06D2 \u06A9\u06CC \u0636\u0631\u0648\u0631\u062A \u0646\u06C1\u06CC\u06BA\u06D4",
"offline.r3Title": "\u0627\u0646 \u06A9\u06D2 \u067E\u06CC\u063A\u0627\u0645 \u0627\u0648\u0631 \u0641\u0627\u0626\u0644\u06CC\u06BA \u0622 \u062C\u0627\u062A\u06CC \u06C1\u06CC\u06BA",
"offline.r3Desc": "\u0628\u0646\u062F\u0634 \u06A9\u06D2 \u062F\u0648\u0631\u0627\u0646 \u0622\u067E \u06A9\u06D2 \u0631\u0627\u0628\u0637\u06D2 \u0646\u06D2 \u062C\u0648 \u0628\u06BE\u06CC\u062C\u0627\u060C \u0648\u06C1 \u062A\u0631\u062A\u06CC\u0628 \u0633\u06D2 \u0622\u067E \u062A\u06A9 \u067E\u06C1\u0646\u0686\u062A\u0627 \u06C1\u06D2\u06D4",
"offline.r4Title": "\u06A9\u0686\u06BE \u0636\u0627\u0626\u0639 \u0646\u06C1\u06CC\u06BA \u06C1\u0648\u062A\u0627",
"offline.r4Desc": "\u062F\u0648\u0628\u0627\u0631\u06C1 \u062C\u0691\u0646\u06D2 \u06A9\u06D2 \u0628\u0639\u062F \u06A9\u0648\u0626\u06CC \u062E\u0644\u0627 \u0646\u06C1\u06CC\u06BA - \u06AF\u0641\u062A\u06AF\u0648 \u0628\u0627\u0644\u06A9\u0644 \u0648\u06C1\u06CC\u06BA \u0633\u06D2 \u062C\u0627\u0631\u06CC \u0631\u06C1\u062A\u06CC \u06C1\u06D2 \u062C\u06C1\u0627\u06BA \u0631\u06A9\u06CC \u062A\u06BE\u06CC\u06D4",
"offline.gotIt": "\u0633\u0645\u062C\u06BE \u06AF\u06CC\u0627",
"qr.showTitle": "\u200FQR \u06A9\u0648\u0688 \u062F\u06A9\u06BE\u0627\u0626\u06CC\u06BA",
"qr.showSubtitle": "\u067E\u0648\u0631\u06CC \u0633\u06A9\u0631\u06CC\u0646 \xB7 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u0648 \u067E\u0691\u06BE\u0646\u06D2 \u062F\u06CC\u06BA",
"qr.showSubtitleFrames": "\u067E\u0648\u0631\u06CC \u0633\u06A9\u0631\u06CC\u0646 \xB7 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u0648 \u062A\u0645\u0627\u0645 {frames} \u0641\u0631\u06CC\u0645 \u067E\u0691\u06BE\u0646\u06D2 \u062F\u06CC\u06BA",
"notify.enabledBody": "\u0627\u0637\u0644\u0627\u0639\u0627\u062A \u0686\u0627\u0644\u0648 \u06C1\u0648 \u06AF\u0626\u06CC\u06BA! \u0646\u0626\u06D2 \u067E\u06CC\u063A\u0627\u0645\u0627\u062A \u06A9\u06CC \u0627\u0637\u0644\u0627\u0639 \u0645\u0644\u06D2 \u06AF\u06CC\u06D4",
"notify.workingBody": "\u0627\u0637\u0644\u0627\u0639\u0627\u062A \u06A9\u0627\u0645 \u06A9\u0631 \u0631\u06C1\u06CC \u06C1\u06CC\u06BA! \u0646\u0626\u06D2 \u067E\u06CC\u063A\u0627\u0645\u0627\u062A \u06A9\u06CC \u0627\u0637\u0644\u0627\u0639 \u0645\u0644\u06D2 \u06AF\u06CC\u06D4",
"pw.label": "\u067E\u0627\u0633 \u0648\u0631\u0688 \u062F\u0631\u062C \u06A9\u0631\u06CC\u06BA",
"pw.placeholder": "\u067E\u0627\u0633 \u0648\u0631\u0688 \u062F\u0631\u062C \u06A9\u0631\u06CC\u06BA...",
"pw.decrypt": "\u06A9\u06BE\u0648\u0644\u06CC\u06BA",
"pw.cancel": "\u0645\u0646\u0633\u0648\u062E",
"file.title": "\u0641\u0627\u0626\u0644 \u0645\u0646\u062A\u0642\u0644\u06CC",
"file.drop": "\u0641\u0627\u0626\u0644\u06CC\u06BA \u06CC\u06C1\u0627\u06BA \u06A9\u06BE\u06CC\u0646\u0686 \u06A9\u0631 \u0686\u06BE\u0648\u0691\u06CC\u06BA",
"file.dropHint": "\u0645\u0646\u062A\u0642\u0644\u06CC \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u062E\u0641\u06CC\u06C1 \xB7 100 MB \u062A\u06A9",
"file.browse": "\u0622\u0644\u06C1 \u062F\u06CC\u06A9\u06BE\u06CC\u06BA",
"file.incoming": "\u0622\u0646\u06D2 \u0648\u0627\u0644\u06CC \u0641\u0627\u0626\u0644 \u06A9\u06CC \u062F\u0631\u062E\u0648\u0627\u0633\u062A",
"file.accept": "\u0642\u0628\u0648\u0644",
"file.reject": "\u0631\u062F",
"file.download": "\u0688\u0627\u0624\u0646 \u0644\u0648\u0688",
"file.notReady": "\u0627\u062A\u0635\u0627\u0644 \u062A\u06CC\u0627\u0631 \u0646\u06C1\u06CC\u06BA",
"file.tooLarge": "\u0641\u0627\u0626\u0644 \u0628\u06C1\u062A \u0628\u0691\u06CC \u06C1\u06D2",
"file.typeNotAllowed": "\u0627\u0633 \u0642\u0633\u0645 \u06A9\u06CC \u0641\u0627\u0626\u0644 \u06A9\u06CC \u0627\u062C\u0627\u0632\u062A \u0646\u06C1\u06CC\u06BA",
"file.maxConcurrent": "\u0627\u06CC\u06A9 \u0633\u0627\u062A\u06BE \u0632\u06CC\u0627\u062F\u06C1 \u0633\u06D2 \u0632\u06CC\u0627\u062F\u06C1 \u0645\u0646\u062A\u0642\u0644\u06CC\u0627\u06BA",
"file.gone": "\u06CC\u06C1 \u0641\u0627\u0626\u0644 \u0627\u0628 \u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u06A9\u06D2 \u0644\u06CC\u06D2 \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA\u06D4",
"call.incoming": "\u0622\u0646\u06D2 \u0648\u0627\u0644\u06CC \u06A9\u0627\u0644",
"call.incomingVideo": "\u0622\u0646\u06D2 \u0648\u0627\u0644\u06CC \u0648\u06CC\u0688\u06CC\u0648 \u06A9\u0627\u0644",
"call.encrypted": "\u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0644",
"call.encryptedShort": "\u062E\u0641\u06CC\u06C1",
"call.peer": "\u0645\u062D\u0641\u0648\u0638 \u0633\u0627\u062A\u06BE\u06CC",
"call.connecting": "\u062C\u0648\u0691\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2\u2026",
"call.ringing": "\u06AF\u06BE\u0646\u0679\u06CC \u0628\u062C \u0631\u06C1\u06CC \u06C1\u06D2\u2026",
"call.accept": "\u0642\u0628\u0648\u0644",
"call.decline": "\u0631\u062F",
"call.end": "\u06A9\u0627\u0644 \u062E\u062A\u0645 \u06A9\u0631\u06CC\u06BA",
"call.camera": "\u06A9\u06CC\u0645\u0631\u06C1",
"call.cameraOff": "\u06A9\u06CC\u0645\u0631\u06C1 \u0628\u0646\u062F",
"call.peerCameraOff": "\u0633\u0627\u062A\u06BE\u06CC \u06A9\u0627 \u06A9\u06CC\u0645\u0631\u06C1 \u0628\u0646\u062F \u06C1\u06D2",
"call.flipCamera": "\u06A9\u06CC\u0645\u0631\u06C1 \u0628\u062F\u0644\u06CC\u06BA",
"call.addVideo": "\u0648\u06CC\u0688\u06CC\u0648 \u0634\u0627\u0645\u0644 \u06A9\u0631\u06CC\u06BA",
"call.video": "\u0648\u06CC\u0688\u06CC\u0648",
"call.muted": "\u062E\u0627\u0645\u0648\u0634",
"call.expand": "\u0628\u0691\u0627 \u06A9\u0631\u06CC\u06BA",
"call.minimize": "\u0686\u06BE\u0648\u0679\u0627 \u06A9\u0631\u06CC\u06BA",
"call.quality": "\u0627\u062A\u0635\u0627\u0644 \u06A9\u0627 \u0645\u0639\u06CC\u0627\u0631",
"call.qualityExcellent": "\u0628\u06C1\u062A\u0631\u06CC\u0646",
"call.videoPrefix": "\u0648\u06CC\u0688\u06CC\u0648 \xB7 ",
"call.voicePrefix": "\u0622\u0648\u0627\u0632 \xB7 ",
"group.new": "\u0646\u06CC\u0627 \u06AF\u0631\u0648\u06C1",
"group.create": "\u06AF\u0631\u0648\u06C1 \u0628\u0646\u0627\u0626\u06CC\u06BA",
"group.join": "\u06AF\u0631\u0648\u06C1 \u0645\u06CC\u06BA \u0634\u0627\u0645\u0644 \u06C1\u0648\u06BA",
"group.name": "\u06AF\u0631\u0648\u06C1 \u06A9\u0627 \u0646\u0627\u0645",
"group.nameTooLong": "\u06AF\u0631\u0648\u06C1 \u06A9\u0627 \u0646\u0627\u0645 \u0628\u06C1\u062A \u0644\u0645\u0628\u0627 \u06C1\u06D2\u06D4",
"group.capacity": "{max} \u0627\u0641\u0631\u0627\u062F \u062A\u06A9\u060C \u06C1\u0645\u200C\u0633\u0637\u062D\u06D4 \u06AF\u0631\u0648\u06C1 \u06A9\u06BE\u0644\u0646\u06D2 \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u0633\u0628 \u0627\u06CC\u06A9 \u062D\u0641\u0627\u0638\u062A\u06CC \u06A9\u0648\u0688 \u0645\u0644\u0627\u0626\u06CC\u06BA \u06AF\u06D2\u06D4",
"group.invite": "\u062F\u0639\u0648\u062A",
"group.inviteMore": "\u0645\u0632\u06CC\u062F \u0627\u0631\u06A9\u0627\u0646 \u0628\u0644\u0627\u0626\u06CC\u06BA",
"group.invitePeople": "{count} \u0627\u0641\u0631\u0627\u062F \u06A9\u0648 \u0628\u0644\u0627\u0626\u06CC\u06BA",
"group.invitation": "\u06AF\u0631\u0648\u06C1\u06CC \u062F\u0639\u0648\u062A",
"group.addMembers": "\u0627\u0631\u06A9\u0627\u0646 \u0634\u0627\u0645\u0644 \u06A9\u0631\u06CC\u06BA",
"group.roomFor": "{remaining} \u0645\u0632\u06CC\u062F \u06A9\u06CC \u06AF\u0646\u062C\u0627\u0626\u0634 \u06C1\u06D2\u06D4 \u0627\u0646 \u06A9\u06D2 \u0634\u0627\u0645\u0644 \u06C1\u0648\u062A\u06D2 \u06C1\u06CC \u0633\u0628 \u0646\u06CC\u0627 \u06AF\u0631\u0648\u06C1\u06CC \u06A9\u0648\u0688 \u0645\u0644\u0627\u0626\u06CC\u06BA \u06AF\u06D2\u06D4",
"group.membersCount": "{count} \u0627\u0631\u06A9\u0627\u0646",
"group.member": "\u0631\u06A9\u0646",
"group.members": "\u0627\u0631\u06A9\u0627\u0646",
"group.remove": "{name} \u06A9\u0648 \u06C1\u0679\u0627\u0626\u06CC\u06BA",
"group.message": "{name} \u06A9\u0648 \u067E\u06CC\u063A\u0627\u0645",
"group.leave": "\u0686\u06BE\u0648\u0691\u06CC\u06BA",
"group.leaveThis": "\u06CC\u06C1 \u06AF\u0631\u0648\u06C1 \u0686\u06BE\u0648\u0691 \u062F\u06CC\u06BA",
"group.cancel": "\u06AF\u0631\u0648\u06C1 \u0645\u0646\u0633\u0648\u062E \u06A9\u0631\u06CC\u06BA",
"group.close": "\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",
"group.cancelBtn": "\u0645\u0646\u0633\u0648\u062E",
"group.decline": "\u0631\u062F",
"group.working": "\u06A9\u0627\u0645 \u062C\u0627\u0631\u06CC\u2026",
"group.sasTitle": "\u06AF\u0631\u0648\u06C1\u06CC \u062D\u0641\u0627\u0638\u062A\u06CC \u06A9\u0648\u0688",
"group.sasEveryone": "\u06CC\u06C1 \u06A9\u0648\u0688 \u0633\u0628 \u06A9\u0648 \u0646\u0638\u0631 \u0622\u062A\u0627 \u06C1\u06D2",
"group.sasCompare": "\u06CC\u06C1 \u06AF\u0631\u0648\u06C1 \u06A9\u06BE\u0648\u0644\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u06AF\u0631\u0648\u06C1\u06CC \u06A9\u0648\u0688 \u06C1\u0631 \u0631\u06A9\u0646 \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u0645\u0644\u0627\u0626\u06CC\u06BA\u06D4",
"group.sasReadAloud": "\u06CC\u06C1 \u06C1\u0646\u062F\u0633\u06D2 \u0628\u0644\u0646\u062F \u0622\u0648\u0627\u0632 \u0645\u06CC\u06BA \u067E\u0691\u06BE \u06A9\u0631 \u0633\u0646\u0627\u0626\u06CC\u06BA ",
"group.sasWarning": "\u0627\u06AF\u0631 \u0627\u06CC\u06A9 \u0631\u06A9\u0646 \u0628\u06BE\u06CC \u0645\u062E\u062A\u0644\u0641 \u06A9\u0648\u0688 \u067E\u0691\u06BE\u06D2 \u062A\u0648 \u06A9\u0648\u0626\u06CC \u0622\u067E \u06A9\u06D2 \u062F\u0631\u0645\u06CC\u0627\u0646 \u0628\u06CC\u0679\u06BE\u0627 \u06C1\u06D2\u06D4 \u06AF\u0631\u0648\u06C1 \u0645\u0646\u0633\u0648\u062E \u06A9\u0631\u06CC\u06BA - \u062A\u0635\u062F\u06CC\u0642 \u0646\u06C1 \u06A9\u0631\u06CC\u06BA\u06D4",
"group.confirmFirst": "\u067E\u06C1\u0644\u06D2 \u06AF\u0631\u0648\u06C1\u06CC \u06A9\u0648\u0688 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u0631\u06CC\u06BA",
"group.codeSuffix": " \xB7 \u06A9\u0648\u0688 {code}",
"group.exchangingNonces": "\u06CC\u06A9 \u0628\u0627\u0631 \u0627\u0642\u062F\u0627\u0631 \u06A9\u0627 \u062A\u0628\u0627\u062F\u0644\u06C1\u2026",
"group.waitingCommit": "\u06C1\u0631 \u0631\u06A9\u0646 \u06A9\u06D2 \u0639\u06C1\u062F \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631\u2026",
"group.waitingJoin": "\u0628\u0627\u0642\u06CC \u0627\u0631\u06A9\u0627\u0646 \u06A9\u06D2 \u0634\u0627\u0645\u0644 \u06C1\u0648\u0646\u06D2 \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631\u2026",
"group.emptyChat": "\u06CC\u06C1\u0627\u06BA \u0627\u0628\u06BE\u06CC \u06A9\u0686\u06BE \u0646\u06C1\u06CC\u06BA\u06D4 \u067E\u06CC\u063A\u0627\u0645 \u0627\u0646 \u06A9\u06D2 \u0628\u06BE\u06CC\u062C\u0646\u06D2 \u0648\u0627\u0644\u06D2 \u06A9\u06D2 \u062F\u0633\u062A\u062E\u0637 \u0633\u06D2 \u0622\u062A\u06D2 \u06C1\u06CC\u06BA \u0627\u0648\u0631 \u06C1\u0631 \u0631\u06A9\u0646 \u06A9\u06D2 \u0627\u067E\u0646\u06D2 \u062E\u0641\u06CC\u06C1 \u0631\u0627\u0628\u0637\u06D2 \u0633\u06D2 \u0633\u0641\u0631 \u06A9\u0631\u062A\u06D2 \u06C1\u06CC\u06BA\u06D4",
"group.noVerified": "\u0627\u0628\u06BE\u06CC \u06A9\u0648\u0626\u06CC \u062A\u0635\u062F\u06CC\u0642 \u0634\u062F\u06C1 \u06AF\u0641\u062A\u06AF\u0648 \u0646\u06C1\u06CC\u06BA\u06D4 \u067E\u06C1\u0644\u06D2 \u0627\u06CC\u06A9 \u062F\u0648 \u0637\u0631\u0641\u06C1 \u06AF\u0641\u062A\u06AF\u0648 \u06A9\u06BE\u0648\u0644\u06CC\u06BA \u0627\u0648\u0631 \u0627\u0633 \u06A9\u0627 \u062D\u0641\u0627\u0638\u062A\u06CC \u06A9\u0648\u0688 \u0645\u0644\u0627\u0626\u06CC\u06BA - \u06AF\u0631\u0648\u06C1 \u0627\u0646\u06C1\u06CC \u0631\u0627\u0628\u0637\u0648\u06BA \u0633\u06D2 \u0628\u0646\u062A\u0627 \u06C1\u06D2 \u062C\u0646\u06C1\u06CC\u06BA \u0622\u067E \u067E\u06C1\u0644\u06D2 \u062C\u0627\u0646\u0686 \u0686\u06A9\u06D2 \u06C1\u0648\u06BA\u06D4",
"group.noMoreToAdd": "\u0634\u0627\u0645\u0644 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0645\u0632\u06CC\u062F \u062A\u0635\u062F\u06CC\u0642 \u0634\u062F\u06C1 \u06AF\u0641\u062A\u06AF\u0648 \u0646\u06C1\u06CC\u06BA\u06D4 \u067E\u06C1\u0644\u06D2 \u0627\u06CC\u06A9 \u062F\u0648 \u0637\u0631\u0641\u06C1 \u06AF\u0641\u062A\u06AF\u0648 \u06A9\u06BE\u0648\u0644\u06CC\u06BA \u0627\u0648\u0631 \u0627\u0633 \u06A9\u0627 \u062D\u0641\u0627\u0638\u062A\u06CC \u06A9\u0648\u0688 \u0645\u0644\u0627\u0626\u06CC\u06BA\u06D4",
"group.directLink": "\u0628\u0631\u0627\u06C1\u0650 \u0631\u0627\u0633\u062A \u06C1\u0645\u200C\u0633\u0637\u062D \u0631\u0627\u0628\u0637\u06C1",
"group.noDirectLink": "\u0627\u0628\u06BE\u06CC \u0628\u0631\u0627\u06C1\u0650 \u0631\u0627\u0633\u062A \u0631\u0627\u0628\u0637\u06C1 \u0646\u06C1\u06CC\u06BA - \u062C\u0628 \u062A\u06A9 \u0628\u0646\u06D2\u060C \u062F\u0648\u0633\u0631\u0627 \u0631\u06A9\u0646 \u067E\u06CC\u063A\u0627\u0645 \u0622\u06AF\u06D2 \u067E\u06C1\u0646\u0686\u0627\u062A\u0627 \u06C1\u06D2",
"group.relayNote": "\u06A9\u0686\u06BE \u0627\u0631\u06A9\u0627\u0646 \u06A9\u0627 \u0627\u0628\u06BE\u06CC \u0622\u067E \u0633\u06D2 \u0628\u0631\u0627\u06C1\u0650 \u0631\u0627\u0633\u062A \u0631\u0627\u0628\u0637\u06C1 \u0646\u06C1\u06CC\u06BA\u06D4 \u0627\u0646 \u06A9\u06D2 \u067E\u06CC\u063A\u0627\u0645 \u06A9\u0633\u06CC \u062F\u0648\u0633\u0631\u06D2 \u0631\u06A9\u0646 \u0633\u06D2 \u06AF\u0632\u0631\u062A\u06D2 \u06C1\u06CC\u06BA\u060C \u062C\u0648 \u062F\u06CC\u06A9\u06BE \u0633\u06A9\u062A\u0627 \u06C1\u06D2 \u06A9\u06C1 \u0622\u067E \u0628\u0627\u062A \u06A9\u0631 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA \u0645\u06AF\u0631 \u062F\u0633\u062A\u062E\u0637 \u0633\u06D2 \u0622\u06AF\u06D2 \u067E\u0691\u06BE \u0646\u06C1\u06CC\u06BA \u0633\u06A9\u062A\u0627 \u0627\u0648\u0631 \u0646\u06C1 \u0622\u067E \u06A9\u06CC \u0628\u0627\u062A \u0628\u062F\u0644 \u0633\u06A9\u062A\u0627 \u06C1\u06D2\u06D4 \u06AF\u0631\u0648\u06C1 \u0627\u0646\u06C1\u06CC\u06BA \u0628\u0631\u0627\u06C1\u0650 \u0631\u0627\u0633\u062A \u062C\u0648\u0691\u0646\u06D2 \u06A9\u06CC \u06A9\u0648\u0634\u0634 \u062C\u0627\u0631\u06CC \u0631\u06A9\u06BE\u062A\u0627 \u06C1\u06D2\u06D4",
"group.relayOnlyOff": "\u0635\u0631\u0641 \u0631\u06CC\u0644\u06D2 \u0645\u0648\u0688 \u0628\u0646\u062F \u06C1\u06D2\u060C \u0627\u0633 \u0644\u06CC\u06D2 \u06C1\u0631 \u0631\u06A9\u0646 \u0622\u067E \u0633\u06D2 \u0628\u0631\u0627\u06C1\u0650 \u0631\u0627\u0633\u062A \u062C\u0691\u062A\u0627 \u06C1\u06D2 \u0627\u0648\u0631 \u0622\u067E \u06A9\u0627 IP \u062C\u0627\u0646 \u0644\u06CC\u062A\u0627 \u06C1\u06D2 - \u0627\u0646 \u0627\u0631\u06A9\u0627\u0646 \u0633\u0645\u06CC\u062A \u062C\u0646\u06C1\u06CC\u06BA \u06A9\u0633\u06CC \u0627\u0648\u0631 \u0646\u06D2 \u0628\u0644\u0627\u06CC\u0627\u06D4 \u0627\u06AF\u0631 \u06CC\u06C1\u0627\u06BA \u06CC\u06C1 \u0627\u06C1\u0645 \u06C1\u06D2 \u062A\u0648 \u0646\u06CC\u0679 \u0648\u0631\u06A9 \u062A\u0631\u062A\u06CC\u0628\u0627\u062A \u0645\u06CC\u06BA \u0627\u0633\u06D2 \u0686\u0627\u0644\u0648 \u06A9\u0631\u06CC\u06BA\u06D4",
"group.memberOffline": "{name} \u0622\u0641 \u0644\u0627\u0626\u0646 \u06C1\u06CC\u06BA \u0627\u0648\u0631 \u067E\u06CC\u063A\u0627\u0645 \u0648\u0635\u0648\u0644 \u0646\u06C1\u06CC\u06BA \u06A9\u0631\u06CC\u06BA \u06AF\u06D2\u06D4 \u0648\u06C1 \u0627\u0628 \u0628\u06BE\u06CC \u0631\u06A9\u0646 \u06C1\u06CC\u06BA - \u0627\u0646\u06C1\u06CC\u06BA \u06C1\u0679\u0627\u0646\u06D2 \u0633\u06D2 \u06AF\u0631\u0648\u06C1 \u06A9\u06CC \u06A9\u0644\u06CC\u062F\u06CC\u06BA \u0646\u0626\u06CC \u0628\u0646\u062A\u06CC \u06C1\u06CC\u06BA\u06D4",
"group.joinNote": "\u0628\u0627\u0642\u06CC \u0627\u0631\u06A9\u0627\u0646 \u06A9\u0648 \u0627\u0633 \u06AF\u0631\u0648\u06C1 \u0645\u06CC\u06BA \u0622\u067E \u06A9\u06CC \u0645\u0648\u062C\u0648\u062F\u06AF\u06CC \u06A9\u0627 \u0639\u0644\u0645 \u06C1\u0648 \u062C\u0627\u0626\u06D2 \u06AF\u0627\u06D4 \u067E\u0686\u06BE\u0644\u06D2 \u067E\u06CC\u063A\u0627\u0645\u0627\u062A \u0646\u06C1\u06CC\u06BA \u06C1\u06CC\u06BA - \u06AF\u0631\u0648\u06C1 \u062E\u0627\u0644\u06CC \u0634\u0631\u0648\u0639 \u06C1\u0648\u062A\u0627 \u06C1\u06D2\u06D4",
"group.inviteSentNote": "\u0627\u0646 \u06A9\u06D2 \u0642\u0628\u0648\u0644 \u06A9\u0631\u0646\u06D2 \u062A\u06A9 \u06AF\u0631\u0648\u06C1 \u06A9\u0627\u0645 \u06A9\u0631\u062A\u0627 \u0631\u06C1\u062A\u0627 \u06C1\u06D2\u06D4 \u0627\u0646 \u06A9\u06D2 \u0644\u06CC\u06D2 \u067E\u0686\u06BE\u0644\u06CC \u062A\u0627\u0631\u06CC\u062E \u0646\u06C1\u06CC\u06BA - \u0648\u06C1 \u0635\u0631\u0641 \u0648\u06C1\u06CC \u062F\u06CC\u06A9\u06BE\u06CC\u06BA \u06AF\u06D2 \u062C\u0648 \u0627\u0628 \u0633\u06D2 \u0628\u06BE\u06CC\u062C\u0627 \u062C\u0627\u0626\u06D2\u06D4",
"group.errNotCreated": "\u06AF\u0631\u0648\u06C1 \u0646\u06C1\u06CC\u06BA \u0628\u0646\u0627",
"group.errNobodyAccepted": "\u06A9\u0633\u06CC \u0646\u06D2 \u0648\u0642\u062A \u067E\u0631 \u062F\u0639\u0648\u062A \u0642\u0628\u0648\u0644 \u0646\u06C1\u06CC\u06BA \u06A9\u06CC\u06D4",
"group.errNothingSent": "\u0646\u06C1 \u06A9\u0686\u06BE \u0628\u06BE\u06CC\u062C\u0627 \u06AF\u06CC\u0627 \u0646\u06C1 \u06A9\u0686\u06BE \u062A\u0635\u062F\u06CC\u0642 \u06C1\u0648\u0627\u06D4 \u0627\u0633\u06D2 \u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA \u0627\u0648\u0631 \u0633\u0628 \u06A9\u06D2 \u062C\u0691\u0646\u06D2 \u067E\u0631 \u062F\u0648\u0628\u0627\u0631\u06C1 \u06A9\u0648\u0634\u0634 \u06A9\u0631\u06CC\u06BA\u06D4",
"group.errNotFormed": "\u06CC\u06C1 \u06AF\u0631\u0648\u06C1 \u0646\u06C1\u06CC\u06BA \u0628\u0646 \u0633\u06A9\u0627\u06D4",
"group.errFull": "\u06CC\u06C1 \u06AF\u0631\u0648\u06C1 \u0628\u06BE\u0631 \u0686\u06A9\u0627 \u06C1\u06D2\u06D4",
"group.errInviteFailed": "\u062F\u0639\u0648\u062A \u0646\u06C1\u06CC\u06BA \u0628\u06BE\u06CC\u062C\u06CC \u062C\u0627 \u0633\u06A9\u06CC - \u0648\u06C1 \u06AF\u0641\u062A\u06AF\u0648 \u062C\u0691\u06CC \u06C1\u0648\u0626\u06CC \u0646\u06C1\u06CC\u06BA\u06D4",
"group.errNoMemberList": "\u06AF\u0631\u0648\u06C1 \u06A9\u06D2 \u0645\u0627\u0644\u06A9 \u0646\u06D2 \u0627\u0631\u06A9\u0627\u0646 \u06A9\u06CC \u0641\u06C1\u0631\u0633\u062A \u06A9\u0628\u06BE\u06CC \u0646\u06C1\u06CC\u06BA \u0628\u06BE\u06CC\u062C\u06CC\u06D4",
"group.errUnsignedList": "\u0627\u0631\u06A9\u0627\u0646 \u06A9\u06CC \u0641\u06C1\u0631\u0633\u062A \u067E\u0631 \u06AF\u0631\u0648\u06C1 \u06A9\u06D2 \u0645\u0627\u0644\u06A9 \u06A9\u06D2 \u062F\u0633\u062A\u062E\u0637 \u0646\u06C1\u06CC\u06BA \u062A\u06BE\u06D2\u06D4 \u062F\u0648\u0628\u0627\u0631\u06C1 \u06A9\u0648\u0634\u0634 \u0646\u06C1 \u06A9\u0631\u06CC\u06BA - \u0627\u0646\u06C1\u06CC\u06BA \u0628\u062A\u0627\u0626\u06CC\u06BA\u06D4",
"group.errNotOwner": "\u06AF\u0631\u0648\u06C1 \u06A9\u06D2 \u0645\u0627\u0644\u06A9 \u06A9\u06D2 \u0639\u0644\u0627\u0648\u06C1 \u06A9\u0633\u06CC \u0646\u06D2 \u0627\u0631\u06A9\u0627\u0646 \u0628\u062F\u0644\u0646\u06D2 \u06A9\u06CC \u06A9\u0648\u0634\u0634 \u06A9\u06CC\u06D4",
"hdr.tagline": "\u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u062E\u0641\u06CC\u06C1",
"hdr.netSettings": "\u0627\u0639\u0644\u06CC\u0670 \u0646\u06CC\u0679 \u0648\u0631\u06A9 \u062A\u0631\u062A\u06CC\u0628\u0627\u062A",
"hdr.netSettingsTitle": "\u0627\u0639\u0644\u06CC\u0670 \u0646\u06CC\u0679 \u0648\u0631\u06A9 \u062A\u0631\u062A\u06CC\u0628\u0627\u062A (STUN/TURN)",
"hdr.disconnect": "\u0645\u0646\u0642\u0637\u0639 \u06A9\u0631\u06CC\u06BA",
"status.connected": "\u062C\u0691\u0627 \u06C1\u0648\u0627",
"status.connecting": "\u062C\u0648\u0691\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2...",
"status.notConnected": "\u062C\u0691\u0627 \u06C1\u0648\u0627 \u0646\u06C1\u06CC\u06BA",
"status.reconnecting": "\u062F\u0648\u0628\u0627\u0631\u06C1 \u062C\u0648\u0691\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2...",
"status.retrying": "\u062F\u0648\u0628\u0627\u0631\u06C1 \u06A9\u0648\u0634\u0634...",
"status.verifying": "\u062A\u0635\u062F\u06CC\u0642 \u062C\u0627\u0631\u06CC...",
"status.peerDisconnected": "\u0633\u0627\u062A\u06BE\u06CC \u0645\u0646\u0642\u0637\u0639 \u06C1\u0648 \u06AF\u06CC\u0627",
"sec.replayProtection": "\u0628\u0627\u0632\u06AF\u0634\u062A \u0633\u06D2 \u062A\u062D\u0641\u0638",
"sec.messageIntegrity": "\u067E\u06CC\u063A\u0627\u0645 \u06A9\u06CC \u0633\u0627\u0644\u0645\u06CC\u062A (HMAC)",
"sec.forwardSecrecy": "\u0645\u06A9\u0645\u0644 \u0641\u0627\u0631\u0648\u0631\u0688 \u0633\u06CC\u06A9\u0631\u0633\u06CC",
"sec.metadataProtection": "\u0645\u06CC\u0679\u0627 \u0688\u06CC\u0679\u0627 \u06A9\u0627 \u062A\u062D\u0641\u0638",
"sec.trafficObfuscation": "\u0679\u0631\u06CC\u0641\u06A9 \u06A9\u06CC \u062F\u06BE\u0646\u062F\u0644\u0627\u06C1\u0679",
"sec.realTests": "\u062D\u0642\u06CC\u0642\u06CC \u062E\u0641\u06CC\u06C1 \u0646\u06AF\u0627\u0631\u06CC \u06A9\u06D2 \u062A\u062C\u0631\u0628\u0627\u062A",
"sec.simulatedData": "\u0645\u0635\u0646\u0648\u0639\u06CC \u0688\u06CC\u0679\u0627",
"sec.testPassed": "\u062A\u062C\u0631\u0628\u06C1 \u06A9\u0627\u0645\u06CC\u0627\u0628",
"sec.testFailed": "\u062A\u062C\u0631\u0628\u06C1 \u0646\u0627\u06A9\u0627\u0645 \u06CC\u0627 \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA",
"sec.verificationDone": "\u062D\u0642\u06CC\u0642\u06CC \u062E\u0641\u06CC\u06C1 \u0646\u06AF\u0627\u0631\u06CC \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u0645\u06A9\u0645\u0644 \u06C1\u0648\u0626\u06CC",
"sec.verificationInProgress": "\u062D\u0641\u0627\u0638\u062A\u06CC \u062A\u0635\u062F\u06CC\u0642 \u062C\u0627\u0631\u06CC \u06C1\u06D2...",
"sec.verificationWait": "\u062D\u0641\u0627\u0638\u062A\u06CC \u062A\u0635\u062F\u06CC\u0642 \u062C\u0627\u0631\u06CC \u06C1\u06D2...\n\u0628\u0631\u0627\u06C1\u0650 \u06A9\u0631\u0645 \u0641\u0648\u0631\u06CC \u062E\u0641\u06CC\u06C1 \u0646\u06AF\u0627\u0631\u06CC \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u0645\u06A9\u0645\u0644 \u06C1\u0648\u0646\u06D2 \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631 \u06A9\u0631\u06CC\u06BA\u06D4",
"sec.verificationUnavailable": "\u062D\u0641\u0627\u0638\u062A\u06CC \u062A\u0635\u062F\u06CC\u0642 \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA",
"chat.placeholder": "\u062E\u0641\u06CC\u06C1 \u067E\u06CC\u063A\u0627\u0645 \u0644\u06A9\u06BE\u06CC\u06BA\u2026",
"chat.send": "\u067E\u06CC\u063A\u0627\u0645 \u0628\u06BE\u06CC\u062C\u06CC\u06BA",
"chat.sendFiles": "\u0641\u0627\u0626\u0644\u06CC\u06BA \u0628\u06BE\u06CC\u062C\u06CC\u06BA",
"chat.hideFiles": "\u0641\u0627\u0626\u0644\u06CC\u06BA \u0686\u06BE\u067E\u0627\u0626\u06CC\u06BA",
"chat.recordVoice": "\u0635\u0648\u062A\u06CC \u067E\u06CC\u063A\u0627\u0645 \u0631\u06CC\u06A9\u0627\u0631\u0688 \u06A9\u0631\u06CC\u06BA",
"chat.sendVoice": "\u0635\u0648\u062A\u06CC \u067E\u06CC\u063A\u0627\u0645 \u0628\u06BE\u06CC\u062C\u06CC\u06BA",
"chat.discard": "\u0636\u0627\u0626\u0639 \u06A9\u0631\u06CC\u06BA",
"chat.codeBlock": "\u06A9\u0648\u0688 \u0628\u0644\u0627\u06A9 \u06A9\u06D2 \u0637\u0648\u0631 \u067E\u0631 \u0628\u06BE\u06CC\u062C\u06CC\u06BA (\u062E\u0627\u0646\u06C1 \u0628\u0691\u0627 \u06C1\u0648 \u062C\u0627\u062A\u0627 \u06C1\u06D2)",
"chat.codeHint": "\u06A9\u0648\u0688 \u06A9\u0627 \u0679\u06A9\u0691\u0627 \xB7 \u062A\u0631\u062A\u06CC\u0628 \u0645\u062D\u0641\u0648\u0638 \xB7 \u0628\u06BE\u06CC\u062C\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u2318\u21B5",
"chat.viewOnce": "\u0627\u06CC\u06A9 \u0628\u0627\u0631 \u062F\u06CC\u06A9\u06BE\u06CC\u06BA",
"chat.viewOnceTitle": "\u0627\u06CC\u06A9 \u0628\u0627\u0631 \u062F\u06CC\u06A9\u06BE\u06CC\u06BA - \u0633\u0627\u062A\u06BE\u06CC \u06A9\u06D2 \u067E\u0691\u06BE\u062A\u06D2 \u06C1\u06CC \u063A\u0627\u0626\u0628",
"chat.viewOncePrefix": "\u0627\u06CC\u06A9 \u0628\u0627\u0631 \u062F\u06CC\u06A9\u06BE\u06CC\u06BA \xB7 ",
"chat.viewOnceTap": "\u0627\u06CC\u06A9 \u0628\u0627\u0631 \u062F\u06CC\u06A9\u06BE\u06CC\u06BA \xB7 \u062F\u06A9\u06BE\u0627\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u062F\u0628\u0627\u0626\u06CC\u06BA",
"chat.viewedOnce": "\u0627\u06CC\u06A9 \u0628\u0627\u0631 \u062F\u06CC\u06A9\u06BE\u0627 \u06AF\u06CC\u0627",
"chat.disappearing": "\u063A\u0627\u0626\u0628 \u06C1\u0648\u0646\u06D2 \u0648\u0627\u0644\u0627 \u067E\u06CC\u063A\u0627\u0645 - \u062F\u0648\u0646\u0648\u06BA \u0637\u0631\u0641 \u0633\u06D2 \u062D\u0630\u0641",
"chat.disappearAfter": "\u0627\u0633 \u06A9\u06D2 \u0628\u0639\u062F \u063A\u0627\u0626\u0628",
"chat.visibleFor": "\u0627\u062A\u0646\u06CC \u062F\u06CC\u0631 \u0646\u0638\u0631 \u0622\u0626\u06D2 \u06AF\u0627",
"chat.timerPrefix": "\u0679\u0627\u0626\u0645\u0631 \xB7 ",
"chat.expired": "\u0627\u0633 \u067E\u06CC\u063A\u0627\u0645 \u06A9\u06CC \u0645\u06CC\u0639\u0627\u062F \u062E\u062A\u0645 \u06C1\u0648 \u0686\u06A9\u06CC \u06C1\u06D2",
"chat.deleteForEveryone": "\u0633\u0628 \u06A9\u06D2 \u0644\u06CC\u06D2 \u062D\u0630\u0641 \u06A9\u0631\u06CC\u06BA",
"chat.sending": "\u0628\u06BE\u06CC\u062C\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2",
"chat.delivered": "\u067E\u06C1\u0646\u0686 \u06AF\u06CC\u0627",
"chat.notSent": "\u0646\u06C1\u06CC\u06BA \u0628\u06BE\u06CC\u062C\u0627 \u06AF\u06CC\u0627",
"chat.notSentReason": "\u0646\u06C1\u06CC\u06BA \u0628\u06BE\u06CC\u062C\u0627 \u06AF\u06CC\u0627 - \u0645\u062D\u0641\u0648\u0638 \u0686\u06CC\u0646\u0644 \u062A\u06CC\u0627\u0631 \u0646\u06C1\u06CC\u06BA\u06D4 \u062C\u0627\u0631\u06CC \u0631\u06A9\u06BE\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u062F\u0648\u0628\u0627\u0631\u06C1 \u062C\u0691\u06CC\u06BA\u06D4",
"chat.encrypted": "\u062E\u0641\u06CC\u06C1",
"chat.decrypted": "\u06A9\u06BE\u0648\u0644\u0627 \u06AF\u06CC\u0627",
"chat.encryptedOnDevice": "\u0622\u067E \u06A9\u06D2 \u0622\u0644\u06D2 \u067E\u0631 \u062E\u0641\u06CC\u06C1 \u06A9\u06CC\u0627 \u06AF\u06CC\u0627",
"chat.uploading": "\u0627\u067E \u0644\u0648\u0688 \u062C\u0627\u0631\u06CC",
"chat.downloading": "\u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u062C\u0627\u0631\u06CC",
"chat.transferring": "\u0645\u0646\u062A\u0642\u0644\u06CC \u062C\u0627\u0631\u06CC\u2026",
"chat.copied": "\u0646\u0642\u0644 \u06C1\u0648 \u06AF\u06CC\u0627!",
"chat.collapse": "\u0633\u0645\u06CC\u0679\u06CC\u06BA",
"chat.closeMenu": "\u0645\u06CC\u0646\u0648 \u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",
"chat.newChat": "\u0646\u0626\u06CC \u06AF\u0641\u062A\u06AF\u0648",
"chat.newGroup": "\u0646\u06CC\u0627 \u06AF\u0631\u0648\u06C1",
"chat.createGroup": "\u06AF\u0631\u0648\u06C1 \u0628\u0646\u0627\u0626\u06CC\u06BA",
"chat.groupChats": "\u06AF\u0631\u0648\u06C1\u06CC \u06AF\u0641\u062A\u06AF\u0648",
"chat.secureChat": "\u0645\u062D\u0641\u0648\u0638 \u06AF\u0641\u062A\u06AF\u0648",
"chat.nameThis": "\u0627\u0633 \u06AF\u0641\u062A\u06AF\u0648 \u06A9\u0648 \u0646\u0627\u0645 \u062F\u06CC\u06BA",
"chat.rename": "\u06AF\u0641\u062A\u06AF\u0648 \u06A9\u0627 \u0646\u0627\u0645 \u0628\u062F\u0644\u06CC\u06BA (\u0635\u0631\u0641 \u0645\u0642\u0627\u0645\u06CC)",
"chat.renameHint": "\u0646\u0627\u0645 \u0628\u062F\u0644\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u062F\u0648 \u0628\u0627\u0631 \u062F\u0628\u0627\u0626\u06CC\u06BA",
"chat.localLabel": "\u0645\u0642\u0627\u0645\u06CC \u0639\u0646\u0648\u0627\u0646 \xB7 \u0635\u0631\u0641 \u0627\u0633\u06CC \u0622\u0644\u06D2 \u067E\u0631 \u0645\u062D\u0641\u0648\u0638",
"chat.setStatus": "\u0627\u067E\u0646\u06CC \u062D\u0627\u0644\u062A \u0645\u0642\u0631\u0631 \u06A9\u0631\u06CC\u06BA",
"chat.yourStatusPrefix": "\u0622\u067E \u06A9\u06CC \u062D\u0627\u0644\u062A - ",
"chat.meshHint": "\u200F8 \u0633\u0627\u062A\u06BE\u06CC\u0648\u06BA \u062A\u06A9 \xB7 \u06C1\u0645\u200C\u0633\u0637\u062D \u062C\u0627\u0644",
"chat.offline": "\u0622\u0641 \u0644\u0627\u0626\u0646",
"chat.noNetwork": "\u0646\u06CC\u0679 \u0648\u0631\u06A9 \u0646\u06C1\u06CC\u06BA \xB7 \u062F\u0648\u0628\u0627\u0631\u06C1 \u062C\u0691\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2",
"chat.startVoiceCall": "\u062E\u0641\u06CC\u06C1 \u0635\u0648\u062A\u06CC \u06A9\u0627\u0644 \u0634\u0631\u0648\u0639 \u06A9\u0631\u06CC\u06BA",
"chat.startVideoCall": "\u062E\u0641\u06CC\u06C1 \u0648\u06CC\u0688\u06CC\u0648 \u06A9\u0627\u0644 \u0634\u0631\u0648\u0639 \u06A9\u0631\u06CC\u06BA",
"chat.verifyForCalls": "\u06A9\u0627\u0644\u06CC\u06BA \u0686\u0627\u0644\u0648 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0633\u06CC\u0634\u0646 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u0631\u06CC\u06BA",
"chat.e2eeNote": "\u06C1\u0631 \u067E\u06CC\u063A\u0627\u0645 \u0622\u067E \u06A9\u06D2 \u0622\u0644\u06D2 \u0633\u06D2 \u0646\u06A9\u0644\u0646\u06D2 \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u062E\u0641\u06CC\u06C1 \u06A9\u06CC\u0627 \u062C\u0627\u062A\u0627 \u06C1\u06D2\u06D4",
"chat.peersOnly": "\u0635\u0631\u0641 \u062C\u0691\u06D2 \u06C1\u0648\u0626\u06D2 \u0633\u0627\u062A\u06BE\u06CC\u0648\u06BA \u06A9\u0648 \u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u0628\u06BE\u06CC\u062C\u0627 \u062C\u0627\u062A\u0627 \u06C1\u06D2 - \u06A9\u0628\u06BE\u06CC \u0633\u0631\u0648\u0631 \u067E\u0631 \u0630\u062E\u06CC\u0631\u06C1 \u0646\u06C1\u06CC\u06BA \u06C1\u0648\u062A\u0627\u06D4",
"flow.invitationCreated": "\u0645\u062D\u0641\u0648\u0638 \u062F\u0639\u0648\u062A \u0628\u0646 \u06AF\u0626\u06CC",
"flow.invitationCreatedBang": "\u0645\u062D\u0641\u0648\u0638 \u062F\u0639\u0648\u062A \u0628\u0646 \u06A9\u0631 \u062E\u0641\u06CC\u06C1 \u06C1\u0648 \u06AF\u0626\u06CC!",
"flow.responseCreated": "\u0645\u062D\u0641\u0648\u0638 \u062C\u0648\u0627\u0628 \u0628\u0646 \u06AF\u06CC\u0627",
"flow.responseCreatedBang": "\u0645\u062D\u0641\u0648\u0638 \u062C\u0648\u0627\u0628 \u0628\u0646 \u06AF\u06CC\u0627!",
"flow.sendInvitation": "\u062F\u0639\u0648\u062A\u06CC \u06A9\u0648\u0688 \u0627\u067E\u0646\u06D2 \u0645\u062E\u0627\u0637\u0628 \u06A9\u0648 \u06A9\u0633\u06CC \u0645\u062D\u0641\u0648\u0638 \u0630\u0631\u06CC\u0639\u06D2 (\u0635\u0648\u062A\u06CC \u06A9\u0627\u0644\u060C \u0627\u06CC\u0633 \u0627\u06CC\u0645 \u0627\u06CC\u0633 \u0648\u063A\u06CC\u0631\u06C1) \u0633\u06D2 \u0628\u06BE\u06CC\u062C\u06CC\u06BA\u06D4",
"flow.sendResponse": "\u062C\u0648\u0627\u0628\u06CC \u06A9\u0648\u0688 \u0622\u063A\u0627\u0632 \u06A9\u0631\u0646\u06D2 \u0648\u0627\u0644\u06D2 \u06A9\u0648 \u0645\u062D\u0641\u0648\u0638 \u0630\u0631\u06CC\u0639\u06D2 \u0633\u06D2 \u0628\u06BE\u06CC\u062C\u06CC\u06BA \u06CC\u0627 \u0627\u0646\u06C1\u06CC\u06BA \u0646\u06CC\u0686\u06D2 \u062F\u06CC\u0627 QR \u06A9\u0648\u0688 \u067E\u0691\u06BE\u0646\u06D2 \u062F\u06CC\u06BA\u06D4",
"flow.sendEncryptedCode": "\u062E\u0641\u06CC\u06C1 \u06A9\u0648\u0688 \u0628\u06BE\u06CC\u062C\u06CC\u06BA",
"flow.sendTheResponse": "\u062C\u0648\u0627\u0628 \u0628\u06BE\u06CC\u062C\u06CC\u06BA",
"flow.pasteOrWrite": "\u06A9\u0648\u0688 \u0686\u0633\u067E\u0627\u06BA \u06A9\u0631\u06CC\u06BA \u06CC\u0627 \u0644\u06A9\u06BE\u06CC\u06BA\u2026",
"flow.processingInvitation": "\u0645\u062D\u0641\u0648\u0638 \u062F\u0639\u0648\u062A \u067E\u0631 \u06A9\u0627\u0631\u0631\u0648\u0627\u0626\u06CC \u062C\u0627\u0631\u06CC...",
"flow.processingResponse": "\u0645\u062D\u0641\u0648\u0638 \u062C\u0648\u0627\u0628 \u067E\u0631 \u06A9\u0627\u0631\u0631\u0648\u0627\u0626\u06CC \u062C\u0627\u0631\u06CC...",
"flow.finalizing": "\u0645\u062D\u0641\u0648\u0638 \u0627\u062A\u0635\u0627\u0644 \u06A9\u0648 \u062D\u062A\u0645\u06CC \u0634\u06A9\u0644 \u062F\u06CC \u062C\u0627 \u0631\u06C1\u06CC \u06C1\u06D2...",
"flow.channelEstablished": "\u0645\u062D\u0641\u0648\u0638 \u0686\u06CC\u0646\u0644 \u0642\u0627\u0626\u0645 \u06C1\u0648 \u06AF\u06CC\u0627",
"flow.channelReady": "\u0645\u062D\u0641\u0648\u0638 \u0686\u06CC\u0646\u0644 \u062A\u06CC\u0627\u0631 \u06C1\u06D2",
"flow.restoring": "\u0627\u062A\u0635\u0627\u0644 \u0628\u062D\u0627\u0644 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2\u2026",
"flow.invitationCaptured": "\u062F\u0639\u0648\u062A \u067E\u06A9\u0691 \u0644\u06CC \u06AF\u0626\u06CC\u06D4",
"err.needInvitation": "\u0622\u067E \u06A9\u0648 \u0627\u067E\u0646\u06D2 \u0645\u062E\u0627\u0637\u0628 \u0633\u06D2 \u0645\u0644\u0627 \u062F\u0639\u0648\u062A\u06CC \u06A9\u0648\u0688 \u0686\u0633\u067E\u0627\u06BA \u06A9\u0631\u0646\u0627 \u06C1\u0648\u06AF\u0627\u06D4",
"err.needResponse": "\u0622\u067E \u06A9\u0648 \u0627\u067E\u0646\u06D2 \u0645\u062E\u0627\u0637\u0628 \u0633\u06D2 \u0645\u0644\u0627 \u062C\u0648\u0627\u0628\u06CC \u06A9\u0648\u0688 \u0686\u0633\u067E\u0627\u06BA \u06A9\u0631\u0646\u0627 \u06C1\u0648\u06AF\u0627\u06D4",
"err.responseFormat": "\u062C\u0648\u0627\u0628 \u06A9\u06CC \u0633\u0627\u062E\u062A \u063A\u0644\u0637 \u06C1\u06D2 - \u06A9\u0648\u0688 \u062C\u0627\u0646\u0686\u06CC\u06BA",
"err.responseNoKey": "\u062C\u0648\u0627\u0628\u06CC \u06A9\u0648\u0688 \u063A\u0644\u0637 \u06C1\u06D2 - \u062E\u0641\u06CC\u06C1 \u0646\u06AF\u0627\u0631\u06CC \u06A9\u06CC \u06A9\u0644\u06CC\u062F \u063A\u0627\u0626\u0628 \u06CC\u0627 \u062E\u0631\u0627\u0628 \u06C1\u06D2\u06D4 \u06A9\u0648\u0688 \u062C\u0627\u0646\u0686 \u06A9\u0631 \u062F\u0648\u0628\u0627\u0631\u06C1 \u06A9\u0648\u0634\u0634 \u06A9\u0631\u06CC\u06BA\u06D4",
"err.responseNoSignKey": "\u062C\u0648\u0627\u0628\u06CC \u06A9\u0648\u0688 \u063A\u0644\u0637 \u06C1\u06D2 - \u062F\u0633\u062A\u062E\u0637 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u06CC \u06A9\u0644\u06CC\u062F \u063A\u0627\u0626\u0628 \u06C1\u06D2\u06D4 \u06A9\u0648\u0688 \u062C\u0627\u0646\u0686 \u06A9\u0631 \u062F\u0648\u0628\u0627\u0631\u06C1 \u06A9\u0648\u0634\u0634 \u06A9\u0631\u06CC\u06BA\u06D4",
"err.responseOutdated": "\u062C\u0648\u0627\u0628\u06CC \u0688\u06CC\u0679\u0627 \u067E\u0631\u0627\u0646\u0627 \u06C1\u06D2 - \u0628\u0631\u0627\u06C1\u0650 \u06A9\u0631\u0645 \u0646\u0626\u06CC \u062F\u0639\u0648\u062A \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06A9\u0631\u06CC\u06BA",
"err.setupError": "\u0627\u062A\u0635\u0627\u0644 \u0642\u0627\u0626\u0645 \u06A9\u0631\u0646\u06D2 \u0645\u06CC\u06BA \u062E\u0631\u0627\u0628\u06CC",
"err.notReady": "\u0627\u062A\u0635\u0627\u0644 \u062A\u06CC\u0627\u0631 \u0646\u06C1\u06CC\u06BA",
"err.securityBreach": "\u062D\u0641\u0627\u0638\u062A\u06CC \u062E\u0644\u0627\u0641 \u0648\u0631\u0632\u06CC \u06A9\u0627 \u067E\u062A\u0627 \u0686\u0644\u0627 - \u0627\u062A\u0635\u0627\u0644 \u0631\u062F \u06A9\u0631 \u062F\u06CC\u0627 \u06AF\u06CC\u0627",
"err.securityValidation": "\u062D\u0641\u0627\u0638\u062A\u06CC \u062A\u0648\u062B\u06CC\u0642 \u0646\u0627\u06A9\u0627\u0645 - \u0645\u0645\u06A9\u0646\u06C1 \u062D\u0645\u0644\u06D2 \u06A9\u0627 \u067E\u062A\u0627 \u0686\u0644\u0627",
"err.retiredQr": "\u06CC\u06C1 QR \u06A9\u0648\u0688 \u0645\u062A\u0631\u0648\u06A9 \u0633\u0627\u062E\u062A \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06A9\u0631\u062A\u0627 \u06C1\u06D2 \u062C\u0648 \u062F\u0639\u0648\u062A \u0645\u0646\u062A\u0642\u0644 \u0646\u06C1 \u06A9\u0631 \u0633\u06A9\u06CC\u06D4 \u0633\u0627\u062A\u06BE\u06CC \u0633\u06D2 \u0646\u06CC\u0627 \u0628\u0646\u0627\u0646\u06D2 \u06A9\u0648 \u06A9\u06C1\u06CC\u06BA\u060C \u06CC\u0627 \u0646\u0642\u0644 \u0648 \u0686\u0633\u067E\u0627\u06BA \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06A9\u0631\u06CC\u06BA\u06D4",
"err.compressedQrNote": "\u062F\u0628\u0627\u06CC\u0627 \u06C1\u0648\u0627 QR \u0627\u062E\u062A\u0635\u0627\u0631 \u06A9\u06D2 \u0644\u06CC\u06D2 SDP \u0686\u06BE\u0648\u0691 \u0633\u06A9\u062A\u0627 \u06C1\u06D2\u06D4 \u0627\u062A\u0635\u0627\u0644 \u0646\u0627\u06A9\u0627\u0645 \u06C1\u0648 \u062A\u0648 \u0646\u0642\u0644 \u0648 \u0686\u0633\u067E\u0627\u06BA \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06A9\u0631\u06CC\u06BA\u06D4",
"err.inviteNotConnected": "\u062F\u0639\u0648\u062A \u0646\u06C1\u06CC\u06BA \u0628\u06BE\u06CC\u062C\u06CC \u062C\u0627 \u0633\u06A9\u06CC\u06D4 \u0648\u06C1 \u06AF\u0641\u062A\u06AF\u0648 \u0627\u0633 \u0648\u0642\u062A \u062C\u0691\u06CC \u06C1\u0648\u0626\u06CC \u0646\u06C1\u06CC\u06BA\u06D4",
"err.inviteNotConnectedRetry": "\u062F\u0639\u0648\u062A \u0646\u06C1\u06CC\u06BA \u0628\u06BE\u06CC\u062C\u06CC \u062C\u0627 \u0633\u06A9\u06CC\u06D4 \u0648\u06C1 \u06AF\u0641\u062A\u06AF\u0648 \u0627\u0633 \u0648\u0642\u062A \u062C\u0691\u06CC \u06C1\u0648\u0626\u06CC \u0646\u06C1\u06CC\u06BA - \u062F\u0648\u0628\u0627\u0631\u06C1 \u06A9\u06BE\u0648\u0644 \u06A9\u0631 \u06A9\u0648\u0634\u0634 \u06A9\u0631\u06CC\u06BA\u06D4",
"err.nobodyAccepted": "\u06A9\u0633\u06CC \u0646\u06D2 \u062F\u0639\u0648\u062A \u0642\u0628\u0648\u0644 \u0646\u06C1\u06CC\u06BA \u06A9\u06CC\u06D4 \u06AF\u0631\u0648\u06C1 \u062C\u0648\u06BA \u06A9\u0627 \u062A\u0648\u06BA \u06C1\u06D2\u06D4",
"err.noAudio": "\u06A9\u0648\u0626\u06CC \u0622\u0648\u0627\u0632 \u0631\u06CC\u06A9\u0627\u0631\u0688 \u0646\u06C1\u06CC\u06BA \u06C1\u0648\u0626\u06CC - \u0645\u0627\u0626\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u06A9\u06CC \u0627\u062C\u0627\u0632\u062A \u062C\u0627\u0646\u0686 \u06A9\u0631 \u062F\u0648\u0628\u0627\u0631\u06C1 \u06A9\u0648\u0634\u0634 \u06A9\u0631\u06CC\u06BA\u06D4",
"err.voiceNeedsConnection": "\u0635\u0648\u062A\u06CC \u067E\u06CC\u063A\u0627\u0645 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0641\u0639\u0627\u0644 \u0645\u062D\u0641\u0648\u0638 \u0627\u062A\u0635\u0627\u0644 \u062F\u0631\u06A9\u0627\u0631 \u06C1\u06D2\u06D4 \u062F\u0648\u0628\u0627\u0631\u06C1 \u062C\u0691 \u06A9\u0631 \u06A9\u0648\u0634\u0634 \u06A9\u0631\u06CC\u06BA\u06D4",
"err.voiceRestoring": "\u0627\u062A\u0635\u0627\u0644 \u0628\u062D\u0627\u0644 \u06C1\u0648 \u0631\u06C1\u0627 \u06C1\u06D2 - \u0644\u0645\u062D\u06C1 \u0628\u06BE\u0631 \u0628\u0639\u062F \u0635\u0648\u062A\u06CC \u067E\u06CC\u063A\u0627\u0645 \u062F\u0648\u0628\u0627\u0631\u06C1 \u0628\u06BE\u06CC\u062C\u06CC\u06BA\u06D4",
"err.fileTooLarge": "\u0641\u0627\u0626\u0644 \u0628\u06C1\u062A \u0628\u0691\u06CC \u06C1\u06D2",
"sas.safetyNumber": "\u062D\u0641\u0627\u0638\u062A\u06CC \u0646\u0645\u0628\u0631",
"sas.incorrect": "\u06A9\u0648\u0688 \u063A\u0644\u0637 \u06C1\u06D2\u06D4 \u0627\u0633\u06D2 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u062C\u0627\u0646\u0686 \u06A9\u0631 \u062F\u0648\u0628\u0627\u0631\u06C1 \u06A9\u0648\u0634\u0634 \u06A9\u0631\u06CC\u06BA\u06D4",
"sas.noMatch": "\u06A9\u0648\u0688 \u0622\u067E\u0633 \u0645\u06CC\u06BA \u0646\u06C1\u06CC\u06BA \u0645\u0644\u062A\u06D2",
"sas.makeSure": "\u06CC\u0642\u06CC\u0646 \u06A9\u0631 \u0644\u06CC\u06BA \u06A9\u06C1 \u06A9\u0648\u0688 \u0628\u0627\u0644\u06A9\u0644 \u0627\u06CC\u06A9 \u062C\u06CC\u0633\u06D2 \u06C1\u06CC\u06BA\u06D4",
"sas.tooManyAttempts": "\u0628\u06C1\u062A \u0632\u06CC\u0627\u062F\u06C1 \u063A\u0644\u0637 \u06A9\u0648\u0634\u0634\u06CC\u06BA\u06D4 \u062D\u0641\u0627\u0638\u062A \u06A9\u06D2 \u0644\u06CC\u06D2 \u0633\u06CC\u0634\u0646 \u062F\u0648\u0628\u0627\u0631\u06C1 \u062A\u0631\u062A\u06CC\u0628 \u062F\u06CC\u0627 \u06AF\u06CC\u0627\u06D4",
"sas.verificationFailed": "\u062A\u0635\u062F\u06CC\u0642 \u0646\u0627\u06A9\u0627\u0645",
"sas.verified": "\u062A\u0635\u062F\u06CC\u0642 \u0634\u062F\u06C1 \xB7 \u0645\u06A9\u0645\u0644 \u0641\u0627\u0631\u0648\u0631\u0688 \u0633\u06CC\u06A9\u0631\u0633\u06CC",
"sas.runVerification": "\u062D\u0641\u0627\u0638\u062A\u06CC \u062A\u0635\u062F\u06CC\u0642 \u0686\u0644\u0627\u0626\u06CC\u06BA",
"sec.panelTitle": "\u0646\u06CC\u0679 \u0648\u0631\u06A9 \u0627\u0648\u0631 \u062E\u0641\u06CC\u06C1 \u0646\u06AF\u0627\u0631\u06CC \u06A9\u06CC \u062A\u0641\u0635\u06CC\u0644",
"sec.security": "\u0633\u0644\u0627\u0645\u062A\u06CC",
"sec.transport": "\u062A\u0631\u0633\u06CC\u0644",
"sec.keyExchange": "\u06A9\u0644\u06CC\u062F \u062A\u0628\u0627\u062F\u0644\u06C1",
"sec.allEnabled": "\u062A\u0645\u0627\u0645 \u062D\u0641\u0627\u0638\u062A\u06CC \u062E\u0635\u0648\u0635\u06CC\u0627\u062A \u0637\u06D2 \u0634\u062F\u06C1 \u0637\u0648\u0631 \u067E\u0631 \u0686\u0627\u0644\u0648 \u06C1\u06CC\u06BA",
"sec.realTimeNote": "\u062D\u0642\u06CC\u0642\u06CC \u062E\u0641\u06CC\u06C1 \u0646\u06AF\u0627\u0631\u06CC \u06A9\u06D2 \u0627\u0641\u0639\u0627\u0644 \u0633\u06D2 \u0641\u0648\u0631\u06CC \u062A\u0635\u062F\u06CC\u0642 - \u06A9\u0648\u0626\u06CC \u062C\u0639\u0644\u06CC \u0688\u06CC\u0679\u0627 \u0646\u06C1\u06CC\u06BA\u06D4",
"sec.simulatedWarning": "\u0627\u0646\u062A\u0628\u0627\u06C1: \u0645\u0645\u06A9\u0646 \u06C1\u06D2 \u0627\u062A\u0635\u0627\u0644 \u0645\u06A9\u0645\u0644 \u0642\u0627\u0626\u0645 \u0646\u06C1 \u06C1\u0648\u0627 \u06C1\u0648 - \u0627\u0642\u062F\u0627\u0631 \u0645\u0635\u0646\u0648\u0639\u06CC \u06C1\u0648 \u0633\u06A9\u062A\u06CC \u06C1\u06CC\u06BA\u06D4",
"dl.title": "\u200FSecureBit \u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u06A9\u0631\u06CC\u06BA",
"dl.free": "\u0645\u0641\u062A \xB7 \u06A9\u06BE\u0644\u0627 \u0645\u0627\u062E\u0630",
"dl.soon": "\u0645\u0648\u0628\u0627\u0626\u0644 (iOS\u060C \u0627\u06CC\u0646\u0688\u0631\u0627\u0626\u06CC\u0688) \u0627\u0648\u0631 \u0628\u0631\u0627\u0624\u0632\u0631 \u0627\u0636\u0627\u0641\u06D2 (Chrome\u060C Firefox\u060C Opera) \u062C\u0644\u062F \u0622 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA\u06D4",
"chatHdr.chat": "\u06AF\u0641\u062A\u06AF\u0648",
"chatHdr.chats": "\u06AF\u0641\u062A\u06AF\u0648\u0626\u06CC\u06BA",
"chatHdr.newChat": "+ \u0646\u0626\u06CC",
"chatHdr.secure": "\u0645\u062D\u0641\u0648\u0638",
"chatHdr.p2pSub": "\u06C1\u0645\u200C\u0633\u0637\u062D \xB7 \u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u062E\u0641\u06CC\u06C1",
"chatHdr.save": "\u0645\u062D\u0641\u0648\u0638 \u06A9\u0631\u06CC\u06BA",
"chatHdr.close": "\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",
"chatHdr.expand": "\u0628\u0691\u0627 \u06A9\u0631\u06CC\u06BA",
"chatHdr.you": "\u0622\u067E",
"chatHdr.qrCode": "\u200FQR \u06A9\u0648\u0688",
"chat.disconnected": "\u0645\u0646\u0642\u0637\u0639",
"call.mute": "\u062E\u0627\u0645\u0648\u0634",
"call.endShort": "\u062E\u062A\u0645",
"group.add": "\u0634\u0627\u0645\u0644 \u06A9\u0631\u06CC\u06BA",
"group.send": "\u0628\u06BE\u06CC\u062C\u06CC\u06BA",
"sec.pfsShort": "\u0645\u06A9\u0645\u0644 \u0641\u0627\u0631\u0648\u0631\u0688 \u0633\u06CC\u06A9\u0631\u0633\u06CC",
"sec.cipher": "\u0633\u0627\u0626\u0641\u0631",
"chat.close": "\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",
"file.needConnection": "\u0641\u0627\u0626\u0644 \u0645\u0646\u062A\u0642\u0644\u06CC \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u06BE\u0644\u0627 \u0627\u062A\u0635\u0627\u0644 \u062F\u0631\u06A9\u0627\u0631 \u06C1\u06D2",
"presence.available": "\u062F\u0633\u062A\u06CC\u0627\u0628",
"presence.away": "\u062F\u0648\u0631",
"presence.busy": "\u0645\u0635\u0631\u0648\u0641",
"presence.offline": "\u0622\u0641 \u0644\u0627\u0626\u0646",
"presence.invisible": "\u067E\u0648\u0634\u06CC\u062F\u06C1",
"presence.availableDesc": "\u0622\u0646 \u0644\u0627\u0626\u0646 \u0627\u0648\u0631 \u062F\u0633\u062A\u06CC\u0627\u0628",
"presence.awayDesc": "\u0628\u06D2 \u06A9\u0627\u0631 \xB7 \u062A\u06BE\u0648\u0691\u06CC \u062F\u06CC\u0631 \u06A9\u06D2 \u0644\u06CC\u06D2 \u06AF\u06CC\u0627",
"presence.busyDesc": "\u0632\u062D\u0645\u062A \u0646\u06C1 \u062F\u06CC\u06BA",
"presence.invisibleDesc": "\u0633\u0627\u062A\u06BE\u06CC\u0648\u06BA \u06A9\u0648 \u0622\u0641 \u0644\u0627\u0626\u0646 \u062F\u06A9\u06BE\u0627\u0626\u06CC \u062F\u06CC\u06BA",
"presence.online": "\u0622\u0646 \u0644\u0627\u0626\u0646",
"conn.p2p": "\u06C1\u0645\u200C\u0633\u0637\u062D \xB7 \u062C\u0691\u0627 \u06C1\u0648\u0627",
"conn.verifying": "\u062A\u0635\u062F\u06CC\u0642 \u062C\u0627\u0631\u06CC\u2026",
"conn.connecting": "\u062C\u0648\u0691\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2\u2026",
"conn.reconnecting": "\u062F\u0648\u0628\u0627\u0631\u06C1 \u062C\u0648\u0691\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2\u2026",
"conn.peerDisconnected": "\u0633\u0627\u062A\u06BE\u06CC \u0645\u0646\u0642\u0637\u0639 \u06C1\u0648 \u06AF\u06CC\u0627",
"conn.disconnected": "\u0645\u0646\u0642\u0637\u0639",
"chat.defaultLabel": "\u06AF\u0641\u062A\u06AF\u0648",
"groupPhase.forming": "\u062A\u0634\u06A9\u06CC\u0644 \u062C\u0627\u0631\u06CC\u2026",
"groupPhase.commitments": "\u0639\u06C1\u062F\u0648\u06BA \u06A9\u0627 \u062A\u0628\u0627\u062F\u0644\u06C1\u2026",
"groupPhase.revealing": "\u0627\u0641\u0634\u0627 \u062C\u0627\u0631\u06CC\u2026",
"groupPhase.compare": "\u06AF\u0631\u0648\u06C1\u06CC \u06A9\u0648\u0688 \u0645\u0644\u0627\u0626\u06CC\u06BA",
"groupPhase.ready": "\u06AF\u0631\u0648\u06C1 \u062A\u06CC\u0627\u0631",
"groupPhase.failed": "\u06AF\u0631\u0648\u06C1 \u0646\u0627\u06A9\u0627\u0645",
"call.qualityGood": "\u0627\u0686\u06BE\u0627",
"call.qualityFair": "\u0645\u0646\u0627\u0633\u0628",
"call.qualityWeak": "\u06A9\u0645\u0632\u0648\u0631",
"msg.code": "\u06A9\u0648\u0688",
"msg.timer": "\u0679\u0627\u0626\u0645\u0631",
"msg.voice": "\u0622\u0648\u0627\u0632",
"msg.play": "\u0686\u0644\u0627\u0626\u06CC\u06BA",
"msg.sent": "\u0628\u06BE\u06CC\u062C\u0627 \u06AF\u06CC\u0627",
"msg.read": "\u067E\u0691\u06BE\u0627 \u06AF\u06CC\u0627",
"report.title": "\u0641\u0648\u0631\u06CC \u062D\u0641\u0627\u0638\u062A\u06CC \u062A\u0635\u062F\u06CC\u0642",
"report.active": "\u0641\u0639\u0627\u0644",
"report.testsPassed": "\u06A9\u0627\u0645\u06CC\u0627\u0628 \u062A\u062C\u0631\u0628\u0627\u062A",
"report.verifiedAt": "\u062A\u0635\u062F\u06CC\u0642 \u06A9\u0627 \u0648\u0642\u062A",
"report.source": "\u0645\u0627\u062E\u0630",
"secTest.verifyECDHKeyExchange": "\u200FECDH \u06A9\u0644\u06CC\u062F \u062A\u0628\u0627\u062F\u0644\u06C1",
"secTest.verifyECDSASignatures": "\u200FECDSA \u0688\u06CC\u062C\u06CC\u0679\u0644 \u062F\u0633\u062A\u062E\u0637",
"secTest.verifyEncryption": "\u200FAES-GCM \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC",
"secTest.verifyMessageIntegrity": "\u067E\u06CC\u063A\u0627\u0645 \u06A9\u06CC \u0633\u0627\u0644\u0645\u06CC\u062A",
"secTest.verifyPerfectForwardSecrecy": "\u0645\u06A9\u0645\u0644 \u0641\u0627\u0631\u0648\u0631\u0688 \u0633\u06CC\u06A9\u0631\u0633\u06CC",
"secTest.verifyPFS": "\u0645\u06A9\u0645\u0644 \u0641\u0627\u0631\u0648\u0631\u0688 \u0633\u06CC\u06A9\u0631\u0633\u06CC",
"secTest.verifyReplayProtection": "\u0628\u0627\u0632\u06AF\u0634\u062A \u0633\u06D2 \u062A\u062D\u0641\u0638",
"secTest.verifyDTLSFingerprint": "\u200FDTLS \u0646\u0642\u0634\u0650 \u0627\u0646\u06AF\u0634\u062A",
"secTest.verifySASVerification": "\u200FSAS \u062A\u0635\u062F\u06CC\u0642",
"secTest.verifyMetadataProtection": "\u0645\u06CC\u0679\u0627 \u0688\u06CC\u0679\u0627 \u06A9\u0627 \u062A\u062D\u0641\u0638",
"secTest.verifyTrafficObfuscation": "\u0679\u0631\u06CC\u0641\u06A9 \u06A9\u06CC \u062F\u06BE\u0646\u062F\u0644\u0627\u06C1\u0679",
"secTest.verifyPacketPadding": "\u067E\u06CC\u06A9\u0679 \u0628\u06BE\u0631\u062A\u06CC",
"secTest.verifyNestedEncryption": "\u0645\u062A\u062F\u0627\u062E\u0644 \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC",
"secTest.verifyNonExtractableKeys": "\u0646\u0627\u0642\u0627\u0628\u0644\u0650 \u0627\u0633\u062A\u062E\u0631\u0627\u062C \u06A9\u0644\u06CC\u062F\u06CC\u06BA",
"secTest.verifyRateLimiting": "\u0634\u0631\u062D \u06A9\u06CC \u062D\u062F \u0628\u0646\u062F\u06CC",
"secTest.verifyMutualAuth": "\u0628\u0627\u06C1\u0645\u06CC \u062A\u0648\u062B\u06CC\u0642",
"secTest.verifyAuthProof": "\u062A\u0648\u062B\u06CC\u0642 \u06A9\u0627 \u062B\u0628\u0648\u062A",
"secTest.verifyEnhancedValidation": "\u0628\u06C1\u062A\u0631 \u062A\u0648\u062B\u06CC\u0642",
"secTest.verifyAdvancedFeatures": "\u0627\u0639\u0644\u06CC\u0670 \u062E\u0635\u0648\u0635\u06CC\u0627\u062A",
"secTest.verifySignature": "\u062F\u0633\u062A\u062E\u0637 \u06A9\u06CC \u062C\u0627\u0646\u0686",
"secDetail.Security system initializing...": "\u062D\u0641\u0627\u0638\u062A\u06CC \u0646\u0638\u0627\u0645 \u0634\u0631\u0648\u0639 \u06C1\u0648 \u0631\u06C1\u0627 \u06C1\u06D2...",
"secDetail.Nested encryption active": "\u0645\u062A\u062F\u0627\u062E\u0644 \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC \u0641\u0639\u0627\u0644",
"secDetail.Nested encryption failed": "\u0645\u062A\u062F\u0627\u062E\u0644 \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC \u0646\u0627\u06A9\u0627\u0645",
"secDetail.Packet padding active": "\u067E\u06CC\u06A9\u0679 \u0628\u06BE\u0631\u062A\u06CC \u0641\u0639\u0627\u0644",
"secDetail.Packet padding failed": "\u067E\u06CC\u06A9\u0679 \u0628\u06BE\u0631\u062A\u06CC \u0646\u0627\u06A9\u0627\u0645",
"secDetail.Advanced features active": "\u0627\u0639\u0644\u06CC\u0670 \u062E\u0635\u0648\u0635\u06CC\u0627\u062A \u0641\u0639\u0627\u0644",
"secDetail.Advanced features failed": "\u0627\u0639\u0644\u06CC\u0670 \u062E\u0635\u0648\u0635\u06CC\u0627\u062A \u0646\u0627\u06A9\u0627\u0645",
"secDetail.No encryption key available": "\u06A9\u0648\u0626\u06CC \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC \u06A9\u06CC \u06A9\u0644\u06CC\u062F \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA",
"secDetail.AES-GCM encryption/decryption working correctly": "\u200FAES-GCM \u062E\u0641\u06CC\u06C1 \u06A9\u0627\u0631\u06CC \u0627\u0648\u0631 \u06A9\u0634\u0627\u0626\u06CC \u062F\u0631\u0633\u062A \u06A9\u0627\u0645 \u06A9\u0631 \u0631\u06C1\u06CC \u06C1\u06D2",
"secDetail.No ECDH key pair available": "\u06A9\u0648\u0626\u06CC ECDH \u06A9\u0644\u06CC\u062F \u062C\u0648\u0691\u0627 \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA",
"secDetail.Key derivation failed": "\u06A9\u0644\u06CC\u062F \u06A9\u0627 \u0627\u062E\u0630 \u0646\u0627\u06A9\u0627\u0645",
"secDetail.No ECDSA key pair available": "\u06A9\u0648\u0626\u06CC ECDSA \u06A9\u0644\u06CC\u062F \u062C\u0648\u0691\u0627 \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA",
"secDetail.ECDSA digital signatures working correctly": "\u200FECDSA \u0688\u06CC\u062C\u06CC\u0679\u0644 \u062F\u0633\u062A\u062E\u0637 \u062F\u0631\u0633\u062A \u06A9\u0627\u0645 \u06A9\u0631 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA",
"secDetail.MAC key not available or invalid": "\u200FMAC \u06A9\u0644\u06CC\u062F \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA \u06CC\u0627 \u063A\u0644\u0637 \u06C1\u06D2",
"secDetail.Rate limiter did not block a message over the limit": "\u0634\u0631\u062D \u0645\u062D\u062F\u0648\u062F \u06A9\u0631\u0646\u06D2 \u0648\u0627\u0644\u06D2 \u0646\u06D2 \u062D\u062F \u0633\u06D2 \u0632\u06CC\u0627\u062F\u06C1 \u067E\u06CC\u063A\u0627\u0645 \u0646\u06C1\u06CC\u06BA \u0631\u0648\u06A9\u0627",
"secDetail.Rate limiter is not available": "\u0634\u0631\u062D \u0645\u062D\u062F\u0648\u062F \u06A9\u0631\u0646\u06D2 \u0648\u0627\u0644\u0627 \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA",
"secDetail.Replay protection is working correctly": "\u0628\u0627\u0632\u06AF\u0634\u062A \u0633\u06D2 \u062A\u062D\u0641\u0638 \u062F\u0631\u0633\u062A \u06A9\u0627\u0645 \u06A9\u0631 \u0631\u06C1\u0627 \u06C1\u06D2",
"secDetail.Replay protection not enabled": "\u0628\u0627\u0632\u06AF\u0634\u062A \u0633\u06D2 \u062A\u062D\u0641\u0638 \u0686\u0627\u0644\u0648 \u0646\u06C1\u06CC\u06BA",
"secDetail.SAS code not available": "\u200FSAS \u06A9\u0648\u0688 \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA",
"secDetail.SAS verification code is valid and available": "\u200FSAS \u062A\u0635\u062F\u06CC\u0642\u06CC \u06A9\u0648\u0688 \u062F\u0631\u0633\u062A \u0627\u0648\u0631 \u062F\u0633\u062A\u06CC\u0627\u0628 \u06C1\u06D2",
"secDetail.Traffic obfuscation is working correctly": "\u0679\u0631\u06CC\u0641\u06A9 \u06A9\u06CC \u062F\u06BE\u0646\u062F\u0644\u0627\u06C1\u0679 \u062F\u0631\u0633\u062A \u06A9\u0627\u0645 \u06A9\u0631 \u0631\u06C1\u06CC \u06C1\u06D2",
"secDetail.Traffic obfuscation not enabled": "\u0679\u0631\u06CC\u0641\u06A9 \u06A9\u06CC \u062F\u06BE\u0646\u062F\u0644\u0627\u06C1\u0679 \u0686\u0627\u0644\u0648 \u0646\u06C1\u06CC\u06BA",
"secDetail.No non-extractable ephemeral ECDH key pair for this session": "\u0627\u0633 \u0633\u06CC\u0634\u0646 \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0648\u0626\u06CC \u0646\u0627\u0642\u0627\u0628\u0644\u0650 \u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0639\u0627\u0631\u0636\u06CC ECDH \u06A9\u0644\u06CC\u062F \u062C\u0648\u0691\u0627 \u0646\u06C1\u06CC\u06BA",
"secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation": "\u0635\u0631\u0641 \u0633\u06CC\u0634\u0646 \u06A9\u06CC \u0633\u0637\u062D \u067E\u0631 \u0641\u0627\u0631\u0648\u0631\u0688 \u0633\u06CC\u06A9\u0631\u0633\u06CC: \u06A9\u0644\u06CC\u062F\u06CC\u06BA \u06C1\u0631 \u0633\u06CC\u0634\u0646 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0639\u0627\u0631\u0636\u06CC \u06C1\u06CC\u06BA\u060C \u0645\u06AF\u0631 \u0627\u0633 \u0627\u062A\u0635\u0627\u0644 \u0645\u06CC\u06BA Double Ratchet \u0641\u0639\u0627\u0644 \u0646\u06C1\u06CC\u06BA (\u0633\u0627\u062A\u06BE\u06CC \u067E\u0631\u0627\u0646\u06D2 \u0646\u0633\u062E\u06D2 \u067E\u0631 \u06C1\u06D2)\u060C \u0627\u0633 \u0644\u06CC\u06D2 \u0627\u06CC\u06A9 \u0627\u0641\u0634\u0627 \u0634\u062F\u06C1 \u0633\u06CC\u0634\u0646 \u06A9\u0644\u06CC\u062F \u067E\u0648\u0631\u06CC \u06AF\u0641\u062A\u06AF\u0648 \u06A9\u06BE\u0648\u0644 \u062F\u06CC\u062A\u06CC \u06C1\u06D2",
"msg.pause": "\u062A\u0648\u0642\u0641",
"msg.failed": "\u0646\u0627\u06A9\u0627\u0645",
"groupErr.timeout": "\u06A9\u0648\u0688 \u062A\u06CC\u0627\u0631 \u06C1\u0648\u0646\u06D2 \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u0627\u06CC\u06A9 \u0631\u06A9\u0646 \u0646\u06D2 \u062C\u0648\u0627\u0628 \u062F\u06CC\u0646\u0627 \u0628\u0646\u062F \u06A9\u0631 \u062F\u06CC\u0627\u06D4",
"groupErr.keyMismatch": "\u0627\u06CC\u06A9 \u0631\u06A9\u0646 \u06A9\u06CC \u06A9\u0644\u06CC\u062F \u0627\u0633 \u06A9\u06D2 \u062F\u0639\u0648\u06D2 \u06A9\u0631\u062F\u06C1 \u0634\u0646\u0627\u062E\u062A \u0633\u06D2 \u0646\u06C1\u06CC\u06BA \u0645\u0644\u06CC\u06D4",
"groupErr.revealMismatch": "\u0627\u06CC\u06A9 \u0631\u06A9\u0646 \u06A9\u06CC \u0627\u0641\u0634\u0627 \u06A9\u0631\u062F\u06C1 \u0642\u062F\u0631 \u0627\u0633 \u06A9\u06D2 \u0639\u06C1\u062F \u0633\u06D2 \u0646\u06C1\u06CC\u06BA \u0645\u0644\u06CC\u06D4",
"groupErr.commitChanged": "\u0627\u06CC\u06A9 \u0631\u06A9\u0646 \u0646\u06D2 \u062F\u0631\u0645\u06CC\u0627\u0646 \u0645\u06CC\u06BA \u0627\u067E\u0646\u0627 \u0639\u06C1\u062F \u0628\u062F\u0644 \u062F\u06CC\u0627\u06D4",
"groupErr.missingKey": "\u0627\u06CC\u06A9 \u0627\u06CC\u0633\u0627 \u0631\u06A9\u0646 \u0641\u06C1\u0631\u0633\u062A \u0645\u06CC\u06BA \u062A\u06BE\u0627 \u062C\u0633 \u06A9\u06CC \u06A9\u0644\u06CC\u062F \u06A9\u0628\u06BE\u06CC \u0646\u06C1\u06CC\u06BA \u067E\u06C1\u0646\u0686\u06CC\u06D4",
"groupErr.outsider": "\u06AF\u0631\u0648\u06C1 \u0633\u06D2 \u0628\u0627\u06C1\u0631 \u06A9\u0633\u06CC \u06A9\u06CC \u0637\u0631\u0641 \u0633\u06D2 \u0641\u0631\u06CC\u0645 \u0622\u06CC\u0627\u06D4",
"groupErr.limit": "\u06AF\u0631\u0648\u06C1 \u0622\u0679\u06BE \u0627\u0631\u06A9\u0627\u0646 \u062A\u06A9 \u0645\u062D\u062F\u0648\u062F \u06C1\u06D2\u06D4",
"groupErr.tooLarge": "\u067E\u06CC\u063A\u0627\u0645 \u06AF\u0631\u0648\u06C1 \u06A9\u0648 \u0628\u06BE\u06CC\u062C\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0628\u06C1\u062A \u0628\u0691\u0627 \u062A\u06BE\u0627\u06D4",
"fileType.text": "\u0633\u0627\u062F\u06C1 \u0645\u062A\u0646",
"fileType.images": "\u062A\u0635\u0627\u0648\u06CC\u0631",
"fileType.archives": "\u0645\u062D\u0641\u0648\u0638\u06C1 \u062C\u0627\u062A",
"fileType.voice": "\u0635\u0648\u062A\u06CC \u067E\u06CC\u063A\u0627\u0645\u0627\u062A",
"fileType.unsupported": "\u063A\u06CC\u0631 \u0645\u0639\u0627\u0648\u0646",
"qrScan.title": "\u200FQR \u06A9\u0648\u0688 \u067E\u0691\u06BE\u06CC\u06BA",
"qrScan.auto": "\u062E\u0648\u062F\u06A9\u0627\u0631 \u0645\u0648\u0688",
"qrScan.reset": "\u062F\u0648\u0628\u0627\u0631\u06C1 \u062A\u0631\u062A\u06CC\u0628",
"qrScan.autoScroll": "\u062E\u0648\u062F\u06A9\u0627\u0631 \u0633\u06A9\u0631\u0648\u0644 \u0686\u0627\u0644\u0648 \u06C1\u06D2",
"qrScan.starting": "\u06A9\u06CC\u0645\u0631\u06C1 \u0634\u0631\u0648\u0639 \u06C1\u0648 \u0631\u06C1\u0627 \u06C1\u06D2...",
"qrScan.point": "\u06A9\u06CC\u0645\u0631\u06C1 QR \u06A9\u0648\u0688 \u06A9\u06CC \u0637\u0631\u0641 \u06A9\u0631\u06CC\u06BA",
"qrScan.tapFocus": "\u062A\u0648\u062C\u06C1 \u0645\u0631\u06A9\u0648\u0632 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0633\u06A9\u0631\u06CC\u0646 \u062F\u0628\u0627\u0626\u06CC\u06BA",
"qrScan.focusing": "\u062A\u0648\u062C\u06C1 \u0645\u0631\u06A9\u0648\u0632 \u06A9\u06CC \u062C\u0627 \u0631\u06C1\u06CC \u06C1\u06D2...",
"iceErr.notArray": "\u0633\u0631\u0648\u0631 \u06A9\u06CC \u0641\u06C1\u0631\u0633\u062A \u0627\u06CC\u06A9 \u0635\u0641 \u06C1\u0648\u0646\u06CC \u0686\u0627\u06C1\u06CC\u06D2",
"iceErr.invalidJson": "\u063A\u0644\u0637 JSON",
"iceErr.tooMany": "\u0628\u06C1\u062A \u0632\u06CC\u0627\u062F\u06C1 \u0633\u0631\u0648\u0631 (\u0632\u06CC\u0627\u062F\u06C1 \u0633\u06D2 \u0632\u06CC\u0627\u062F\u06C1 {max})",
"iceErr.invalidEntry": "{label}: \u063A\u0644\u0637 \u0627\u0646\u062F\u0631\u0627\u062C",
"iceErr.urlCount": "{label}: 1 \u0633\u06D2 {max} \u062A\u06A9 \u067E\u062A\u06D2 \u062F\u0631\u06A9\u0627\u0631 \u06C1\u06CC\u06BA",
"iceErr.turnCreds": "{label}: \u200FTURN \u0633\u0631\u0648\u0631\u0632 \u06A9\u0648 \u0639\u0645\u0648\u0645\u0627\u064B \u0635\u0627\u0631\u0641 \u0646\u0627\u0645 \u0627\u0648\u0631 \u0633\u0646\u062F \u062F\u0631\u06A9\u0627\u0631 \u06C1\u0648\u062A\u06CC \u06C1\u06D2",
"iceUrl.notString": "\u067E\u062A\u06C1 \u0627\u06CC\u06A9 \u0633\u0644\u0633\u0644\u06C1 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2",
"iceUrl.empty": "\u067E\u062A\u06C1 \u062E\u0627\u0644\u06CC \u06C1\u06D2",
"iceUrl.tooLong": "\u067E\u062A\u06C1 \u0628\u06C1\u062A \u0644\u0645\u0628\u0627 \u06C1\u06D2",
"iceUrl.badChars": "\u067E\u062A\u06D2 \u0645\u06CC\u06BA \u063A\u0644\u0637 \u062D\u0631\u0648\u0641 \u06C1\u06CC\u06BA",
"iceUrl.badScheme": "\u067E\u062A\u06C1 stun:\u200F\u060C stuns:\u200F\u060C turn: \u06CC\u0627 turns: \u0633\u06D2 \u0634\u0631\u0648\u0639 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2",
"iceUrl.badQuery": "\u067E\u062A\u06D2 \u06A9\u06CC \u0627\u0633\u062A\u0641\u0633\u0627\u0631 \u063A\u0644\u0637 \u06C1\u06D2",
"iceUrl.noHost": "\u067E\u062A\u06D2 \u0645\u06CC\u06BA \u0645\u06CC\u0632\u0628\u0627\u0646 \u0646\u06C1\u06CC\u06BA",
"iceUrl.badHost": "\u067E\u062A\u06D2 \u06A9\u0627 \u0645\u06CC\u0632\u0628\u0627\u0646 \u06CC\u0627 \u067E\u0648\u0631\u0679 \u063A\u0644\u0637 \u06C1\u06D2",
"iceUrl.badTransport": "\u067E\u062A\u06D2 \u06A9\u06CC \u0627\u0633\u062A\u0641\u0633\u0627\u0631 transport=udp \u06CC\u0627 transport=tcp \u06C1\u0648\u0646\u06CC \u0686\u0627\u06C1\u06CC\u06D2",
"msg.off": "\u0628\u0646\u062F",
"file.consentUnavailable": "\u0635\u0627\u0631\u0641 \u06A9\u06CC \u0631\u0636\u0627\u0645\u0646\u062F\u06CC \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA",
"secLevel.MAXIMUM": "\u0632\u06CC\u0627\u062F\u06C1 \u0633\u06D2 \u0632\u06CC\u0627\u062F\u06C1",
"secLevel.INITIALIZING": "\u0634\u0631\u0648\u0639 \u06C1\u0648 \u0631\u06C1\u0627 \u06C1\u06D2",
"secLevel.ERROR": "\u062E\u0631\u0627\u0628\u06CC",
"secLevel.UNKNOWN": "\u0646\u0627\u0645\u0639\u0644\u0648\u0645",
"status.error": "\u062E\u0631\u0627\u0628\u06CC",
"offline.disconnect": "\u0645\u0646\u0642\u0637\u0639 \u06A9\u0631\u06CC\u06BA",
"offline.learnMore": "\u0645\u0632\u06CC\u062F \u062C\u0627\u0646\u06CC\u06BA",
"pwa.installApp": "\u0627\u06CC\u067E \u0646\u0635\u0628 \u06A9\u0631\u06CC\u06BA",
"chat.onWeb": "\u0622\u067E \u0648\u06CC\u0628 \u067E\u0631 \u06C1\u06CC\u06BA",
"groupCall.startVoice": "\u06AF\u0631\u0648\u067E \u0648\u0627\u0626\u0633 \u06A9\u0627\u0644 \u0634\u0631\u0648\u0639 \u06A9\u0631\u06CC\u06BA",
"groupCall.startVideo": "\u06AF\u0631\u0648\u067E \u0648\u06CC\u0688\u06CC\u0648 \u06A9\u0627\u0644 \u0634\u0631\u0648\u0639 \u06A9\u0631\u06CC\u06BA",
"groupCall.join": "\u0634\u0627\u0645\u0644 \u06C1\u0648\u06BA",
"groupCall.dismiss": "\u0627\u0628\u06BE\u06CC \u0646\u06C1\u06CC\u06BA",
"groupCall.leave": "\u06A9\u0627\u0644 \u0686\u06BE\u0648\u0691\u06CC\u06BA",
"groupCall.you": "\u0622\u067E",
"groupCall.connecting": "\u0645\u0646\u0633\u0644\u06A9 \u06C1\u0648 \u0631\u06C1\u0627 \u06C1\u06D2\u2026",
"groupCall.waitingLink": "\u0628\u0631\u0627\u06C1\u0650 \u0631\u0627\u0633\u062A \u0631\u0627\u0628\u0637\u06D2 \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631\u2026",
"groupCall.legFailed": "\u0645\u0646\u0633\u0644\u06A9 \u0646\u06C1\u06CC\u06BA \u06C1\u0648 \u0633\u06A9\u0627",
"groupCall.startedVoice": "{name} \u0646\u06D2 \u0648\u0627\u0626\u0633 \u06A9\u0627\u0644 \u0634\u0631\u0648\u0639 \u06A9\u06CC",
"groupCall.startedVideo": "{name} \u0646\u06D2 \u0648\u06CC\u0688\u06CC\u0648 \u06A9\u0627\u0644 \u0634\u0631\u0648\u0639 \u06A9\u06CC",
"groupCall.inCall": "\u06A9\u0627\u0644 \u0645\u06CC\u06BA {count}",
"groupCall.err.permission_denied": "\u06A9\u0627\u0644 \u0634\u0631\u0648\u0639 \u0646\u06C1\u06CC\u06BA \u06C1\u0648 \u0633\u06A9\u06CC - \u0645\u0627\u0626\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0627\u0648\u0631 \u06A9\u06CC\u0645\u0631\u06D2 \u062A\u06A9 \u0631\u0633\u0627\u0626\u06CC \u0628\u0646\u062F \u06C1\u06D2\u06D4 \u0627\u0633 \u0633\u0627\u0626\u0679 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u062C\u0627\u0632\u062A \u062F\u06CC\u06BA \u0627\u0648\u0631 \u062F\u0648\u0628\u0627\u0631\u06C1 \u06A9\u0648\u0634\u0634 \u06A9\u0631\u06CC\u06BA\u06D4",
"groupCall.err.device_not_found": "\u06A9\u0627\u0644 \u0634\u0631\u0648\u0639 \u0646\u06C1\u06CC\u06BA \u06C1\u0648 \u0633\u06A9\u06CC - \u0627\u0633 \u0688\u06CC\u0648\u0627\u0626\u0633 \u067E\u0631 \u06A9\u0648\u0626\u06CC \u0645\u0627\u0626\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0646\u06C1\u06CC\u06BA \u0645\u0644\u0627\u06D4",
"groupCall.err.device_busy": "\u06A9\u0627\u0644 \u0634\u0631\u0648\u0639 \u0646\u06C1\u06CC\u06BA \u06C1\u0648 \u0633\u06A9\u06CC - \u0622\u067E \u06A9\u0627 \u0645\u0627\u0626\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u06A9\u0633\u06CC \u0627\u0648\u0631 \u0627\u06CC\u067E \u06A9\u06D2 \u0632\u06CC\u0631\u0650 \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06C1\u06D2\u06D4 \u0627\u0633\u06D2 \u0628\u0646\u062F \u06A9\u0631 \u06A9\u06D2 \u062F\u0648\u0628\u0627\u0631\u06C1 \u06A9\u0648\u0634\u0634 \u06A9\u0631\u06CC\u06BA\u06D4",
"groupCall.err.media_failed": "\u06A9\u0627\u0644 \u0634\u0631\u0648\u0639 \u0646\u06C1\u06CC\u06BA \u06C1\u0648 \u0633\u06A9\u06CC - \u0645\u0627\u0626\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0646\u06C1\u06CC\u06BA \u06A9\u06BE\u0644 \u0633\u06A9\u0627\u06D4",
"groupCall.err.call_in_progress": "\u0627\u0633 \u06AF\u0631\u0648\u067E \u0645\u06CC\u06BA \u067E\u06C1\u0644\u06D2 \u06C1\u06CC \u0627\u06CC\u06A9 \u06A9\u0627\u0644 \u062C\u0627\u0631\u06CC \u06C1\u06D2\u06D4 \u0646\u0626\u06CC \u0634\u0631\u0648\u0639 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0628\u062C\u0627\u0626\u06D2 \u0627\u0633 \u0645\u06CC\u06BA \u0634\u0627\u0645\u0644 \u06C1\u0648\u06BA\u06D4",
"groupCall.err.not_ready": "\u06A9\u0627\u0644 \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u06AF\u0631\u0648\u067E \u06A9\u0648\u0688 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u0631\u06CC\u06BA\u06D4",
"groupCall.speaking": "{name} \u0628\u0648\u0644 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA",
"groupCall.pin": "{name} \u06A9\u0648 \u0628\u0691\u0627 \u062F\u06A9\u06BE\u0627\u0626\u06CC\u06BA",
"groupCall.unpin": "\u0633\u0628 \u067E\u0631 \u0648\u0627\u067E\u0633 \u062C\u0627\u0626\u06CC\u06BA",
"groupCall.showEveryone": "\u0633\u0628",
"msg.after5s": "\u067E\u0691\u06BE\u0646\u06D2 \u06A9\u06D2 5 \u0633\u06CC\u06A9\u0646\u0688 \u0628\u0639\u062F",
"msg.after15s": "\u067E\u0691\u06BE\u0646\u06D2 \u06A9\u06D2 15 \u0633\u06CC\u06A9\u0646\u0688 \u0628\u0639\u062F",
"msg.after30s": "\u067E\u0691\u06BE\u0646\u06D2 \u06A9\u06D2 30 \u0633\u06CC\u06A9\u0646\u0688 \u0628\u0639\u062F",
"msg.after1m": "\u067E\u0691\u06BE\u0646\u06D2 \u06A9\u06D2 1 \u0645\u0646\u0679 \u0628\u0639\u062F",
"msg.sec30": "30 \u0633\u06CC\u06A9\u0646\u0688",
"msg.min5": "5 \u0645\u0646\u0679",
"msg.hour1": "1 \u06AF\u06BE\u0646\u0679\u06C1",
"desktop.shareDesc": "\u06A9\u0648\u0688 \u0627\u067E\u0646\u06D2 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u0648 \u0628\u06BE\u06CC\u062C\u06CC\u06BA\u06D4 \u06CC\u06C1 \u0627\u06CC\u06A9 \u0628\u0627\u0631 \u06A9\u0627 \u06C1\u06D2 \u0627\u0648\u0631 \u062C\u0644\u062F \u062E\u062A\u0645 \u06C1\u0648 \u062C\u0627\u062A\u0627 \u06C1\u06D2\u06D4",
"desktop.invitationCreated": "\u0645\u062D\u0641\u0648\u0638 \u062F\u0639\u0648\u062A \u0628\u0646 \u06AF\u0626\u06CC - \u0627\u0633\u06D2 \u0627\u067E\u0646\u06D2 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u0648 \u0628\u06BE\u06CC\u062C\u06CC\u06BA\u06D4",
"desktop.joinDesc": "\u0627\u067E\u0646\u0627 \u0645\u062D\u0641\u0648\u0638 \u062C\u0648\u0627\u0628 \u0628\u0646\u0627\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u0627 \u062F\u0639\u0648\u062A\u06CC \u06A9\u0648\u0688 \u0686\u0633\u067E\u0627\u06BA \u06A9\u0631\u06CC\u06BA\u06D4",
"desktop.offerTag": "\u062F\u0639\u0648\u062A \xB7 \u0645\u062A\u0646 \u06A9\u0627\u067E\u06CC \u06A9\u0631\u06CC\u06BA",
"desktop.answerTag": "\u062C\u0648\u0627\u0628 \xB7 \u0645\u062A\u0646 \u06A9\u0627\u067E\u06CC \u06A9\u0631\u06CC\u06BA",
"desktop.offerPlaceholder": "\u062F\u0639\u0648\u062A\u06CC \u06A9\u0648\u0688 \u06CC\u06C1\u0627\u06BA \u0638\u0627\u06C1\u0631 \u06C1\u0648\u06AF\u0627\u2026",
"desktop.answerPlaceholder": "\u062C\u0648\u0627\u0628\u06CC \u06A9\u0648\u0688 \u06CC\u06C1\u0627\u06BA \u0638\u0627\u06C1\u0631 \u06C1\u0648\u06AF\u0627\u2026",
"desktop.backToChats": "\u0686\u06CC\u0679\u0633 \u067E\u0631 \u0648\u0627\u067E\u0633",
"desktop.sendFeedback": "\u0631\u0627\u0626\u06D2 \u0628\u06BE\u06CC\u062C\u06CC\u06BA",
"desktop.callsNeedVerified": "\u06A9\u0627\u0644\u0648\u06BA \u06A9\u06D2 \u0644\u06CC\u06D2 \u062A\u0635\u062F\u06CC\u0642 \u0634\u062F\u06C1 \u0645\u062D\u0641\u0648\u0638 \u0686\u06CC\u0646\u0644 \u062F\u0631\u06A9\u0627\u0631 \u06C1\u06D2\u06D4",
"desktop.noOpenChannel": "\u06A9\u0648\u0626\u06CC \u06A9\u06BE\u0644\u0627 \u0645\u062D\u0641\u0648\u0638 \u0686\u06CC\u0646\u0644 \u0646\u06C1\u06CC\u06BA \u06C1\u06D2\u06D4",
"desktop.chatCarriesCall": "\u06CC\u06C1 \u0686\u06CC\u0679 \u0627\u06CC\u06A9 \u06AF\u0631\u0648\u067E \u06A9\u0627\u0644 \u0627\u0679\u06BE\u0627\u0626\u06D2 \u06C1\u0648\u0626\u06D2 \u06C1\u06D2\u06D4 \u0648\u0646 \u0679\u0648 \u0648\u0646 \u06A9\u0627\u0644 \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u06AF\u0631\u0648\u067E \u06A9\u0627\u0644 \u0686\u06BE\u0648\u0691\u06CC\u06BA\u06D4",
"desktop.err.permission_denied": "\u06A9\u0627\u0644 \u0634\u0631\u0648\u0639 \u0646\u06C1 \u06C1\u0648 \u0633\u06A9\u06CC - \u0645\u0627\u0626\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0627\u0648\u0631 \u06A9\u06CC\u0645\u0631\u06D2 \u062A\u06A9 \u0631\u0633\u0627\u0626\u06CC \u0628\u0646\u062F \u06C1\u06D2\u06D4 \u0633\u0633\u0679\u0645 \u0633\u06CC\u0679\u0646\u06AF\u0632 \u0645\u06CC\u06BA \u0627\u062C\u0627\u0632\u062A \u062F\u06CC\u06BA \u0627\u0648\u0631 \u062F\u0648\u0628\u0627\u0631\u06C1 \u06A9\u0648\u0634\u0634 \u06A9\u0631\u06CC\u06BA\u06D4",
"desktop.language": "\u0632\u0628\u0627\u0646",
"desktop.languageHint": "\u0641\u0648\u0631\u0627\u064B \u0644\u0627\u06AF\u0648 \u06C1\u0648\u062A\u0627 \u06C1\u06D2\u06D4 \u067E\u06C1\u0644\u06D2 \u0628\u06BE\u06CC\u062C\u06D2 \u06AF\u0626\u06D2 \u067E\u06CC\u063A\u0627\u0645\u0627\u062A \u0627\u067E\u0646\u06D2 \u06C1\u06CC \u0627\u0644\u0641\u0627\u0638 \u0645\u06CC\u06BA \u0631\u06C1\u062A\u06D2 \u06C1\u06CC\u06BA\u06D4",
"desktop.compareCode": "\u062A\u0635\u062F\u06CC\u0642\u06CC \u06A9\u0648\u0688 \u0627\u067E\u0646\u06D2 \u0633\u0627\u062A\u06BE\u06CC \u0633\u06D2 \u0645\u0644\u0627\u0626\u06CC\u06BA \u0627\u0648\u0631 \u0645\u0637\u0627\u0628\u0642\u062A \u067E\u0631 \u062A\u0635\u062F\u06CC\u0642 \u06A9\u0631\u06CC\u06BA\u06D4",
"desktop.verifyBeforeFiles": "\u0641\u0627\u0626\u0644\u06CC\u06BA \u0628\u06BE\u06CC\u062C\u0646\u06D2 \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u062A\u0635\u062F\u06CC\u0642 \u0645\u06A9\u0645\u0644 \u06A9\u0631\u06CC\u06BA\u06D4",
"desktop.verifyBeforeSending": "\u067E\u06CC\u063A\u0627\u0645\u0627\u062A \u0628\u06BE\u06CC\u062C\u0646\u06D2 \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u062A\u0635\u062F\u06CC\u0642 \u0645\u06A9\u0645\u0644 \u06A9\u0631\u06CC\u06BA\u06D4",
"desktop.disconnectedByBackend": "\u06A9\u0646\u06A9\u0634\u0646 \u0645\u062D\u0641\u0648\u0638 \u0637\u0631\u06CC\u0642\u06D2 \u0633\u06D2 \u0628\u0646\u062F \u06A9\u0631 \u062F\u06CC\u0627 \u06AF\u06CC\u0627\u06D4",
"desktop.restoreFailed": "\u06A9\u0646\u06A9\u0634\u0646 \u0628\u062D\u0627\u0644 \u0646\u06C1 \u06C1\u0648 \u0633\u06A9\u0627\u06D4 \u06CC\u06C1 \u0686\u06CC\u0679 \u0628\u0646\u062F \u06A9\u06CC \u062C\u0627 \u0631\u06C1\u06CC \u06C1\u06D2\u06D4",
"desktop.channelNotReady": "\u0688\u06CC\u0679\u0627 \u0686\u06CC\u0646\u0644 \u0627\u0628\u06BE\u06CC \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA\u06D4 \u06A9\u0646\u06A9\u0634\u0646 \u0642\u0627\u0626\u0645 \u06C1\u0648\u0646\u06D2 \u062A\u06A9 \u0627\u0646\u062A\u0638\u0627\u0631 \u06A9\u0631\u06CC\u06BA\u06D4",
"desktop.enterCode": "\u062A\u0635\u062F\u06CC\u0642 \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0648\u0688 \u062F\u0631\u062C \u06A9\u0631\u06CC\u06BA\u06D4",
"desktop.noOffer": "\u06A9\u0648\u0626\u06CC \u062F\u0639\u0648\u062A \u0646\u06C1\u06CC\u06BA \u0645\u0644\u06CC\u06D4 \u067E\u06C1\u0644\u06D2 \u0627\u06CC\u06A9 \u0628\u0646\u0627\u0626\u06CC\u06BA\u06D4",
"desktop.notInitiator": "\u06CC\u06C1 \u06A9\u0646\u06A9\u0634\u0646 \u0622\u067E \u0646\u06D2 \u0646\u06C1\u06CC\u06BA \u0628\u0646\u0627\u06CC\u0627\u060C \u0627\u0633 \u0644\u06CC\u06D2 \u0644\u0627\u06AF\u0648 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0648\u0626\u06CC \u062C\u0648\u0627\u0628 \u0646\u06C1\u06CC\u06BA\u06D4",
"desktop.decryptFailed": "\u0627\u06CC\u06A9 \u067E\u06CC\u063A\u0627\u0645 \u0688\u06CC \u06A9\u0631\u067E\u0679 \u0646\u06C1 \u06C1\u0648 \u0633\u06A9\u0627 \u0627\u0648\u0631 \u0631\u062F \u06A9\u0631 \u062F\u06CC\u0627 \u06AF\u06CC\u0627\u06D4",
"desktop.badMessageFormat": "\u062E\u0631\u0627\u0628 \u0641\u0631\u06CC\u0645 \u0622\u06CC\u0627 \u0627\u0648\u0631 \u0631\u062F \u06A9\u0631 \u062F\u06CC\u0627 \u06AF\u06CC\u0627\u06D4",
"desktop.notSentNotReady": "\u067E\u06CC\u063A\u0627\u0645 \u0646\u06C1\u06CC\u06BA \u0628\u06BE\u06CC\u062C\u0627 \u06AF\u06CC\u0627: \u0645\u062D\u0641\u0648\u0638 \u0686\u06CC\u0646\u0644 \u062A\u06CC\u0627\u0631 \u0646\u06C1\u06CC\u06BA\u06D4 \u062A\u0635\u062F\u06CC\u0642 \u0645\u06A9\u0645\u0644 \u06C1\u0648\u0646\u06D2 \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631 \u06A9\u0631\u06CC\u06BA \u06CC\u0627 \u062F\u0648\u0628\u0627\u0631\u06C1 \u062C\u0691\u06CC\u06BA\u06D4",
"desktop.micDenied": "\u0645\u0627\u0626\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u062A\u06A9 \u0631\u0633\u0627\u0626\u06CC \u0645\u0633\u062A\u0631\u062F \u06A9\u0631 \u062F\u06CC \u06AF\u0626\u06CC\u06D4",
"desktop.noChannelWait": "\u06A9\u0648\u0626\u06CC \u06A9\u06BE\u0644\u0627 \u0645\u062D\u0641\u0648\u0638 \u0686\u06CC\u0646\u0644 \u0646\u06C1\u06CC\u06BA - \u06A9\u0646\u06A9\u0634\u0646 \u0642\u0627\u0626\u0645 \u06C1\u0648\u0646\u06D2 \u062A\u06A9 \u0627\u0646\u062A\u0638\u0627\u0631 \u06A9\u0631\u06CC\u06BA\u06D4",
"desktop.sasFailed": "\u062A\u0635\u062F\u06CC\u0642 \u0646\u0627\u06A9\u0627\u0645\u06D4 \u062F\u0631\u0645\u06CC\u0627\u0646 \u0645\u06CC\u06BA \u06A9\u0648\u0626\u06CC \u06C1\u0648 \u0633\u06A9\u062A\u0627 \u06C1\u06D2\u060C \u0627\u0633 \u0644\u06CC\u06D2 \u06A9\u0646\u06A9\u0634\u0646 \u0631\u0648\u06A9 \u062F\u06CC\u0627 \u06AF\u06CC\u0627\u06D4",
"desktop.sasOk": "\u062A\u0635\u062F\u06CC\u0642 \u06A9\u0627\u0645\u06CC\u0627\u0628\u06D4 \u06CC\u06C1 \u0686\u06CC\u0646\u0644 \u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u0645\u0633\u062A\u0646\u062F \u06C1\u06D2\u06D4",
"desktop.iceForgotten": "\u0645\u062D\u0641\u0648\u0638 \u0633\u0631\u0648\u0631 \u0628\u06BE\u0644\u0627 \u062F\u06CC\u06D2 \u06AF\u0626\u06D2\u06D4 \u0639\u0648\u0627\u0645\u06CC ICE \u0633\u0631\u0648\u0631 \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06C1\u0648 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA\u06D4",
"desktop.icePublic": "\u0639\u0648\u0627\u0645\u06CC ICE \u0633\u0631\u0648\u0631 \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06C1\u0648 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA\u06D4",
"desktop.verificationInProgress": "\u0633\u06CC\u06A9\u06CC\u0648\u0631\u0679\u06CC \u062A\u0635\u062F\u06CC\u0642 \u0627\u0628\u06BE\u06CC \u062C\u0627\u0631\u06CC \u06C1\u06D2\u06D4 \u0645\u06A9\u0645\u0644 \u06C1\u0648\u0646\u06D2 \u062A\u06A9 \u0627\u0646\u062A\u0638\u0627\u0631 \u06A9\u0631\u06CC\u06BA\u06D4",
"desktop.fileGone": "\u06CC\u06C1 \u0641\u0627\u0626\u0644 \u0627\u0628 \u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u06A9\u06D2 \u0644\u06CC\u06D2 \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA\u06D4",
"desktop.codeMismatch": "\u062A\u0635\u062F\u06CC\u0642\u06CC \u06A9\u0648\u0688 \u0645\u0637\u0627\u0628\u0642\u062A \u0646\u06C1\u06CC\u06BA \u0631\u06A9\u06BE\u062A\u06D2\u06D4 \u062D\u0641\u0627\u0638\u062A \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0646\u06A9\u0634\u0646 \u0645\u0646\u0642\u0637\u0639 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2\u06D4",
"desktop.noLocalCode": "\u062A\u0635\u062F\u06CC\u0642 \u0646\u0627\u06A9\u0627\u0645: \u0645\u0648\u0627\u0632\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0645\u0642\u0627\u0645\u06CC \u06A9\u0648\u0688 \u0645\u0648\u062C\u0648\u062F \u0646\u06C1\u06CC\u06BA\u06D4 \u062D\u0641\u0627\u0638\u062A \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0646\u06A9\u0634\u0646 \u0645\u0646\u0642\u0637\u0639 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2\u06D4",
"desktop.protocolViolation": "\u0633\u0627\u062A\u06BE\u06CC \u0646\u06D2 \u0622\u067E \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u06C1\u06CC \u06A9\u0648\u0688 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u0627 \u062F\u0639\u0648\u06CC\u0670 \u06A9\u06CC\u0627\u06D4 \u062D\u0641\u0627\u0638\u062A \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0646\u06A9\u0634\u0646 \u0645\u0646\u0642\u0637\u0639 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2\u06D4",
"desktop.verificationRejected": "\u062A\u0635\u062F\u06CC\u0642 \u0645\u0633\u062A\u0631\u062F\u06D4 \u062D\u0641\u0627\u0638\u062A \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0646\u06A9\u0634\u0646 \u0631\u0648\u06A9 \u062F\u06CC\u0627 \u06AF\u06CC\u0627\u06D4",
"secLevel.HIGH": "\u0628\u0644\u0646\u062F",
"secLevel.MEDIUM": "\u062F\u0631\u0645\u06CC\u0627\u0646\u06C1",
"secLevel.LOW": "\u06A9\u0645",
"desktop.rerun": "\u062F\u0648\u0628\u0627\u0631\u06C1 \u062C\u0627\u0646\u0686\u06CC\u06BA",
"desktop.ice.customDesc": "\u0632\u06CC\u0627\u062F\u06C1 \u0633\u06D2 \u0632\u06CC\u0627\u062F\u06C1 {max} \u0633\u0631\u0648\u0631\u060C \u0641\u06CC \u0633\u0637\u0631 \u0627\u06CC\u06A9 URL \u06CC\u0627 JSON\u06D4",
"desktop.ice.persistDesc": "\u0627\u0633\u06CC \u0688\u06CC\u0648\u0627\u0626\u0633 \u067E\u0631 \u0645\u0642\u0627\u0645\u06CC \u0637\u0648\u0631 \u067E\u0631 \u0645\u062D\u0641\u0648\u0638 \u06C1\u0648\u062A\u0627 \u06C1\u06D2\u06D4 \u0635\u0631\u0641 \u0627\u0633\u06CC \u0633\u06CC\u0634\u0646 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06A9\u0631\u0646\u0627 \u06C1\u0648 \u062A\u0648 \u0628\u0646\u062F \u0631\u06C1\u0646\u06D2 \u062F\u06CC\u06BA\u06D4",
"desktop.group.leaveNote": "\u0628\u0627\u0642\u06CC \u0627\u0631\u0627\u06A9\u06CC\u0646 \u06A9\u0648 \u0628\u062A\u0627 \u062F\u06CC\u0627 \u062C\u0627\u062A\u0627 \u06C1\u06D2 \u06A9\u06C1 \u0622\u067E \u0686\u0644\u06D2 \u06AF\u0626\u06D2\u06D4 \u0627\u0633 \u06A9\u06D2 \u0628\u0639\u062F \u0627\u0633 \u0688\u06CC\u0648\u0627\u0626\u0633 \u067E\u0631 \u0627\u0633 \u06AF\u0631\u0648\u067E \u06A9\u0627 \u06A9\u0686\u06BE \u0628\u0627\u0642\u06CC \u0646\u06C1\u06CC\u06BA \u0631\u06C1\u062A\u0627 - \u06A9\u0633\u06CC \u0633\u0631\u0648\u0631 \u06A9\u06D2 \u067E\u0627\u0633 \u0646\u0642\u0644 \u0646\u06C1\u06CC\u06BA \u06A9\u06C1 \u0648\u0627\u067E\u0633 \u0622 \u0633\u06A9\u06CC\u06BA\u060C \u0627\u0633 \u0644\u06CC\u06D2 \u0646\u0626\u06CC \u062F\u0639\u0648\u062A \u062F\u0631\u06A9\u0627\u0631 \u06C1\u0648\u06AF\u06CC\u06D4",
"desktop.sec.ecdsaOk": "\u06C1\u06CC\u0646\u0688 \u0634\u06CC\u06A9 \u06A9\u06D2 \u062F\u0648\u0631\u0627\u0646 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u06D2 \u06A9\u0644\u06CC\u062F \u067E\u06CC\u06A9\u062C \u06A9\u06D2 \u062F\u0633\u062A\u062E\u0637 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06C1\u0648\u0626\u06CC (ECDSA P-384 / SHA-384)",
"desktop.sec.ecdsaNone": "\u06A9\u0648\u0626\u06CC \u0645\u06A9\u0645\u0644 \u06C1\u06CC\u0646\u0688 \u0634\u06CC\u06A9 \u0646\u06C1\u06CC\u06BA",
"desktop.sec.ecdhOk": "\u0633\u06CC\u0634\u0646 \u06A9\u0644\u06CC\u062F\u06CC\u06BA \u0639\u0627\u0631\u0636\u06CC ECDH P-384 \u062A\u0628\u0627\u062F\u0644\u06D2 \u0633\u06D2 HKDF-SHA-256 \u06A9\u06D2 \u0630\u0631\u06CC\u0639\u06D2 \u0627\u062E\u0630 \u06C1\u0648\u0626\u06CC\u06BA",
"desktop.sec.ecdhNone": "\u06A9\u0648\u0626\u06CC \u0633\u06CC\u0634\u0646 \u06A9\u0644\u06CC\u062F \u0627\u062E\u0630 \u0646\u06C1\u06CC\u06BA \u06C1\u0648\u0626\u06CC",
"desktop.sec.encryptionOk": "\u06A9\u0648\u0631 \u0645\u06CC\u06BA AES-GCM \u0627\u0646\u06A9\u0631\u067E\u0634\u0646 \u0627\u0648\u0631 \u0688\u06A9\u0631\u067E\u0634\u0646 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06C1\u0648\u0626\u06CC",
"desktop.sec.encryptionNa": "AES-GCM \u062E\u0648\u062F \u062C\u0627\u0646\u0686 \u0646\u06C1 \u0686\u0644 \u0633\u06A9\u06CC",
"desktop.sec.integrityOk": "\u067E\u06CC\u063A\u0627\u0645 \u06A9\u06CC \u0633\u0627\u0644\u0645\u06CC\u062A \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06C1\u0648\u0626\u06CC (AES-GCM \u062A\u0635\u062F\u06CC\u0642)",
"desktop.sec.integrityNa": "\u0633\u0627\u0644\u0645\u06CC\u062A \u06A9\u06CC \u062E\u0648\u062F \u062C\u0627\u0646\u0686 \u0646\u06C1 \u0686\u0644 \u0633\u06A9\u06CC",
"desktop.sec.pfsOk": "Double Ratchet \u0641\u0639\u0627\u0644 \u06C1\u06D2 - \u06C1\u0631 \u067E\u06CC\u063A\u0627\u0645 \u06A9\u06CC \u0627\u067E\u0646\u06CC \u06A9\u0644\u06CC\u062F \u06C1\u06D2",
"desktop.sec.pfsNa": "\u0646\u0627\u067E\u0627 \u0646\u06C1\u06CC\u06BA \u06AF\u06CC\u0627",
"desktop.sec.replayOk": "\u0631\u06CC\u0686\u0679 \u067E\u06CC\u063A\u0627\u0645 \u06A9\u0644\u06CC\u062F\u06CC\u06BA \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06A9\u06D2 \u0641\u0648\u0631\u0627\u064B \u0628\u0639\u062F \u062E\u062A\u0645 \u06C1\u0648 \u062C\u0627\u062A\u06CC \u06C1\u06CC\u06BA\u060C \u0627\u0633 \u0644\u06CC\u06D2 \u067E\u06A9\u0691\u0627 \u06AF\u06CC\u0627 \u0641\u0631\u06CC\u0645 \u062F\u0648\u0628\u0627\u0631\u06C1 \u0646\u06C1\u06CC\u06BA \u0686\u0644\u0627\u06CC\u0627 \u062C\u0627 \u0633\u06A9\u062A\u0627",
"desktop.sec.replayNa": "\u0646\u0627\u067E\u0627 \u0646\u06C1\u06CC\u06BA \u06AF\u06CC\u0627",
"desktop.sec.dtlsPinned": "\u0633\u0627\u062A\u06BE\u06CC \u06A9\u0627 DTLS \u0641\u0646\u06AF\u0631 \u067E\u0631\u0646\u0679 \u067E\u0646 \u06A9\u0631 \u062F\u06CC\u0627 \u06AF\u06CC\u0627: {fp}",
"desktop.sec.dtlsNone": "\u062F\u0648\u0631 \u062F\u0631\u0627\u0632 DTLS \u0641\u0646\u06AF\u0631 \u067E\u0631\u0646\u0679 \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA",
"desktop.sec.sasBoth": "\u062F\u0648\u0646\u0648\u06BA \u0641\u0631\u06CC\u0642\u0648\u06BA \u0646\u06D2 \u0686\u06CC\u0646\u0644 \u0633\u06D2 \u0628\u0627\u06C1\u0631 \u0633\u06CC\u0641\u0679\u06CC \u06A9\u0648\u0688 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u06CC",
"desktop.sec.sasIncomplete": "\u0633\u06CC\u0641\u0679\u06CC \u06A9\u0648\u0688 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u062F\u0648\u0646\u0648\u06BA \u0641\u0631\u06CC\u0642\u0648\u06BA \u0646\u06D2 \u0646\u06C1\u06CC\u06BA \u06A9\u06CC",
"desktop.sec.metadataOk": "\u0645\u062E\u0635\u0648\u0635 \u0645\u06CC\u0679\u0627 \u0688\u06CC\u0679\u0627 \u06A9\u0644\u06CC\u062F \u0627\u062E\u0630 \u06C1\u0648\u0626\u06CC (HKDF metadata-protection-v4)",
"desktop.sec.metadataNone": "\u06A9\u0648\u0626\u06CC \u0645\u06CC\u0679\u0627 \u0688\u06CC\u0679\u0627 \u06A9\u0644\u06CC\u062F \u0646\u06C1\u06CC\u06BA",
"desktop.sec.coverOn": "\u06A9\u0648\u0631 \u0679\u0631\u06CC\u0641\u06A9 \u0641\u0639\u0627\u0644: \u0631\u06CC\u0686\u0679 \u0686\u06CC\u0646\u0644 \u067E\u0631 \u0628\u06D2 \u062A\u0631\u062A\u06CC\u0628 \u062C\u0639\u0644\u06CC \u0641\u0631\u06CC\u0645 (\u06C1\u0631 15-30 \u0633\u06CC\u06A9\u0646\u0688 \u0645\u06CC\u06BA 32-128 B)",
"desktop.sec.coverOff": "\u06A9\u0648\u0631 \u0679\u0631\u06CC\u0641\u06A9 \u062C\u0646\u0631\u06CC\u0679\u0631 \u0646\u06C1\u06CC\u06BA \u0686\u0644 \u0631\u06C1\u0627",
"desktop.sec.coverUnsupported": "\u06A9\u0648\u0631 \u0679\u0631\u06CC\u0641\u06A9 \u06A9\u06D2 \u0644\u06CC\u06D2 Double Ratchet \u0633\u06CC\u0634\u0646 \u062F\u0631\u06A9\u0627\u0631 \u06C1\u06D2 (\u0633\u0627\u062A\u06BE\u06CC \u067E\u0631\u0627\u0646\u06D2 \u0648\u0631\u0698\u0646 \u067E\u0631 \u06C1\u06D2)",
"desktop.tagline": "\u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u0622\u0632\u0627\u062F\u06CC"
}
};
// src/i18n/index.js
var STORAGE_KEY = "securebit-locale";
function localeFromPathname(pathname = "/") {
const segment = String(pathname).split("/")[1];
return SUPPORTED_LOCALES.includes(segment) && segment !== DEFAULT_LOCALE ? segment : null;
}
function localeFromLanguages(languages = []) {
for (const tag of languages) {
const lower = String(tag).toLowerCase();
const exact = SUPPORTED_LOCALES.find((code) => code.toLowerCase() === lower);
if (exact) return exact;
const base = lower.split("-")[0];
const partial = SUPPORTED_LOCALES.find((code) => code.toLowerCase().split("-")[0] === base);
if (partial) return partial;
}
return null;
}
function detectLocale({ pathname = "/", stored = null, languages = [] } = {}) {
const fromPath = localeFromPathname(pathname);
if (fromPath) return fromPath;
if (isLocaleRoot(pathname)) return DEFAULT_LOCALE;
if (stored && SUPPORTED_LOCALES.includes(stored)) return stored;
return localeFromLanguages(languages) || DEFAULT_LOCALE;
}
function isLocaleRoot(pathname) {
return pathname === "/" || pathname === "/index.html";
}
function localeHref(code, pathname = "/") {
const current = localeFromPathname(pathname);
const rest = current ? String(pathname).slice(current.length + 1) : String(pathname);
const tail = rest.replace(/^\/+/, "");
return code === DEFAULT_LOCALE ? `/${tail}` : `/${code}/${tail}`;
}
function rememberLocale(code) {
try {
localStorage.setItem(STORAGE_KEY, code);
} catch (_) {
}
}
function storedLocale() {
try {
return localStorage.getItem(STORAGE_KEY);
} catch (_) {
return null;
}
}
var resolvedLocale = null;
function currentLocale() {
if (resolvedLocale) return resolvedLocale;
const w = typeof window === "undefined" ? null : window;
if (!w || !w.location) return DEFAULT_LOCALE;
resolvedLocale = detectLocale({
pathname: w.location.pathname || "/",
stored: storedLocale(),
languages: w.navigator?.languages || []
});
return resolvedLocale;
}
function localeDir(code = currentLocale()) {
return LOCALE_META[code]?.dir === "rtl" ? "rtl" : "ltr";
}
function isRTL(code = currentLocale()) {
return localeDir(code) === "rtl";
}
function direction(code = currentLocale()) {
return isRTL(code) ? -1 : 1;
}
var SUGGEST_KEY = "securebit-locale-suggest-dismissed";
function localeSuggestionDismissed() {
try {
return localStorage.getItem(SUGGEST_KEY) === "1";
} catch (_) {
return false;
}
}
function dismissLocaleSuggestion() {
try {
localStorage.setItem(SUGGEST_KEY, "1");
} catch (_) {
}
}
function suggestedLocale({ pathname = "/", languages = [], stored = null } = {}) {
const shown = localeFromPathname(pathname) || DEFAULT_LOCALE;
const preferred = SUPPORTED_LOCALES.includes(stored) && stored || localeFromLanguages(languages);
return preferred && preferred !== shown ? preferred : null;
}
function t(key, vars, locale = currentLocale()) {
const template = DICTIONARIES[locale]?.[key] ?? DICTIONARIES[DEFAULT_LOCALE]?.[key] ?? key;
if (!vars) return template;
return String(template).replace(
/\{(\w+)\}/g,
(match, name) => Object.prototype.hasOwnProperty.call(vars, name) ? String(vars[name]) : match
);
}
// src/state/sessionsStore.js
var SESSION_ACTIONS = Object.freeze({
CREATE_SESSION: "CREATE_SESSION",
REMOVE_SESSION: "REMOVE_SESSION",
SET_ACTIVE: "SET_ACTIVE",
SET_STATUS: "SET_STATUS",
SET_FINGERPRINT: "SET_FINGERPRINT",
SET_VERIFICATION: "SET_VERIFICATION",
SET_SAS: "SET_SAS",
ADD_MESSAGE: "ADD_MESSAGE",
SET_MESSAGES: "SET_MESSAGES",
UPDATE_MESSAGE_STATUS: "UPDATE_MESSAGE_STATUS",
PATCH_MESSAGE: "PATCH_MESSAGE",
DELETE_MESSAGE: "DELETE_MESSAGE",
EXPIRE_MESSAGE: "EXPIRE_MESSAGE",
INCREMENT_UNREAD: "INCREMENT_UNREAD",
CLEAR_UNREAD: "CLEAR_UNREAD",
SET_PENDING_FILES: "SET_PENDING_FILES",
PATCH_SETUP: "PATCH_SETUP",
RENAME: "RENAME",
SET_PEER_PRESENCE: "SET_PEER_PRESENCE"
});
var PRESENCE_DOT = { available: "#3ecf8e", away: "#e3b341", busy: "#e5727a", offline: "#6b6b73" };
var PRESENCE_WORD = { available: t("presence.available"), away: t("presence.away"), busy: t("presence.busy"), offline: t("presence.offline") };
var MY_STATUS_OPTIONS = [
{ key: "available", word: t("presence.available"), desc: t("presence.availableDesc"), dot: "#3ecf8e" },
{ key: "away", word: t("presence.away"), desc: t("presence.awayDesc"), dot: "#e3b341" },
{ key: "busy", word: t("presence.busy"), desc: t("presence.busyDesc"), dot: "#e5727a" },
{ key: "invisible", word: t("presence.invisible"), desc: t("presence.invisibleDesc"), dot: "#6b6b73" }
];
function shortLabelFromId(id) {
const hex = String(id || "").replace(/[^a-z0-9]/gi, "");
return t("chat.defaultLabel") + " " + (hex.slice(0, 4) || "0000").toUpperCase();
}
function monoInitials(label2) {
const words = String(label2 || "").trim().split(/\s+/).filter(Boolean);
const a = words[0]?.[0] || "";
const b = words[1]?.[0] || words[0]?.[1] || "";
return (a + b).toUpperCase() || "\xB7\xB7";
}
function statusSub(status) {
switch (status) {
case "connected":
case "verified":
return t("conn.p2p");
case "verifying":
return t("conn.verifying");
case "connecting":
case "new":
return t("conn.connecting");
case "reconnecting":
return t("conn.reconnecting");
case "peer_disconnected":
return t("conn.peerDisconnected");
default:
return t("conn.disconnected");
}
}
function emptySetup() {
return {
offerData: "",
answerData: "",
offerInput: "",
answerInput: "",
showOfferStep: false,
showAnswerStep: false,
showVerification: false,
showQRCode: false,
qrCodeUrl: "",
isGeneratingKeys: false,
qrFramesTotal: 0,
qrFrameIndex: 0,
qrManualMode: false
};
}
function createSessionEntry(opts = {}) {
const id = opts.id || (typeof crypto !== "undefined" && crypto.randomUUID ? crypto.randomUUID() : String(Date.now()) + Math.random());
return {
id,
peerLabel: opts.peerLabel || shortLabelFromId(id),
labelIsCustom: false,
// becomes true once the user renames; blocks SAS auto-relabel
createdAt: opts.createdAt || Date.now(),
role: opts.role || "offer",
// 'offer' | 'answer'
status: opts.status || "new",
keyFingerprint: "",
verificationCode: "",
sas: { localConfirmed: false, remoteConfirmed: false, bothConfirmed: false, isVerified: false },
messages: [],
unreadCount: 0,
pendingIncomingFiles: [],
peerPresence: null,
// peer's advertised availability ('available'|'away'|'busy'|'offline'); null = unknown
setup: emptySetup()
};
}
function createInitialState() {
return { sessions: {}, order: [], activeSessionId: null };
}
function patchSession(state, id, patch) {
const session = state.sessions[id];
if (!session) return state;
return {
...state,
sessions: { ...state.sessions, [id]: { ...session, ...patch } }
};
}
function sessionsReducer(state, action) {
const A = SESSION_ACTIONS;
switch (action.type) {
case A.CREATE_SESSION: {
const entry = action.entry || createSessionEntry(action);
if (state.sessions[entry.id]) return state;
return {
sessions: { ...state.sessions, [entry.id]: entry },
order: [...state.order, entry.id],
activeSessionId: action.activate === false ? state.activeSessionId : entry.id
};
}
case A.REMOVE_SESSION: {
const { id } = action;
if (!state.sessions[id]) return state;
const sessions = { ...state.sessions };
delete sessions[id];
const order = state.order.filter((x) => x !== id);
let activeSessionId = state.activeSessionId;
if (activeSessionId === id) {
const removedIdx = state.order.indexOf(id);
activeSessionId = order[Math.max(0, removedIdx - 1)] || order[0] || null;
}
return { sessions, order, activeSessionId };
}
case A.SET_ACTIVE: {
if (!state.sessions[action.id]) return state;
if (state.activeSessionId === action.id) return state;
return { ...state, activeSessionId: action.id };
}
case A.SET_STATUS: {
const session = state.sessions[action.id];
if (!session || session.status === action.status) return state;
const connected = action.status === "connected" || action.status === "verified" || action.status === "reconnecting";
const patch = !connected && session.peerPresence !== null ? { status: action.status, peerPresence: null } : { status: action.status };
return patchSession(state, action.id, patch);
}
case A.SET_FINGERPRINT:
return patchSession(state, action.id, { keyFingerprint: action.fingerprint });
case A.SET_VERIFICATION:
return patchSession(state, action.id, { verificationCode: action.code });
case A.SET_SAS: {
const session = state.sessions[action.id];
if (!session) return state;
return patchSession(state, action.id, { sas: { ...session.sas, ...action.sas } });
}
case A.ADD_MESSAGE: {
const session = state.sessions[action.id];
if (!session) return state;
return patchSession(state, action.id, { messages: [...session.messages, action.message] });
}
case A.SET_MESSAGES: {
const session = state.sessions[action.id];
if (!session) return state;
const next = typeof action.updater === "function" ? action.updater(session.messages) : action.messages;
return patchSession(state, action.id, { messages: Array.isArray(next) ? next : [] });
}
case A.UPDATE_MESSAGE_STATUS: {
const session = state.sessions[action.id];
if (!session) return state;
let changed = false;
const messages = session.messages.map((m) => {
if (String(m.mid) === String(action.mid) && m.status !== action.status) {
changed = true;
return { ...m, status: action.status };
}
return m;
});
return changed ? patchSession(state, action.id, { messages }) : state;
}
case A.PATCH_MESSAGE: {
const session = state.sessions[action.id];
if (!session) return state;
const byId = action.messageId != null ? String(action.messageId) : null;
const byMid = action.mid != null ? String(action.mid) : null;
const byFileId = action.fileId != null ? String(action.fileId) : null;
let changed = false;
const messages = session.messages.map((m) => {
const hit = byId != null && String(m.id) === byId || byMid != null && String(m.mid) === byMid || byFileId != null && m.fileId != null && String(m.fileId) === byFileId;
if (!hit) return m;
changed = true;
const patch = typeof action.patch === "function" ? action.patch(m) : action.patch;
return { ...m, ...patch };
});
return changed ? patchSession(state, action.id, { messages }) : state;
}
case A.DELETE_MESSAGE: {
const session = state.sessions[action.id];
if (!session) return state;
const messages = session.messages.filter((m) => String(m.mid) !== String(action.mid));
if (messages.length === session.messages.length) return state;
return patchSession(state, action.id, { messages });
}
case A.EXPIRE_MESSAGE: {
const session = state.sessions[action.id];
if (!session) return state;
let changed = false;
const messages = session.messages.map((m) => {
if (String(m.id) === String(action.messageId) && !m.expired) {
changed = true;
return { ...m, expired: true, message: "", expiresAt: void 0 };
}
return m;
});
return changed ? patchSession(state, action.id, { messages }) : state;
}
case A.INCREMENT_UNREAD: {
const session = state.sessions[action.id];
if (!session) return state;
return patchSession(state, action.id, { unreadCount: session.unreadCount + 1 });
}
case A.CLEAR_UNREAD: {
const session = state.sessions[action.id];
if (!session || session.unreadCount === 0) return state;
return patchSession(state, action.id, { unreadCount: 0 });
}
case A.SET_PENDING_FILES: {
const session = state.sessions[action.id];
if (!session) return state;
const next = typeof action.updater === "function" ? action.updater(session.pendingIncomingFiles) : action.files;
return patchSession(state, action.id, { pendingIncomingFiles: Array.isArray(next) ? next : [] });
}
case A.PATCH_SETUP: {
const session = state.sessions[action.id];
if (!session) return state;
return patchSession(state, action.id, { setup: { ...session.setup, ...action.patch } });
}
case A.RENAME: {
const session = state.sessions[action.id];
if (!session) return state;
const label2 = String(action.label || "").trim() || session.peerLabel;
return patchSession(state, action.id, { peerLabel: label2, labelIsCustom: true });
}
case A.SET_PEER_PRESENCE: {
const session = state.sessions[action.id];
if (!session || session.peerPresence === action.presence) return state;
return patchSession(state, action.id, { peerPresence: action.presence });
}
default:
return state;
}
}
function decorateSession(session, activeSessionId) {
const lastMessage = [...session.messages].reverse().find(
(m) => !m.expired && m.type !== "system" && (typeof m.message === "string" && m.message.trim() || m.voice)
);
const s = session.status;
const isUp = s === "connected" || s === "verified";
const isPending = s === "connecting" || s === "verifying" || s === "new" || s === "reconnecting";
let dot, headerSub;
if (isPending) {
dot = "#e3b341";
headerSub = statusSub(s);
} else if (isUp) {
dot = session.peerPresence ? PRESENCE_DOT[session.peerPresence] || "#6b6b73" : "#3ecf8e";
headerSub = session.peerPresence ? PRESENCE_WORD[session.peerPresence] || t("presence.online") : t("conn.p2p");
} else {
dot = "#e5727a";
headerSub = statusSub(s);
}
const preview = lastMessage ? lastMessage.voice ? "\u{1F399} Voice message" : lastMessage.message : headerSub;
return {
id: session.id,
name: session.peerLabel,
mono: monoInitials(session.peerLabel),
dot,
headerSub,
status: session.status,
peerPresence: session.peerPresence,
preview,
unread: session.unreadCount > 0 ? session.unreadCount > 99 ? "99+" : String(session.unreadCount) : null,
verified: !!session.sas.isVerified,
active: session.id === activeSessionId,
inactive: session.id !== activeSessionId
};
}
function decorateSessions(state) {
return state.order.map((id) => state.sessions[id]).filter(Boolean).map((s) => decorateSession(s, state.activeSessionId));
}
// src/group/groupCrypto.js
var GROUP_LIMITS = Object.freeze({
// Eight is a mesh limit, not a crypto limit: it is where N(N-1)/2 pairwise
// connections and N-1 fan-out copies stop being comfortable in a browser.
MAX_MEMBERS: 8,
MIN_MEMBERS: 2,
GROUP_ID_BYTES: 16,
NONCE_BYTES: 32,
COMMIT_BYTES: 32,
FINGERPRINT_BYTES: 32,
// Matches the pairwise SAS. Safe at this length only because of the
// commit-reveal ordering above — see the header.
SAS_DIGITS: 7,
// Bytes, not characters — and the gap between the two is a real trap. The
// create dialog used to cap input at 64 CHARACTERS, so a 36-character
// Cyrillic name ("Наша секретная группа для обсуждений") is 68 bytes and was
// accepted by the UI and then rejected here, inside the admin's roster
// signing, killing group formation with no visible cause. The dialog now
// clamps by bytes, and the budget is generous enough that a normal name in
// any script fits.
MAX_NAME_BYTES: 128,
// Epoch is a uint32 on the wire; a group that changes membership four
// billion times has other problems.
MAX_EPOCH: 4294967295,
MAX_SPKI_BYTES: 256,
MIN_SPKI_BYTES: 40,
MAX_SIG_BYTES: 160,
MIN_SIG_BYTES: 48,
/**
* Group frames travel as chat content on a pairwise session, and that path
* ends in EnhancedSecureCryptoUtils.sanitizeMessage, which runs DOMPurify and
* then truncates to 2000 characters. Truncation would corrupt a frame
* silently, so every frame has to fit underneath it after base64 — see
* FRAME_BUDGET_CHARS and the envelope in GroupSession.
*
* A frame's fixed overhead (group id, epoch, sequence, sender fingerprint,
* timestamp, signature, envelope) is roughly 300 bytes, and base64 costs
* another third. 1024 bytes of body leaves comfortable headroom, and it is
* bytes rather than characters so a message in a non-Latin script is bounded
* by the same real budget.
*/
MAX_BODY_BYTES: 1024,
FRAME_BUDGET_CHARS: 1800,
/**
* A mesh descriptor as it travels inside a group frame.
*
* SBQ2 caps a descriptor payload at 512 bytes (LIMITS.MAX_PAYLOAD_BYTES),
* which is "SB2:" plus 683 base64url characters at the absolute worst. 768
* bounds the allocation with room to spare and still leaves the whole frame
* — descriptor, two fingerprints, a nonce and a signature, wrapped in a
* relay envelope and base64'd — under FRAME_BUDGET_CHARS. A descriptor that
* somehow does not fit is refused rather than truncated; the pair simply
* stays on the relay path, which is the same thing that happens when the
* mesh dial fails for any other reason.
*/
MAX_DESCRIPTOR_CHARS: 768,
/** Binds an answer to the one dial attempt that asked for it. */
MESH_NONCE_BYTES: 16,
/**
* A group call's identifier, in bytes.
*
* Random rather than derived, and long enough that two members who press
* "call" at the same instant cannot collide. Everything about a call is
* scoped to it: a `join` for one call says nothing about another, and a
* `leave` replayed from a finished call cannot end a later one.
*/
CALL_ID_BYTES: 16
});
var CALL_ACTIONS = Object.freeze({
START: "start",
// I have opened a call and I am in it
JOIN: "join",
// I am joining the call already open
LEAVE: "leave"
// I have left; the call ends when nobody is left
});
var MESH_KINDS = Object.freeze({ OFFER: "moffer", ANSWER: "manswer" });
var MEMBER_OPS = Object.freeze({
CREATE: "create",
ADD: "add",
REMOVE: "remove",
RENAME: "rename"
});
var ENC = new TextEncoder();
var GroupCryptoError = class extends Error {
constructor(message, code = "group_crypto") {
super(message);
this.name = "GroupCryptoError";
this.code = code;
}
};
var fail = (msg, code) => {
throw new GroupCryptoError(msg, code);
};
function toHex(bytes) {
const view = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
let out = "";
for (let i = 0; i < view.length; i++) out += view[i].toString(16).padStart(2, "0");
return out;
}
function fromHex(hex) {
if (typeof hex !== "string" || hex.length % 2 !== 0 || !/^[0-9a-f]*$/i.test(hex)) {
fail("not a hex string", "bad_hex");
}
const out = new Uint8Array(hex.length / 2);
for (let i = 0; i < out.length; i++) out[i] = parseInt(hex.substr(i * 2, 2), 16);
return out;
}
function toB64(bytes) {
const view = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
let binary = "";
for (let i = 0; i < view.length; i++) binary += String.fromCharCode(view[i]);
return btoa(binary);
}
function fromB64(b64, { max = GROUP_LIMITS.MAX_SPKI_BYTES } = {}) {
if (typeof b64 !== "string") fail("not a base64 string", "bad_b64");
if (b64.length > Math.ceil(max * 4 / 3) + 4) fail("base64 payload exceeds its limit", "bad_b64");
let binary;
try {
binary = atob(b64);
} catch (_) {
fail("malformed base64", "bad_b64");
}
const out = new Uint8Array(binary.length);
for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);
return out;
}
function randomBytes(n) {
return crypto.getRandomValues(new Uint8Array(n));
}
function newGroupId() {
return toHex(randomBytes(GROUP_LIMITS.GROUP_ID_BYTES));
}
function lp(label2, ...parts) {
const chunks = [ENC.encode(label2 + "\0")];
let total = chunks[0].length;
for (const part of parts) {
const bytes = part instanceof Uint8Array ? part : typeof part === "string" ? ENC.encode(part) : fail("unsupported payload component", "bad_payload");
const header = new Uint8Array(4);
new DataView(header.buffer).setUint32(0, bytes.length);
chunks.push(header, bytes);
total += 4 + bytes.length;
}
const out = new Uint8Array(total);
let o = 0;
for (const c of chunks) {
out.set(c, o);
o += c.length;
}
return out;
}
function u32(n) {
if (!Number.isInteger(n) || n < 0 || n > GROUP_LIMITS.MAX_EPOCH) fail("value out of uint32 range", "bad_u32");
const b = new Uint8Array(4);
new DataView(b.buffer).setUint32(0, n);
return b;
}
function equalBytes(a, b) {
if (!(a instanceof Uint8Array) || !(b instanceof Uint8Array) || a.length !== b.length) return false;
let diff = 0;
for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];
return diff === 0;
}
function assertGroupId(groupId) {
if (typeof groupId !== "string" || groupId.length !== GROUP_LIMITS.GROUP_ID_BYTES * 2 || !/^[0-9a-f]+$/.test(groupId)) {
fail("malformed group id", "bad_group_id");
}
return groupId;
}
function assertFingerprint(fp) {
if (typeof fp !== "string" || fp.length !== GROUP_LIMITS.FINGERPRINT_BYTES * 2 || !/^[0-9a-f]+$/.test(fp)) {
fail("malformed member fingerprint", "bad_fingerprint");
}
return fp;
}
function assertEpoch(epoch) {
if (!Number.isInteger(epoch) || epoch < 0 || epoch > GROUP_LIMITS.MAX_EPOCH) {
fail("epoch out of range", "bad_epoch");
}
return epoch;
}
function assertName(name) {
const value = typeof name === "string" ? name : "";
if (ENC.encode(value).length > GROUP_LIMITS.MAX_NAME_BYTES) fail("group name too long", "bad_name");
return value;
}
function canonicalFingerprints(fps) {
if (!Array.isArray(fps)) fail("member list is not an array", "bad_members");
if (fps.length < GROUP_LIMITS.MIN_MEMBERS) fail("a group needs at least two members", "bad_members");
if (fps.length > GROUP_LIMITS.MAX_MEMBERS) fail(`a group is limited to ${GROUP_LIMITS.MAX_MEMBERS} members`, "too_many_members");
const seen = /* @__PURE__ */ new Set();
for (const fp of fps) {
assertFingerprint(fp);
if (seen.has(fp)) fail("duplicate member fingerprint", "duplicate_member");
seen.add(fp);
}
return [...fps].sort();
}
async function generateGroupIdentity(subtle) {
const keyPair = await subtle.generateKey(
{ name: "ECDSA", namedCurve: "P-384" },
false,
["sign", "verify"]
);
const spki = new Uint8Array(await subtle.exportKey("spki", keyPair.publicKey));
const fingerprint = await fingerprintSpki(subtle, spki);
return { keyPair, spki, fingerprint };
}
async function fingerprintSpki(subtle, spki) {
if (!(spki instanceof Uint8Array) || spki.length < GROUP_LIMITS.MIN_SPKI_BYTES || spki.length > GROUP_LIMITS.MAX_SPKI_BYTES) {
fail("SPKI length out of range", "bad_spki");
}
return toHex(new Uint8Array(await subtle.digest("SHA-256", spki)));
}
async function importMemberIdentity(subtle, spki) {
const fingerprint = await fingerprintSpki(subtle, spki);
let publicKey;
try {
publicKey = await subtle.importKey("spki", spki, { name: "ECDSA", namedCurve: "P-384" }, false, ["verify"]);
} catch (_) {
fail("member identity key is not a valid P-384 public key", "bad_spki");
}
return { publicKey, fingerprint };
}
async function buildCommitment(subtle, { groupId, epoch, fingerprint, nonce }) {
assertGroupId(groupId);
assertEpoch(epoch);
assertFingerprint(fingerprint);
if (!(nonce instanceof Uint8Array) || nonce.length !== GROUP_LIMITS.NONCE_BYTES) {
fail("nonce must be 32 bytes", "bad_nonce");
}
const payload = lp("securebit/group/commit/v1", fromHex(groupId), u32(epoch), fromHex(fingerprint), nonce);
return new Uint8Array(await subtle.digest("SHA-256", payload));
}
async function verifyCommitment(subtle, commitment, fields) {
if (!(commitment instanceof Uint8Array) || commitment.length !== GROUP_LIMITS.COMMIT_BYTES) return false;
let expected;
try {
expected = await buildCommitment(subtle, fields);
} catch (_) {
return false;
}
return equalBytes(commitment, expected);
}
async function computeGroupSas(subtle, { groupId, epoch, contributions, digits = GROUP_LIMITS.SAS_DIGITS }) {
assertGroupId(groupId);
assertEpoch(epoch);
if (!Array.isArray(contributions)) fail("contributions must be an array", "bad_contributions");
if (!Number.isInteger(digits) || digits < 4 || digits > 12) fail("digit count out of range", "bad_digits");
canonicalFingerprints(contributions.map((c) => c && c.fingerprint));
const ordered = [...contributions].sort((a, b) => a.fingerprint < b.fingerprint ? -1 : 1);
const parts = [];
for (const c of ordered) {
if (!(c.nonce instanceof Uint8Array) || c.nonce.length !== GROUP_LIMITS.NONCE_BYTES) {
fail("every member must contribute a 32-byte nonce", "bad_nonce");
}
parts.push(fromHex(c.fingerprint), c.nonce);
}
const ikm = lp("securebit/group/sas/v1", fromHex(groupId), u32(epoch), ...parts);
const salt = new Uint8Array(await subtle.digest("SHA-256", lp("securebit/group/sas-salt/v1", fromHex(groupId), u32(epoch))));
let key = null;
try {
key = await subtle.importKey("raw", ikm, "HKDF", false, ["deriveBits"]);
const bits = await subtle.deriveBits(
{ name: "HKDF", hash: "SHA-256", salt, info: ENC.encode("securebit-group-sas-v1") },
key,
64
);
const dv = new DataView(bits);
const n = dv.getUint32(0) * 2 ** 20 + (dv.getUint32(4) >>> 12);
return String(n % 10 ** digits).padStart(digits, "0");
} finally {
try {
ikm.fill(0);
} catch (_) {
}
}
}
var GroupSasCeremony = class {
constructor({ groupId, epoch, selfFingerprint, memberFingerprints }) {
this.groupId = assertGroupId(groupId);
this.epoch = assertEpoch(epoch);
this.selfFingerprint = assertFingerprint(selfFingerprint);
this.members = canonicalFingerprints(memberFingerprints);
if (!this.members.includes(this.selfFingerprint)) {
fail("the local member is not in the member set", "not_a_member");
}
this.nonce = randomBytes(GROUP_LIMITS.NONCE_BYTES);
this.commitments = /* @__PURE__ */ new Map();
this.nonces = /* @__PURE__ */ new Map();
this.revealed = false;
this.code = null;
}
/** Our own commitment, to be broadcast first. */
async ownCommitment(subtle) {
const commitment = await buildCommitment(subtle, {
groupId: this.groupId,
epoch: this.epoch,
fingerprint: this.selfFingerprint,
nonce: this.nonce
});
this.commitments.set(this.selfFingerprint, commitment);
return commitment;
}
/**
* Record a peer commitment. Rejects anyone outside the member set, and
* refuses to overwrite one already recorded — a second, different commitment
* from the same member is an attempt to move after seeing more of the round.
*/
acceptCommitment(fingerprint, commitment) {
assertFingerprint(fingerprint);
if (!this.members.includes(fingerprint)) fail("commitment from a non-member", "not_a_member");
if (!(commitment instanceof Uint8Array) || commitment.length !== GROUP_LIMITS.COMMIT_BYTES) {
fail("malformed commitment", "bad_commitment");
}
const existing = this.commitments.get(fingerprint);
if (existing) {
if (!equalBytes(existing, commitment)) fail("member changed their commitment", "commitment_changed");
return false;
}
this.commitments.set(fingerprint, commitment);
return true;
}
get commitmentsComplete() {
return this.members.every((fp) => this.commitments.has(fp));
}
/**
* Our nonce — available ONLY once every commitment is in.
*
* This is the gate the whole construction rests on. Do not add a caller that
* bypasses it, and do not "helpfully" relax it when a member is slow: a
* timeout must fail the ceremony, never proceed without a commitment.
*/
reveal() {
if (!this.commitmentsComplete) {
fail("cannot reveal before every member has committed", "premature_reveal");
}
this.revealed = true;
this.nonces.set(this.selfFingerprint, this.nonce);
return this.nonce;
}
/** Record a peer nonce, checking it against the commitment they are bound to. */
async acceptReveal(subtle, fingerprint, nonce) {
assertFingerprint(fingerprint);
if (!this.members.includes(fingerprint)) fail("reveal from a non-member", "not_a_member");
const commitment = this.commitments.get(fingerprint);
if (!commitment) fail("reveal arrived before the commitment", "reveal_without_commitment");
const ok = await verifyCommitment(subtle, commitment, {
groupId: this.groupId,
epoch: this.epoch,
fingerprint,
nonce
});
if (!ok) fail("revealed nonce does not match the commitment", "commitment_mismatch");
this.nonces.set(fingerprint, nonce);
return true;
}
get revealsComplete() {
return this.members.every((fp) => this.nonces.has(fp));
}
/** The digits, once every nonce is in and verified. */
async finish(subtle) {
if (!this.revealsComplete) fail("not every member has revealed", "incomplete_reveal");
this.code = await computeGroupSas(subtle, {
groupId: this.groupId,
epoch: this.epoch,
contributions: this.members.map((fp) => ({ fingerprint: fp, nonce: this.nonces.get(fp) }))
});
return this.code;
}
/** Wipe the nonce material once the code exists or the ceremony is abandoned. */
destroy() {
try {
this.nonce.fill(0);
} catch (_) {
}
for (const n of this.nonces.values()) {
try {
n.fill(0);
} catch (_) {
}
}
this.nonces.clear();
this.commitments.clear();
}
};
function memberOpPayload({ groupId, epoch, op, memberFps, name = "" }) {
assertGroupId(groupId);
assertEpoch(epoch);
if (!Object.values(MEMBER_OPS).includes(op)) fail("unknown membership operation", "bad_op");
const ordered = canonicalFingerprints(memberFps);
return lp(
"securebit/group/member-op/v1",
fromHex(groupId),
u32(epoch),
op,
assertName(name),
...ordered.map((fp) => fromHex(fp))
);
}
async function signMemberOp(subtle, privateKey, fields) {
const sig = await subtle.sign({ name: "ECDSA", hash: "SHA-384" }, privateKey, memberOpPayload(fields));
return new Uint8Array(sig);
}
async function verifyMemberOp(subtle, publicKey, fields, signature) {
if (!(signature instanceof Uint8Array) || signature.length < GROUP_LIMITS.MIN_SIG_BYTES || signature.length > GROUP_LIMITS.MAX_SIG_BYTES) {
return false;
}
let payload;
try {
payload = memberOpPayload(fields);
} catch (_) {
return false;
}
try {
return await subtle.verify({ name: "ECDSA", hash: "SHA-384" }, publicKey, signature, payload);
} catch (_) {
return false;
}
}
async function hashBody(subtle, body) {
const bytes = typeof body === "string" ? ENC.encode(body) : body;
if (!(bytes instanceof Uint8Array)) fail("message body must be a string or bytes", "bad_body");
if (bytes.length > GROUP_LIMITS.MAX_BODY_BYTES) fail("message body exceeds the group limit", "body_too_large");
return new Uint8Array(await subtle.digest("SHA-256", bytes));
}
function groupMessagePayload({ groupId, epoch, seq, senderFp, bodyHash }) {
assertGroupId(groupId);
assertEpoch(epoch);
assertEpoch(seq);
assertFingerprint(senderFp);
if (!(bodyHash instanceof Uint8Array) || bodyHash.length !== 32) fail("body hash must be 32 bytes", "bad_body_hash");
return lp("securebit/group/message/v1", fromHex(groupId), u32(epoch), u32(seq), fromHex(senderFp), bodyHash);
}
async function signGroupMessage(subtle, privateKey, fields) {
const sig = await subtle.sign({ name: "ECDSA", hash: "SHA-384" }, privateKey, groupMessagePayload(fields));
return new Uint8Array(sig);
}
async function verifyGroupMessage(subtle, publicKey, fields, signature) {
if (!(signature instanceof Uint8Array) || signature.length < GROUP_LIMITS.MIN_SIG_BYTES || signature.length > GROUP_LIMITS.MAX_SIG_BYTES) {
return false;
}
let payload;
try {
payload = groupMessagePayload(fields);
} catch (_) {
return false;
}
try {
return await subtle.verify({ name: "ECDSA", hash: "SHA-384" }, publicKey, signature, payload);
} catch (_) {
return false;
}
}
function meshDescriptorPayload({ groupId, epoch, kind, fromFp, toFp, descriptor, nonce }) {
assertGroupId(groupId);
assertEpoch(epoch);
if (kind !== MESH_KINDS.OFFER && kind !== MESH_KINDS.ANSWER) {
fail("unknown mesh descriptor kind", "bad_mesh_kind");
}
assertFingerprint(fromFp);
assertFingerprint(toFp);
if (fromFp === toFp) fail("a member cannot dial itself", "bad_mesh_peer");
if (typeof descriptor !== "string" || descriptor.length === 0 || descriptor.length > GROUP_LIMITS.MAX_DESCRIPTOR_CHARS) {
fail("mesh descriptor is missing or oversized", "bad_descriptor");
}
if (!(nonce instanceof Uint8Array) || nonce.length !== GROUP_LIMITS.MESH_NONCE_BYTES) {
fail("mesh nonce must be 16 bytes", "bad_mesh_nonce");
}
return lp(
"securebit/group/mesh-descriptor/v1",
fromHex(groupId),
u32(epoch),
kind,
fromHex(fromFp),
fromHex(toFp),
descriptor,
nonce
);
}
async function signMeshDescriptor(subtle, privateKey, fields) {
const sig = await subtle.sign({ name: "ECDSA", hash: "SHA-384" }, privateKey, meshDescriptorPayload(fields));
return new Uint8Array(sig);
}
async function verifyMeshDescriptor(subtle, publicKey, fields, signature) {
if (!(signature instanceof Uint8Array) || signature.length < GROUP_LIMITS.MIN_SIG_BYTES || signature.length > GROUP_LIMITS.MAX_SIG_BYTES) {
return false;
}
let payload;
try {
payload = meshDescriptorPayload(fields);
} catch (_) {
return false;
}
try {
return await subtle.verify({ name: "ECDSA", hash: "SHA-384" }, publicKey, signature, payload);
} catch (_) {
return false;
}
}
function linkProbePayload({ groupId, epoch, fp, linkFp }) {
assertGroupId(groupId);
assertEpoch(epoch);
assertFingerprint(fp);
if (typeof linkFp !== "string" || linkFp.length === 0 || linkFp.length > 256) {
fail("link fingerprint is missing or oversized", "bad_link_fp");
}
return lp("securebit/group/link-probe/v1", fromHex(groupId), u32(epoch), fromHex(fp), linkFp);
}
async function signLinkProbe(subtle, privateKey, fields) {
const sig = await subtle.sign({ name: "ECDSA", hash: "SHA-384" }, privateKey, linkProbePayload(fields));
return new Uint8Array(sig);
}
async function verifyLinkProbe(subtle, publicKey, fields, signature) {
if (!(signature instanceof Uint8Array) || signature.length < GROUP_LIMITS.MIN_SIG_BYTES || signature.length > GROUP_LIMITS.MAX_SIG_BYTES) {
return false;
}
let payload;
try {
payload = linkProbePayload(fields);
} catch (_) {
return false;
}
try {
return await subtle.verify({ name: "ECDSA", hash: "SHA-384" }, publicKey, signature, payload);
} catch (_) {
return false;
}
}
function groupCallPayload({ groupId, epoch, callId, action, fp, seq, withVideo }) {
assertGroupId(groupId);
assertEpoch(epoch);
assertCallId(callId);
assertEpoch(seq);
assertFingerprint(fp);
if (action !== CALL_ACTIONS.START && action !== CALL_ACTIONS.JOIN && action !== CALL_ACTIONS.LEAVE) {
fail("unknown call action", "bad_call_action");
}
return lp(
"securebit/group/call/v1",
fromHex(groupId),
u32(epoch),
fromHex(callId),
action,
fromHex(fp),
u32(seq),
withVideo === true ? "v" : "a"
);
}
function assertCallId(callId) {
if (typeof callId !== "string" || callId.length !== GROUP_LIMITS.CALL_ID_BYTES * 2 || !/^[0-9a-f]+$/.test(callId)) {
fail("malformed call id", "bad_call_id");
}
return callId;
}
function newCallId() {
return toHex(randomBytes(GROUP_LIMITS.CALL_ID_BYTES));
}
async function signGroupCall(subtle, privateKey, fields) {
const sig = await subtle.sign({ name: "ECDSA", hash: "SHA-384" }, privateKey, groupCallPayload(fields));
return new Uint8Array(sig);
}
async function verifyGroupCall(subtle, publicKey, fields, signature) {
if (!(signature instanceof Uint8Array) || signature.length < GROUP_LIMITS.MIN_SIG_BYTES || signature.length > GROUP_LIMITS.MAX_SIG_BYTES) {
return false;
}
let payload;
try {
payload = groupCallPayload(fields);
} catch (_) {
return false;
}
try {
return await subtle.verify({ name: "ECDSA", hash: "SHA-384" }, publicKey, signature, payload);
} catch (_) {
return false;
}
}
// src/state/groupsStore.js
var GROUP_ACTIONS = Object.freeze({
CREATE_GROUP: "CREATE_GROUP",
REMOVE_GROUP: "REMOVE_GROUP",
SET_ACTIVE_GROUP: "SET_ACTIVE_GROUP",
SET_PHASE: "SET_PHASE",
SET_MEMBERS: "SET_MEMBERS",
PATCH_MEMBER: "PATCH_MEMBER",
SET_SAS: "SET_SAS",
CONFIRM_SAS: "CONFIRM_SAS",
ADD_MESSAGE: "ADD_MESSAGE",
SET_MESSAGES: "SET_MESSAGES",
UPDATE_MESSAGE_STATUS: "UPDATE_MESSAGE_STATUS",
INCREMENT_UNREAD: "INCREMENT_UNREAD",
CLEAR_UNREAD: "CLEAR_UNREAD",
RENAME: "RENAME",
SET_ERROR: "SET_ERROR"
});
var GROUP_PHASE = Object.freeze({
FORMING: "forming",
// members chosen, identity keys being exchanged
COMMITTING: "committing",
// commitments in flight
REVEALING: "revealing",
// every commitment in, nonces in flight
AWAITING_SAS: "awaiting_sas",
// code computed, waiting for the humans
READY: "ready",
// confirmed; group traffic flows
FAILED: "failed"
// ceremony aborted; nothing flows
});
var MEMBER_STATE = Object.freeze({
SELF: "self",
LINKED: "linked",
// pairwise session up and SAS-verified
PENDING: "pending",
// session exists but is not verified/connected yet
LOST: "lost"
// was linked, connection dropped
});
var GROUP_PHASE_WORD = {
[GROUP_PHASE.FORMING]: t("groupPhase.forming"),
[GROUP_PHASE.COMMITTING]: t("groupPhase.commitments"),
[GROUP_PHASE.REVEALING]: t("groupPhase.revealing"),
[GROUP_PHASE.AWAITING_SAS]: t("groupPhase.compare"),
[GROUP_PHASE.READY]: t("groupPhase.ready"),
[GROUP_PHASE.FAILED]: t("groupPhase.failed")
};
function groupInitials(name) {
const words = String(name || "").trim().split(/\s+/).filter(Boolean);
const a = words[0]?.[0] || "";
const b = words[1]?.[0] || words[0]?.[1] || "";
return (a + b).toUpperCase() || "##";
}
function createGroupEntry(opts = {}) {
return {
id: opts.id,
name: opts.name || "Group",
createdAt: opts.createdAt || Date.now(),
adminFp: opts.adminFp || "",
selfFp: opts.selfFp || "",
isAdmin: !!opts.isAdmin,
epoch: Number.isInteger(opts.epoch) ? opts.epoch : 1,
phase: opts.phase || GROUP_PHASE.FORMING,
// members: [{ fp, name, sessionId, state }]. Always stored in canonical
// fingerprint order so every device renders the same list.
members: Array.isArray(opts.members) ? [...opts.members].sort(byFingerprint) : [],
sasCode: "",
sasConfirmed: false,
messages: [],
unreadCount: 0,
error: null
};
}
var NAME_ENCODER = new TextEncoder();
function clampNameBytes(value) {
let out = String(value);
while (NAME_ENCODER.encode(out).length > GROUP_LIMITS.MAX_NAME_BYTES) out = out.slice(0, -1);
return out;
}
function byFingerprint(a, b) {
return a.fp < b.fp ? -1 : a.fp > b.fp ? 1 : 0;
}
function createInitialGroupState() {
return { groups: {}, order: [], activeGroupId: null };
}
function patchGroup(state, id, patch) {
const group = state.groups[id];
if (!group) return state;
return { ...state, groups: { ...state.groups, [id]: { ...group, ...patch } } };
}
function groupsReducer(state, action) {
const A = GROUP_ACTIONS;
switch (action.type) {
case A.CREATE_GROUP: {
const entry = action.entry || createGroupEntry(action);
if (!entry.id || state.groups[entry.id]) return state;
return {
groups: { ...state.groups, [entry.id]: entry },
order: [...state.order, entry.id],
activeGroupId: action.activate === false ? state.activeGroupId : entry.id
};
}
case A.REMOVE_GROUP: {
const { id } = action;
if (!state.groups[id]) return state;
const groups = { ...state.groups };
delete groups[id];
const order = state.order.filter((x) => x !== id);
let activeGroupId = state.activeGroupId;
if (activeGroupId === id) {
const removedIdx = state.order.indexOf(id);
activeGroupId = order[Math.max(0, removedIdx - 1)] || order[0] || null;
}
return { groups, order, activeGroupId };
}
case A.SET_ACTIVE_GROUP: {
if (action.id === null) {
return state.activeGroupId === null ? state : { ...state, activeGroupId: null };
}
if (!state.groups[action.id] || state.activeGroupId === action.id) return state;
return { ...state, activeGroupId: action.id };
}
case A.SET_PHASE: {
const group = state.groups[action.id];
if (!group || group.phase === action.phase) return state;
const patch = { phase: action.phase };
if (action.phase !== GROUP_PHASE.READY && group.sasConfirmed) {
patch.sasConfirmed = false;
}
if (action.phase !== GROUP_PHASE.READY && action.phase !== GROUP_PHASE.AWAITING_SAS) {
patch.sasCode = "";
}
if (action.phase !== GROUP_PHASE.FAILED) patch.error = null;
return patchGroup(state, action.id, patch);
}
case A.SET_MEMBERS: {
const group = state.groups[action.id];
if (!group) return state;
const members = Array.isArray(action.members) ? [...action.members].sort(byFingerprint) : group.members;
const patch = { members };
if (Number.isInteger(action.epoch)) patch.epoch = action.epoch;
return patchGroup(state, action.id, patch);
}
case A.PATCH_MEMBER: {
const group = state.groups[action.id];
if (!group) return state;
let changed = false;
const members = group.members.map((m) => {
if (m.fp !== action.fp) return m;
const next = { ...m, ...action.patch };
if (Object.keys(action.patch).every((k) => m[k] === next[k])) return m;
changed = true;
return next;
});
return changed ? patchGroup(state, action.id, { members }) : state;
}
case A.SET_SAS: {
const group = state.groups[action.id];
if (!group || group.sasCode === action.code) return state;
return patchGroup(state, action.id, { sasCode: action.code || "", sasConfirmed: false });
}
case A.CONFIRM_SAS: {
const group = state.groups[action.id];
if (!group) return state;
if (!group.sasCode) return state;
if (group.phase !== GROUP_PHASE.AWAITING_SAS) return state;
if (group.sasConfirmed && group.phase === GROUP_PHASE.READY) return state;
return patchGroup(state, action.id, { sasConfirmed: true, phase: GROUP_PHASE.READY, error: null });
}
case A.ADD_MESSAGE: {
const group = state.groups[action.id];
if (!group) return state;
return patchGroup(state, action.id, { messages: [...group.messages, action.message] });
}
case A.SET_MESSAGES: {
const group = state.groups[action.id];
if (!group) return state;
const next = typeof action.updater === "function" ? action.updater(group.messages) : action.messages;
return patchGroup(state, action.id, { messages: Array.isArray(next) ? next : [] });
}
case A.UPDATE_MESSAGE_STATUS: {
const group = state.groups[action.id];
if (!group) return state;
let changed = false;
const messages = group.messages.map((m) => {
if (String(m.mid) === String(action.mid) && m.status !== action.status) {
changed = true;
return { ...m, status: action.status };
}
return m;
});
return changed ? patchGroup(state, action.id, { messages }) : state;
}
case A.INCREMENT_UNREAD: {
const group = state.groups[action.id];
if (!group) return state;
return patchGroup(state, action.id, { unreadCount: group.unreadCount + 1 });
}
case A.CLEAR_UNREAD: {
const group = state.groups[action.id];
if (!group || group.unreadCount === 0) return state;
return patchGroup(state, action.id, { unreadCount: 0 });
}
case A.RENAME: {
const group = state.groups[action.id];
if (!group) return state;
const name = clampNameBytes(String(action.name || "").trim()) || group.name;
return patchGroup(state, action.id, { name });
}
case A.SET_ERROR: {
const group = state.groups[action.id];
if (!group) return state;
const patch = { error: action.error || null };
if (action.error) patch.phase = GROUP_PHASE.FAILED;
return patchGroup(state, action.id, patch);
}
default:
return state;
}
}
function linkedCount(group) {
return group.members.filter((m) => m.state === MEMBER_STATE.SELF || m.state === MEMBER_STATE.LINKED).length;
}
function groupSub(group) {
if (group.phase !== GROUP_PHASE.READY) return GROUP_PHASE_WORD[group.phase] || "Group";
const total = group.members.length;
const linked = linkedCount(group);
if (linked < total) return `${linked} of ${total} connected`;
return `${total} members \xB7 P2P mesh`;
}
function groupDot(group) {
switch (group.phase) {
case GROUP_PHASE.READY:
return linkedCount(group) < group.members.length ? "#e3b341" : "#3ecf8e";
case GROUP_PHASE.FAILED:
return "#e5727a";
default:
return "#e3b341";
}
}
function decorateGroup(group, activeGroupId) {
const lastMessage = [...group.messages].reverse().find(
(m) => !m.expired && typeof m.message === "string" && m.message.trim()
);
const sub = groupSub(group);
return {
id: group.id,
kind: "group",
name: group.name,
mono: groupInitials(group.name),
dot: groupDot(group),
headerSub: sub,
phase: group.phase,
memberCount: group.members.length,
linkedCount: linkedCount(group),
preview: lastMessage ? lastMessage.message : sub,
unread: group.unreadCount > 0 ? group.unreadCount > 99 ? "99+" : String(group.unreadCount) : null,
verified: group.phase === GROUP_PHASE.READY && group.sasConfirmed,
active: group.id === activeGroupId,
inactive: group.id !== activeGroupId
};
}
function decorateGroups(state) {
return state.order.map((id) => state.groups[id]).filter(Boolean).map((g) => decorateGroup(g, state.activeGroupId));
}
// src/group/GroupSession.js
var GROUP_FRAMES = Object.freeze({
INVITE: "g_invite",
HELLO: "g_hello",
MEMBER: "g_member",
ROSTER: "g_roster",
COMMIT: "g_commit",
REVEAL: "g_reveal",
MESSAGE: "g_msg",
RELAY: "g_relay",
LEAVE: "g_leave",
// Mesh link establishment. These carry SBQ2 descriptors between two members
// who have no link yet, over the relay path of a member who can reach both.
MESH_OFFER: "g_moffer",
MESH_ANSWER: "g_manswer",
MESH_ABORT: "g_mabort",
// "The pairwise chat this arrived on is me, member <fp>."
PROBE: "g_probe",
// Call control: who opened a call, who is in it, who has left. Media never
// travels here — see the call section below.
CALL: "g_call"
});
var GROUP_ENVELOPE = "g_env";
var GROUP_FRAME_TYPES = Object.freeze(new Set(Object.values(GROUP_FRAMES)));
function isGroupFrame(parsed) {
if (!parsed || typeof parsed !== "object") return false;
return parsed.type === GROUP_ENVELOPE || GROUP_FRAME_TYPES.has(parsed.type);
}
function groupFrameType(parsed) {
if (!parsed || typeof parsed !== "object") return null;
if (parsed.type === GROUP_ENVELOPE) return typeof parsed.t === "string" ? parsed.t : null;
return GROUP_FRAME_TYPES.has(parsed.type) ? parsed.type : null;
}
function encodeEnvelope(frame) {
const json = JSON.stringify(frame);
const encoded = toB64(new TextEncoder().encode(json));
if (encoded.length > GROUP_LIMITS.FRAME_BUDGET_CHARS) {
throw new GroupSessionError("group frame exceeds the transport budget", "frame_too_large");
}
return { type: GROUP_ENVELOPE, gid: frame.gid, t: frame.type, d: encoded };
}
function decodeEnvelope(envelope) {
if (!envelope || envelope.type !== GROUP_ENVELOPE) return envelope;
const raw = String(envelope.d || "");
if (raw.length > GROUP_LIMITS.FRAME_BUDGET_CHARS) {
throw new GroupSessionError("group frame exceeds the transport budget", "frame_too_large");
}
const bytes = fromB64(raw, { max: GROUP_LIMITS.FRAME_BUDGET_CHARS });
const frame = JSON.parse(new TextDecoder().decode(bytes));
if (!frame || typeof frame !== "object" || !GROUP_FRAME_TYPES.has(frame.type)) {
throw new GroupSessionError("envelope carried no recognisable frame", "bad_envelope");
}
if (envelope.gid && frame.gid !== envelope.gid) {
throw new GroupSessionError("envelope group id does not match its frame", "bad_envelope");
}
if (envelope.t && frame.type !== envelope.t) {
throw new GroupSessionError("envelope type does not match its frame", "bad_envelope");
}
return frame;
}
var TIMEOUTS = Object.freeze({
// A member that has not committed by now is treated as absent and the
// ceremony fails. It must FAIL rather than proceed: proceeding without a
// commitment is exactly the grinding freedom the commit round removes.
CEREMONY_MS: 6e4,
// How long the admin waits for invitees to publish their identity keys.
HELLO_MS: 45e3,
// How long one mesh dial may stay in flight. It covers a descriptor going
// out over a relay hop, an answer coming back, and the whole SBQ2 in-band
// exchange completing on the new channel. Generous, because failing early
// costs a direct link and gains nothing: the pair keeps working over the
// relay the entire time the dial is running.
MESH_DIAL_MS: 45e3,
// Gap before a failed pair is dialled again, doubling per failure. A pair
// that cannot connect is usually a network that will not allow it, and
// retrying hard turns one unreachable member into a permanent load.
MESH_RETRY_MS: 2e4
});
var MESH_MAX_CONCURRENT_DIALS = 2;
var MESH_MAX_ATTEMPTS = 3;
var GroupSessionError = class extends Error {
constructor(message, code = "group_session") {
super(message);
this.name = "GroupSessionError";
this.code = code;
}
};
var GroupSession = class {
/**
* @param {object} opts
* @param {string} opts.groupId
* @param {string} opts.name
* @param {boolean} opts.isAdmin
* @param {SubtleCrypto} opts.subtle
* @param {(sessionId: string, frame: object) => Promise<void>} opts.send
* @param {(event: string, payload: object) => void} opts.emit
*/
constructor({ groupId, name, isAdmin, subtle, send, emit, mesh = null, log = () => {
} }) {
this.groupId = assertGroupId(groupId);
this.name = assertName(name);
this.isAdmin = !!isAdmin;
this.subtle = subtle;
this._send = send;
this._emit = emit;
this._log = log;
this._mesh = mesh;
this.identity = null;
this.epoch = 1;
this.adminFp = "";
this.phase = GROUP_PHASE.FORMING;
this.members = /* @__PURE__ */ new Map();
this.sessionToFp = /* @__PURE__ */ new Map();
this.ceremony = null;
this.sasCode = "";
this.sasConfirmed = false;
this.seq = 0;
this.transcript = /* @__PURE__ */ new Map();
this._timers = /* @__PURE__ */ new Set();
this._destroyed = false;
this._awaitingHello = /* @__PURE__ */ new Map();
this._pendingCeremony = [];
this._draining = false;
this._pendingKeys = /* @__PURE__ */ new Map();
this._pendingAdd = null;
this._meshDials = /* @__PURE__ */ new Map();
this._meshFailures = /* @__PURE__ */ new Map();
this._meshSessions = /* @__PURE__ */ new Set();
this._probed = /* @__PURE__ */ new Set();
this._meshPass = null;
this.call = null;
this.callSeq = 0;
this._callSeen = /* @__PURE__ */ new Map();
}
// -----------------------------------------------------------------------
// lifecycle
// -----------------------------------------------------------------------
static newId() {
return newGroupId();
}
async init() {
if (this.identity) return this.identity;
this.identity = await generateGroupIdentity(this.subtle);
this.members.set(this.identity.fingerprint, {
fp: this.identity.fingerprint,
name: "You",
spki: this.identity.spki,
publicKey: null,
// our own key verifies nothing inbound
sessionId: null,
state: MEMBER_STATE.SELF
});
if (this.isAdmin) this.adminFp = this.identity.fingerprint;
return this.identity;
}
get selfFp() {
return this.identity?.fingerprint || "";
}
destroy() {
this._destroyed = true;
for (const t2 of this._timers) clearTimeout(t2);
this._timers.clear();
try {
this.ceremony?.destroy();
} catch (_) {
}
this.ceremony = null;
for (const sessionId of this._meshSessions) {
try {
this._mesh?.close(sessionId);
} catch (_) {
}
}
this._meshSessions.clear();
this._meshDials.clear();
this._meshFailures.clear();
this._probed.clear();
this.call = null;
this._callSeen.clear();
this.members.clear();
this.sessionToFp.clear();
this.transcript.clear();
this._pendingCeremony = [];
this._pendingKeys.clear();
this._pendingAdd = null;
this.identity = null;
}
_timer(fn, ms) {
const t2 = setTimeout(() => {
this._timers.delete(t2);
if (!this._destroyed) fn();
}, ms);
this._timers.add(t2);
return t2;
}
_fail(code) {
if (this._destroyed) return;
this._log("warn", "group ceremony failed", { code });
this.phase = GROUP_PHASE.FAILED;
try {
this.ceremony?.destroy();
} catch (_) {
}
this.ceremony = null;
this._emit("error", { error: code });
}
_setPhase(phase) {
if (this.phase === phase) return;
this.phase = phase;
if (phase !== GROUP_PHASE.READY) this.sasConfirmed = false;
if (phase !== GROUP_PHASE.READY && phase !== GROUP_PHASE.AWAITING_SAS) {
this.sasCode = "";
}
this._emit("phase", { phase });
}
/** The member list in the shape the reducer stores. */
_memberSnapshot() {
return [...this.members.values()].map((m) => ({
fp: m.fp,
name: m.name,
sessionId: m.sessionId,
state: m.state
}));
}
_emitMembers() {
this._pruneCall();
this._emit("members", { members: this._memberSnapshot(), epoch: this.epoch });
}
/**
* Drop anyone from the current call who is no longer a member.
*
* Membership can change under a call — the admin removes somebody, a roster
* for a new epoch arrives — and a participant list that outlives the roster
* would show a person in the call who is not in the group, which is exactly
* the kind of stale claim a group must not make about who can hear it.
*/
_pruneCall() {
if (!this.call) return;
let changed = false;
for (const fp of [...this.call.participants]) {
if (!this.members.has(fp)) {
this.call.participants.delete(fp);
changed = true;
}
}
if (this.call.participants.size === 0) {
this.call = null;
changed = true;
}
if (changed) this._emit("call", { call: this.getCallSnapshot() });
}
// -----------------------------------------------------------------------
// routing
// -----------------------------------------------------------------------
/** Members we can reach over their own pairwise link right now. */
_directPeers() {
return [...this.members.values()].filter(
(m) => m.state === MEMBER_STATE.LINKED && m.sessionId
);
}
/**
* Whoever can carry a frame to a member we cannot reach ourselves.
*
* The admin is preferred because by construction it holds a link to every
* member; any other directly-linked member is a fallback for when the admin
* is the one that has gone away.
*/
_relayFor(toFp) {
const admin = this.members.get(this.adminFp);
if (admin && admin.state === MEMBER_STATE.LINKED && admin.sessionId && admin.fp !== toFp) {
return admin;
}
return this._directPeers().find((m) => m.fp !== toFp) || null;
}
/**
* Put a frame on the wire, wrapped.
*
* Every outbound frame goes through here so the envelope is applied in
* exactly one place — a frame sent raw would be silently mangled by the
* chat path's sanitiser rather than rejected, which is the worst way for
* this to fail.
*/
async _wire(sessionId, frame) {
return this._send(sessionId, encodeEnvelope(frame));
}
/** Send one frame to one member, directly if we can and relayed if we cannot. */
async _sendTo(toFp, frame) {
const member = this.members.get(toFp);
if (!member || member.fp === this.selfFp) return false;
if (member.state === MEMBER_STATE.LINKED && member.sessionId) {
await this._wire(member.sessionId, frame);
return true;
}
const relay = this._relayFor(toFp);
if (!relay) return false;
await this._wire(relay.sessionId, {
type: GROUP_FRAMES.RELAY,
gid: this.groupId,
to: toFp,
hopped: false,
inner: frame
});
return member.state !== MEMBER_STATE.LOST;
}
/**
* Fan a frame out to every other member. Failures are per-recipient.
*
* Returns WHO could not be reached as well as how many could, because a
* count on its own cannot tell "Alice is offline" from "Bob is offline" —
* and the sender is the only person in a position to know the difference.
*/
async _broadcast(frame, { exclude = [] } = {}) {
const targets = [...this.members.keys()].filter(
(fp) => fp !== this.selfFp && !exclude.includes(fp)
);
const results = await Promise.allSettled(targets.map((fp) => this._sendTo(fp, frame)));
const unreachable = [];
let delivered = 0;
results.forEach((result, i) => {
if (result.status === "fulfilled" && result.value === true) {
delivered += 1;
return;
}
const member = this.members.get(targets[i]);
unreachable.push({ fp: targets[i], name: member?.name || "A member" });
});
return { delivered, unreachable };
}
// -----------------------------------------------------------------------
// link bookkeeping (driven by the app as pairwise sessions come and go)
// -----------------------------------------------------------------------
/**
* Bind a pairwise session to a member. Called for the admin's own invites and
* whenever a member is reached over a session for the first time.
*/
bindSession(fp, sessionId, state = MEMBER_STATE.LINKED) {
const member = this.members.get(fp);
if (!member) return false;
if (member.sessionId && member.sessionId !== sessionId) {
this.sessionToFp.delete(member.sessionId);
this._closeMeshSession(member.sessionId);
}
member.sessionId = sessionId;
member.state = state;
if (sessionId) this.sessionToFp.set(sessionId, fp);
this._emitMembers();
return true;
}
/**
* Detach a member from whatever link it was on, back to the relay path.
*
* Used when a mesh dial fails: the half-built session is closed and the
* member returns to being reachable only through someone else, which is
* where they were before the dial started. Deliberately does NOT change the
* member's state to LOST — they are not offline, we just have no direct
* route to them.
*/
unbindSession(fp) {
const member = this.members.get(fp);
if (!member || !member.sessionId) return false;
const sessionId = member.sessionId;
this.sessionToFp.delete(sessionId);
member.sessionId = null;
if (member.state === MEMBER_STATE.LINKED || member.state === MEMBER_STATE.LOST) {
member.state = MEMBER_STATE.PENDING;
}
this._closeMeshSession(sessionId);
this._emitMembers();
this._scheduleMeshMaintain();
return true;
}
/** A pairwise session changed state; reflect it on whichever member owns it. */
setSessionState(sessionId, connected) {
const fp = this.sessionToFp.get(sessionId);
if (!fp) return;
const member = this.members.get(fp);
if (!member || member.state === MEMBER_STATE.SELF) return;
const next = connected ? MEMBER_STATE.LINKED : MEMBER_STATE.LOST;
if (member.state === next) return;
member.state = next;
this._emitMembers();
if (connected) this._settleDial(fp);
this._scheduleMeshMaintain();
}
// -----------------------------------------------------------------------
// the mesh
// -----------------------------------------------------------------------
//
// Every pair that has no link between it dials one, so that the relay path
// becomes the exception it was always described as rather than the way the
// whole group runs.
//
// WHO DIALS
// ---------
// The member with the smaller fingerprint. That is the entire glare
// protocol: both sides compute it from the roster they already agree on, so
// exactly one side opens each pair and there is no simultaneous-offer case
// to resolve. A member that receives an offer from someone it should have
// been dialling ITSELF refuses it — either the peer is confused or somebody
// is trying to get two half-open dials fighting over one pair.
//
// WHEN
// ----
// Only once the group is READY and the safety code is confirmed. Before
// that, the roster's identity keys are keys nobody has vouched for yet, and
// a link authenticated by an unconfirmed key is a link authenticated by
// nothing. Waiting costs a few seconds of relayed traffic.
//
// HOW IT IS AUTHENTICATED
// -----------------------
// The descriptors travel through a relay, so they are signed with the
// sender's group identity key and checked against the roster — see
// meshDescriptorPayload in groupCrypto.js for why that is enough and what
// it deliberately does not defend against. Once the transport is up, the
// SBQ2 in-band exchange runs on it exactly as it does for a 1:1 chat, with
// one difference: nobody is asked to compare digits, because the group code
// already authenticated the key that signed the descriptor. The app closes
// that loop by marking the link verified on the group's authority.
/**
* Is this dial still worth finishing?
*
* Re-checked after EVERY await inside a dial, and that is not defensive
* padding — both awaits are long. Building a descriptor means gathering ICE,
* and verifying a signature is a trip through WebCrypto; either is ample time
* for the answer to change.
*
* The case that made this necessary: a link probe adopts a chat the two
* members already had while a dial for the same pair is mid-flight. The
* probe binds a link that works. The dial then came back and bound its own
* half-built session over the top, downgrading a live link to a pending one
* and leaving the pair relaying to each other over a connection that was
* never needed. Checking the member's session — not just our own dial
* bookkeeping — is what catches that.
*/
_dialStillWanted(fp, dial) {
if (this._destroyed) return false;
if (this._meshDials.get(fp) !== dial) return false;
if (this.epoch !== dial.epoch) return false;
const member = this.members.get(fp);
if (!member) return false;
if (member.sessionId && member.sessionId !== dial.sessionId) return false;
return true;
}
/** Drop a dial that is no longer wanted, without recording it as a failure. */
_abandonDial(fp, dial, sessionId) {
if (this._meshDials.get(fp) === dial) {
if (dial.timer) {
clearTimeout(dial.timer);
this._timers.delete(dial.timer);
}
this._meshDials.delete(fp);
}
this._meshSessions.delete(sessionId);
try {
this._mesh?.close(sessionId);
} catch (_) {
}
}
/** Close and forget a connection this group opened. Never touches a chat. */
_closeMeshSession(sessionId) {
if (!sessionId || !this._meshSessions.has(sessionId)) return;
this._meshSessions.delete(sessionId);
try {
this._mesh?.close(sessionId);
} catch (_) {
}
}
/** A dial is over, one way or another. Stops its timer and frees the slot. */
_settleDial(fp) {
const dial = this._meshDials.get(fp);
if (!dial) return;
if (dial.timer) {
clearTimeout(dial.timer);
this._timers.delete(dial.timer);
}
this._meshDials.delete(fp);
this._meshFailures.delete(fp);
}
/**
* Give up on one pair, for now.
*
* The half-built connection is closed and the member goes back to being
* reached through somebody else — which is where they were before the dial
* started, so nothing the user can see gets worse. The backoff doubles per
* attempt because a pair that cannot connect is usually a network that will
* not allow it, and hammering at that produces load rather than links.
*/
_meshFail(fp, code, { tellPeer = true } = {}) {
const dial = this._meshDials.get(fp);
if (dial) {
if (dial.timer) {
clearTimeout(dial.timer);
this._timers.delete(dial.timer);
}
this._meshDials.delete(fp);
const member = this.members.get(fp);
if (dial.sessionId && member && member.sessionId === dial.sessionId) {
this.unbindSession(fp);
} else {
this._closeMeshSession(dial.sessionId);
}
}
const failure = this._meshFailures.get(fp) || { attempts: 0, nextAt: 0 };
failure.attempts += 1;
failure.nextAt = Date.now() + TIMEOUTS.MESH_RETRY_MS * 2 ** (failure.attempts - 1);
this._meshFailures.set(fp, failure);
this._log("warn", "mesh dial failed", { code, attempts: failure.attempts });
if (tellPeer && this.members.has(fp)) {
this._sendTo(fp, {
type: GROUP_FRAMES.MESH_ABORT,
gid: this.groupId,
epoch: this.epoch,
from: this.selfFp,
to: fp
}).catch(() => {
});
}
this._scheduleMeshMaintain();
}
/**
* Cancel every dial in flight and forget every backoff.
*
* Called when the epoch moves. A dial signed against the old epoch will not
* verify against the new one, and a pair that could not connect under the
* old membership deserves a fresh chance under the new one. Links that are
* already up are untouched — _onRoster carries them across.
*/
_meshReset() {
for (const fp of [...this._meshDials.keys()]) {
const dial = this._meshDials.get(fp);
if (dial?.timer) {
clearTimeout(dial.timer);
this._timers.delete(dial.timer);
}
this._meshDials.delete(fp);
const member = this.members.get(fp);
if (dial?.sessionId && member && member.sessionId === dial.sessionId) {
this.unbindSession(fp);
} else {
this._closeMeshSession(dial?.sessionId);
}
}
this._meshFailures.clear();
this._probed.clear();
}
/**
* Ask for a maintenance pass soon rather than now.
*
* Every edge that could change the answer calls this — a link coming up, a
* dial failing, the code being confirmed — and several of them fire in a
* burst. Coalescing them means one pass sees the settled picture instead of
* several passes each acting on a half-updated one.
*/
_scheduleMeshMaintain() {
if (this._destroyed || !this._mesh || this._meshPass) return;
this._meshPass = this._timer(() => {
this._meshPass = null;
this._meshMaintain();
}, 0);
}
/** Open dials for whoever still has no link, within the concurrency limit. */
_meshMaintain() {
if (this._destroyed || !this._mesh) return;
if (this.phase !== GROUP_PHASE.READY || !this.sasConfirmed) return;
const now = Date.now();
let inFlight = this._meshDials.size;
let soonest = Infinity;
for (const fp of canonicalFingerprints([...this.members.keys()])) {
if (inFlight >= MESH_MAX_CONCURRENT_DIALS) break;
const member = this.members.get(fp);
if (!member || member.state === MEMBER_STATE.SELF) continue;
if (member.sessionId) continue;
if (this._meshDials.has(fp)) continue;
if (!(this.selfFp < fp)) continue;
const failure = this._meshFailures.get(fp);
if (failure) {
if (failure.attempts >= MESH_MAX_ATTEMPTS) continue;
if (now < failure.nextAt) {
soonest = Math.min(soonest, failure.nextAt);
continue;
}
}
if (!this._relayFor(fp)) continue;
inFlight += 1;
this._meshDial(fp).catch(() => {
});
}
if (soonest !== Infinity && !this._meshPass) {
this._meshPass = this._timer(() => {
this._meshPass = null;
this._meshMaintain();
}, Math.max(0, soonest - now) + 50);
}
}
/** Build a descriptor for one peer, sign it, and put it on the relay path. */
async _meshDial(fp) {
const member = this.members.get(fp);
if (!member || member.sessionId || this._meshDials.has(fp)) return;
const epoch = this.epoch;
const nonce = randomBytes(GROUP_LIMITS.MESH_NONCE_BYTES);
const dial = { role: "offer", sessionId: null, nonce, epoch, timer: null };
this._meshDials.set(fp, dial);
try {
const link = await this._mesh.createOffer(fp);
const sessionId = link && link.sessionId;
const descriptor = String(link && link.descriptor || "");
if (!sessionId || !descriptor) throw new GroupSessionError("mesh transport produced no descriptor", "no_descriptor");
if (!this._dialStillWanted(fp, dial)) return this._abandonDial(fp, dial, sessionId);
dial.sessionId = sessionId;
this._meshSessions.add(sessionId);
this.bindSession(fp, sessionId, MEMBER_STATE.PENDING);
const sig = await signMeshDescriptor(this.subtle, this.identity.keyPair.privateKey, {
groupId: this.groupId,
epoch,
kind: MESH_KINDS.OFFER,
fromFp: this.selfFp,
toFp: fp,
descriptor,
nonce
});
const sent = await this._sendTo(fp, {
type: GROUP_FRAMES.MESH_OFFER,
gid: this.groupId,
epoch,
from: this.selfFp,
to: fp,
d: descriptor,
n: toB64(nonce),
sig: toB64(sig)
});
if (!sent) throw new GroupSessionError("no route to carry the dial", "unreachable");
dial.timer = this._timer(() => this._meshFail(fp, "dial_timeout"), TIMEOUTS.MESH_DIAL_MS);
} catch (error) {
this._meshFail(fp, error?.code || "dial_failed");
}
}
async _onMeshOffer(frame) {
if (!this._mesh || this._destroyed) return;
const from = assertFingerprint(String(frame.from || ""));
if (assertFingerprint(String(frame.to || "")) !== this.selfFp) return;
if (assertEpoch(frame.epoch) !== this.epoch) return;
if (this.phase !== GROUP_PHASE.READY || !this.sasConfirmed) return;
const member = this.members.get(from);
if (!member || !member.publicKey) {
throw new GroupSessionError("mesh dial from a non-member", "not_a_member");
}
if (member.sessionId) return;
if (this._meshDials.has(from)) return;
if (this.selfFp < from) return;
const descriptor = String(frame.d || "");
if (!descriptor || descriptor.length > GROUP_LIMITS.MAX_DESCRIPTOR_CHARS) {
throw new GroupSessionError("mesh descriptor is missing or oversized", "bad_descriptor");
}
const nonce = fromB64(String(frame.n || ""), { max: GROUP_LIMITS.MESH_NONCE_BYTES });
const ok = await verifyMeshDescriptor(this.subtle, member.publicKey, {
groupId: this.groupId,
epoch: this.epoch,
kind: MESH_KINDS.OFFER,
fromFp: from,
toFp: this.selfFp,
descriptor,
nonce
}, fromB64(String(frame.sig || ""), { max: GROUP_LIMITS.MAX_SIG_BYTES }));
if (!ok) throw new GroupSessionError("mesh dial signature did not verify", "bad_signature");
if (this._destroyed || member.sessionId || this._meshDials.has(from)) return;
if (assertEpoch(frame.epoch) !== this.epoch) return;
const epoch = this.epoch;
const dial = { role: "answer", sessionId: null, nonce, epoch, timer: null };
this._meshDials.set(from, dial);
try {
const link = await this._mesh.createAnswer(from, descriptor);
const sessionId = link && link.sessionId;
const answer = String(link && link.descriptor || "");
if (!sessionId || !answer) throw new GroupSessionError("mesh transport produced no answer", "no_descriptor");
if (!this._dialStillWanted(from, dial)) return this._abandonDial(from, dial, sessionId);
dial.sessionId = sessionId;
this._meshSessions.add(sessionId);
this.bindSession(from, sessionId, MEMBER_STATE.PENDING);
const sig = await signMeshDescriptor(this.subtle, this.identity.keyPair.privateKey, {
groupId: this.groupId,
epoch,
kind: MESH_KINDS.ANSWER,
fromFp: this.selfFp,
toFp: from,
descriptor: answer,
nonce
});
const sent = await this._sendTo(from, {
type: GROUP_FRAMES.MESH_ANSWER,
gid: this.groupId,
epoch,
from: this.selfFp,
to: from,
d: answer,
n: toB64(nonce),
sig: toB64(sig)
});
if (!sent) throw new GroupSessionError("no route to carry the answer", "unreachable");
dial.timer = this._timer(() => this._meshFail(from, "answer_timeout"), TIMEOUTS.MESH_DIAL_MS);
} catch (error) {
this._meshFail(from, error?.code || "answer_failed");
}
}
async _onMeshAnswer(frame) {
if (!this._mesh || this._destroyed) return;
const from = assertFingerprint(String(frame.from || ""));
if (assertFingerprint(String(frame.to || "")) !== this.selfFp) return;
if (assertEpoch(frame.epoch) !== this.epoch) return;
const dial = this._meshDials.get(from);
if (!dial || dial.role !== "offer" || !dial.sessionId || dial.epoch !== this.epoch) return;
const member = this.members.get(from);
if (!member || !member.publicKey) {
throw new GroupSessionError("mesh answer from a non-member", "not_a_member");
}
const descriptor = String(frame.d || "");
if (!descriptor || descriptor.length > GROUP_LIMITS.MAX_DESCRIPTOR_CHARS) {
throw new GroupSessionError("mesh descriptor is missing or oversized", "bad_descriptor");
}
const nonce = fromB64(String(frame.n || ""), { max: GROUP_LIMITS.MESH_NONCE_BYTES });
if (nonce.length !== dial.nonce.length || !nonce.every((b, i) => b === dial.nonce[i])) {
throw new GroupSessionError("mesh answer does not match the dial it claims", "bad_mesh_nonce");
}
const ok = await verifyMeshDescriptor(this.subtle, member.publicKey, {
groupId: this.groupId,
epoch: this.epoch,
kind: MESH_KINDS.ANSWER,
fromFp: from,
toFp: this.selfFp,
descriptor,
nonce
}, fromB64(String(frame.sig || ""), { max: GROUP_LIMITS.MAX_SIG_BYTES }));
if (!ok) throw new GroupSessionError("mesh answer signature did not verify", "bad_signature");
try {
await this._mesh.acceptAnswer(dial.sessionId, descriptor);
} catch (error) {
this._meshFail(from, error?.code || "answer_rejected");
}
}
_onMeshAbort(frame) {
const from = assertFingerprint(String(frame.from || ""));
if (assertFingerprint(String(frame.to || "")) !== this.selfFp) return;
if (!this._meshDials.has(from)) return;
this._meshFail(from, "peer_aborted", { tellPeer: false });
}
// -----------------------------------------------------------------------
// link probes
// -----------------------------------------------------------------------
/**
* Claim a pairwise chat we already hold as this group's link to a member.
*
* Two people who were already talking do not need a second connection built
* between them, and dialling one anyway would spend a WebRTC negotiation to
* arrive back where we started. The app calls this for every verified chat
* that is not already carrying a member; whoever is on the other end and is
* in this group binds it, and the pair is meshed without dialling anything.
*
* Sent once per session per epoch. It is a claim about identity, not a
* request, so there is nothing to retry.
*/
async probeSession(sessionId) {
if (this._destroyed || !this._mesh || !sessionId) return false;
if (this.phase !== GROUP_PHASE.READY || !this.sasConfirmed) return false;
if (this.sessionToFp.has(sessionId)) return false;
return this._sendProbe(sessionId);
}
/**
* Sign and send one probe. Once per session per epoch, whatever asked for it.
*
* Split from probeSession because the two callers disagree about one check:
* the app only offers sessions that carry nobody, while an ANSWERING probe
* goes out on a session that has just been bound — by the very probe it is
* answering.
*/
async _sendProbe(sessionId) {
if (this._destroyed || this._probed.has(sessionId)) return false;
const linkFp = this._linkFingerprint(sessionId);
if (!linkFp) return false;
this._probed.add(sessionId);
const sig = await signLinkProbe(this.subtle, this.identity.keyPair.privateKey, {
groupId: this.groupId,
epoch: this.epoch,
fp: this.selfFp,
linkFp
});
await this._wire(sessionId, {
type: GROUP_FRAMES.PROBE,
gid: this.groupId,
epoch: this.epoch,
fp: this.selfFp,
sig: toB64(sig)
});
return true;
}
_linkFingerprint(sessionId) {
try {
const fp = this._mesh?.linkFingerprint?.(sessionId);
return typeof fp === "string" && fp.length > 0 ? fp : "";
} catch (_) {
return "";
}
}
async _onProbe(sessionId, frame) {
if (this._destroyed) return;
if (this.phase !== GROUP_PHASE.READY || !this.sasConfirmed) return;
if (assertEpoch(frame.epoch) !== this.epoch) return;
const fp = assertFingerprint(String(frame.fp || ""));
if (fp === this.selfFp) return;
const member = this.members.get(fp);
if (!member || !member.publicKey) return;
if (this.sessionToFp.has(sessionId)) return;
if (member.sessionId) {
if (member.state === MEMBER_STATE.LINKED) return;
if (!this._meshDials.has(fp)) return;
}
const linkFp = this._linkFingerprint(sessionId);
if (!linkFp) return;
const ok = await verifyLinkProbe(this.subtle, member.publicKey, {
groupId: this.groupId,
epoch: this.epoch,
fp,
linkFp
}, fromB64(String(frame.sig || ""), { max: GROUP_LIMITS.MAX_SIG_BYTES }));
if (!ok) throw new GroupSessionError("link probe signature did not verify", "bad_signature");
this._settleDial(fp);
this.bindSession(fp, sessionId, MEMBER_STATE.LINKED);
this._sendProbe(sessionId).catch(() => {
});
this._scheduleMeshMaintain();
}
// -----------------------------------------------------------------------
// step 1-2: invite / hello
// -----------------------------------------------------------------------
/**
* Admin: invite peers we already hold verified 1:1 sessions with.
* @param {{sessionId: string, name: string}[]} peers
*/
async invite(peers) {
if (!this.isAdmin) throw new GroupSessionError("only the admin invites", "not_admin");
await this.init();
if (peers.length + 1 > GROUP_LIMITS.MAX_MEMBERS) {
throw new GroupSessionError(`a group is limited to ${GROUP_LIMITS.MAX_MEMBERS} members`, "too_many_members");
}
this._setPhase(GROUP_PHASE.FORMING);
for (const peer of peers) this._awaitingHello.set(peer.sessionId, peer.name || "Member");
const frame = {
type: GROUP_FRAMES.INVITE,
gid: this.groupId,
epoch: this.epoch,
name: this.name,
adminSpki: toB64(this.identity.spki)
};
const results = await Promise.allSettled(peers.map((p) => this._wire(p.sessionId, frame)));
const failed = results.filter((r) => r.status === "rejected");
if (failed.length === peers.length) {
this._fail("invitations_could_not_be_sent");
throw new GroupSessionError(
"the invitation could not be sent \u2014 the chat with that peer is not connected",
"invitations_could_not_be_sent"
);
}
if (failed.length > 0) {
const reachable = peers.filter((_, i) => results[i].status === "fulfilled");
for (const p of peers) {
if (!reachable.includes(p)) this._awaitingHello.delete(p.sessionId);
}
this._emit("partial_invite", { sent: reachable.length, total: peers.length });
}
this._timer(() => {
if (this.phase === GROUP_PHASE.FORMING) this._fail("invitees_did_not_respond");
}, TIMEOUTS.HELLO_MS);
}
/** Invitee: adopt an invitation and publish our own identity key back. */
async acceptInvite(sessionId, envelope) {
const frame = decodeEnvelope(envelope);
await this.init();
const adminSpki = fromB64(String(frame.adminSpki || ""));
const { publicKey, fingerprint } = await importMemberIdentity(this.subtle, adminSpki);
this.adminFp = fingerprint;
this.epoch = assertEpoch(frame.epoch);
this.name = assertName(frame.name);
this.members.set(fingerprint, {
fp: fingerprint,
name: "Admin",
spki: adminSpki,
publicKey,
sessionId,
state: MEMBER_STATE.LINKED
});
this.sessionToFp.set(sessionId, fingerprint);
this._setPhase(GROUP_PHASE.FORMING);
this._emitMembers();
await this._wire(sessionId, {
type: GROUP_FRAMES.HELLO,
gid: this.groupId,
epoch: this.epoch,
spki: toB64(this.identity.spki)
});
this._timer(() => {
if (this.phase === GROUP_PHASE.FORMING) this._fail("roster_never_arrived");
}, TIMEOUTS.HELLO_MS);
}
async _onHello(sessionId, frame) {
if (!this.isAdmin) return;
if (!this._awaitingHello.has(sessionId)) {
this._log("warn", "dropped an unsolicited group hello", { groupId: this.groupId });
return;
}
const spki = fromB64(String(frame.spki || ""));
const { publicKey, fingerprint } = await importMemberIdentity(this.subtle, spki);
if (this.members.has(fingerprint) && fingerprint !== this.selfFp) return;
if (this.members.size >= GROUP_LIMITS.MAX_MEMBERS) throw new GroupSessionError("group is full", "too_many_members");
this.members.set(fingerprint, {
fp: fingerprint,
name: this._awaitingHello.get(sessionId) || "Member",
spki,
publicKey,
sessionId,
state: MEMBER_STATE.LINKED
});
this.sessionToFp.set(sessionId, fingerprint);
this._awaitingHello.delete(sessionId);
this._emitMembers();
if (this._awaitingHello.size === 0) {
if (this._pendingAdd) return this._finishAdd();
await this.publishRoster(MEMBER_OPS.CREATE);
}
}
// -----------------------------------------------------------------------
// step 3: the signed roster
// -----------------------------------------------------------------------
/** Admin: sign the current member set for this epoch and broadcast it. */
async publishRoster(op = MEMBER_OPS.ADD) {
if (!this.isAdmin) throw new GroupSessionError("only the admin publishes the roster", "not_admin");
const memberFps = canonicalFingerprints([...this.members.keys()]);
const fields = { groupId: this.groupId, epoch: this.epoch, op, memberFps, name: this.name };
const sig = await signMemberOp(this.subtle, this.identity.keyPair.privateKey, fields);
for (const fp of memberFps) {
const m = this.members.get(fp);
await this._broadcast({
type: GROUP_FRAMES.MEMBER,
gid: this.groupId,
epoch: this.epoch,
fp,
name: m.name === "You" ? "Admin" : m.name,
spki: toB64(m.spki)
});
}
await this._broadcast({
type: GROUP_FRAMES.ROSTER,
gid: this.groupId,
epoch: this.epoch,
op,
name: this.name,
adminSpki: toB64(this.identity.spki),
members: memberFps,
sig: toB64(sig)
});
await this._startCeremony();
}
/**
* A member's identity key, published ahead of the roster that names them.
*
* Held in a staging area rather than applied: until the admin's signed roster
* arrives, a key frame is an unverified claim about who is in the group. The
* fingerprint is derived from the bytes, never taken from the frame, so a
* member cannot register a key under someone else's name.
*/
async _onMemberKey(frame) {
const epoch = assertEpoch(frame.epoch);
if (epoch < this.epoch) return;
if (this._pendingKeys.size > GROUP_LIMITS.MAX_MEMBERS * 2) return;
const spki = fromB64(String(frame.spki || ""));
const { publicKey, fingerprint } = await importMemberIdentity(this.subtle, spki);
if (assertFingerprint(String(frame.fp || "")) !== fingerprint) {
throw new GroupSessionError("member key does not match its fingerprint", "fingerprint_mismatch");
}
this._pendingKeys.set(fingerprint, { spki, publicKey, name: assertName(frame.name) });
}
/**
* Member: adopt a roster.
*
* The admin's signature is checked against the key whose fingerprint IS the
* admin fingerprint we recorded at invite time — not against whatever key the
* frame happens to carry — so a member cannot promote itself by attaching its
* own key to a roster. The epoch must move forward, which refuses both a
* replay and a rollback to a membership that used to be valid.
*/
async _onRoster(sessionId, frame) {
const epoch = assertEpoch(frame.epoch);
if (this.isAdmin) return;
if (epoch < this.epoch) throw new GroupSessionError("roster epoch went backwards", "stale_epoch");
const adminSpki = fromB64(String(frame.adminSpki || ""));
const { publicKey: adminKey, fingerprint: adminFp } = await importMemberIdentity(this.subtle, adminSpki);
if (this.adminFp && adminFp !== this.adminFp) {
throw new GroupSessionError("roster was signed by someone other than the admin", "wrong_admin");
}
if (!Array.isArray(frame.members)) throw new GroupSessionError("roster carries no member list", "bad_roster");
if (frame.members.length > GROUP_LIMITS.MAX_MEMBERS) throw new GroupSessionError("roster exceeds the member limit", "too_many_members");
const memberFps = canonicalFingerprints(frame.members.map((fp) => String(fp || "")));
if (!memberFps.includes(this.selfFp)) throw new GroupSessionError("roster does not include us", "not_a_member");
if (!memberFps.includes(adminFp)) throw new GroupSessionError("roster does not include its author", "bad_roster");
const imported = [];
for (const fp of memberFps) {
if (fp === this.selfFp) {
imported.push({ fp, name: "You", spki: this.identity.spki, publicKey: null });
continue;
}
const staged = this._pendingKeys.get(fp) || (fp === adminFp ? { spki: adminSpki, publicKey: adminKey, name: "Admin" } : null);
if (!staged) throw new GroupSessionError("roster names a member whose key never arrived", "missing_member_key");
imported.push({ fp, name: staged.name, spki: staged.spki, publicKey: staged.publicKey });
}
const ok = await verifyMemberOp(this.subtle, adminKey, {
groupId: this.groupId,
epoch,
op: String(frame.op || ""),
memberFps,
name: assertName(frame.name)
}, fromB64(String(frame.sig || ""), { max: GROUP_LIMITS.MAX_SIG_BYTES }));
if (!ok) throw new GroupSessionError("roster signature did not verify", "bad_signature");
this.epoch = epoch;
this.name = assertName(frame.name);
this.adminFp = adminFp;
const previous = this.members;
this.members = /* @__PURE__ */ new Map();
for (const m of imported) {
const old = previous.get(m.fp);
this.members.set(m.fp, {
fp: m.fp,
name: m.fp === this.selfFp ? "You" : m.name,
spki: m.spki,
publicKey: m.fp === this.selfFp ? null : m.publicKey,
sessionId: old?.sessionId || null,
state: m.fp === this.selfFp ? MEMBER_STATE.SELF : old?.state === MEMBER_STATE.LINKED ? MEMBER_STATE.LINKED : MEMBER_STATE.PENDING
});
}
for (const [sid, fp] of [...this.sessionToFp]) {
if (!this.members.has(fp)) this.sessionToFp.delete(sid);
}
this._emit("roster", { name: this.name, epoch: this.epoch, adminFp });
this._emitMembers();
await this._startCeremony();
}
// -----------------------------------------------------------------------
// steps 4-6: the safety code ceremony
// -----------------------------------------------------------------------
async _startCeremony() {
try {
this.ceremony?.destroy();
} catch (_) {
}
this._meshReset();
this.ceremony = new GroupSasCeremony({
groupId: this.groupId,
epoch: this.epoch,
selfFingerprint: this.selfFp,
memberFingerprints: [...this.members.keys()]
});
this._setPhase(GROUP_PHASE.COMMITTING);
const commitment = await this.ceremony.ownCommitment(this.subtle);
await this._broadcast({
type: GROUP_FRAMES.COMMIT,
gid: this.groupId,
epoch: this.epoch,
fp: this.selfFp,
commit: toB64(commitment)
});
const epochAtStart = this.epoch;
this._timer(() => {
if (this.epoch !== epochAtStart) return;
if (this.phase === GROUP_PHASE.COMMITTING || this.phase === GROUP_PHASE.REVEALING) {
this._fail("ceremony_timed_out");
}
}, TIMEOUTS.CEREMONY_MS);
await this._drainPendingCeremony();
await this._maybeReveal();
}
/** Hold a ceremony frame that outran our own roster. See _pendingCeremony. */
_holdCeremonyFrame(frame) {
if (this._pendingCeremony.length >= GROUP_LIMITS.MAX_MEMBERS * 2) return;
this._pendingCeremony.push(frame);
}
async _drainPendingCeremony() {
if (this._draining) return;
this._draining = true;
try {
const held = this._pendingCeremony;
this._pendingCeremony = [];
for (const frame of held) {
try {
if (frame.type === GROUP_FRAMES.COMMIT) await this._onCommit(frame);
else if (frame.type === GROUP_FRAMES.REVEAL) await this._onReveal(frame);
} catch (error) {
this._log("warn", "held ceremony frame discarded", { code: error?.code });
}
}
} finally {
this._draining = false;
}
}
async _onCommit(frame) {
if (!this.ceremony) return this._holdCeremonyFrame(frame);
if (assertEpoch(frame.epoch) !== this.epoch) return;
this.ceremony.acceptCommitment(
assertFingerprint(String(frame.fp || "")),
fromB64(String(frame.commit || ""), { max: GROUP_LIMITS.COMMIT_BYTES })
);
await this._drainPendingCeremony();
await this._maybeReveal();
}
/**
* Publish our nonce, but only once every commitment is in.
*
* The check lives in GroupSasCeremony.reveal(), which throws otherwise. This
* method only asks whether the round is complete — it must never be changed
* to reveal on a timer or on a partial round.
*/
async _maybeReveal() {
if (!this.ceremony || this.ceremony.revealed) return;
if (!this.ceremony.commitmentsComplete) return;
this._setPhase(GROUP_PHASE.REVEALING);
const nonce = this.ceremony.reveal();
await this._broadcast({
type: GROUP_FRAMES.REVEAL,
gid: this.groupId,
epoch: this.epoch,
fp: this.selfFp,
nonce: toB64(nonce)
});
await this._maybeFinish();
}
async _onReveal(frame) {
if (!this.ceremony) return this._holdCeremonyFrame(frame);
if (assertEpoch(frame.epoch) !== this.epoch) return;
if (!this.ceremony.commitments.has(assertFingerprint(String(frame.fp || "")))) {
return this._holdCeremonyFrame(frame);
}
await this.ceremony.acceptReveal(
this.subtle,
assertFingerprint(String(frame.fp || "")),
fromB64(String(frame.nonce || ""), { max: GROUP_LIMITS.NONCE_BYTES })
);
await this._maybeFinish();
}
async _maybeFinish() {
if (!this.ceremony || !this.ceremony.revealsComplete) return;
if (this.sasCode) return;
const code = await this.ceremony.finish(this.subtle);
this._setPhase(GROUP_PHASE.AWAITING_SAS);
this.sasCode = code;
this._emit("sas", { code });
}
/**
* The humans compared the digits and they matched.
*
* This is the only path to READY, and it is driven by a user action — never
* by a frame arriving. It mirrors the 1:1 rule: completing a handshake proves
* somebody completed it, and only the out-of-band comparison proves who.
*/
confirmSas() {
if (this.phase !== GROUP_PHASE.AWAITING_SAS || !this.sasCode) {
throw new GroupSessionError("there is no group code to confirm", "no_code");
}
this.sasConfirmed = true;
this.phase = GROUP_PHASE.READY;
try {
this.ceremony?.destroy();
} catch (_) {
}
this.ceremony = null;
this._emit("confirmed", { members: this._memberSnapshot() });
this._scheduleMeshMaintain();
}
/** Recompute the code for the current epoch — used only by tests and diagnostics. */
async _recomputeSas(contributions) {
return computeGroupSas(this.subtle, {
groupId: this.groupId,
epoch: this.epoch,
contributions
});
}
// -----------------------------------------------------------------------
// step 7: messages
// -----------------------------------------------------------------------
async sendText(text) {
if (this.phase !== GROUP_PHASE.READY || !this.sasConfirmed) {
throw new GroupSessionError("the group code has not been confirmed", "not_ready");
}
const body = String(text ?? "");
if (!body.trim()) throw new GroupSessionError("empty message", "empty");
const seq = ++this.seq;
const bodyHash = await hashBody(this.subtle, body);
const sig = await signGroupMessage(this.subtle, this.identity.keyPair.privateKey, {
groupId: this.groupId,
epoch: this.epoch,
seq,
senderFp: this.selfFp,
bodyHash
});
const frame = {
type: GROUP_FRAMES.MESSAGE,
gid: this.groupId,
epoch: this.epoch,
seq,
fp: this.selfFp,
ts: Date.now(),
body,
sig: toB64(sig)
};
const { delivered, unreachable } = await this._broadcast(frame);
return { seq, delivered, total: this.members.size - 1, unreachable };
}
async _onMessage(frame, { relayed = false } = {}) {
const epoch = assertEpoch(frame.epoch);
const seq = assertEpoch(frame.seq);
const senderFp = assertFingerprint(String(frame.fp || ""));
if (senderFp === this.selfFp) return;
const member = this.members.get(senderFp);
if (!member || !member.publicKey) throw new GroupSessionError("message from a non-member", "not_a_member");
if (epoch !== this.epoch) throw new GroupSessionError("message from another epoch", "stale_epoch");
const body = String(frame.body ?? "");
const bodyHash = await hashBody(this.subtle, body);
const ok = await verifyGroupMessage(this.subtle, member.publicKey, {
groupId: this.groupId,
epoch,
seq,
senderFp,
bodyHash
}, fromB64(String(frame.sig || ""), { max: GROUP_LIMITS.MAX_SIG_BYTES }));
if (!ok) throw new GroupSessionError("message signature did not verify", "bad_signature");
const byMember = this.transcript.get(senderFp) || /* @__PURE__ */ new Map();
const hashHex = toB64(bodyHash);
const previous = byMember.get(seq);
if (previous !== void 0) {
if (previous === hashHex) return;
this._emit("inconsistency", { fp: senderFp, seq, name: member.name });
throw new GroupSessionError("member sent conflicting messages under one sequence number", "transcript_split");
}
byMember.set(seq, hashHex);
if (byMember.size > 512) byMember.delete(byMember.keys().next().value);
this.transcript.set(senderFp, byMember);
this._emit("message", {
fp: senderFp,
name: member.name,
body,
seq,
ts: Number.isFinite(frame.ts) ? frame.ts : Date.now(),
// Whether this particular copy came straight from its author or was
// carried by another member. Worth showing: a relayed message is one
// a third member knew the timing of, and the reader is the only one
// in a position to notice that is still happening.
relayed
});
}
// -----------------------------------------------------------------------
// calls
// -----------------------------------------------------------------------
//
// WHAT TRAVELS HERE AND WHAT DOES NOT
// -----------------------------------
// Only the roster of a call: somebody opened one, somebody joined it,
// somebody left. No SDP, no ICE, no audio, no video. Media is carried by the
// pairwise sessions themselves — each member places an ordinary encrypted
// call to each other member over the link they already share, so a group
// call is N-1 of the 1:1 calls this app already makes, on transports that
// were already SAS-verified. There is no mixer, no conference server and no
// point at which two people's audio meets anywhere but on a device.
//
// That is why call control is separate from the media path. Control has to
// reach every member, including one who is currently reachable only through
// a relay; media can only flow where a direct link exists. Splitting them
// means a member with no direct link still SEES the call and can be dialled
// into it as the mesh completes, instead of silently missing it.
//
// WHY THESE FRAMES ARE SIGNED
// ---------------------------
// A relaying member carries call control for pairs that cannot reach each
// other. Unsigned, that member could add somebody to a call they never
// joined, or drop somebody who is in one, and nobody could tell it had
// happened. Signed with the group identity key, a relay can still refuse to
// carry a frame — the same availability cost relaying always has — but it
// cannot write one.
/** What the app renders. Null when there is no call. */
getCallSnapshot() {
if (!this.call) return null;
const starter = this.members.get(this.call.startedBy);
return {
callId: this.call.callId,
startedBy: this.call.startedBy,
startedByName: this.call.startedBy === this.selfFp ? "You" : starter?.name || "A member",
withVideo: this.call.withVideo,
startedAt: this.call.startedAt,
joined: this.call.joined,
participants: [...this.call.participants].map((fp) => {
const member = this.members.get(fp);
return {
fp,
name: fp === this.selfFp ? "You" : member?.name || "A member",
self: fp === this.selfFp,
sessionId: member?.sessionId || null,
state: member?.state || MEMBER_STATE.LOST
};
}).sort((a, b) => a.fp < b.fp ? -1 : a.fp > b.fp ? 1 : 0)
};
}
_emitCall() {
this._emit("call", { call: this.getCallSnapshot() });
}
_requireReady() {
if (this.phase !== GROUP_PHASE.READY || !this.sasConfirmed) {
throw new GroupSessionError("the group code has not been confirmed", "not_ready");
}
}
/** Sign and fan out one call-control frame. */
async _sendCallFrame(action, callId, withVideo) {
const seq = ++this.callSeq;
const sig = await signGroupCall(this.subtle, this.identity.keyPair.privateKey, {
groupId: this.groupId,
epoch: this.epoch,
callId,
action,
fp: this.selfFp,
seq,
withVideo
});
return this._broadcast({
type: GROUP_FRAMES.CALL,
gid: this.groupId,
epoch: this.epoch,
callId,
action,
fp: this.selfFp,
seq,
v: withVideo === true,
ts: Date.now(),
sig: toB64(sig)
});
}
/**
* Open a call and put ourselves in it.
*
* Refused while one is already running: joining the call that exists is what
* the user means, and a second concurrent call would split the group into two
* rooms that cannot hear each other.
*/
async startCall({ withVideo = false, prepare = null } = {}) {
this._requireReady();
if (this.call) throw new GroupSessionError("a call is already running in this group", "call_in_progress");
const callId = newCallId();
this.call = {
callId,
startedBy: this.selfFp,
withVideo: withVideo === true,
startedAt: Date.now(),
participants: /* @__PURE__ */ new Set([this.selfFp]),
joined: true
};
this._emitCall();
this._scheduleMeshMaintain();
try {
if (typeof prepare === "function") await prepare(this.getCallSnapshot());
const { unreachable } = await this._sendCallFrame(CALL_ACTIONS.START, callId, this.call.withVideo);
return { callId, unreachable };
} catch (error) {
this.call = null;
this._emitCall();
throw error;
}
}
/** Join the call that is already running. */
async joinCall() {
this._requireReady();
if (!this.call) throw new GroupSessionError("there is no call to join", "no_call");
if (this.call.joined) return { callId: this.call.callId, unreachable: [] };
this.call.joined = true;
this.call.participants.add(this.selfFp);
this._emitCall();
this._scheduleMeshMaintain();
const { unreachable } = await this._sendCallFrame(CALL_ACTIONS.JOIN, this.call.callId, this.call.withVideo);
return { callId: this.call.callId, unreachable };
}
/**
* Leave the call.
*
* Leaving is always local first: the frame is best effort, because a member
* who cannot be reached must not be able to keep us in a call by being
* unreachable.
*/
async leaveCall() {
if (!this.call) return;
const callId = this.call.callId;
const withVideo = this.call.withVideo;
this.call.joined = false;
this.call.participants.delete(this.selfFp);
if (this.call.participants.size === 0) this.call = null;
this._emitCall();
try {
await this._sendCallFrame(CALL_ACTIONS.LEAVE, callId, withVideo);
} catch (_) {
}
}
/**
* A member is gone (left the call, left the group, or was removed).
*
* A call with NOBODY in it is over. A call with only us in it is not: that
* is exactly the state every call is in for the seconds between opening it
* and the first person joining, and ending it there would hang up on
* somebody who is on their way in. Leaving is the user's decision, and
* leaveCall is the only thing that makes it.
*/
_dropFromCall(fp) {
if (!this.call || !this.call.participants.has(fp)) return;
this.call.participants.delete(fp);
if (this.call.participants.size === 0) this.call = null;
this._emitCall();
}
async _onCall(frame) {
const epoch = assertEpoch(frame.epoch);
const seq = assertEpoch(frame.seq);
const senderFp = assertFingerprint(String(frame.fp || ""));
const callId = assertCallId(String(frame.callId || ""));
const action = String(frame.action || "");
const withVideo = frame.v === true;
if (senderFp === this.selfFp) return;
const member = this.members.get(senderFp);
if (!member || !member.publicKey) throw new GroupSessionError("call frame from a non-member", "not_a_member");
if (epoch !== this.epoch) throw new GroupSessionError("call frame from another epoch", "stale_epoch");
const seen = this._callSeen.get(senderFp);
if (seen !== void 0 && seq <= seen) return;
const ok = await verifyGroupCall(this.subtle, member.publicKey, {
groupId: this.groupId,
epoch,
callId,
action,
fp: senderFp,
seq,
withVideo
}, fromB64(String(frame.sig || ""), { max: GROUP_LIMITS.MAX_SIG_BYTES }));
if (!ok) throw new GroupSessionError("call frame signature did not verify", "bad_signature");
this._callSeen.set(senderFp, seq);
if (this.phase !== GROUP_PHASE.READY || !this.sasConfirmed) return;
switch (action) {
case CALL_ACTIONS.START: {
if (this.call && this.call.callId !== callId) {
if (callId >= this.call.callId) return;
this.call = null;
}
if (!this.call) {
this.call = {
callId,
startedBy: senderFp,
withVideo,
startedAt: Date.now(),
participants: /* @__PURE__ */ new Set([senderFp]),
joined: false
};
} else {
this.call.participants.add(senderFp);
}
this._emitCall();
this._scheduleMeshMaintain();
return;
}
case CALL_ACTIONS.JOIN: {
if (!this.call || this.call.callId !== callId) return;
if (this.call.participants.has(senderFp)) return;
this.call.participants.add(senderFp);
if (withVideo) this.call.withVideo = true;
this._emitCall();
this._scheduleMeshMaintain();
return;
}
case CALL_ACTIONS.LEAVE: {
if (!this.call || this.call.callId !== callId) return;
this._dropFromCall(senderFp);
return;
}
default:
return;
}
}
// -----------------------------------------------------------------------
// inbound dispatch
// -----------------------------------------------------------------------
/**
* Handle one frame that arrived on a pairwise session.
*
* Everything here is attacker-supplied in the sense that matters: it comes
* from a verified peer, but a group member is only as trustworthy as the
* group makes them. Types are matched against an explicit list and anything
* unrecognised is dropped rather than passed on.
*/
async handleFrame(sessionId, envelope, { relayed = false } = {}) {
if (this._destroyed) return;
if (!isGroupFrame(envelope)) return;
const frame = decodeEnvelope(envelope);
if (!frame || !GROUP_FRAME_TYPES.has(frame.type)) return;
if (assertGroupId(String(frame.gid || "")) !== this.groupId) return;
switch (frame.type) {
case GROUP_FRAMES.RELAY:
return this._onRelay(sessionId, frame);
case GROUP_FRAMES.HELLO:
return this._onHello(sessionId, frame);
case GROUP_FRAMES.MEMBER:
return this._onMemberKey(frame);
case GROUP_FRAMES.ROSTER:
return this._onRoster(sessionId, frame);
case GROUP_FRAMES.COMMIT:
return this._onCommit(frame);
case GROUP_FRAMES.REVEAL:
return this._onReveal(frame);
case GROUP_FRAMES.MESSAGE:
return this._onMessage(frame, { relayed });
case GROUP_FRAMES.LEAVE:
return this._onLeave(frame);
case GROUP_FRAMES.MESH_OFFER:
return this._onMeshOffer(frame);
case GROUP_FRAMES.MESH_ANSWER:
return this._onMeshAnswer(frame);
case GROUP_FRAMES.MESH_ABORT:
return this._onMeshAbort(frame);
case GROUP_FRAMES.CALL:
return this._onCall(frame);
case GROUP_FRAMES.PROBE:
return relayed ? void 0 : this._onProbe(sessionId, frame);
case GROUP_FRAMES.INVITE:
return;
// handled by the app, which decides whether to join at all
default:
return;
}
}
/**
* Single-hop relay.
*
* A frame addressed to us is unwrapped and handled. A frame addressed to
* someone else is forwarded exactly once — `hopped` makes a second forward
* impossible, so there is no loop to form and no path to lengthen.
*/
async _onRelay(sessionId, frame) {
const to = assertFingerprint(String(frame.to || ""));
const inner = frame.inner;
if (!isGroupFrame(inner)) return;
if (inner.type === GROUP_FRAMES.RELAY) return;
if (to === this.selfFp) return this.handleFrame(sessionId, inner, { relayed: true });
if (frame.hopped === true) return;
const member = this.members.get(to);
if (!member || member.state !== MEMBER_STATE.LINKED || !member.sessionId) return;
await this._wire(member.sessionId, { ...frame, hopped: true });
}
async _onLeave(frame) {
const fp = assertFingerprint(String(frame.fp || ""));
const member = this.members.get(fp);
if (!member || fp === this.selfFp) return;
this._emit("left", { fp, name: member.name });
this._dropFromCall(fp);
if (!this.isAdmin && fp === this.adminFp) {
this.members.delete(fp);
for (const [sid, f] of [...this.sessionToFp]) if (f === fp) this.sessionToFp.delete(sid);
this._emit("ended", { reason: "admin_left" });
return;
}
if (!this.isAdmin) return;
this.members.delete(fp);
for (const [sid, f] of [...this.sessionToFp]) if (f === fp) this.sessionToFp.delete(sid);
this._emitMembers();
if (this.members.size < GROUP_LIMITS.MIN_MEMBERS) {
this._emit("ended", { reason: "last_member_left" });
return;
}
this.epoch += 1;
await this.publishRoster(MEMBER_OPS.REMOVE);
}
/**
* Tell the group we are leaving, best effort.
*
* Await this before destroy(): teardown clears the member map this walks to
* find recipients, so a leave that is merely started can end up addressed to
* nobody — and a peer that never hears it keeps a group nobody is in.
*/
async leave() {
try {
await this._broadcast({ type: GROUP_FRAMES.LEAVE, gid: this.groupId, fp: this.selfFp });
} catch (_) {
}
}
/**
* Admin: invite more people into a group that is already running.
*
* The group stays usable throughout. Nothing about the membership changes
* until the new members have published their identity keys and a roster for
* the next epoch actually goes out — at which point every member, old and
* new, runs a fresh commit/reveal round and compares a new code. That is not
* ceremony for its own sake: the safety code covers the member set, so a set
* that has changed has a different code, and the old one no longer says
* anything about who is in the room.
*
* If nobody answers, the round is abandoned and the group is left exactly as
* it was — which is why the epoch is not touched until the roster is sent.
*
* @param {{sessionId: string, name: string}[]} peers
*/
async addMembers(peers) {
if (!this.isAdmin) throw new GroupSessionError("only the admin invites", "not_admin");
if (!Array.isArray(peers) || peers.length === 0) return 0;
if (this._pendingAdd) throw new GroupSessionError("an invitation round is already running", "add_in_flight");
if (this.members.size + peers.length > GROUP_LIMITS.MAX_MEMBERS) {
throw new GroupSessionError(`a group is limited to ${GROUP_LIMITS.MAX_MEMBERS} members`, "too_many_members");
}
for (const peer of peers) {
if (this.sessionToFp.has(peer.sessionId)) {
throw new GroupSessionError("that chat is already a member of this group", "already_a_member");
}
}
this._pendingAdd = {
op: MEMBER_OPS.ADD,
epoch: this.epoch + 1,
before: new Set(this.members.keys())
};
for (const peer of peers) this._awaitingHello.set(peer.sessionId, peer.name || "Member");
const frame = {
type: GROUP_FRAMES.INVITE,
gid: this.groupId,
epoch: this._pendingAdd.epoch,
name: this.name,
adminSpki: toB64(this.identity.spki)
};
const round = this._pendingAdd;
const results = await Promise.allSettled(peers.map((p) => this._wire(p.sessionId, frame)));
const sent = results.filter((r) => r.status === "fulfilled").length;
if (sent === 0) {
for (const peer of peers) this._awaitingHello.delete(peer.sessionId);
if (this._pendingAdd === round) this._pendingAdd = null;
throw new GroupSessionError(
"the invitation could not be sent \u2014 that chat is not connected",
"invitations_could_not_be_sent"
);
}
peers.forEach((peer, i) => {
if (results[i].status === "rejected") this._awaitingHello.delete(peer.sessionId);
});
if (this._pendingAdd === round) {
this._timer(() => {
if (this._pendingAdd === round) this._finishAdd();
}, TIMEOUTS.HELLO_MS);
}
return sent;
}
/**
* Close an add round: publish the new roster, or abandon it.
*
* Reached either when every invitee has answered or when the wait runs out.
* A partial answer is still worth publishing — the people who did join are
* in — but if nobody joined, the group is left untouched rather than pushed
* through a re-keying that would achieve nothing except making everyone
* compare a new code.
*/
async _finishAdd() {
const round = this._pendingAdd;
if (!round) return false;
this._pendingAdd = null;
this._awaitingHello.clear();
const joined = [...this.members.keys()].filter((fp) => !round.before.has(fp));
if (joined.length === 0) {
this._emit("add_failed", { reason: "nobody_joined" });
return false;
}
this.epoch = round.epoch;
this._emitMembers();
await this.publishRoster(round.op);
return true;
}
/**
* Admin: remove a member and re-key the group.
*
* The new epoch is what makes the removal effective — a new safety code every
* remaining member must compare again, and a member set the removed member is
* not in. There is no shared group key to rotate because there never was one:
* every message travels over pairwise ratchets, so a removed member simply
* stops being sent anything.
*/
async removeMember(fp) {
if (!this.isAdmin) throw new GroupSessionError("only the admin removes members", "not_admin");
if (fp === this.selfFp) throw new GroupSessionError("the admin cannot remove themselves", "bad_target");
if (!this.members.has(fp)) return false;
if (this.members.size - 1 < GROUP_LIMITS.MIN_MEMBERS) {
throw new GroupSessionError("a group cannot drop below two members \u2014 leave it instead", "would_empty_group");
}
this.members.delete(fp);
for (const [sid, f] of [...this.sessionToFp]) if (f === fp) this.sessionToFp.delete(sid);
this.epoch += 1;
this._emitMembers();
await this.publishRoster(MEMBER_OPS.REMOVE);
return true;
}
};
// src/group/groupSender.js
var GROUP_SEND_GAP_MS = 260;
var GROUP_SEND_ATTEMPTS = 4;
var isRateLimit = (error) => /rate limit/i.test(error?.message || "");
function createGroupSender({
getManager,
gapMs = GROUP_SEND_GAP_MS,
attempts = GROUP_SEND_ATTEMPTS,
now = () => Date.now(),
sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
} = {}) {
const queues = /* @__PURE__ */ new Map();
return async function sendGroupFrame(sessionId, frame) {
const manager = getManager(sessionId);
if (!manager || typeof manager.sendMessage !== "function") throw new Error("no such link");
if (typeof manager.isConnected === "function" && !manager.isConnected()) {
throw new Error("link is down");
}
const queue = queues.get(sessionId) || { chain: Promise.resolve(), lastAt: 0 };
const payload = JSON.stringify(frame);
const run = queue.chain.then(async () => {
const wait = gapMs - (now() - queue.lastAt);
if (wait > 0) await sleep(wait);
let lastError = null;
for (let attempt = 0; attempt < attempts; attempt++) {
try {
await manager.sendMessage(payload);
queue.lastAt = now();
return true;
} catch (error) {
lastError = error;
if (!isRateLimit(error)) throw error;
await sleep(gapMs * (attempt + 1));
}
}
throw lastError;
});
queue.chain = run.catch(() => {
});
queues.set(sessionId, queue);
return run;
};
}
// src/ui/motion.js
var SPRING = {
// Move / reposition something. No overshoot: a panel that bounces when it
// was not thrown reads as decoration.
move: { damping: 1, response: 0.4 },
// A sheet or drawer the user dragged. The bounce is earned — the gesture
// carried momentum into it.
drawer: { damping: 0.8, response: 0.3 },
// Rotation.
rotate: { damping: 0.8, response: 0.4 }
};
var DT = 1 / 480;
var MAX_FRAME = 0.064;
function prefersReducedMotion() {
try {
return typeof matchMedia === "function" && matchMedia("(prefers-reduced-motion: reduce)").matches;
} catch (_) {
return false;
}
}
function project(velocity, decelerationRate = 0.998) {
return velocity / 1e3 * decelerationRate / (1 - decelerationRate);
}
function snapTarget(position, velocity, points, o = {}) {
const { flick = 220, decelerationRate = 0.998 } = o;
if (!points || !points.length) return position;
const projected = position + project(velocity, decelerationRate);
let pool = points;
if (Math.abs(velocity) > flick) {
const ahead = points.filter((p) => velocity > 0 ? p >= position : p <= position);
if (ahead.length) pool = ahead;
}
return pool.reduce(
(best, p) => Math.abs(p - projected) < Math.abs(best - projected) ? p : best,
pool[0]
);
}
function rubberband(overshoot, dimension, constant = 0.55) {
if (!dimension) return 0;
return overshoot * dimension * constant / (dimension + constant * Math.abs(overshoot));
}
function velocityTracker(windowMs = 100) {
const samples = [];
return {
add(value, time = performance.now()) {
samples.push({ value, time });
while (samples.length > 2 && time - samples[0].time > windowMs) samples.shift();
},
/** @returns {number} px/s over the trailing window */
get(now = performance.now()) {
if (samples.length < 2) return 0;
const last = samples[samples.length - 1];
if (now - last.time > windowMs) return 0;
const first = samples[0];
const dt = (last.time - first.time) / 1e3;
if (dt <= 0) return 0;
return (last.value - first.value) / dt;
},
reset() {
samples.length = 0;
}
};
}
function spring(o) {
const {
from,
to,
velocity = 0,
damping = SPRING.move.damping,
response = SPRING.move.response,
restDelta = 0.1,
restSpeed = 0.5,
respectReducedMotion = true,
onUpdate,
onComplete
} = o;
let value = from;
let vel = velocity;
let target = to;
let raf = 0;
let last = 0;
let done = false;
const omega = 2 * Math.PI / response;
const zeta = damping;
const finish = () => {
done = true;
raf = 0;
value = target;
vel = 0;
if (onUpdate) onUpdate(value);
if (onComplete) onComplete();
};
if (respectReducedMotion && prefersReducedMotion()) {
finish();
return {
get value() {
return value;
},
get velocity() {
return 0;
},
get done() {
return true;
},
retarget(next) {
target = next;
finish();
},
stop() {
}
};
}
const step = (now) => {
raf = 0;
const frame = Math.min((now - last) / 1e3, MAX_FRAME);
last = now;
let t2 = frame;
while (t2 > 0) {
const dt = Math.min(DT, t2);
const accel = -omega * omega * (value - target) - 2 * zeta * omega * vel;
vel += accel * dt;
value += vel * dt;
t2 -= dt;
}
if (Math.abs(value - target) < restDelta && Math.abs(vel) < restSpeed) {
finish();
return;
}
if (onUpdate) onUpdate(value);
raf = requestAnimationFrame(step);
};
last = performance.now();
raf = requestAnimationFrame(step);
return {
get value() {
return value;
},
get velocity() {
return vel;
},
get done() {
return done;
},
/**
* Point the spring somewhere else without touching its current velocity.
*
* This is the anti-"brick wall" move. Killing this animation and starting
* a new one at velocity 0 puts a discontinuity exactly where the user
* reversed direction, which is the moment they are most attentive.
*/
retarget(next) {
target = next;
},
stop() {
if (raf) cancelAnimationFrame(raf);
raf = 0;
done = true;
}
};
}
// src/components/ui/LanguageSuggestion.jsx
var LanguageSuggestion = () => {
const [target] = React.useState(() => {
if (typeof window === "undefined" || !window.location) return null;
if (localeSuggestionDismissed()) return null;
return suggestedLocale({
pathname: window.location.pathname || "/",
languages: window.navigator?.languages || [],
stored: storedLocale()
});
});
const [gone, setGone] = React.useState(false);
const [shown, setShown] = React.useState(false);
React.useEffect(() => {
if (!target) return void 0;
const id = setTimeout(() => setShown(true), 600);
return () => clearTimeout(id);
}, [target]);
if (!target || gone) return null;
const meta = LOCALE_META[target] || {};
const dir = meta.dir === "rtl" ? "rtl" : "ltr";
const pathname = typeof window !== "undefined" ? window.location.pathname : "/";
const href = localeHref(target, pathname);
const still = prefersReducedMotion();
const close = () => {
dismissLocaleSuggestion();
setGone(true);
};
const line = React.createElement("div", {
key: "line",
lang: meta.htmlLang || target,
dir,
style: { fontSize: "13px", lineHeight: 1.45, color: "#cfcfd4", textAlign: "start" }
}, t("language.suggest.text", null, target));
const link = React.createElement("a", {
key: "cta",
href,
hrefLang: meta.htmlLang || target,
lang: meta.htmlLang || target,
dir,
// Following the link is an explicit choice, so it is remembered — the bar has
// then done its job and will not be offered again.
onClick: () => {
rememberLocale(target);
dismissLocaleSuggestion();
},
style: {
display: "inline-flex",
alignItems: "center",
gap: "6px",
padding: "7px 12px",
borderRadius: "9px",
border: "1px solid rgba(240,137,42,0.30)",
background: "rgba(240,137,42,0.12)",
color: "#f0892a",
fontSize: "12.5px",
fontWeight: 600,
textDecoration: "none",
whiteSpace: "nowrap"
}
}, t("language.suggest.cta", null, target));
const dismiss = React.createElement("button", {
key: "dismiss",
type: "button",
onClick: close,
// Labelled in the offered language too: this button is for the same reader.
"aria-label": t("language.suggest.dismiss", null, target),
style: {
padding: "7px 10px",
borderRadius: "9px",
border: "1px solid rgba(255,255,255,0.07)",
background: "rgba(255,255,255,0.02)",
color: "#8a8a92",
font: "inherit",
fontSize: "12.5px",
fontWeight: 500,
cursor: "pointer",
whiteSpace: "nowrap"
}
}, t("language.suggest.dismiss", null, target));
return React.createElement("div", {
// A region rather than a dialog: it interrupts nothing and takes no focus.
role: "region",
"aria-label": t("language.label"),
style: {
// Bottom inline-start, because the install prompt owns the opposite corner.
position: "fixed",
bottom: "24px",
insetInlineStart: "24px",
zIndex: 50,
maxWidth: "min(340px, calc(100vw - 48px))",
display: "flex",
flexDirection: "column",
gap: "11px",
padding: "14px 16px",
borderRadius: "14px",
border: "1px solid rgba(255,255,255,0.08)",
background: "#161618",
boxShadow: "0 16px 40px rgba(0,0,0,0.5)",
opacity: shown ? 1 : 0,
transform: shown || still ? "none" : "translateY(10px)",
transition: still ? "opacity .2s linear" : "opacity .3s ease, transform .3s cubic-bezier(.2,.7,.3,1)",
// Invisible and untouchable until raised, so it cannot swallow a tap during
// the fade.
pointerEvents: shown ? "auto" : "none"
}
}, [
line,
React.createElement("div", {
key: "actions",
style: { display: "flex", alignItems: "center", gap: "8px" }
}, [link, dismiss])
]);
};
window.LanguageSuggestion = LanguageSuggestion;
// src/components/ui/GroupChat.jsx
var h = (...args) => React.createElement(...args);
var C = {
bg: "#0c0c0e",
panel: "#141417",
panel2: "#1b1b1f",
line: "rgba(255,255,255,0.07)",
line2: "rgba(255,255,255,0.13)",
ink: "#f4f4f6",
ink2: "#a7a7b0",
ink3: "#6b6b73",
accent: "#f0892a",
good: "#3ecf8e",
warn: "#e3b341",
bad: "#e5727a",
mono: "'JetBrains Mono', ui-monospace, monospace"
};
var ICON = {
users: '<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M16 19v-1.5a3.5 3.5 0 0 0-3.5-3.5h-5A3.5 3.5 0 0 0 4 17.5V19"/><circle cx="10" cy="8" r="3.2"/><path d="M20 19v-1.5a3.5 3.5 0 0 0-2.6-3.4"/><path d="M15.5 5.3a3.2 3.2 0 0 1 0 5.4"/></svg>',
send: '<svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 2 11 13"/><path d="m22 2-7 20-4-9-9-4 20-7z"/></svg>',
shield: '<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/><path d="m9 12 2 2 4-4"/></svg>',
x: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M18 6 6 18M6 6l12 12"/></svg>',
plus: '<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><path d="M12 5v14M5 12h14"/></svg>',
relay: '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12h4l3-7 4 14 3-7h2"/></svg>',
phone: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.8 19.8 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.12 4.18 2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92z"/></svg>',
exit: '<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 20H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h4"/><path d="m15 16 4-4-4-4"/><path d="M19 12H10"/></svg>',
video: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M23 7l-7 5 7 5V7z"/><rect x="1" y="5" width="15" height="14" rx="2.5"/></svg>'
};
var svg = (markup, extra = {}) => h("span", {
style: { display: "grid", placeItems: "center", ...extra },
dangerouslySetInnerHTML: { __html: markup }
});
var btn = (accent = false) => ({
display: "inline-flex",
alignItems: "center",
justifyContent: "center",
gap: "8px",
padding: "11px 18px",
borderRadius: "10px",
cursor: "pointer",
fontFamily: "inherit",
fontSize: "14px",
fontWeight: 700,
border: accent ? "none" : `1px solid ${C.line2}`,
background: accent ? C.accent : "transparent",
color: accent ? "#1a0f04" : C.ink2
});
var overlay = {
position: "fixed",
inset: 0,
zIndex: 90,
display: "grid",
placeItems: "center",
background: "rgba(5,5,7,0.72)",
backdropFilter: "blur(6px)",
padding: "20px"
};
var card = {
width: "100%",
maxWidth: "440px",
background: C.panel,
border: `1px solid ${C.line}`,
borderRadius: "16px",
padding: "24px",
display: "flex",
flexDirection: "column",
gap: "18px",
boxShadow: "0 24px 60px rgba(0,0,0,0.5)"
};
function clampToBytes(value, max) {
const enc = new TextEncoder();
let out = String(value);
while (enc.encode(out).length > max) out = out.slice(0, -1);
return out;
}
var label = {
fontFamily: C.mono,
fontSize: "10px",
fontWeight: 700,
letterSpacing: "1.3px",
textTransform: "uppercase",
color: C.ink3
};
function waitingWord(group) {
switch (group.phase) {
case GROUP_PHASE.FORMING:
return t("group.waitingJoin");
case GROUP_PHASE.COMMITTING:
return t("group.waitingCommit");
case GROUP_PHASE.REVEALING:
return t("group.exchangingNonces");
case GROUP_PHASE.FAILED:
return GROUP_ERROR_WORD[group.error] || t("group.errNotFormed");
default:
return t("group.working");
}
}
var GROUP_ERROR_WORD = {
invitations_could_not_be_sent: t("group.errInviteFailed"),
invitees_did_not_respond: t("group.errNobodyAccepted"),
roster_never_arrived: t("group.errNoMemberList"),
ceremony_timed_out: t("groupErr.timeout"),
bad_signature: t("group.errUnsignedList"),
wrong_admin: t("group.errNotOwner"),
fingerprint_mismatch: t("groupErr.keyMismatch"),
commitment_mismatch: t("groupErr.revealMismatch"),
commitment_changed: t("groupErr.commitChanged"),
missing_member_key: t("groupErr.missingKey"),
not_a_member: t("groupErr.outsider"),
bad_name: t("group.nameTooLong"),
too_many_members: t("groupErr.limit"),
frame_too_large: t("groupErr.tooLarge")
};
function GroupSasModal({ group, onConfirm, onCancel }) {
if (!group) return null;
const failed = group.phase === GROUP_PHASE.FAILED;
const waiting = group.phase !== GROUP_PHASE.AWAITING_SAS || !group.sasCode;
return h(
"div",
{ style: overlay, role: "dialog", "aria-modal": "true" },
h("div", { style: card }, [
h("div", { key: "h", style: { display: "flex", flexDirection: "column", gap: "6px" } }, [
h("span", { key: "l", style: label }, t("group.sasTitle")),
h("h3", { key: "t", style: { margin: 0, fontSize: "19px", fontWeight: 700, color: C.ink } }, group.name)
]),
waiting ? h("div", {
key: "wait",
style: {
padding: "28px 16px",
textAlign: "center",
borderRadius: "12px",
background: C.panel2,
border: `1px solid ${C.line}`,
color: C.ink2,
fontSize: "14px"
}
}, [
h("div", {
key: "d",
style: {
fontFamily: C.mono,
fontSize: "26px",
letterSpacing: "6px",
color: failed ? C.bad : C.ink3
}
}, "\xB7\xB7\xB7\xB7\xB7\xB7\xB7"),
h("div", { key: "s", style: { marginTop: "10px", color: failed ? C.bad : C.ink2 } }, waitingWord(group)),
failed && h("div", {
key: "why",
style: { marginTop: "6px", fontFamily: C.mono, fontSize: "11px", color: C.ink3 }
}, group.error || "unknown")
]) : h("div", {
key: "code",
style: {
padding: "22px 16px",
textAlign: "center",
borderRadius: "12px",
background: "rgba(240,137,42,0.09)",
border: "1px solid rgba(240,137,42,0.3)"
}
}, h("span", {
// Everyone in the group compares these digits against each other's
// screens, so their order must not depend on the reader's language.
dir: "ltr",
style: {
fontFamily: C.mono,
fontSize: "clamp(30px, 9vw, 42px)",
fontWeight: 700,
letterSpacing: "9px",
color: C.accent,
unicodeBidi: "isolate"
}
}, group.sasCode)),
h("p", {
key: "why",
style: { margin: 0, fontSize: "13.5px", lineHeight: 1.62, color: C.ink2 }
}, [
t("group.sasReadAloud"),
h("b", { key: "b", style: { color: C.ink } }, `all ${group.members.length - 1} other members`),
" \u2014 in person, or on a call where you recognise every voice. Everyone must see the same code."
]),
h("p", {
key: "warn",
style: {
margin: 0,
padding: "11px 13px",
borderRadius: "9px",
fontSize: "12.5px",
lineHeight: 1.55,
background: "rgba(229,114,122,0.09)",
border: "1px solid rgba(229,114,122,0.26)",
color: "#f0a6ab"
}
}, failed ? t("group.errNothingSent") : t("group.sasWarning")),
h("div", { key: "actions", style: { display: "flex", gap: "10px" } }, [
h(
"button",
{ key: "c", onClick: onCancel, style: { ...btn(failed), flex: failed ? 2 : 1 } },
failed ? t("group.close") : t("group.cancel")
),
!failed && h("button", {
key: "ok",
onClick: onConfirm,
disabled: waiting,
style: { ...btn(true), flex: 2, opacity: waiting ? 0.4 : 1, cursor: waiting ? "not-allowed" : "pointer" }
}, [svg(ICON.shield, { key: "i" }), t("group.sasEveryone")])
])
])
);
}
function CreateGroupModal({ candidates, relayOnly, onCreate, onCancel }) {
const [name, setName] = React.useState("");
const [picked, setPicked] = React.useState([]);
const max = GROUP_LIMITS.MAX_MEMBERS - 1;
const toggle = (id) => setPicked((prev) => prev.includes(id) ? prev.filter((x) => x !== id) : prev.length >= max ? prev : [...prev, id]);
const ready = name.trim().length > 0 && picked.length >= 1;
return h(
"div",
{ style: overlay, role: "dialog", "aria-modal": "true" },
h("div", { style: { ...card, maxWidth: "470px" } }, [
h("div", { key: "h", style: { display: "flex", flexDirection: "column", gap: "6px" } }, [
h("span", { key: "l", style: label }, t("group.new")),
h("p", {
key: "p",
style: { margin: 0, fontSize: "13.5px", lineHeight: 1.6, color: C.ink2 }
}, t("group.capacity", { max: GROUP_LIMITS.MAX_MEMBERS }))
]),
h("input", {
key: "name",
value: name,
// Clamped by BYTES, because that is the limit the protocol
// enforces. Counting characters here let a Cyrillic name through
// the dialog that the admin's roster signing then rejected.
onChange: (e) => setName(clampToBytes(e.target.value, GROUP_LIMITS.MAX_NAME_BYTES)),
placeholder: t("group.name"),
style: {
width: "100%",
padding: "12px 14px",
borderRadius: "10px",
outline: "none",
background: C.panel2,
border: `1px solid ${C.line2}`,
color: C.ink,
fontFamily: "inherit",
fontSize: "14.5px"
}
}),
h("div", { key: "pick", style: { display: "flex", flexDirection: "column", gap: "9px" } }, [
h("div", { key: "l", style: { display: "flex", justifyContent: "space-between", alignItems: "baseline" } }, [
h("span", { key: "a", style: label }, t("group.members")),
h(
"span",
{ key: "b", style: { ...label, color: picked.length >= max ? C.warn : C.ink3 } },
`${picked.length} / ${max}`
)
]),
candidates.length === 0 ? h("div", {
key: "empty",
style: {
padding: "18px 14px",
borderRadius: "10px",
textAlign: "center",
background: C.panel2,
border: `1px dashed ${C.line2}`,
color: C.ink3,
fontSize: "13px",
lineHeight: 1.55
}
}, t("group.noVerified")) : h("div", {
key: "list",
className: "msc-scroll",
style: { display: "flex", flexDirection: "column", gap: "6px", maxHeight: "240px", overflowY: "auto" }
}, candidates.map((c) => {
const on = picked.includes(c.id);
const full = !on && picked.length >= max;
return h("button", {
key: c.id,
onClick: () => toggle(c.id),
disabled: full,
style: {
display: "flex",
alignItems: "center",
gap: "11px",
padding: "10px 12px",
borderRadius: "10px",
cursor: full ? "not-allowed" : "pointer",
textAlign: "start",
background: on ? "rgba(240,137,42,0.1)" : "transparent",
border: `1px solid ${on ? "rgba(240,137,42,0.32)" : C.line}`,
opacity: full ? 0.4 : 1,
fontFamily: "inherit"
}
}, [
h("span", {
key: "av",
style: {
flex: "none",
width: "32px",
height: "32px",
borderRadius: "9px",
display: "grid",
placeItems: "center",
background: C.panel2,
border: `1px solid ${C.line}`,
fontFamily: C.mono,
fontSize: "11px",
fontWeight: 700,
color: C.ink2
}
}, c.mono),
h("span", { key: "n", style: { flex: 1, minWidth: 0, fontSize: "14px", color: C.ink, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" } }, c.name),
h("span", {
key: "tick",
style: {
flex: "none",
width: "18px",
height: "18px",
borderRadius: "5px",
background: on ? C.accent : "transparent",
border: `1px solid ${on ? C.accent : C.line2}`
}
})
]);
}))
]),
// A group is a bigger exposure than a 1:1 chat: without a relay, every
// member's address is visible to every other member, including people
// the user did not personally invite. Say it before they commit, not
// after.
!relayOnly && h("p", {
key: "ip",
style: {
margin: 0,
padding: "11px 13px",
borderRadius: "9px",
fontSize: "12.5px",
lineHeight: 1.55,
background: "rgba(227,179,65,0.08)",
border: "1px solid rgba(227,179,65,0.26)",
color: "#e3b341"
}
}, t("group.relayOnlyOff")),
h("div", { key: "actions", style: { display: "flex", gap: "10px" } }, [
h("button", { key: "c", onClick: onCancel, style: { ...btn(false), flex: 1 } }, t("group.cancelBtn")),
h("button", {
key: "ok",
onClick: () => ready && onCreate({ name: name.trim(), sessionIds: picked }),
disabled: !ready,
style: { ...btn(true), flex: 2, opacity: ready ? 1 : 0.4, cursor: ready ? "pointer" : "not-allowed" }
}, t("group.create"))
])
])
);
}
function GroupErrorModal({ message, onDismiss }) {
if (!message) return null;
return h(
"div",
{ style: overlay, role: "alertdialog", "aria-modal": "true" },
h("div", { style: { ...card, maxWidth: "400px" } }, [
h("span", { key: "l", style: label }, t("group.errNotCreated")),
h("p", {
key: "m",
style: { margin: 0, fontSize: "14px", lineHeight: 1.6, color: C.ink2 }
}, message),
h("button", { key: "ok", onClick: onDismiss, style: btn(true) }, t("group.close"))
])
);
}
function AddMembersModal({ candidates, remaining, onAdd, onCancel }) {
const [picked, setPicked] = React.useState([]);
const toggle = (id) => setPicked((prev) => prev.includes(id) ? prev.filter((x) => x !== id) : prev.length >= remaining ? prev : [...prev, id]);
return h(
"div",
{ style: overlay, role: "dialog", "aria-modal": "true" },
h("div", { style: { ...card, maxWidth: "440px" } }, [
h("div", { key: "h", style: { display: "flex", flexDirection: "column", gap: "6px" } }, [
h("span", { key: "l", style: label }, t("group.addMembers")),
h("p", {
key: "p",
style: { margin: 0, fontSize: "13.5px", lineHeight: 1.6, color: C.ink2 }
}, remaining > 0 ? t("group.roomFor", { remaining }) : t("group.errFull"))
]),
candidates.length === 0 ? h("div", {
key: "empty",
style: {
padding: "18px 14px",
borderRadius: "10px",
textAlign: "center",
background: C.panel2,
border: `1px dashed ${C.line2}`,
color: C.ink3,
fontSize: "13px",
lineHeight: 1.55
}
}, t("group.noMoreToAdd")) : h("div", {
key: "list",
className: "msc-scroll",
style: { display: "flex", flexDirection: "column", gap: "6px", maxHeight: "260px", overflowY: "auto" }
}, candidates.map((c) => {
const on = picked.includes(c.id);
const full = !on && picked.length >= remaining;
return h("button", {
key: c.id,
onClick: () => toggle(c.id),
disabled: full,
style: {
display: "flex",
alignItems: "center",
gap: "11px",
padding: "10px 12px",
borderRadius: "10px",
cursor: full ? "not-allowed" : "pointer",
textAlign: "start",
background: on ? "rgba(240,137,42,0.1)" : "transparent",
border: `1px solid ${on ? "rgba(240,137,42,0.32)" : C.line}`,
opacity: full ? 0.4 : 1,
fontFamily: "inherit"
}
}, [
h("span", {
key: "av",
style: {
flex: "none",
width: "32px",
height: "32px",
borderRadius: "9px",
display: "grid",
placeItems: "center",
background: C.panel2,
border: `1px solid ${C.line}`,
fontFamily: C.mono,
fontSize: "11px",
fontWeight: 700,
color: C.ink2
}
}, c.mono),
h("span", { key: "n", style: { flex: 1, minWidth: 0, fontSize: "14px", color: C.ink, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" } }, c.name),
h("span", {
key: "tick",
style: {
flex: "none",
width: "18px",
height: "18px",
borderRadius: "5px",
background: on ? C.accent : "transparent",
border: `1px solid ${on ? C.accent : C.line2}`
}
})
]);
})),
h("p", {
key: "note",
style: {
margin: 0,
padding: "11px 13px",
borderRadius: "9px",
fontSize: "12.5px",
lineHeight: 1.55,
background: C.panel2,
border: `1px solid ${C.line}`,
color: C.ink3
}
}, t("group.inviteSentNote")),
h("div", { key: "actions", style: { display: "flex", gap: "10px" } }, [
h("button", { key: "c", onClick: onCancel, style: { ...btn(false), flex: 1 } }, t("group.cancelBtn")),
h("button", {
key: "ok",
onClick: () => picked.length && onAdd(picked),
disabled: picked.length === 0,
style: { ...btn(true), flex: 2, opacity: picked.length ? 1 : 0.4, cursor: picked.length ? "pointer" : "not-allowed" }
}, picked.length > 1 ? t("group.invitePeople", { count: picked.length }) : t("group.invite"))
])
])
);
}
function GroupInviteModal({ invite, onAccept, onDecline }) {
if (!invite) return null;
return h(
"div",
{ style: overlay, role: "dialog", "aria-modal": "true" },
h("div", { style: card }, [
h("div", { key: "h", style: { display: "flex", flexDirection: "column", gap: "6px" } }, [
h("span", { key: "l", style: label }, t("group.invitation")),
h("h3", { key: "t", style: { margin: 0, fontSize: "19px", fontWeight: 700, color: C.ink } }, invite.name)
]),
h("p", {
key: "p",
style: { margin: 0, fontSize: "13.5px", lineHeight: 1.62, color: C.ink2 }
}, [
h("b", { key: "b", style: { color: C.ink } }, invite.fromLabel),
" invited you to a peer-to-peer group. You will compare one safety code with every member before anything is sent."
]),
h("p", {
key: "note",
style: {
margin: 0,
padding: "11px 13px",
borderRadius: "9px",
fontSize: "12.5px",
lineHeight: 1.55,
background: C.panel2,
border: `1px solid ${C.line}`,
color: C.ink3
}
}, t("group.joinNote")),
h("div", { key: "actions", style: { display: "flex", gap: "10px" } }, [
h("button", { key: "d", onClick: onDecline, style: { ...btn(false), flex: 1 } }, t("group.decline")),
h("button", { key: "a", onClick: onAccept, style: { ...btn(true), flex: 2 } }, t("group.join"))
])
])
);
}
function MemberStrip({ group, onRemove, isAdmin }) {
return h("div", {
className: "msc-scroll",
style: {
display: "flex",
gap: "7px",
padding: "9px 16px",
overflowX: "auto",
borderBottom: `1px solid ${C.line}`,
flex: "none"
}
}, group.members.map((m) => {
const self = m.state === MEMBER_STATE.SELF;
const lost = m.state === MEMBER_STATE.LOST;
const dot = self || m.state === MEMBER_STATE.LINKED ? C.good : m.state === MEMBER_STATE.PENDING ? C.warn : C.bad;
const via = m.state === MEMBER_STATE.PENDING;
return h("span", {
key: m.fp,
title: self ? "You" : m.state === MEMBER_STATE.LINKED ? t("group.directLink") : m.state === MEMBER_STATE.PENDING ? t("group.noDirectLink") : t("group.memberOffline", { name: m.name }),
style: {
flex: "none",
display: "inline-flex",
alignItems: "center",
gap: "6px",
padding: "5px 10px",
borderRadius: "20px",
// A member who is offline should not read as one who is present.
// They stay listed because membership is a signed, epoch-ordered
// fact that a dropped connection does not change — but the chip
// says plainly that nothing sent now reaches them.
background: lost ? "transparent" : C.panel2,
border: `1px solid ${lost ? "rgba(229,114,122,0.3)" : C.line}`,
fontSize: "12.5px",
color: self ? C.ink : lost ? C.ink3 : C.ink2,
opacity: lost ? 0.75 : 1
}
}, [
h("span", { key: "d", style: { width: "7px", height: "7px", borderRadius: "50%", background: dot } }),
h("span", { key: "n", style: lost ? { textDecoration: "line-through" } : void 0 }, self ? "You" : m.name),
lost && h("span", {
key: "off",
style: { fontFamily: C.mono, fontSize: "10px", color: C.bad, letterSpacing: "0.04em" }
}, "offline"),
via && svg(ICON.relay, { key: "r", color: C.warn }),
isAdmin && !self && onRemove && h("button", {
key: "x",
onClick: () => onRemove(m.fp),
title: t("group.remove", { name: m.name }),
style: { border: "none", background: "transparent", color: C.ink3, cursor: "pointer", display: "grid", padding: 0 },
dangerouslySetInnerHTML: { __html: '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M18 6 6 18M6 6l12 12"/></svg>' }
})
]);
}));
}
function Bubble({ msg }) {
const mine = msg.type === "sent";
const system = msg.type === "system";
if (system) {
return h("div", {
style: {
alignSelf: "center",
maxWidth: "80%",
textAlign: "center",
padding: "6px 12px",
borderRadius: "9px",
background: C.panel2,
border: `1px solid ${C.line}`,
fontSize: "12px",
color: C.ink3,
lineHeight: 1.5
}
}, msg.message);
}
return h("div", {
style: {
alignSelf: mine ? "flex-end" : "flex-start",
maxWidth: "min(74%, 560px)",
display: "flex",
flexDirection: "column",
gap: "3px"
}
}, [
!mine && h("span", {
key: "who",
style: { fontSize: "11.5px", fontWeight: 600, color: C.accent, paddingInlineStart: "3px" }
}, msg.senderName || t("group.member")),
h("div", {
key: "b",
style: {
padding: "9px 13px",
borderRadius: mine ? "13px 13px 4px 13px" : "13px 13px 13px 4px",
background: mine ? "rgba(240,137,42,0.14)" : C.panel2,
border: `1px solid ${mine ? "rgba(240,137,42,0.26)" : C.line}`,
color: C.ink,
fontSize: "14.5px",
lineHeight: 1.5,
wordBreak: "break-word",
whiteSpace: "pre-wrap"
}
}, msg.message),
h("span", {
key: "t",
style: { fontFamily: C.mono, fontSize: "10px", color: C.ink3, alignSelf: mine ? "flex-end" : "flex-start", padding: "0 3px" }
}, [
new Date(msg.timestamp || Date.now()).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }),
msg.relayed ? " \xB7 relayed" : ""
].join(""))
]);
}
function GroupChatView({
group,
input,
setInput,
onSend,
onLeave,
onRemoveMember,
onAddMembers,
isAdmin,
scrollRef,
onStartCall,
callActive,
callOverlay
}) {
const ready = group.phase === GROUP_PHASE.READY && group.sasConfirmed;
const degraded = group.members.some((m) => m.state === MEMBER_STATE.PENDING);
const submit = (e) => {
e.preventDefault();
if (!ready || !input.trim()) return;
onSend(input);
};
return h("div", {
style: {
position: "relative",
display: "flex",
flexDirection: "column",
height: "100%",
minHeight: 0,
background: C.bg
}
}, [
// Responsive rules the inline styles cannot express. The group header had
// none, so on a phone the drawer hamburger — which is position:fixed at the
// top-left corner — sat directly on top of the group's avatar and name. The
// 1:1 header has always reserved that space; this is the same reservation,
// plus the safe-area strip an installed web view draws under.
h("style", {
key: "head-css",
dangerouslySetInnerHTML: {
__html: "@media (max-width:1023px){.sb-group-header{padding-inline-start:58px !important;gap:9px !important;}}@media (max-width:600px){.sb-group-header .sb-gh-label{display:none !important;}.sb-group-header .sb-gh-btn{padding:8px 10px !important;}}"
}
}),
// header
h("div", {
key: "head",
className: "sb-group-header",
style: {
flex: "none",
display: "flex",
alignItems: "center",
gap: "12px",
padding: "var(--sb-safe-top, 0px) 16px 0",
minHeight: "calc(64px + var(--sb-safe-top, 0px))",
borderBottom: `1px solid ${C.line}`
}
}, [
h("span", {
key: "av",
style: {
flex: "none",
width: "38px",
height: "38px",
borderRadius: "11px",
display: "grid",
placeItems: "center",
background: "rgba(240,137,42,0.12)",
border: "1px solid rgba(240,137,42,0.24)",
color: C.accent,
fontFamily: C.mono,
fontSize: "12px",
fontWeight: 700
}
}, groupInitials(group.name)),
h("div", { key: "meta", style: { flex: 1, minWidth: 0 } }, [
h("div", {
key: "n",
style: { fontSize: "15px", fontWeight: 700, color: C.ink, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }
}, group.name),
h("div", {
key: "s",
style: { fontSize: "11.5px", color: degraded ? C.warn : C.ink3, display: "flex", alignItems: "center", gap: "5px" }
}, [
svg(ICON.users, { key: "i", width: "13px", height: "13px" }),
t("group.membersCount", { count: group.members.length }),
ready && group.sasCode ? h("span", { key: "code", dir: "ltr", style: { unicodeBidi: "isolate" } }, t("group.codeSuffix", { code: group.sasCode })) : ""
])
]),
// Calls are offered only once the group is usable: a call before the
// safety code is confirmed would be media on links nobody has
// authenticated as belonging to this group.
ready && onStartCall && h("button", {
key: "callvoice",
className: "sb-gh-btn",
onClick: () => onStartCall(false),
disabled: callActive,
title: t("groupCall.startVoice"),
"aria-label": t("groupCall.startVoice"),
style: {
...btn(false),
flex: "none",
padding: "8px 10px",
opacity: callActive ? 0.4 : 1,
cursor: callActive ? "default" : "pointer"
}
}, svg(ICON.phone, { key: "i" })),
ready && onStartCall && h("button", {
key: "callvideo",
className: "sb-gh-btn",
onClick: () => onStartCall(true),
disabled: callActive,
title: t("groupCall.startVideo"),
"aria-label": t("groupCall.startVideo"),
style: {
...btn(false),
flex: "none",
padding: "8px 10px",
opacity: callActive ? 0.4 : 1,
cursor: callActive ? "default" : "pointer"
}
}, svg(ICON.video, { key: "i" })),
isAdmin && onAddMembers && group.members.length < GROUP_LIMITS.MAX_MEMBERS && h("button", {
key: "add",
className: "sb-gh-btn",
onClick: onAddMembers,
title: t("group.inviteMore"),
style: { ...btn(false), flex: "none", padding: "8px 12px", fontSize: "12.5px" }
}, [
svg(ICON.plus, { key: "i" }),
h("span", { key: "l", className: "sb-gh-label" }, t("group.add"))
]),
h("button", {
key: "leave",
className: "sb-gh-btn",
onClick: onLeave,
title: t("group.leaveThis"),
"aria-label": t("group.leaveThis"),
style: { ...btn(false), flex: "none", padding: "8px 12px", fontSize: "12.5px", color: C.bad, borderColor: "rgba(229,114,122,0.3)" }
}, [
svg(ICON.exit, { key: "i" }),
h("span", { key: "l", className: "sb-gh-label" }, t("group.leave"))
])
]),
h(MemberStrip, { key: "strip", group, onRemove: onRemoveMember, isAdmin }),
degraded && ready && h("div", {
key: "relay-note",
style: {
flex: "none",
padding: "8px 16px",
fontSize: "12px",
lineHeight: 1.5,
color: C.warn,
background: "rgba(227,179,65,0.08)",
borderBottom: `1px solid ${C.line}`
}
}, t("group.relayNote")),
// transcript
h("div", {
key: "msgs",
ref: scrollRef,
className: "msc-scroll",
style: {
flex: 1,
minHeight: 0,
overflowY: "auto",
padding: "18px 16px",
display: "flex",
flexDirection: "column",
gap: "11px"
}
}, group.messages.length === 0 ? [h("div", {
key: "empty",
style: { margin: "auto", textAlign: "center", color: C.ink3, fontSize: "13.5px", lineHeight: 1.6, maxWidth: "320px" }
}, ready ? t("group.emptyChat") : t("group.sasCompare"))] : group.messages.map((m) => h(Bubble, { key: m.id, msg: m }))),
// composer
h("form", {
key: "composer",
onSubmit: submit,
style: {
flex: "none",
display: "flex",
gap: "9px",
padding: "12px 16px",
borderTop: `1px solid ${C.line}`,
alignItems: "flex-end"
}
}, [
h("input", {
key: "in",
value: input,
onChange: (e) => setInput(e.target.value),
placeholder: ready ? t("group.message", { name: group.name }) : t("group.confirmFirst"),
disabled: !ready,
maxLength: GROUP_LIMITS.MAX_BODY_BYTES,
style: {
flex: 1,
minWidth: 0,
padding: "12px 14px",
borderRadius: "11px",
outline: "none",
background: C.panel2,
border: `1px solid ${C.line2}`,
color: C.ink,
fontFamily: "inherit",
fontSize: "14.5px",
opacity: ready ? 1 : 0.5
}
}),
h("button", {
key: "send",
type: "submit",
disabled: !ready || !input.trim(),
title: t("group.send"),
style: {
...btn(true),
flex: "none",
width: "44px",
height: "44px",
padding: 0,
borderRadius: "11px",
opacity: !ready || !input.trim() ? 0.4 : 1
}
}, svg(ICON.send))
]),
// The group call covers the transcript when it is running and renders
// nothing when it is not — the same shape as the 1:1 call overlay.
callOverlay
]);
}
// src/group/groupCallMedia.js
var LEG_STATE = Object.freeze({
UNREACHABLE: "unreachable",
// no direct link yet — the mesh is still building one
CONNECTING: "connecting",
// a leg exists, media has not started flowing
ACTIVE: "active",
// audio (and video, if any) is flowing
FAILED: "failed"
// the leg was attempted and did not come up
});
var PHASE_TO_STATE = {
idle: LEG_STATE.CONNECTING,
outgoing: LEG_STATE.CONNECTING,
incoming: LEG_STATE.CONNECTING,
connecting: LEG_STATE.CONNECTING,
active: LEG_STATE.ACTIVE,
ended: LEG_STATE.FAILED
};
var SPEAKING = Object.freeze({ ON: 0.05, OFF: 0.025, HOLD_MS: 600, SAMPLE_MS: 120 });
var FALLBACK_DIAL_MS = 8e3;
function webAudioLevelMeter(context, stream) {
if (!context || !stream) return null;
let source;
try {
source = context.createMediaStreamSource(stream);
} catch (_) {
return null;
}
const analyser = context.createAnalyser();
analyser.fftSize = 512;
analyser.smoothingTimeConstant = 0.2;
source.connect(analyser);
const buffer = new Uint8Array(analyser.fftSize);
return {
read() {
analyser.getByteTimeDomainData(buffer);
let sum = 0;
for (let i = 0; i < buffer.length; i++) {
const v = (buffer[i] - 128) / 128;
sum += v * v;
}
return Math.sqrt(sum / buffer.length);
},
close() {
try {
source.disconnect();
} catch (_) {
}
try {
analyser.disconnect();
} catch (_) {
}
}
};
}
var GroupCallMedia = class {
/**
* @param {object} deps
* @param {(sessionId: string) => object|null} deps.getManager pairwise manager by session id
* @param {(constraints: object) => Promise<MediaStream>} [deps.getUserMedia]
* @param {() => void} [deps.onChange] called whenever the snapshot changes
* @param {(level: string, message: string, context?: object) => void} [deps.log]
*/
constructor({
getManager,
getUserMedia = null,
createAudioSink = null,
createLevelMeter = null,
onChange = () => {
},
log = () => {
}
}) {
this._getManager = getManager;
this._getUserMedia = getUserMedia || ((constraints) => navigator.mediaDevices.getUserMedia(constraints));
this._createAudioSink = createAudioSink || (() => typeof Audio === "function" ? new Audio() : null);
this._createLevelMeter = createLevelMeter || ((stream) => webAudioLevelMeter(this._audioContext(), stream));
this._onChange = onChange;
this._log = log;
this.callId = null;
this.selfFp = "";
this.withVideo = false;
this.micEnabled = true;
this.cameraEnabled = false;
this.facingMode = "user";
this.error = null;
this.localStream = null;
this._legs = /* @__PURE__ */ new Map();
this._peers = [];
this._busy = false;
this._ctx = null;
this._selfMeter = null;
this.selfSpeaking = false;
this._selfQuietSince = 0;
this._levelTimer = null;
}
/**
* One AudioContext for the whole call, created on first use.
*
* A context per leg would be several audio graphs and several hardware
* callbacks for one conversation, and browsers cap how many a page may hold.
* It is resumed rather than assumed: a context created outside a gesture
* starts suspended, and a suspended context reads silence forever — which
* would look exactly like nobody ever speaking.
*/
_audioContext() {
if (this._ctx) return this._ctx;
const Ctor = typeof AudioContext !== "undefined" ? AudioContext : typeof webkitAudioContext !== "undefined" ? webkitAudioContext : null;
if (!Ctor) return null;
try {
this._ctx = new Ctor();
if (this._ctx.state === "suspended") this._ctx.resume().catch(() => {
});
} catch (_) {
this._ctx = null;
}
return this._ctx;
}
get active() {
return this.callId !== null;
}
// -----------------------------------------------------------------------
// joining and leaving
// -----------------------------------------------------------------------
/**
* Capture, then start building legs.
*
* The capture comes FIRST and its failure aborts the join, because a call
* this device cannot speak into is not a call — and the failure has to be
* reported as a device problem (permission, no microphone, another app
* holding it) rather than left to look like the group failed to connect.
*
* CALL IT WITH NO PEERS to capture without connecting anything, then call
* setPeers once the group has been told you are in the call. That ordering
* is not cosmetic — see setPeers.
*
* @param {{callId: string, selfFp: string, withVideo?: boolean, peers?: object[]}} opts
*/
async join({ callId, selfFp, withVideo = false, peers = [] }) {
if (this.callId === callId) {
this.setPeers(peers);
return;
}
if (this.callId) await this.leave();
this.callId = callId;
this.selfFp = selfFp;
this.withVideo = withVideo === true;
this.micEnabled = true;
this.cameraEnabled = this.withVideo;
this.error = null;
this._changed();
try {
this.localStream = await this._getUserMedia({
audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true },
video: this.withVideo ? { facingMode: this.facingMode, width: { ideal: 1280 }, height: { ideal: 720 } } : false
});
} catch (error) {
this.callId = null;
this.error = mediaErrorCode(error);
this._changed();
throw error;
}
this._selfMeter = this._createLevelMeter(this.localStream);
this._startLevelPolling();
this.setPeers(peers);
}
/**
* The participant list changed: reconcile the legs against it.
*
* Called whenever anything moves — somebody joins, somebody leaves, a member
* who was relayed gets a direct link. Idempotent, so the caller can run it
* on every group event without tracking what actually differs.
*
* ORDERING: the group must be told we are in the call BEFORE this runs.
* Attaching a leg can place an offer immediately, and an offer that arrives
* at a member who has not yet heard we joined lands on a session they do not
* yet know is a call leg — so they ring instead of answering, and the dialler
* sits at "connecting" for the rest of the call. Announcing first works
* because both the join frame and the offer travel the same ordered data
* channel, so the join cannot overtake it.
*
* @param {{fp: string, name: string, sessionId: string|null, self?: boolean}[]} peers
*/
setPeers(peers) {
this._peers = Array.isArray(peers) ? peers : [];
if (!this.active) return;
const wanted = /* @__PURE__ */ new Map();
for (const peer of this._peers) {
if (!peer || !peer.fp || peer.fp === this.selfFp) continue;
wanted.set(peer.fp, peer);
}
for (const [fp, leg] of [...this._legs]) {
const peer = wanted.get(fp);
if (!peer || peer.sessionId !== leg.sessionId) this._detach(fp);
}
for (const [fp, peer] of wanted) {
const existing = this._legs.get(fp);
if (existing) {
if (existing.state === LEG_STATE.FAILED && this._weDial(fp)) this._dial(existing);
continue;
}
if (!peer.sessionId) continue;
this._attach(fp, peer);
}
this._changed();
}
/** Tear down every leg and release the capture. */
async leave() {
this._stopLevelPolling();
if (this._selfMeter) {
try {
this._selfMeter.close?.();
} catch (_) {
}
this._selfMeter = null;
}
this.selfSpeaking = false;
for (const fp of [...this._legs.keys()]) this._detach(fp);
if (this._ctx) {
try {
this._ctx.close?.();
} catch (_) {
}
this._ctx = null;
}
if (this.localStream) {
for (const track of this.localStream.getTracks()) {
try {
track.stop();
} catch (_) {
}
}
}
this.localStream = null;
this.callId = null;
this.selfFp = "";
this.withVideo = false;
this.cameraEnabled = false;
this.micEnabled = true;
this._peers = [];
this._changed();
}
// -----------------------------------------------------------------------
// legs
// -----------------------------------------------------------------------
/**
* Who places the call for this pair.
*
* Both members run this and get opposite answers, so exactly one offer is
* made. Comparing fingerprints rather than, say, join order means the answer
* does not depend on anything the two members might disagree about.
*/
_weDial(peerFp) {
return this.selfFp < peerFp;
}
_attach(fp, peer) {
const manager = this._getManager(peer.sessionId);
if (!manager) return;
const leg = {
fp,
name: peer.name || "Member",
sessionId: peer.sessionId,
manager,
unsubscribe: null,
sink: this._createAudioSink(),
meter: null,
fallback: null,
speaking: false,
quietSince: 0,
state: LEG_STATE.CONNECTING,
quality: null,
hasVideo: false
};
if (leg.sink) {
leg.sink.autoplay = true;
leg.sink.muted = false;
}
this._legs.set(fp, leg);
try {
manager.setCallGroupContext(this.callId);
} catch (_) {
}
try {
manager.setExternalMediaStream(this.localStream);
} catch (_) {
}
if (typeof manager.addCallStateListener === "function") {
leg.unsubscribe = manager.addCallStateListener((state) => this._onLegState(fp, state));
}
this._onLegState(fp, manager.getCallState?.() || {});
if (this._weDial(fp)) {
this._dial(leg);
return;
}
leg.fallback = setTimeout(() => this._dialFallback(fp), FALLBACK_DIAL_MS);
}
_dialFallback(fp) {
const leg = this._legs.get(fp);
if (!leg || !this.active) return;
leg.fallback = null;
const phase = leg.manager.getCallState?.().phase || "idle";
if (phase !== "idle") return;
this._log("info", "group call leg was never dialled by the peer; dialling it", {});
Promise.resolve().then(() => leg.manager.startCall(this.withVideo)).catch(() => {
const live = this._legs.get(fp);
if (live === leg) {
live.state = LEG_STATE.FAILED;
this._changed();
}
});
}
/** Place this leg's call. */
_dial(leg) {
const phase = leg.manager.getCallState?.().phase || "idle";
if (phase !== "idle") return;
leg.state = LEG_STATE.CONNECTING;
Promise.resolve().then(() => leg.manager.startCall(this.withVideo)).catch((error) => {
this._log("warn", "group call leg could not be placed", {
errorType: error?.constructor?.name
});
const live = this._legs.get(leg.fp);
if (live === leg) {
live.state = LEG_STATE.FAILED;
this._changed();
}
});
}
_detach(fp) {
const leg = this._legs.get(fp);
if (!leg) return;
this._legs.delete(fp);
if (leg.fallback) {
clearTimeout(leg.fallback);
leg.fallback = null;
}
try {
leg.unsubscribe?.();
} catch (_) {
}
if (leg.sink) {
try {
leg.sink.pause?.();
} catch (_) {
}
try {
leg.sink.srcObject = null;
} catch (_) {
}
}
if (leg.meter) {
try {
leg.meter.close?.();
} catch (_) {
}
leg.meter = null;
}
try {
leg.manager.endCall?.();
} catch (_) {
}
try {
leg.manager.setExternalMediaStream?.(null);
} catch (_) {
}
try {
leg.manager.setCallGroupContext?.(null);
} catch (_) {
}
}
_onLegState(fp, state) {
const leg = this._legs.get(fp);
if (!leg) return;
const phase = state?.phase || "idle";
if (leg.fallback && phase !== "idle") {
clearTimeout(leg.fallback);
leg.fallback = null;
}
leg.state = PHASE_TO_STATE[phase] || LEG_STATE.CONNECTING;
leg.quality = state?.quality || null;
leg.hasVideo = state?.remoteHasVideo === true;
this._pumpAudio(leg);
this._changed();
}
/**
* Keep this leg's audio element pointed at its current inbound stream.
*
* The manager rebuilds that stream whenever its receivers change — a track
* arriving late, a camera being switched on — and hands back a NEW
* MediaStream each time so a consumer can tell. Reassigning here on every
* state change is what keeps a leg audible across those rebuilds; assigning
* once at attach time left the first seconds of some calls silent.
*/
_pumpAudio(leg) {
if (!leg.sink) return;
let stream = null;
try {
stream = leg.manager.getRemoteMediaStream?.() || null;
} catch (_) {
return;
}
if (!stream || leg.sink.srcObject === stream) return;
try {
leg.sink.srcObject = stream;
const played = leg.sink.play?.();
if (played && played.catch) played.catch(() => {
});
} catch (_) {
}
if (leg.meter) {
try {
leg.meter.close?.();
} catch (_) {
}
}
leg.meter = this._createLevelMeter(stream);
leg.speaking = false;
}
// -----------------------------------------------------------------------
// who is speaking
// -----------------------------------------------------------------------
_startLevelPolling() {
if (this._levelTimer || typeof setInterval !== "function") return;
this._levelTimer = setInterval(() => this._sampleLevels(), SPEAKING.SAMPLE_MS);
}
_stopLevelPolling() {
if (this._levelTimer) {
clearInterval(this._levelTimer);
this._levelTimer = null;
}
}
/**
* Turn a level into a speaking flag, with hysteresis and a hold.
*
* `holder` is whatever object carries the flag — a leg, or this instance for
* our own microphone — so the same rule runs for everyone and the local tile
* cannot disagree with a remote one about what counts as talking.
*/
_applyLevel(holder, key, quietKey, level, now) {
const speaking = holder[key] === true;
if (level >= SPEAKING.ON) {
holder[quietKey] = 0;
if (!speaking) {
holder[key] = true;
return true;
}
return false;
}
if (!speaking) return false;
if (level > SPEAKING.OFF) {
holder[quietKey] = 0;
return false;
}
if (!holder[quietKey]) {
holder[quietKey] = now;
return false;
}
if (now - holder[quietKey] >= SPEAKING.HOLD_MS) {
holder[key] = false;
return true;
}
return false;
}
_sampleLevels() {
if (!this.active) return;
const now = Date.now();
let changed = false;
const selfLevel = this.micEnabled && this._selfMeter ? safeRead(this._selfMeter) : 0;
if (this._applyLevel(this, "selfSpeaking", "_selfQuietSince", selfLevel, now)) changed = true;
for (const leg of this._legs.values()) {
const level = leg.meter ? safeRead(leg.meter) : 0;
if (this._applyLevel(leg, "speaking", "quietSince", level, now)) changed = true;
}
if (changed) this._changed();
}
// -----------------------------------------------------------------------
// controls — applied to every leg at once, because it is one call
// -----------------------------------------------------------------------
setMic(enabled) {
this.micEnabled = enabled !== false;
if (this.localStream) {
for (const track of this.localStream.getAudioTracks()) track.enabled = this.micEnabled;
}
if (!this.micEnabled) {
this.selfSpeaking = false;
this._selfQuietSince = 0;
}
for (const leg of this._legs.values()) {
try {
leg.manager.setMicEnabled?.(this.micEnabled);
} catch (_) {
}
}
this._changed();
}
toggleMic() {
this.setMic(!this.micEnabled);
}
/**
* Turn the camera on or off for the whole call.
*
* Turning it on when the call started as voice captures a camera track and
* adds it to every leg, each of which renegotiates its own connection. That
* is N-1 renegotiations for one button, which is the honest cost of having
* no server in the middle.
*/
async setCamera(enabled) {
if (!this.active || this._busy) return;
if (enabled === false) {
this.cameraEnabled = false;
if (this.localStream) {
for (const track of this.localStream.getVideoTracks()) track.enabled = false;
}
for (const leg of this._legs.values()) {
try {
leg.manager.setCameraEnabled?.(false);
} catch (_) {
}
}
this._changed();
return;
}
const existing = this.localStream?.getVideoTracks?.() || [];
if (existing.length) {
for (const track of existing) track.enabled = true;
this.cameraEnabled = true;
this.withVideo = true;
this._changed();
return;
}
this._busy = true;
try {
const camera = await this._getUserMedia({
video: { facingMode: this.facingMode, width: { ideal: 1280 }, height: { ideal: 720 } }
});
const track = camera.getVideoTracks()[0];
if (!track) return;
this.localStream.addTrack(track);
this.cameraEnabled = true;
this.withVideo = true;
await Promise.allSettled([...this._legs.values()].map(
(leg) => Promise.resolve().then(() => leg.manager.addVideoTrack?.(track))
));
} catch (error) {
this.error = mediaErrorCode(error);
this.cameraEnabled = false;
} finally {
this._busy = false;
this._changed();
}
}
async toggleCamera() {
await this.setCamera(!this.cameraEnabled);
}
/** Front/back camera. One capture, swapped into every leg without renegotiating. */
async flipCamera() {
if (!this.active || this._busy || !this.localStream) return;
const old = this.localStream.getVideoTracks()[0];
if (!old) return;
this._busy = true;
const previous = this.facingMode;
this.facingMode = this.facingMode === "user" ? "environment" : "user";
try {
const camera = await this._getUserMedia({ video: { facingMode: this.facingMode } });
const track = camera.getVideoTracks()[0];
if (!track) {
this.facingMode = previous;
return;
}
track.enabled = this.cameraEnabled;
this.localStream.removeTrack(old);
try {
old.stop();
} catch (_) {
}
this.localStream.addTrack(track);
await Promise.allSettled([...this._legs.values()].map(
(leg) => Promise.resolve().then(() => leg.manager.replaceVideoTrack?.(track))
));
} catch (error) {
this.facingMode = previous;
this._log("warn", "group call camera flip failed", { errorType: error?.constructor?.name });
} finally {
this._busy = false;
this._changed();
}
}
// -----------------------------------------------------------------------
// what the UI reads
// -----------------------------------------------------------------------
getLocalStream() {
return this.localStream;
}
/** The inbound stream for one member, or null while their leg is coming up. */
getRemoteStream(fp) {
const leg = this._legs.get(fp);
if (!leg) return null;
try {
return leg.manager.getRemoteMediaStream?.() || null;
} catch (_) {
return null;
}
}
/**
* One call, as one object.
*
* Every participant appears, including the ones with no leg: a member who is
* in the call but reachable only through a relay is CONNECTING, not absent.
* Hiding them would make a mesh that is still building look like a member
* who declined.
*/
snapshot() {
const peers = this._peers.filter((peer) => peer && peer.fp !== this.selfFp).map((peer) => {
const leg = this._legs.get(peer.fp);
return {
fp: peer.fp,
name: peer.name || "Member",
state: leg ? leg.state : LEG_STATE.UNREACHABLE,
quality: leg ? leg.quality : null,
hasVideo: leg ? leg.hasVideo : false,
speaking: leg ? leg.speaking === true : false
};
}).sort((a, b) => a.fp < b.fp ? -1 : a.fp > b.fp ? 1 : 0);
return {
active: this.active,
callId: this.callId,
withVideo: this.withVideo,
micEnabled: this.micEnabled,
cameraEnabled: this.cameraEnabled,
facingMode: this.facingMode,
error: this.error,
selfSpeaking: this.selfSpeaking,
peers,
connected: peers.filter((p) => p.state === LEG_STATE.ACTIVE).length
};
}
_changed() {
try {
this._onChange(this.snapshot());
} catch (_) {
}
}
};
function safeRead(meter) {
try {
return meter.read();
} catch (_) {
return 0;
}
}
function mediaErrorCode(error) {
const name = error?.name || "";
if (name === "NotAllowedError" || name === "SecurityError") return "permission_denied";
if (name === "NotFoundError" || name === "OverconstrainedError") return "device_not_found";
if (name === "NotReadableError" || name === "AbortError") return "device_busy";
return "media_failed";
}
// src/components/ui/callLayout.js
var TILE_GAP = 10;
var TILE_ASPECT = 16 / 9;
var MIN_TILE_W = 150;
function gridLayout(count, width, height, {
gap = TILE_GAP,
aspect = TILE_ASPECT,
minWidth = MIN_TILE_W
} = {}) {
if (count <= 0) return { cols: 0, rows: 0, tileW: 0, tileH: 0 };
if (!(width > 0) || !(height > 0)) {
const cols = Math.min(count, count <= 2 ? count : Math.ceil(Math.sqrt(count)));
return { cols, rows: Math.ceil(count / cols), tileW: 0, tileH: 0 };
}
let best = { cols: 1, rows: count, tileW: 0, tileH: 0 };
for (let cols = 1; cols <= count; cols++) {
const rows = Math.ceil(count / cols);
const perColumn = (width - gap * (cols - 1)) / cols;
const perRow = (height - gap * (rows - 1)) / rows;
if (perColumn <= 0 || perRow <= 0) continue;
const tileW = Math.min(perColumn, perRow * aspect);
if (tileW > best.tileW) best = { cols, rows, tileW, tileH: tileW / aspect };
}
if (best.tileW < minWidth) {
best.tileW = minWidth;
best.tileH = minWidth / aspect;
}
return best;
}
function spotlightLayout(othersCount, width, height, {
gap = TILE_GAP,
aspect = TILE_ASPECT,
minThumb = 92,
maxThumb = 168
} = {}) {
if (!(width > 0) || !(height > 0)) {
return { main: { w: 0, h: 0 }, stripH: 0, thumbW: 0 };
}
if (othersCount <= 0) {
const w = Math.min(width, height * aspect);
return { main: { w, h: w / aspect }, stripH: 0, thumbW: 0 };
}
const thumbW = Math.max(minThumb, Math.min(maxThumb, Math.round(height * 0.2 * aspect)));
const stripH = thumbW / aspect;
const mainH = height - stripH - gap;
const mainW = Math.min(width, mainH * aspect);
if (mainH <= 0 || mainW < thumbW * 2) {
return { main: { w: 0, h: 0 }, stripH: 0, thumbW: 0 };
}
return { main: { w: mainW, h: mainW / aspect }, stripH, thumbW };
}
// src/components/ui/GroupCallUI.jsx
var h2 = (...args) => React.createElement(...args);
var MONO = "'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace";
var ICON2 = {
lock: '<path d="M7 11V7a5 5 0 0 1 10 0v4"/><rect x="4.5" y="11" width="15" height="9" rx="2.2"/>',
minimize: '<path d="M9 4v4a1 1 0 0 1-1 1H4M15 4v4a1 1 0 0 0 1 1h4M9 20v-4a1 1 0 0 0-1-1H4M15 20v-4a1 1 0 0 1 1-1h4"/>',
expand: '<path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"/>',
users: '<path d="M16 19v-1.5a3.5 3.5 0 0 0-3.5-3.5h-5A3.5 3.5 0 0 0 4 17.5V19"/><circle cx="10" cy="8" r="3.2"/><path d="M20 19v-1.5a3.5 3.5 0 0 0-2.6-3.4"/><path d="M15.5 5.3a3.2 3.2 0 0 1 0 5.4"/>',
micOn: '<rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0"/><path d="M12 18v3"/>',
micOff: '<path d="M9 9v-1a3 3 0 0 1 5.1-2.1M15 11v3a3 3 0 0 1-4.6 2.5"/><path d="M5 11a7 7 0 0 0 10.3 6.2M19 11a7 7 0 0 1-.4 2.3"/><path d="M12 18v3"/><path d="M3 3l18 18"/>',
camOn: '<path d="M23 7l-7 5 7 5V7z"/><rect x="1" y="5" width="15" height="14" rx="2.5"/>',
camOff: '<path d="M16 16H3a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h2l2-2M11 6h2l7-3v14M2 2l20 20"/>',
grid: '<rect x="3" y="3" width="7.5" height="7.5" rx="1.6"/><rect x="13.5" y="3" width="7.5" height="7.5" rx="1.6"/><rect x="3" y="13.5" width="7.5" height="7.5" rx="1.6"/><rect x="13.5" y="13.5" width="7.5" height="7.5" rx="1.6"/>',
flip: '<path d="M3 7h3l2-2h8l2 2h3v12H3z"/><path d="M9.5 13a2.5 2.5 0 0 1 5 0M14.5 13l-1.3-1.3M14.5 13l1.3-1.3"/>',
phone: '<path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.8 19.8 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.12 4.18 2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92z"/>',
phoneHangup: '<path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.8 19.8 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.12 4.18 2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92z" transform="rotate(135 12 12)"/>'
};
var svg2 = (inner, size, sw) => h2("span", {
style: { display: "grid", placeItems: "center", width: size + "px", height: size + "px" },
dangerouslySetInnerHTML: { __html: `<svg width="${size}" height="${size}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="${sw}" stroke-linecap="round" stroke-linejoin="round">${inner}</svg>` }
});
var ctrlBase = {
width: "56px",
height: "56px",
borderRadius: "50%",
display: "grid",
placeItems: "center",
border: "1px solid rgba(255,255,255,0.1)",
background: "rgba(255,255,255,0.05)",
color: "#cfcfd4",
cursor: "pointer",
transition: "all .15s"
};
var dangerCtrl = { ...ctrlBase, background: "#e5484d", color: "#fff", border: "1px solid transparent" };
var endBtn = {
width: "56px",
height: "56px",
borderRadius: "50%",
display: "grid",
placeItems: "center",
border: "none",
background: "#e5484d",
color: "#fff",
cursor: "pointer",
boxShadow: "0 8px 24px rgba(229,72,77,0.35)",
transition: "transform .15s"
};
var minimizeBtn = {
width: "36px",
height: "36px",
borderRadius: "9px",
display: "grid",
placeItems: "center",
border: "1px solid rgba(255,255,255,0.15)",
background: "rgba(0,0,0,0.35)",
color: "#fff",
cursor: "pointer",
transition: "all .15s"
};
var QUALITY = {
excellent: { bars: 4, color: "#3ecf8e" },
good: { bars: 3, color: "#3ecf8e" },
fair: { bars: 2, color: "#e3c84e" },
poor: { bars: 1, color: "#e5727a" }
};
function qualityBars(quality) {
const q = QUALITY[quality];
if (!q) return null;
return h2(
"span",
{ key: "q", style: { display: "inline-flex", alignItems: "flex-end", gap: "2px", height: "12px" } },
[0, 1, 2, 3].map((i) => h2("span", {
key: i,
style: {
width: "2.5px",
height: 4 + i * 2.6 + "px",
borderRadius: "1px",
background: i < q.bars ? q.color : "rgba(255,255,255,0.18)"
}
}))
);
}
function initials(name) {
const words = String(name || "").trim().split(/\s+/).filter(Boolean);
return ((words[0]?.[0] || "") + (words[1]?.[0] || words[0]?.[1] || "")).toUpperCase() || "#";
}
var fmt = (s) => `${String(Math.floor(s / 60)).padStart(2, "0")}:${String(s % 60).padStart(2, "0")}`;
function useMeasuredSize() {
const [size, setSize] = React.useState({ w: 0, h: 0 });
const [node, setNode] = React.useState(null);
React.useLayoutEffect(() => {
if (!node) return void 0;
const apply = () => setSize((prev) => prev.w === node.clientWidth && prev.h === node.clientHeight ? prev : { w: node.clientWidth, h: node.clientHeight });
apply();
if (typeof ResizeObserver === "undefined") {
window.addEventListener("resize", apply);
return () => window.removeEventListener("resize", apply);
}
const observer = new ResizeObserver(apply);
observer.observe(node);
return () => observer.disconnect();
}, [node]);
return [setNode, size];
}
function Tile({ peer, stream, self, localStream, cameraEnabled, speaking, tileW, tileH, onSelect, pinned, compact }) {
const videoRef = React.useRef(null);
const source = self ? localStream : stream;
const showVideo = self ? cameraEnabled : peer.hasVideo;
React.useEffect(() => {
const el = videoRef.current;
if (!el || !source) return;
if (el.srcObject !== source) {
el.muted = true;
el.srcObject = source;
}
const played = el.play && el.play();
if (played && played.catch) played.catch(() => {
});
});
const statusWord = self ? null : peer.state === LEG_STATE.ACTIVE ? null : peer.state === LEG_STATE.UNREACHABLE ? t("groupCall.waitingLink") : peer.state === LEG_STATE.FAILED ? t("groupCall.legFailed") : t("groupCall.connecting");
const avatarPx = Math.max(44, Math.min(148, Math.round((tileH || 180) * 0.42)));
return h2("div", {
// A tile is a control as well as a picture: clicking it spotlights that
// person. Given a role and a key handler rather than wrapped in a button,
// so a <video> is not nested inside interactive content.
role: onSelect ? "button" : void 0,
tabIndex: onSelect ? 0 : void 0,
onClick: onSelect,
onKeyDown: onSelect ? (e) => {
if (e.key === "Enter" || e.key === " ") {
e.preventDefault();
onSelect();
}
} : void 0,
title: pinned ? t("groupCall.unpin", { name: peer.name }) : onSelect ? t("groupCall.pin", { name: peer.name }) : speaking ? t("groupCall.speaking", { name: peer.name }) : peer.name,
style: {
cursor: onSelect ? "pointer" : "default",
position: "relative",
borderRadius: "14px",
overflow: "hidden",
background: "#141417",
border: speaking ? "2px solid #3ecf8e" : "2px solid rgba(255,255,255,0.08)",
boxShadow: speaking ? "0 0 0 3px rgba(62,207,142,0.16)" : "none",
transition: "border-color .12s ease, box-shadow .12s ease",
// Sized by the grid, which is the only thing that knows how much
// room there is. aspectRatio stays as the fallback for the first
// paint, before the container has been measured.
// Measured: an exact size. Unmeasured: a shape that is still a tile.
// The floor matters more than it looks — without a minimum a flex item
// can shrink to its own text, and one bad containing block turned the
// whole call into a cluster of label-sized rectangles. Measurement now
// makes the layout GOOD; it is no longer what makes it work at all.
flex: tileW ? "0 0 auto" : "1 1 260px",
minWidth: tileW ? void 0 : "200px",
width: tileW ? tileW + "px" : "auto",
height: tileH ? tileH + "px" : "auto",
aspectRatio: tileH ? void 0 : "16 / 9",
display: "grid",
placeItems: "center"
}
}, [
showVideo ? h2("video", {
key: "v",
ref: videoRef,
autoPlay: true,
muted: true,
playsInline: true,
style: {
position: "absolute",
inset: 0,
width: "100%",
height: "100%",
objectFit: "cover",
transform: self ? "scaleX(-1)" : "none",
background: "#0f0f11"
}
}) : h2("div", {
key: "av",
style: {
// Proportional to the tile: a fixed disc looks lost in a
// large tile and crowds a small one.
width: avatarPx + "px",
height: avatarPx + "px",
borderRadius: "50%",
display: "grid",
placeItems: "center",
background: "radial-gradient(circle at 35% 30%, #2a2a30, #161618)",
border: speaking ? "1.5px solid rgba(62,207,142,0.65)" : "1px solid rgba(255,255,255,0.1)",
color: speaking ? "#3ecf8e" : "#cfcfd4",
fontFamily: MONO,
fontSize: Math.round(avatarPx * 0.3) + "px",
fontWeight: 700,
transition: "color .12s ease, border-color .12s ease"
}
}, initials(peer.name)),
h2("div", {
key: "label",
style: {
position: "absolute",
insetInline: 0,
bottom: 0,
display: "flex",
alignItems: "center",
gap: compact ? "4px" : "7px",
padding: compact ? "4px 6px" : "8px 10px",
background: "linear-gradient(0deg, rgba(0,0,0,0.7), transparent)"
}
}, [
h2("span", {
key: "n",
style: {
flex: 1,
minWidth: 0,
fontSize: compact ? "10.5px" : "12.5px",
fontWeight: 700,
color: "#f4f4f6",
whiteSpace: "nowrap",
overflow: "hidden",
textOverflow: "ellipsis"
}
}, peer.name),
speaking && h2("span", {
key: "sp",
style: { flex: "none", color: "#3ecf8e", display: "grid", placeItems: "center" }
}, svg2(ICON2.micOn, compact ? 11 : 13, 2)),
statusWord && !compact && h2("span", {
key: "s",
style: {
flex: "none",
fontFamily: MONO,
fontSize: "10.5px",
color: peer.state === LEG_STATE.FAILED ? "#e5727a" : "#9a9aa2"
}
}, statusWord),
!self && !compact && qualityBars(peer.quality)
])
]);
}
function GroupCallUI({
call,
media,
groupName,
localStream,
getRemoteStream,
onJoin,
onDismiss,
onLeave,
onToggleMic,
onToggleCamera,
onFlipCamera
}) {
const [minimized, setMinimized] = React.useState(false);
const [seconds, setSeconds] = React.useState(0);
const [pinned, setPinned] = React.useState(null);
const [stageRef, stage] = useMeasuredSize();
const joined = !!call?.joined;
React.useEffect(() => {
if (!joined) {
setSeconds(0);
return void 0;
}
const started = Date.now();
const iv = setInterval(() => setSeconds(Math.floor((Date.now() - started) / 1e3)), 1e3);
return () => clearInterval(iv);
}, [joined, call?.callId]);
React.useEffect(() => {
if (!call) setMinimized(false);
}, [!call]);
const present = React.useMemo(
() => /* @__PURE__ */ new Set(["self", ...(media?.peers || []).map((p) => p.fp)]),
[media]
);
React.useEffect(() => {
if (pinned && !present.has(pinned)) setPinned(null);
}, [pinned, present]);
if (!call) return null;
const encBadge = h2("span", {
key: "enc",
style: { display: "inline-flex", alignItems: "center", gap: "5px", fontSize: "11.5px", fontWeight: 600, color: "#3ecf8e" }
}, [svg2(ICON2.lock, 12, 2), t("call.encryptedShort")]);
if (!joined) {
return h2("div", {
style: {
position: "absolute",
inset: 0,
zIndex: 40,
display: "flex",
flexDirection: "column",
background: "radial-gradient(680px 460px at 50% 36%, rgba(240,137,42,0.08), transparent 70%), #0d0d0f",
animation: "sbExpand .2s ease"
}
}, [
h2(
"div",
{ key: "top", style: { flex: "none", padding: "16px 18px" } },
h2(
"span",
{ style: { display: "inline-flex", alignItems: "center", gap: "7px", fontSize: "12px", fontWeight: 600, color: "#3ecf8e" } },
[svg2(ICON2.lock, 13, 2), t("call.encrypted")]
)
),
h2("div", { key: "mid", style: { flex: 1, display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", padding: "0 24px", textAlign: "center" } }, [
h2("div", {
key: "av",
style: {
position: "relative",
width: "112px",
height: "112px",
marginBottom: "26px",
display: "grid",
placeItems: "center"
}
}, [
h2("span", { key: "p1", style: { position: "absolute", inset: 0, borderRadius: "50%", border: "1.5px solid rgba(240,137,42,0.5)", animation: "sbCallPulse 2s ease-out infinite" } }),
h2("span", { key: "p2", style: { position: "absolute", inset: 0, borderRadius: "50%", border: "1.5px solid rgba(240,137,42,0.4)", animation: "sbCallPulse 2s ease-out infinite", animationDelay: "1s" } }),
h2("div", {
key: "c",
style: {
width: "96px",
height: "96px",
borderRadius: "50%",
display: "grid",
placeItems: "center",
background: "radial-gradient(circle at 35% 30%, #2a2a30, #161618)",
border: "1px solid rgba(255,255,255,0.1)",
color: "#8a8a92"
}
}, svg2(ICON2.users, 42, 1.6))
]),
h2("div", { key: "n", style: { fontSize: "22px", fontWeight: 800, letterSpacing: "-0.4px", color: "#f4f4f6" } }, groupName),
h2(
"div",
{ key: "s", style: { fontFamily: MONO, fontSize: "13.5px", color: "#9a9aa2", marginTop: "8px" } },
call.withVideo ? t("groupCall.startedVideo", { name: call.startedByName }) : t("groupCall.startedVoice", { name: call.startedByName })
),
h2(
"div",
{ key: "p", style: { fontSize: "12.5px", color: "#6b6b73", marginTop: "6px" } },
t("groupCall.inCall", { count: call.participants.length })
)
]),
h2("div", { key: "ctrls", style: { flex: "none", display: "flex", justifyContent: "center", gap: "48px", padding: "24px 24px 40px" } }, [
h2("div", { key: "dec", style: { display: "flex", flexDirection: "column", alignItems: "center", gap: "8px" } }, [
h2("button", { key: "b", onClick: onDismiss, title: t("groupCall.dismiss"), style: { ...endBtn, width: "62px", height: "62px" } }, svg2(ICON2.phoneHangup, 24, 1.9)),
h2("span", { key: "l", style: { fontFamily: MONO, fontSize: "10.5px", color: "#8a8a92" } }, t("groupCall.dismiss"))
]),
h2("div", { key: "acc", style: { display: "flex", flexDirection: "column", alignItems: "center", gap: "8px" } }, [
h2("button", {
key: "b",
onClick: onJoin,
title: t("groupCall.join"),
style: {
width: "62px",
height: "62px",
borderRadius: "50%",
display: "grid",
placeItems: "center",
border: "none",
background: "#3ecf8e",
color: "#06231a",
cursor: "pointer",
boxShadow: "0 8px 24px rgba(62,207,142,0.35)"
}
}, svg2(ICON2.phone, 24, 1.9)),
h2("span", { key: "l", style: { fontFamily: MONO, fontSize: "10.5px", color: "#8a8a92" } }, t("groupCall.join"))
])
])
]);
}
const peers = media?.peers || [];
const selfTile = {
fp: "self",
name: t("groupCall.you"),
state: LEG_STATE.ACTIVE,
hasVideo: media?.cameraEnabled,
quality: null,
speaking: media?.selfSpeaking === true
};
if (minimized) {
const speakers = peers.filter((p) => p.speaking).map((p) => p.name);
const talking = speakers.length === 1 ? speakers[0] : speakers.length > 1 ? speakers.slice(0, 2).join(", ") : media?.selfSpeaking ? t("groupCall.you") : null;
return h2("div", {
style: {
position: "absolute",
bottom: "18px",
insetInlineEnd: "18px",
zIndex: 40,
width: "244px",
borderRadius: "14px",
overflow: "hidden",
background: "#161618",
border: "1px solid rgba(255,255,255,0.1)",
boxShadow: "0 18px 44px rgba(0,0,0,0.55)",
animation: "sbExpand .18s ease"
}
}, [
h2("div", { key: "bar", style: { display: "flex", alignItems: "center", gap: "11px", padding: "11px 12px" } }, [
h2("span", {
key: "ic",
style: {
flex: "none",
width: "34px",
height: "34px",
borderRadius: "9px",
display: "grid",
placeItems: "center",
background: "rgba(62,207,142,0.1)",
border: "1px solid rgba(62,207,142,0.25)",
color: "#3ecf8e"
}
}, svg2(ICON2.users, 16, 1.9)),
h2("div", { key: "tx", style: { flex: 1, minWidth: 0 } }, [
h2("div", { key: "n", style: { fontSize: "13px", fontWeight: 700, color: "#f4f4f6", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" } }, groupName),
h2("div", {
key: "s",
style: {
fontFamily: MONO,
fontSize: "11px",
color: talking ? "#3ecf8e" : "#9a9aa2",
whiteSpace: "nowrap",
overflow: "hidden",
textOverflow: "ellipsis"
}
}, talking ? t("groupCall.speaking", { name: talking }) : `${t("groupCall.inCall", { count: call.participants.length })} \xB7 ${fmt(seconds)}`)
]),
h2("button", { key: "exp", onClick: () => setMinimized(false), title: t("call.expand"), style: { flex: "none", width: "32px", height: "32px", borderRadius: "8px", display: "grid", placeItems: "center", border: "none", background: "rgba(255,255,255,0.05)", color: "#cfcfd4", cursor: "pointer" } }, svg2(ICON2.expand, 15, 2)),
h2("button", { key: "end", onClick: onLeave, title: t("groupCall.leave"), style: { flex: "none", width: "32px", height: "32px", borderRadius: "8px", display: "grid", placeItems: "center", border: "none", background: "#e5484d", color: "#fff", cursor: "pointer" } }, svg2(ICON2.phoneHangup, 15, 2))
])
]);
}
const tiles = [selfTile, ...peers];
const tileFor = (id) => tiles.find((tile) => tile.fp === id) || null;
const spotlight = pinned ? tileFor(pinned) : null;
const others = spotlight ? tiles.filter((tile) => tile.fp !== spotlight.fp) : [];
const spot = spotlight ? spotlightLayout(others.length, stage.w, stage.h) : null;
const spotlit = spotlight && spot && spot.main.w > 0;
const layout = gridLayout(tiles.length, stage.w, stage.h);
const renderTile = (tile, extra = {}) => h2(Tile, {
key: tile.fp,
peer: tile,
self: tile.fp === "self",
speaking: tile.speaking === true,
localStream,
cameraEnabled: media?.cameraEnabled,
stream: tile.fp === "self" ? null : getRemoteStream(tile.fp),
...extra
});
return h2("div", {
style: {
position: "absolute",
inset: 0,
zIndex: 40,
display: "flex",
flexDirection: "column",
background: "#0a0a0c",
animation: "sbExpand .2s ease"
}
}, [
h2("div", {
key: "top",
style: {
flex: "none",
display: "flex",
alignItems: "flex-start",
justifyContent: "space-between",
gap: "14px",
padding: "16px 18px 10px"
}
}, [
h2("div", { key: "l", style: { minWidth: 0 } }, [
h2("div", { key: "n", style: { fontSize: "17px", fontWeight: 800, letterSpacing: "-0.3px", color: "#fff", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" } }, groupName),
h2("div", { key: "s", style: { display: "inline-flex", alignItems: "center", gap: "9px", marginTop: "4px" } }, [
h2("span", { key: "d", style: { fontFamily: MONO, fontSize: "12.5px", color: "#e8e8eb" } }, fmt(seconds)),
encBadge,
h2(
"span",
{ key: "c", style: { fontSize: "11.5px", color: "#8a8a92" } },
t("groupCall.inCall", { count: call.participants.length })
)
])
]),
h2("div", { key: "r", style: { flex: "none", display: "flex", alignItems: "center", gap: "8px" } }, [
spotlit && h2("button", {
key: "grid",
onClick: () => setPinned(null),
title: t("groupCall.showEveryone"),
style: {
height: "36px",
padding: "0 12px",
borderRadius: "9px",
display: "inline-flex",
alignItems: "center",
gap: "7px",
border: "1px solid rgba(255,255,255,0.15)",
background: "rgba(0,0,0,0.35)",
color: "#fff",
cursor: "pointer",
fontFamily: "inherit",
fontSize: "12.5px",
fontWeight: 600
}
}, [svg2(ICON2.grid, 14, 2), t("groupCall.showEveryone")]),
h2("button", { key: "min", onClick: () => setMinimized(true), title: t("call.minimize"), style: minimizeBtn }, svg2(ICON2.minimize, 16, 2))
])
]),
media?.error && h2("div", {
key: "err",
style: {
flex: "none",
margin: "0 18px 10px",
padding: "9px 12px",
borderRadius: "10px",
background: "rgba(229,114,122,0.1)",
border: "1px solid rgba(229,114,122,0.28)",
color: "#e5727a",
fontSize: "12.5px",
lineHeight: 1.5
}
}, t(`groupCall.err.${media.error}`)),
// The stage is what gets measured, so it carries no padding of its own —
// padding would be counted as usable room and every tile would come out
// slightly too large for the space that is really there.
h2("div", {
key: "stage",
ref: stageRef,
className: "msc-scroll",
style: {
flex: 1,
minHeight: 0,
minWidth: 0,
overflow: "auto",
// Breathing room as MARGIN, not padding: clientWidth counts
// padding as usable space and every tile would come out that
// much too wide for the room actually available.
margin: "0 14px 6px",
// Flex, not grid. A grid with `justify-content: center` sizes its
// column to the content, so the row's `width: 100%` had nothing
// definite to resolve against and collapsed to the widest label —
// which is exactly what the broken screenshot showed. A flex
// container keeps a definite content box either way, so a row
// asking for the full width gets the full width.
// `safe center` centres it without the clipping plain centring
// causes once the content overflows: the first row stays
// reachable and the stage scrolls as normal.
display: "flex",
alignItems: "safe center",
justifyContent: "safe center"
}
}, spotlit ? h2("div", {
style: {
display: "flex",
flexDirection: "column",
gap: TILE_GAP + "px",
width: "100%",
height: stage.h + "px",
minHeight: 0
}
}, [
h2("div", {
key: "main",
style: { flex: "none", display: "flex", justifyContent: "center", minHeight: 0 }
}, renderTile(spotlight, {
tileW: spot.main.w,
tileH: spot.main.h,
pinned: true,
onSelect: () => setPinned(null)
})),
others.length > 0 && h2("div", {
key: "strip",
className: "msc-scroll",
style: {
flex: "none",
height: spot.stripH + "px",
display: "flex",
gap: TILE_GAP + "px",
justifyContent: others.length > 4 ? "flex-start" : "center",
// The strip scrolls sideways rather than shrinking: past a
// handful of people, thumbnails that keep dividing stop
// being recognisable, which is the whole point of them.
overflowX: "auto",
overflowY: "hidden"
}
}, others.map((tile) => renderTile(tile, {
tileW: spot.thumbW,
tileH: spot.stripH,
compact: true,
onSelect: () => setPinned(tile.fp)
})))
]) : h2("div", {
// Wrapping flex rather than a grid, for one reason: a call of three
// lays out two over one, and in a grid that lone tile is stuck in the
// first column with a hole beside it. Fixing the row width to exactly
// `cols` tiles makes the wrap land where the layout said it should,
// and a short last row centres itself.
style: {
display: "flex",
flexWrap: "wrap",
gap: TILE_GAP + "px",
justifyContent: "center",
alignContent: "center",
width: layout.tileW ? layout.cols * layout.tileW + (layout.cols - 1) * TILE_GAP + "px" : "100%"
}
}, tiles.map((tile) => renderTile(tile, {
tileW: layout.tileW,
tileH: layout.tileH,
onSelect: () => setPinned(tile.fp)
})))),
h2("div", {
key: "ctrls",
style: {
flex: "none",
display: "flex",
alignItems: "center",
justifyContent: "center",
gap: "16px",
padding: "16px 20px calc(22px + var(--sb-safe-bottom, env(safe-area-inset-bottom, 0px)))",
background: "linear-gradient(0deg, rgba(0,0,0,0.6), transparent)"
}
}, [
h2(
"button",
{ key: "mic", onClick: onToggleMic, title: t("call.mute"), style: media?.micEnabled ? ctrlBase : dangerCtrl },
svg2(media?.micEnabled ? ICON2.micOn : ICON2.micOff, 21, 1.9)
),
h2(
"button",
{ key: "cam", onClick: onToggleCamera, title: t("call.camera"), style: media?.cameraEnabled ? ctrlBase : dangerCtrl },
svg2(media?.cameraEnabled ? ICON2.camOn : ICON2.camOff, 21, 1.8)
),
media?.cameraEnabled && h2("button", { key: "flip", onClick: onFlipCamera, title: t("call.flipCamera"), style: ctrlBase }, svg2(ICON2.flip, 21, 1.8)),
h2("button", { key: "end", onClick: onLeave, title: t("groupCall.leave"), style: endBtn }, svg2(ICON2.phoneHangup, 22, 1.9))
])
]);
}
if (typeof window !== "undefined") {
window.GroupCallUI = GroupCallUI;
}
// src/app.jsx
var DIR = direction();
var scrollBehavior = () => prefersReducedMotion() ? "auto" : "smooth";
var copyToClipboardSecure = async (text, autoClearMs = 0) => {
let ok = false;
try {
await navigator.clipboard.writeText(text);
ok = true;
} catch (e) {
try {
const ta = document.createElement("textarea");
ta.value = text;
ta.style.position = "fixed";
ta.style.opacity = "0";
document.body.appendChild(ta);
ta.select();
ok = document.execCommand("copy");
document.body.removeChild(ta);
} catch (_) {
ok = false;
}
}
if (ok && autoClearMs > 0 && navigator.clipboard && navigator.clipboard.writeText) {
setTimeout(async () => {
let current = null;
let readable = true;
try {
current = await navigator.clipboard.readText();
} catch (_) {
readable = false;
}
if (!readable || current === text) {
try {
await navigator.clipboard.writeText("");
} catch (_) {
}
}
}, autoClearMs);
}
return ok;
};
var parseMessageSegments = (text) => {
if (typeof text !== "string" || text.indexOf("```") === -1) return null;
const segments = [];
const re = /```([a-zA-Z0-9_+#.-]*)\n?([\s\S]*?)```/g;
let last = 0;
let m;
while ((m = re.exec(text)) !== null) {
if (m.index > last) segments.push({ kind: "text", content: text.slice(last, m.index) });
segments.push({ kind: "code", lang: (m[1] || "").toLowerCase(), content: m[2].replace(/\n$/, "") });
last = re.lastIndex;
}
if (last < text.length) segments.push({ kind: "text", content: text.slice(last) });
return segments.some((s) => s.kind === "code") ? segments : null;
};
var HL_KEYWORDS = /* @__PURE__ */ new Set([
"const",
"let",
"var",
"function",
"return",
"if",
"else",
"for",
"while",
"do",
"switch",
"case",
"break",
"continue",
"class",
"extends",
"new",
"this",
"super",
"import",
"export",
"from",
"as",
"default",
"async",
"await",
"try",
"catch",
"finally",
"throw",
"typeof",
"instanceof",
"delete",
"yield",
"in",
"of",
"def",
"elif",
"lambda",
"pass",
"with",
"global",
"public",
"private",
"protected",
"static",
"final",
"void",
"int",
"long",
"float",
"double",
"char",
"bool",
"boolean",
"string",
"struct",
"enum",
"interface",
"package",
"func",
"fn",
"type",
"where",
"select",
"update",
"insert",
"delete",
"where",
"and",
"or",
"not",
"end",
"then",
"fi",
"done",
"echo",
"use",
"mut",
"impl",
"trait",
"match",
"module",
"require"
]);
var HL_LITERALS = /* @__PURE__ */ new Set(["true", "false", "null", "undefined", "None", "True", "False", "nil", "NaN", "Infinity"]);
var highlightCode = (code) => {
const re = /(\/\/[^\n]*|#[^\n]*|\/\*[\s\S]*?\*\/|--[^\n]*)|(`(?:\\.|[^`\\])*`|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|(\b\d[\d_.]*(?:[eE][+-]?\d+)?\b|\b0[xX][0-9a-fA-F]+\b)|([A-Za-z_$][A-Za-z0-9_$]*)/g;
const nodes = [];
let buffer = "";
let last = 0;
let key = 0;
const flush = () => {
if (buffer) {
nodes.push(buffer);
buffer = "";
}
};
let m;
while ((m = re.exec(code)) !== null) {
if (m.index > last) buffer += code.slice(last, m.index);
last = re.lastIndex;
let cls = null;
if (m[1]) cls = "text-gray-500 italic";
else if (m[2]) cls = "text-amber-300";
else if (m[3]) cls = "text-sky-300";
else if (m[4]) {
if (HL_KEYWORDS.has(m[4])) cls = "text-purple-300";
else if (HL_LITERALS.has(m[4])) cls = "text-sky-300";
}
if (cls) {
flush();
nodes.push(React.createElement("span", { key: `h${key++}`, className: cls }, m[0]));
} else {
buffer += m[0];
}
}
if (last < code.length) buffer += code.slice(last);
flush();
return nodes;
};
var PRISM_ALIAS = {
js: "javascript",
mjs: "javascript",
javascript: "javascript",
node: "javascript",
ts: "typescript",
typescript: "typescript",
jsx: "jsx",
tsx: "tsx",
py: "python",
python: "python",
sh: "bash",
shell: "bash",
zsh: "bash",
bash: "bash",
"c++": "cpp",
cpp: "cpp",
cc: "cpp",
cxx: "cpp",
c: "c",
h: "c",
cs: "csharp",
csharp: "csharp",
java: "java",
go: "go",
golang: "go",
rs: "rust",
rust: "rust",
json: "json",
yml: "yaml",
yaml: "yaml",
sql: "sql",
md: "markdown",
markdown: "markdown",
html: "markup",
xml: "markup",
svg: "markup",
css: "css"
};
var CodeBlock = ({ code, lang }) => {
const [copied, setCopied] = React.useState(false);
const handleCopy = async () => {
const ok = await copyToClipboardSecure(code, 3e4);
if (ok) {
setCopied(true);
setTimeout(() => setCopied(false), 2e3);
}
};
const norm = PRISM_ALIAS[(lang || "").toLowerCase()] || (lang || "").toLowerCase();
const prism = typeof window !== "undefined" ? window.Prism : null;
const grammar = prism && prism.languages ? prism.languages[norm] : null;
const usePrism = !!(prism && grammar && typeof prism.highlight === "function");
let highlightedHtml = null;
if (usePrism) {
try {
highlightedHtml = prism.highlight(code, grammar, norm);
} catch (_) {
highlightedHtml = null;
}
}
const displayLang = usePrism ? norm : lang || "code";
const codeEl = usePrism && highlightedHtml != null ? React.createElement("code", { className: "language-" + norm, dangerouslySetInnerHTML: { __html: highlightedHtml } }) : React.createElement("code", null, highlightCode(code));
return React.createElement("div", {
className: "my-1 rounded-lg overflow-hidden",
style: { backgroundColor: "#1b1c1b", border: "0 solid #e5e7eb" }
}, [
React.createElement("div", {
key: "hdr",
className: "flex items-center justify-between px-3 py-1.5",
style: { backgroundColor: "#222322", border: "0 solid #e5e7eb" }
}, [
React.createElement("span", {
key: "lang",
className: "text-[11px] uppercase tracking-wide text-gray-500 font-mono"
}, displayLang),
React.createElement("button", {
key: "copy",
onClick: handleCopy,
title: "Copy \u2014 clipboard auto-clears in 30s",
className: "flex items-center text-[11px] text-gray-400 hover:text-green-400 transition-colors"
}, [
React.createElement("i", {
key: "ic",
className: `${copied ? "fas fa-check text-green-400" : "far fa-copy"} me-1`
}),
copied ? t("action.copied") : t("action.copy")
])
]),
React.createElement("pre", {
key: "pre",
className: "px-3 py-2 overflow-x-auto text-xs leading-relaxed text-gray-200 custom-scrollbar",
style: { whiteSpace: "pre", fontFamily: "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace", margin: 0 }
}, codeEl)
]);
};
var MessageBody = ({ text }) => {
const segments = parseMessageSegments(text);
if (!segments) {
return React.createElement("div", {
className: "text-sm break-words",
style: { whiteSpace: "pre-wrap", wordBreak: "break-word" }
}, text);
}
return React.createElement(
"div",
{ className: "text-sm" },
segments.map(
(seg, i) => seg.kind === "code" ? React.createElement(CodeBlock, { key: i, code: seg.content, lang: seg.lang }) : seg.content.trim() ? React.createElement("div", {
key: i,
className: "break-words",
style: { whiteSpace: "pre-wrap", wordBreak: "break-word" }
}, seg.content) : null
)
);
};
var SAS_CODE_LENGTH = 7;
var GRAIN_URL = `url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='100'%20height='100'%3E%3Cfilter%20id='n'%3E%3CfeTurbulence%20type='fractalNoise'%20baseFrequency='0.9'%20numOctaves='2'%20stitchTiles='stitch'/%3E%3C/filter%3E%3Crect%20width='100%25'%20height='100%25'%20filter='url(%23n)'/%3E%3C/svg%3E")`;
var SB_MONO = "'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace";
var sbGenBars = (seed, n) => {
const out = [];
let s = seed || 1;
for (let i = 0; i < n; i++) {
s = (s * 9301 + 49297) % 233280;
const r = s / 233280;
const env = 0.45 + 0.55 * Math.sin(i / n * Math.PI);
out.push(Math.max(0.16, Math.min(1, (0.3 + r * 0.7) * env)));
}
return out;
};
var sbFmtClock = (sec) => {
sec = Math.max(0, Math.round(sec));
const m = Math.floor(sec / 60), s = sec % 60;
return m + ":" + String(s).padStart(2, "0");
};
var VoicePlayer = ({ voice, isMe }) => {
const h3 = React.createElement;
const [playing, setPlaying] = React.useState(false);
const [progress, setProgress] = React.useState(0);
const [playErr, setPlayErr] = React.useState(false);
const audioRef = React.useRef(null);
const rafRef = React.useRef(null);
const v = voice || {};
const dur = Number.isFinite(v.dur) && v.dur > 0 ? v.dur : 8;
const bars = Array.isArray(v.bars) && v.bars.length ? v.bars : sbGenBars(dur * 37 + 11, 34);
const src = v.url || null;
const transfer = v.transfer || null;
const transferring = !!transfer && !src;
const failed = !!v.error || playErr;
const dir = transfer ? transfer.dir : null;
const pct = transfer ? Math.max(0, Math.min(100, transfer.pct || 0)) : 100;
React.useEffect(() => () => {
if (rafRef.current) cancelAnimationFrame(rafRef.current);
if (audioRef.current) {
try {
audioRef.current.pause();
} catch (_) {
}
audioRef.current = null;
}
}, []);
React.useEffect(() => {
if (!src && audioRef.current) {
try {
audioRef.current.pause();
} catch (_) {
}
audioRef.current = null;
setPlaying(false);
setProgress(0);
}
}, [src]);
const pause = () => {
if (audioRef.current) {
try {
audioRef.current.pause();
} catch (_) {
}
}
if (rafRef.current) cancelAnimationFrame(rafRef.current);
setPlaying(false);
};
const play = () => {
if (!src) return;
setPlayErr(false);
if (!audioRef.current) {
const a = new Audio();
a.preload = "auto";
a.addEventListener("timeupdate", () => {
const d = a.duration && isFinite(a.duration) ? a.duration : dur;
if (d) setProgress(Math.min(1, a.currentTime / d));
});
a.addEventListener("ended", () => {
setPlaying(false);
setProgress(0);
});
a.addEventListener("error", () => {
setPlaying(false);
setPlayErr(true);
});
a.src = src;
audioRef.current = a;
}
const p = audioRef.current.play();
if (p && typeof p.then === "function") {
p.then(() => setPlaying(true)).catch((err) => {
console.warn("Voice playback failed:", err && err.name, err && err.message);
setPlayErr(true);
setPlaying(false);
});
} else {
setPlaying(true);
}
};
const toggle = () => {
if (transferring || failed || !src) return;
if (playing) pause();
else play();
};
const seek = (e) => {
if (transferring || failed || !src) return;
const rect = e.currentTarget.getBoundingClientRect();
const p = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));
if (audioRef.current && audioRef.current.duration) audioRef.current.currentTime = p * audioRef.current.duration;
setProgress(p);
};
const elapsed = progress * dur;
const circ = 2 * Math.PI * 23;
const playBg = isMe ? "#f0892a" : "rgba(240,137,42,0.14)";
const playColor = isMe ? "#1a0f04" : "#f0892a";
const barEls = bars.map((hgt, i) => {
const played = (i + 0.5) / bars.length <= progress;
let col;
if (transferring) col = isMe ? "rgba(255,255,255,0.13)" : "rgba(255,255,255,0.1)";
else col = played ? "#f0892a" : isMe ? "rgba(255,255,255,0.22)" : "rgba(255,255,255,0.16)";
return h3("span", { key: i, style: { flex: "1 1 0", minWidth: 0, width: "3px", height: Math.round(6 + hgt * 22) + "px", borderRadius: "2px", background: col, transition: "background .12s" } });
});
const ring = transferring && h3("svg", { key: "ring", width: 50, height: 50, viewBox: "0 0 50 50", style: { position: "absolute", inset: 0, transform: "rotate(-90deg)" } }, [
h3("circle", { key: "bg", cx: 25, cy: 25, r: 23, fill: "none", stroke: "rgba(240,137,42,0.2)", strokeWidth: 2.5 }),
h3("circle", { key: "fg", cx: 25, cy: 25, r: 23, fill: "none", stroke: "#f0892a", strokeWidth: 2.5, strokeLinecap: "round", strokeDasharray: circ.toFixed(1), strokeDashoffset: (circ * (1 - pct / 100)).toFixed(1), style: { transition: "stroke-dashoffset .12s linear" } })
]);
const icon = failed ? h3("i", { className: "fas fa-triangle-exclamation", style: { fontSize: "14px" } }) : transferring ? h3("svg", { width: 15, height: 15, viewBox: "0 0 24 24", fill: "currentColor", style: { opacity: 0.5 } }, h3("path", { d: "M8 5.2v13.6l11-6.8z" })) : playing ? h3("svg", { width: 16, height: 16, viewBox: "0 0 24 24", fill: "currentColor" }, [h3("rect", { key: "a", x: 6, y: 5, width: 4, height: 14, rx: 1.2 }), h3("rect", { key: "b", x: 14, y: 5, width: 4, height: 14, rx: 1.2 })]) : h3("svg", { width: 16, height: 16, viewBox: "0 0 24 24", fill: "currentColor" }, h3("path", { d: "M8 5.2v13.6l11-6.8z" }));
const label2 = failed ? t("msg.failed") : transferring ? dir === "up" ? t("chat.uploading") : t("chat.downloading") : t("msg.voice");
const timeText = transferring ? pct + "%" : sbFmtClock(playing || progress > 0 ? elapsed : dur);
return h3("div", { style: { display: "flex", alignItems: "center", gap: "13px", padding: "13px 15px 12px" } }, [
h3("div", { key: "pw", style: { position: "relative", flex: "none", width: "50px", height: "50px", display: "grid", placeItems: "center" } }, [
ring,
h3("button", {
key: "pb",
onClick: toggle,
title: transferring ? t("chat.transferring") : playing ? t("msg.pause") : t("msg.play"),
style: { width: "42px", height: "42px", borderRadius: "50%", display: "grid", placeItems: "center", border: "none", background: failed ? "rgba(229,114,122,0.15)" : playBg, color: failed ? "#e5727a" : playColor, cursor: transferring || failed || !src ? "default" : "pointer", transition: "transform .15s cubic-bezier(.2,.7,.3,1)" }
}, icon)
]),
h3("div", { key: "body", style: { flex: 1, minWidth: 0 } }, [
h3("div", { key: "wave", onClick: seek, style: { display: "flex", alignItems: "center", gap: "2px", height: "30px", cursor: transferring || failed || !src ? "default" : "pointer" } }, barEls),
h3("div", { key: "meta", style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginTop: "6px" } }, [
h3("span", { key: "t", style: { fontFamily: SB_MONO, fontSize: "10.5px", fontWeight: 500, color: transferring ? "#f0b072" : "#9a9aa2" } }, timeText),
h3("span", { key: "l", style: { fontFamily: SB_MONO, fontSize: "9.5px", fontWeight: 600, color: failed ? "#e5727a" : transferring ? "#f0892a" : "#56565e", textTransform: "uppercase", letterSpacing: "0.8px" } }, label2)
])
])
]);
};
var VoiceRecorder = ({ onSend, onCancel }) => {
const h3 = React.createElement;
const MAX_SECONDS = 300;
const NBARS = 40;
const [elapsed, setElapsed] = React.useState(0);
const [liveBars, setLiveBars] = React.useState(() => new Array(NBARS).fill(0.06));
const [micError, setMicError] = React.useState(false);
const R = React.useRef({}).current;
const teardownGraph = () => {
try {
if (R.node) {
R.node.disconnect();
if (R.node.port) R.node.port.onmessage = null;
R.node.onaudioprocess = null;
}
} catch (_) {
}
try {
if (R.srcNode) R.srcNode.disconnect();
} catch (_) {
}
try {
if (R.sink) R.sink.disconnect();
} catch (_) {
}
R.node = R.srcNode = R.sink = null;
};
const cleanup = () => {
if (R.timer) clearInterval(R.timer);
R.timer = null;
teardownGraph();
try {
if (R.stream) R.stream.getTracks().forEach((t2) => t2.stop());
} catch (_) {
}
try {
if (R.ac) R.ac.close();
} catch (_) {
}
if (R.wurl) {
try {
URL.revokeObjectURL(R.wurl);
} catch (_) {
}
R.wurl = null;
}
R.stream = R.ac = null;
};
const pushPeak = (amp) => {
R.peaks = R.peaks || [];
R.peaks.push(amp);
const now = performance.now();
if (!R.lastDraw || now - R.lastDraw > 55) {
R.lastDraw = now;
setLiveBars((prev) => {
const live = prev.slice(1);
live.push(Math.max(0.08, amp));
return live;
});
}
};
const downsample = (peaks, n) => {
if (!peaks || !peaks.length) return new Array(n).fill(0.3);
const out = [];
const step = peaks.length / n;
for (let i = 0; i < n; i++) {
const a = Math.floor(i * step), b = Math.max(a + 1, Math.floor((i + 1) * step));
let m = 0;
for (let j = a; j < b && j < peaks.length; j++) m = Math.max(m, peaks[j]);
out.push(Math.max(0.16, Math.min(1, m)));
}
return out;
};
const resample = (data, from, to) => {
if (!data || !data.length || to >= from) return data || new Float32Array(0);
const ratio = from / to;
const outLen = Math.floor(data.length / ratio);
const out = new Float32Array(outLen);
for (let i = 0; i < outLen; i++) {
const start = Math.floor(i * ratio), end = Math.min(data.length, Math.floor((i + 1) * ratio));
let s = 0, n = 0;
for (let j = start; j < end; j++) {
s += data[j];
n++;
}
out[i] = n ? s / n : 0;
}
return out;
};
const encodeWav = (samples, rate) => {
const buf = new ArrayBuffer(44 + samples.length * 2);
const view = new DataView(buf);
const ws = (o2, s) => {
for (let i = 0; i < s.length; i++) view.setUint8(o2 + i, s.charCodeAt(i));
};
ws(0, "RIFF");
view.setUint32(4, 36 + samples.length * 2, true);
ws(8, "WAVE");
ws(12, "fmt ");
view.setUint32(16, 16, true);
view.setUint16(20, 1, true);
view.setUint16(22, 1, true);
view.setUint32(24, rate, true);
view.setUint32(28, rate * 2, true);
view.setUint16(32, 2, true);
view.setUint16(34, 16, true);
ws(36, "data");
view.setUint32(40, samples.length * 2, true);
let o = 44;
for (let i = 0; i < samples.length; i++) {
const s = Math.max(-1, Math.min(1, samples[i]));
view.setInt16(o, s < 0 ? s * 32768 : s * 32767, true);
o += 2;
}
return new Blob([buf], { type: "audio/wav" });
};
const onPcmFrame = (frame) => {
if (!frame || !frame.length) return;
R.pcm.push(frame);
R.sampleCount = (R.sampleCount || 0) + frame.length;
let sum = 0;
for (let i = 0; i < frame.length; i++) sum += frame[i] * frame[i];
pushPeak(Math.min(1, Math.sqrt(sum / frame.length) * 3.2));
};
const finish = (send) => {
if (R.finished) return;
R.finished = true;
if (R.timer) clearInterval(R.timer);
R.timer = null;
const peaks = (R.peaks || []).slice();
const srcRate = R.ac && R.ac.sampleRate || 48e3;
teardownGraph();
let outBlob = null, outDur = 1;
const total = R.sampleCount || 0;
if (send && R.pcm && R.pcm.length && total > srcRate * 0.2) {
const merged = new Float32Array(total);
let off = 0;
for (const c of R.pcm) {
merged.set(c, off);
off += c.length;
}
const targetRate = 24e3;
const out = resample(merged, srcRate, targetRate);
outDur = Math.max(1, Math.round(out.length / targetRate));
outBlob = encodeWav(out, targetRate);
}
try {
if (R.stream) R.stream.getTracks().forEach((t2) => t2.stop());
} catch (_) {
}
try {
if (R.ac) R.ac.close();
} catch (_) {
}
if (R.wurl) {
try {
URL.revokeObjectURL(R.wurl);
} catch (_) {
}
R.wurl = null;
}
R.stream = R.ac = null;
R.pcm = [];
if (send && outBlob && outBlob.size > 44) onSend(outBlob, outDur, downsample(peaks, 34));
else if (send) {
setMicError(true);
R.finished = false;
} else onCancel();
};
React.useEffect(() => {
let cancelled = false;
R.finished = false;
R.peaks = [];
R.pcm = [];
R.sampleCount = 0;
R.t0 = performance.now();
R.timer = setInterval(() => {
const e = (performance.now() - R.t0) / 1e3;
setElapsed(e);
if (e >= MAX_SECONDS) finish(true);
}, 200);
(async () => {
let stream = null;
try {
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
stream = await navigator.mediaDevices.getUserMedia({ audio: { channelCount: 1, echoCancellation: true, noiseSuppression: true } });
}
} catch (_) {
stream = null;
}
if (cancelled) {
if (stream) stream.getTracks().forEach((t2) => t2.stop());
return;
}
if (!stream) {
setMicError(true);
if (R.timer) clearInterval(R.timer);
return;
}
R.stream = stream;
try {
const AC = window.AudioContext || window.webkitAudioContext;
R.ac = new AC();
if (R.ac.state === "suspended") {
try {
await R.ac.resume();
} catch (_) {
}
}
R.srcNode = R.ac.createMediaStreamSource(stream);
R.sink = R.ac.createGain();
R.sink.gain.value = 0;
let useWorklet = false;
if (R.ac.audioWorklet && typeof R.ac.audioWorklet.addModule === "function" && window.AudioWorkletNode) {
try {
const code = 'class P extends AudioWorkletProcessor{process(i){const c=i[0]&&i[0][0];if(c){this.port.postMessage(c.slice(0));}return true;}}registerProcessor("sb-pcm",P);';
R.wurl = URL.createObjectURL(new Blob([code], { type: "application/javascript" }));
await R.ac.audioWorklet.addModule(R.wurl);
if (cancelled) return;
R.node = new AudioWorkletNode(R.ac, "sb-pcm");
R.node.port.onmessage = (e) => onPcmFrame(e.data);
R.srcNode.connect(R.node);
R.node.connect(R.sink);
R.sink.connect(R.ac.destination);
useWorklet = true;
} catch (_) {
useWorklet = false;
}
}
if (!useWorklet) {
const bufSize = 4096;
R.node = R.ac.createScriptProcessor(bufSize, 1, 1);
R.node.onaudioprocess = (e) => {
const inBuf = e.inputBuffer.getChannelData(0);
onPcmFrame(new Float32Array(inBuf));
};
R.srcNode.connect(R.node);
R.node.connect(R.sink);
R.sink.connect(R.ac.destination);
}
} catch (_) {
setMicError(true);
if (R.timer) clearInterval(R.timer);
}
})();
return () => {
cancelled = true;
cleanup();
};
}, []);
if (micError) {
return h3("div", { style: { display: "flex", alignItems: "center", gap: "12px" } }, [
h3("div", { key: "msg", style: { flex: 1, minWidth: 0, display: "flex", alignItems: "center", gap: "9px", height: "46px", padding: "0 16px", borderRadius: "13px", background: "rgba(229,72,72,0.06)", border: "1px solid rgba(229,72,72,0.22)", color: "#e5727a", fontSize: "13.5px" } }, [
h3("i", { key: "i", className: "fas fa-microphone-slash", style: { fontSize: "14px" } }),
t("err.noAudio")
]),
h3(
"button",
{ key: "x", onClick: onCancel, title: t("chatHdr.close"), style: { flex: "none", width: "46px", height: "46px", borderRadius: "50%", display: "grid", placeItems: "center", border: "none", background: "rgba(255,255,255,0.05)", color: "#9a9aa2", cursor: "pointer" } },
h3("i", { className: "fas fa-xmark", style: { fontSize: "16px" } })
)
]);
}
const barEls = liveBars.map((hgt, i) => h3("span", { key: i, style: { flex: "none", width: "3px", height: Math.round(4 + hgt * 24) + "px", borderRadius: "2px", background: "#e5727a", opacity: 0.45 + hgt * 0.55 } }));
return h3("div", { style: { display: "flex", alignItems: "center", gap: "12px" } }, [
h3("button", {
key: "cancel",
onClick: () => finish(false),
title: t("chat.discard"),
style: { flex: "none", width: "42px", height: "42px", borderRadius: "12px", display: "grid", placeItems: "center", border: "none", background: "rgba(255,255,255,0.04)", color: "#9a9aa2", cursor: "pointer" }
}, h3("i", { className: "fas fa-trash-can", style: { fontSize: "15px" } })),
h3("div", { key: "bar", style: { flex: 1, minWidth: 0, display: "flex", alignItems: "center", gap: "11px", height: "46px", padding: "0 16px", borderRadius: "13px", background: "rgba(229,72,72,0.06)", border: "1px solid rgba(229,72,72,0.22)" } }, [
h3(
"span",
{ key: "dot", style: { position: "relative", flex: "none", width: "9px", height: "9px" } },
h3("span", { style: { position: "absolute", inset: 0, borderRadius: "50%", background: "#e5727a", animation: "vmRec 1.3s ease-in-out infinite" } })
),
h3("span", { key: "time", style: { flex: "none", fontFamily: SB_MONO, fontSize: "13px", fontWeight: 600, color: "#f4f4f6", minWidth: "42px" } }, sbFmtClock(elapsed)),
h3("div", { key: "wave", style: { flex: 1, minWidth: 0, display: "flex", alignItems: "center", justifyContent: "flex-end", gap: "2px", height: "30px", overflow: "hidden" } }, barEls)
]),
h3("button", {
key: "send",
onClick: () => finish(true),
title: t("chat.sendVoice"),
style: { flex: "none", width: "46px", height: "46px", borderRadius: "50%", display: "grid", placeItems: "center", border: "none", background: "#f0892a", color: "#1a0f04", cursor: "pointer", boxShadow: "0 8px 22px rgba(240,137,42,0.3)", transition: "transform .15s cubic-bezier(.2,.7,.3,1)" }
}, h3("svg", { width: 20, height: 20, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round" }, [h3("path", { key: "a", d: "M22 2L11 13" }), h3("path", { key: "b", d: "M22 2l-7 20-4-9-9-4 20-7z" })]))
]);
};
var EnhancedChatMessage = ({ message, type, timestamp, mid, status, viewOnce, viewOnceTtl, expiresAt, expired, nowTick, canUnsend, onUnsend, onExpire, voice }) => {
const [revealed, setRevealed] = React.useState(false);
const revealTimerRef = React.useRef(null);
const formatTime = (ts) => new Date(ts).toLocaleTimeString("en-GB", { hour: "2-digit", minute: "2-digit", second: "2-digit" });
React.useEffect(() => () => {
if (revealTimerRef.current) clearTimeout(revealTimerRef.current);
}, []);
if (type === "system" || type === "notice") {
const isNotice = type === "notice";
return React.createElement(
"div",
{ className: "message-slide", style: { display: "flex", justifyContent: "center", margin: "4px 0" } },
React.createElement("div", {
style: { maxWidth: "80%", padding: "8px 14px", borderRadius: "10px", border: "1px solid " + (isNotice ? "rgba(62,207,142,0.25)" : "rgba(240,137,42,0.22)"), background: isNotice ? "rgba(62,207,142,0.08)" : "rgba(240,137,42,0.08)", color: isNotice ? "#8fe0bb" : "#e8b27a", fontSize: "12.5px", textAlign: "center", lineHeight: 1.5 }
}, message)
);
}
const isMe = type === "sent";
const encrypted = isMe;
const isViewOnce = type === "received" && viewOnce === true;
const remaining = typeof expiresAt === "number" ? Math.max(0, Math.ceil((expiresAt - (nowTick || Date.now())) / 1e3)) : null;
const fmtRemaining = (sec) => {
if (sec == null) return "";
const h3 = Math.floor(sec / 3600), m = Math.floor(sec % 3600 / 60), s = sec % 60;
const pad = (n) => String(n).padStart(2, "0");
return h3 > 0 ? h3 + ":" + pad(m) + ":" + pad(s) : m + ":" + pad(s);
};
const handleReveal = () => {
if (revealed) return;
setRevealed(true);
const ms = Math.max(1, typeof viewOnceTtl === "number" ? viewOnceTtl : 15) * 1e3;
revealTimerRef.current = setTimeout(() => {
onExpire && onExpire();
}, ms);
};
const radius = isMe ? "14px 14px 4px 14px" : "14px 14px 14px 4px";
const border = isMe ? "1px solid rgba(255,255,255,0.10)" : "1px solid rgba(255,255,255,0.06)";
const bg = isMe ? "#26262b" : "#161618";
const isExpired = expired === true || typeof expiresAt === "number" && (nowTick || Date.now()) >= expiresAt;
if (isExpired) {
return React.createElement("div", {
className: "message-slide",
style: { display: "flex", width: "100%", justifyContent: isMe ? "flex-end" : "flex-start" }
}, React.createElement(
"div",
{ style: { maxWidth: "74%", minWidth: "170px" } },
React.createElement("div", { style: { display: "flex", alignItems: "center", gap: "9px", padding: "12px 15px", borderRadius: radius, border: "1px dashed rgba(255,255,255,0.1)", background: "rgba(255,255,255,0.018)" } }, [
React.createElement("i", { key: "i", className: "fas fa-clock", style: { color: "#6b6b73", fontSize: "13px" } }),
React.createElement("span", { key: "t", style: { fontSize: "13px", color: "#6b6b73", fontStyle: "italic" } }, t("chat.expired"))
])
));
}
let body;
if (voice) {
body = React.createElement(VoicePlayer, { key: "voice", voice, isMe });
} else if (isViewOnce && !revealed) {
body = React.createElement("div", {
key: "cover",
onClick: handleReveal,
style: { position: "relative", cursor: "pointer", padding: "12px 15px 10px", overflow: "hidden" }
}, [
React.createElement("div", { key: "blur", style: { fontSize: "14.5px", lineHeight: 1.55, color: "#b3b3ba", filter: "blur(7px)", userSelect: "none", pointerEvents: "none", wordBreak: "break-word", minHeight: "22px" } }, message),
React.createElement("div", { key: "grain", style: { position: "absolute", inset: 0, backgroundImage: GRAIN_URL, backgroundSize: "90px", opacity: 0.18, mixBlendMode: "screen", pointerEvents: "none" } }),
React.createElement("div", { key: "lbl", style: { position: "absolute", inset: 0, display: "flex", alignItems: "center", justifyContent: "center", gap: "7px", pointerEvents: "none" } }, [
React.createElement("i", { key: "i", className: "fas fa-eye-slash", style: { color: "#e8e8eb", fontSize: "13px" } }),
React.createElement("span", { key: "t", style: { fontSize: "12px", fontWeight: 600, color: "#e8e8eb", textShadow: "0 1px 5px rgba(0,0,0,0.75)" } }, t("chat.viewOnceTap"))
])
]);
} else {
body = React.createElement(
"div",
{ key: "body", style: { padding: "12px 15px 10px", color: "#e9e9ec" } },
React.createElement(MessageBody, { text: message })
);
}
const metaLeft = [
React.createElement("span", { key: "time", style: { fontFamily: SB_MONO, fontSize: "10.5px", color: "#6b6b73" } }, formatTime(timestamp))
];
if (isMe) {
const stCfg = {
sending: { icon: "fa-clock", color: "#6b6b73", label: t("chat.sending") },
sent: { icon: "fa-check", color: "#8a8a92", label: t("msg.sent") },
// Two GREY ticks = delivered to the peer's device but not yet read.
delivered: { icon: "fa-check-double", color: "#8a8a92", label: t("chat.delivered") },
// Two GREEN ticks = the peer actually opened the chat and read it.
read: { icon: "fa-check-double", color: "#3ecf8e", label: t("msg.read") },
failed: { icon: "fa-triangle-exclamation", color: "#e5727a", label: t("chat.notSent") }
}[status || "sent"] || { icon: "fa-check", color: "#8a8a92", label: t("msg.sent") };
metaLeft.push(React.createElement("span", {
key: "dlv",
title: stCfg.label,
style: { display: "inline-flex", alignItems: "center", color: stCfg.color }
}, React.createElement("i", { className: "fas " + stCfg.icon, style: { fontSize: "10.5px" } })));
}
if (isViewOnce && revealed) {
metaLeft.push(React.createElement("span", { key: "vo", style: { display: "inline-flex", alignItems: "center", gap: "4px", fontSize: "10px", fontWeight: 600, color: "#8a8a92" } }, [
React.createElement("span", { key: "d", style: { width: "4px", height: "4px", borderRadius: "50%", background: "#8a8a92" } }),
t("chat.viewedOnce")
]));
} else if (remaining !== null) {
metaLeft.push(React.createElement("span", { key: "ttl", style: { display: "inline-flex", alignItems: "center", gap: "4px", fontFamily: SB_MONO, fontSize: "10.5px", fontWeight: 500, color: "#f0892a" } }, [
React.createElement("i", { key: "i", className: "fas fa-clock", style: { fontSize: "10px" } }),
fmtRemaining(remaining)
]));
}
const metaRight = [];
metaRight.push(React.createElement("span", { key: "status", style: { display: "inline-flex", alignItems: "center", gap: "5px", fontSize: "10.5px", fontWeight: 600, color: "#3ecf8e", flex: "none" } }, [
React.createElement("i", { key: "i", className: encrypted ? "fas fa-lock" : "fas fa-lock-open", style: { fontSize: "10px" } }),
encrypted ? t("chat.encrypted") : t("chat.decrypted")
]));
if (canUnsend && isMe && mid) {
metaRight.push(React.createElement("button", {
key: "unsend",
onClick: () => onUnsend && onUnsend(mid),
title: t("chat.deleteForEveryone"),
className: "sb-unsend",
style: { background: "none", border: "none", cursor: "pointer", color: "#56565e", fontSize: "11px", padding: 0, lineHeight: 1 }
}, React.createElement("i", { className: "fas fa-trash-can" })));
}
const meta = React.createElement("div", {
key: "meta",
style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: "14px", padding: "0 15px 10px" }
}, [
React.createElement("div", { key: "l", style: { display: "flex", alignItems: "center", gap: "9px", minWidth: 0 } }, metaLeft),
React.createElement("div", { key: "r", style: { display: "flex", alignItems: "center", gap: "9px", flex: "none" } }, metaRight)
]);
return React.createElement("div", {
className: "message-slide",
style: { display: "flex", width: "100%", justifyContent: isMe ? "flex-end" : "flex-start" }
}, [
React.createElement(
"div",
{ key: "wrap", style: { maxWidth: "74%", minWidth: "170px" } },
React.createElement("div", { style: { borderRadius: radius, border, background: bg, overflow: "hidden" } }, [body, meta])
)
]);
};
var EnhancedConnectionSetup = ({
messages,
onCreateOffer,
onCreateAnswer,
onConnect,
onClearData,
onVerifyConnection,
connectionStatus,
offerData,
answerData,
offerInput,
setOfferInput,
answerInput,
setAnswerInput,
showOfferStep,
showAnswerStep,
verificationCode,
showVerification,
showQRCode,
qrCodeUrl,
showQRScanner,
setShowQRCode,
setShowQRScanner,
setShowQRScannerModal,
offerPassword,
answerPassword,
localVerificationConfirmed,
remoteVerificationConfirmed,
bothVerificationsConfirmed,
// QR control props
qrFramesTotal,
qrFrameIndex,
qrManualMode,
toggleQrManualMode,
nextQrFrame,
prevQrFrame,
markAnswerCreated,
notificationIntegrationRef,
isGeneratingKeys,
setIsGeneratingKeys,
handleCreateOffer,
relayOnlyMode,
setRelayOnlyMode,
webrtcManagerRef,
showIceSettings,
setShowIceSettings,
iceServersText,
iceSettingsPersisted,
customIceServers,
handleApplyIceSettings,
handleForgetIceSettings,
// When true, render ONLY the create/connect card (no marketing landing,
// no hero) so it slots into the chat column for an additional session.
compact = false
}) => {
const [mode, setMode] = React.useState("create");
const [notificationPermissionRequested, setNotificationPermissionRequested] = React.useState(false);
const [qrModalOpen, setQrModalOpen] = React.useState(false);
const [copied, setCopied] = React.useState(false);
const [sasInput, setSasInput] = React.useState("");
const [sasError, setSasError] = React.useState("");
const [platformsOpen, setPlatformsOpen] = React.useState(false);
const [codeRevealed, setCodeRevealed] = React.useState(false);
const [genProgress, setGenProgress] = React.useState(0);
React.useEffect(() => {
setSasInput("");
setSasError("");
}, [verificationCode]);
React.useEffect(() => {
if (!showOfferStep && !showAnswerStep) setQrModalOpen(false);
setCodeRevealed(false);
}, [showOfferStep, showAnswerStep]);
React.useEffect(() => {
const generating = isGeneratingKeys && !showOfferStep && !showAnswerStep && !showVerification;
if (!generating) {
setGenProgress(0);
return;
}
setGenProgress(0);
let p = 0;
const id = setInterval(() => {
p += 1;
setGenProgress(p);
if (p >= 3) clearInterval(id);
}, 520);
return () => clearInterval(id);
}, [isGeneratingKeys, showOfferStep, showAnswerStep, showVerification]);
React.useEffect(() => {
if (!platformsOpen) return;
const onDoc = () => setPlatformsOpen(false);
const id = setTimeout(() => document.addEventListener("click", onDoc), 0);
return () => {
clearTimeout(id);
document.removeEventListener("click", onDoc);
};
}, [platformsOpen]);
const resetToSelect = () => {
setIsGeneratingKeys(false);
setQrModalOpen(false);
onClearData();
};
const handleVerificationConfirm = (userCode) => {
return onVerifyConnection(userCode);
};
const handleVerificationReject = () => {
onVerifyConnection(null, false);
};
const requestNotificationPermissionOnInteraction = async () => {
if (notificationPermissionRequested) {
return;
}
try {
if (!("Notification" in window)) {
return;
}
if (!window.isSecureContext && window.location.protocol !== "https:" && window.location.hostname !== "localhost") {
return;
}
const currentPermission = typeof Notification !== "undefined" && Notification ? Notification.permission : "denied";
if (currentPermission === "default" && typeof Notification !== "undefined" && Notification) {
const permission = await Notification.requestPermission();
if (permission === "granted") {
try {
if (window.NotificationIntegration && webrtcManagerRef.current) {
const integration = new window.NotificationIntegration(webrtcManagerRef.current);
await integration.init();
notificationIntegrationRef.current = integration;
}
} catch (error) {
}
setTimeout(() => {
try {
const welcomeNotification = new Notification("SecureBit Chat", {
body: t("notify.enabledBody"),
icon: "/logo/icon-192x192.png",
tag: "welcome-notification"
});
welcomeNotification.onclick = () => {
welcomeNotification.close();
};
setTimeout(() => {
welcomeNotification.close();
}, 5e3);
} catch (error) {
}
}, 1e3);
}
} else if (currentPermission === "granted") {
try {
if (window.NotificationIntegration && webrtcManagerRef.current && !notificationIntegrationRef.current) {
const integration = new window.NotificationIntegration(webrtcManagerRef.current);
await integration.init();
notificationIntegrationRef.current = integration;
}
} catch (error) {
}
setTimeout(() => {
try {
const testNotification = new Notification("SecureBit Chat", {
body: t("notify.workingBody"),
icon: "/logo/icon-192x192.png",
tag: "test-notification"
});
testNotification.onclick = () => {
testNotification.close();
};
setTimeout(() => {
testNotification.close();
}, 5e3);
} catch (error) {
}
}, 1e3);
}
setNotificationPermissionRequested(true);
} catch (error) {
}
};
const h3 = React.createElement;
const C_ORANGE = "#f0892a";
const C_GREEN = "#3ecf8e";
const MONO2 = SB_MONO;
const encode = (data) => {
try {
const min = typeof data === "object" ? JSON.stringify(data) : data || "";
if (!min) return "";
if (typeof window.encodeBinaryToPrefixed === "function") return window.encodeBinaryToPrefixed(min);
if (typeof window.compressToPrefixedGzip === "function") return window.compressToPrefixedGzip(min);
return min;
} catch {
return typeof data === "object" ? JSON.stringify(data) : data || "";
}
};
const isCreate = mode === "create";
const isGenerating = isGeneratingKeys && !showOfferStep && !showAnswerStep && !showVerification;
const isOfferCred = isCreate && showOfferStep && !showVerification;
const isAnswerCred = !isCreate && showAnswerStep && !showVerification;
const atIntro = !showVerification && !isGenerating && !isOfferCred && !isAnswerCred;
const accent = isCreate ? C_ORANGE : C_GREEN;
const kicker = showVerification ? t("step.verification") : isOfferCred || isAnswerCred ? t("step.exchange") : t("step.open");
const credCode = isCreate ? encode(offerData) : encode(answerData);
const hasInvite = (offerInput || "").trim().length > 0;
const hasAnswer = (answerInput || "").trim().length > 0;
const copyCred = async () => {
try {
if (typeof copyToClipboardSecure === "function") await copyToClipboardSecure(credCode);
else await navigator.clipboard.writeText(credCode);
} catch (e) {
}
setCopied(true);
setTimeout(() => setCopied(false), 1600);
};
const normExpected = (verificationCode || "").replace(/[-\s]/g, "").length;
const normInput = sasInput.replace(/[-\s]/g, "").length;
const canConfirm = !localVerificationConfirmed && normExpected > 0 && normInput === normExpected;
const handleSasConfirm = async () => {
try {
setSasError("");
await onVerifyConnection(sasInput);
} catch (err) {
setSasInput("");
setSasError(err?.message === "SAS_MAX_ATTEMPTS" ? t("sas.tooManyAttempts") : t("sas.incorrect"));
}
};
const ICON_DEFS = {
"fa-user": { sw: 1.9, e: [["circle", { cx: 12, cy: 8, r: 3.6 }], ["path", { d: "M5 20c0-3.5 3-5.5 7-5.5s7 2 7 5.5" }]] },
"fa-lock": { sw: 2, e: [["path", { d: "M7 11V7a5 5 0 0 1 10 0v4" }], ["rect", { x: 4.5, y: 11, width: 15, height: 9, rx: 2.2 }]] },
"fa-plus": { sw: 2.1, e: [["path", { d: "M12 5v14M5 12h14" }]] },
"fa-link": { sw: 2, e: [["path", { d: "M9.5 14.5l5-5M8 11l-2.2 2.2a3.5 3.5 0 0 0 4.95 4.95L13 16M16 13l2.2-2.2a3.5 3.5 0 0 0-4.95-4.95L11 8" }]] },
"fa-bolt": { sw: 2.1, e: [["path", { d: "M13 2L4.5 13H11l-1 9 8.5-11H12l1-9z" }]] },
"fa-camera": { sw: 1.8, e: [["path", { d: "M2 8.5V6.5A2.5 2.5 0 0 1 4.5 4h2M17.5 4h2A2.5 2.5 0 0 1 22 6.5v2M22 15.5v2a2.5 2.5 0 0 1-2.5 2.5h-2M6.5 20h-2A2.5 2.5 0 0 1 2 17.5v-2" }], ["circle", { cx: 12, cy: 12, r: 3.2 }]] },
"fa-qrcode": { sw: 1.9, e: [["rect", { x: 3, y: 3, width: 7, height: 7, rx: 1.3 }], ["rect", { x: 14, y: 3, width: 7, height: 7, rx: 1.3 }], ["rect", { x: 3, y: 14, width: 7, height: 7, rx: 1.3 }], ["path", { d: "M14 14h3v3M21 14v.01M14 21h.01M21 21v-4M17.5 21H21" }]] },
"fa-chevron-right": { sw: 2, e: [["path", { d: "M9 6l6 6-6 6" }]] },
"fa-chevron-left": { sw: 2, e: [["path", { d: "M15 6l-6 6 6 6" }]] },
"fa-chevron-down": { sw: 2, e: [["path", { d: "M6 9l6 6 6-6" }]] },
"fa-circle-notch": { sw: 2, e: [["path", { d: "M21 12a9 9 0 1 1-6.2-8.6" }]] },
"fa-check": { sw: 2.4, e: [["path", { d: "M20 6L9 17l-5-5" }]] },
"fa-check-circle": { sw: 2, e: [["circle", { cx: 12, cy: 12, r: 9 }], ["path", { d: "M8.5 12.4l2.4 2.4 4.6-5" }]] },
"fa-shield-alt": { sw: 1.9, e: [["path", { d: "M12 2.6l7 3v5.1c0 4.5-3 8.3-7 10.2-4-1.9-7-5.7-7-10.2V5.6l7-3z" }], ["path", { d: "M9 12l2 2 4-4.1" }]] },
"fa-download": { sw: 2, e: [["path", { d: "M12 3v12M12 15l-4.5-4.5M12 15l4.5-4.5" }], ["path", { d: "M4 20h16" }]] },
"fa-clock": { sw: 1.8, e: [["circle", { cx: 12, cy: 13, r: 8 }], ["path", { d: "M12 9v4l2.5 2M9 2h6" }]] },
"fa-times": { sw: 2.2, e: [["path", { d: "M18 6L6 18M6 6l12 12" }]] },
"fa-eye": { sw: 1.9, e: [["path", { d: "M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7-10-7-10-7z" }], ["circle", { cx: 12, cy: 12, r: 3 }]] }
};
const fa = (name, opts) => {
opts = opts || {};
const def = ICON_DEFS[name];
if (!def) {
const st = {};
if (opts.color) st.color = opts.color;
if (opts.fontSize) st.fontSize = opts.fontSize;
if (opts.animation) st.animation = opts.animation;
if (opts.style) Object.assign(st, opts.style);
return h3("i", { key: opts.key, className: `fas ${name}`, style: st });
}
const size = opts.fontSize ? parseFloat(opts.fontSize) : 16;
const svgStyle = {};
if (opts.animation) {
svgStyle.animation = opts.animation;
svgStyle.transformOrigin = "center";
svgStyle.transformBox = "fill-box";
}
if (opts.style) Object.assign(svgStyle, opts.style);
return h3("svg", {
key: opts.key,
className: name,
width: size,
height: size,
viewBox: "0 0 24 24",
fill: "none",
stroke: opts.color || "currentColor",
strokeWidth: def.sw || 2,
strokeLinecap: "round",
strokeLinejoin: "round",
style: svgStyle
}, def.e.map((el, i) => h3(el[0], Object.assign({ key: i }, el[1]))));
};
const leftPanel = h3("div", {
key: "left",
className: "sb-start-left",
style: {
flex: "1.05 1 380px",
position: "relative",
overflow: "hidden",
// Full viewport height even when the panels stack on mobile, so the
// branding column isn't collapsed/cramped (looked broken otherwise).
minHeight: "100vh",
boxSizing: "border-box",
padding: "46px",
display: "flex",
flexDirection: "column",
justifyContent: "space-between",
gap: "36px",
borderInlineEnd: "1px solid rgba(255,255,255,0.06)",
background: "radial-gradient(900px 600px at 25% 18%, rgba(240,137,42,0.07), transparent 62%), radial-gradient(800px 700px at 80% 92%, rgba(62,207,142,0.06), transparent 60%), #0c0c0e"
}
}, [
h3(
"div",
{ key: "herowrap", style: { flex: 1, display: "flex", flexDirection: "column", justifyContent: "center", position: "relative", zIndex: 2 } },
h3("div", { key: "hero", style: { maxWidth: "560px" } }, [
h3("h1", { key: "h1", style: { margin: "0 0 14px", fontSize: "34px", fontWeight: 800, letterSpacing: "-1.1px", lineHeight: 1.1, color: "#f4f4f6" } }, [
t("hero.headlineTop"),
h3("br", { key: "br" }),
t("hero.headlineBottom")
]),
h3(
"p",
{ key: "p", style: { margin: "0 0 38px", fontSize: "14.5px", lineHeight: 1.6, color: "#8a8a92", maxWidth: "390px" } },
t("hero.subheading")
),
// P2P / mesh animation.
//
// The loop tells the product's story in one shot: a direct line to
// one peer, then two more joining it over 14 seconds — which is what
// v6.0 actually added. Motion is pure CSS (offset-path along the
// same geometry the lines are drawn from), so there is no rAF loop
// burning battery on a landing page and nothing to tear down.
h3("div", { key: "channel", style: { display: "flex", alignItems: "center", gap: "32px", flexWrap: "wrap" } }, [
h3("svg", {
key: "svg",
viewBox: "0 0 380 200",
role: "img",
"aria-label": t("hero.diagramAlt"),
// Scales down on narrow screens; the labels sit just outside
// the viewBox, so the box must not clip them.
style: { display: "block", width: "100%", maxWidth: "380px", height: "auto", overflow: "visible" }
}, [
// the established 1:1 line
h3("line", { key: "l0", x1: 30, y1: 100, x2: 330, y2: 100, stroke: C_ORANGE, strokeWidth: 1.5, strokeOpacity: 0.75 }),
h3("circle", { key: "p0", r: 3.6, fill: "#f0a455", style: { offsetPath: "path('M30,100 L330,100')", animation: "sbTrav 2.8s linear infinite" } }),
// first peer joins
h3("g", { key: "g1", style: { animation: "sbIn1 14s linear infinite" } }, [
h3("line", { key: "a", x1: 30, y1: 100, x2: 250, y2: 26, stroke: C_ORANGE, strokeWidth: 1.4, strokeOpacity: 0.7 }),
h3("line", { key: "b", x1: 250, y1: 26, x2: 330, y2: 100, stroke: C_GREEN, strokeWidth: 1.2, strokeOpacity: 0.3 }),
h3("circle", { key: "p", r: 3.2, fill: "#f0a455", style: { offsetPath: "path('M30,100 L250,26')", animation: "sbTrav 3s linear .6s infinite" } }),
h3("circle", { key: "n", cx: 250, cy: 26, r: 5, fill: "#0c0c0e", stroke: "#6b6760", strokeWidth: 1.2 }),
h3("text", { key: "t", x: 250, y: 8, textAnchor: "middle", fontFamily: MONO2, fontSize: 12, fill: "#8f8b84" }, "mara")
]),
h3("circle", { key: "r1", cx: 250, cy: 26, r: 5, fill: "none", stroke: C_ORANGE, strokeOpacity: 0.6, style: { animation: "sbRing1 14s linear infinite" } }),
// second peer joins, and the mesh closes
h3("g", { key: "g2", style: { animation: "sbIn2 14s linear infinite" } }, [
h3("line", { key: "a", x1: 30, y1: 100, x2: 250, y2: 174, stroke: C_ORANGE, strokeWidth: 1.4, strokeOpacity: 0.7 }),
h3("line", { key: "b", x1: 250, y1: 174, x2: 330, y2: 100, stroke: C_GREEN, strokeWidth: 1.2, strokeOpacity: 0.3 }),
h3("line", { key: "c", x1: 250, y1: 26, x2: 250, y2: 174, stroke: C_GREEN, strokeWidth: 1.2, strokeOpacity: 0.3 }),
h3("circle", { key: "p", r: 3.2, fill: "#f0a455", style: { offsetPath: "path('M30,100 L250,174')", animation: "sbTrav 3s linear .3s infinite" } }),
h3("circle", { key: "q", r: 2.8, fill: C_GREEN, style: { offsetPath: "path('M250,26 L250,174')", animation: "sbTrav 3.4s linear 1.2s infinite" } }),
h3("circle", { key: "n", cx: 250, cy: 174, r: 5, fill: "#0c0c0e", stroke: "#6b6760", strokeWidth: 1.2 }),
h3("text", { key: "t", x: 250, y: 194, textAnchor: "middle", fontFamily: MONO2, fontSize: 12, fill: "#8f8b84" }, "tobi")
]),
h3("circle", { key: "r2", cx: 250, cy: 174, r: 5, fill: "none", stroke: C_ORANGE, strokeOpacity: 0.6, style: { animation: "sbRing2 14s linear infinite" } }),
// the two endpoints of the original line
h3("circle", { key: "pe", cx: 330, cy: 100, r: 5, fill: "#0c0c0e", stroke: "#6b6760", strokeWidth: 1.2 }),
h3("text", { key: "pt", x: 346, y: 104, fontFamily: MONO2, fontSize: 12, fill: "#8f8b84" }, "peer"),
h3("circle", { key: "yh", cx: 30, cy: 100, r: 15, fill: C_ORANGE, fillOpacity: 0.09 }),
h3("circle", { key: "yc", cx: 30, cy: 100, r: 6, fill: C_ORANGE }),
h3("text", { key: "yt", x: 30, y: 126, textAnchor: "middle", fontFamily: MONO2, fontSize: 12, fill: "#d8cfc1" }, t("mesh.you"))
]),
// the log, timed to the same 14s loop as the nodes appearing
h3("div", { key: "log", style: { display: "flex", flexDirection: "column", gap: "12px", fontFamily: MONO2, fontSize: "12px", color: "#85817b" } }, [
h3("div", { key: "r0", style: { animation: "sbRow0 14s linear infinite" } }, t("mesh.peer")),
h3("div", { key: "r1", style: { animation: "sbRow1 14s linear infinite" } }, t("mesh.joined2")),
h3("div", { key: "r2", style: { animation: "sbRow2 14s linear infinite" } }, t("mesh.joined3"))
])
])
])
),
h3(
"div",
{ key: "badges", style: { position: "relative", zIndex: 2, display: "flex", flexWrap: "wrap", gap: "8px" } },
["ECDH P-384", "AES-256-GCM", t("sec.pfsShort")].map(
(label2) => h3("span", { key: label2, style: { display: "inline-flex", alignItems: "center", gap: "6px", padding: "6px 11px", borderRadius: "8px", border: "1px solid rgba(255,255,255,0.07)", background: "rgba(255,255,255,0.025)", fontFamily: MONO2, fontSize: "11px", fontWeight: 500, color: "#9a9aa2" } }, [
h3("span", { key: "dot", style: { width: "5px", height: "5px", borderRadius: "50%", background: C_GREEN } }),
label2
])
)
)
]);
const segToggle = atIntro && h3("div", { key: "seg", style: { position: "relative", display: "flex", padding: "4px", borderRadius: "12px", border: "1px solid rgba(255,255,255,0.07)", background: "#141416", marginBottom: "26px" } }, [
h3("div", { key: "ind", style: { position: "absolute", top: "4px", bottom: "4px", insetInlineStart: "4px", width: "calc(50% - 4px)", borderRadius: "9px", background: "rgba(255,255,255,0.07)", border: "1px solid rgba(255,255,255,0.08)", transform: isCreate ? "translateX(0%)" : `translateX(${100 * DIR}%)`, transition: "transform .26s cubic-bezier(.3,.8,.3,1)" } }),
h3("button", { key: "c", className: "sb-seg-btn", onClick: () => setMode("create"), style: { position: "relative", zIndex: 1, flex: 1, display: "flex", alignItems: "center", justifyContent: "center", gap: "8px", padding: "11px", border: "none", background: "transparent", color: isCreate ? "#f4f4f6" : "#7b7b83", fontFamily: "inherit", fontSize: "14px", fontWeight: 700, cursor: "pointer" } }, [fa("fa-plus", { key: "i" }), t("action.create")]),
h3("button", { key: "j", className: "sb-seg-btn", onClick: () => setMode("join"), style: { position: "relative", zIndex: 1, flex: 1, display: "flex", alignItems: "center", justifyContent: "center", gap: "8px", padding: "11px", border: "none", background: "transparent", color: !isCreate ? "#f4f4f6" : "#7b7b83", fontFamily: "inherit", fontSize: "14px", fontWeight: 700, cursor: "pointer" } }, [fa("fa-link", { key: "i" }), t("action.join")])
]);
const backButton = (key) => h3("button", { key: key || "back", className: "sb-soft-btn", onClick: resetToSelect, style: { display: "inline-flex", alignItems: "center", gap: "6px", marginBottom: "14px", paddingBlock: "6px", paddingInlineStart: "8px", paddingInlineEnd: "11px", borderRadius: "8px", border: "1px solid rgba(255,255,255,0.08)", background: "transparent", color: "#9a9aa2", fontFamily: "inherit", fontSize: "12.5px", fontWeight: 600, cursor: "pointer" } }, [fa("fa-chevron-left", { key: "i" }), t("action.back")]);
const credBlock = h3("div", { key: "codeblock", style: { borderRadius: "13px", border: "1px solid rgba(255,255,255,0.08)", background: "#141416", overflow: "hidden", marginBottom: "16px" } }, [
h3("div", { key: "bar", style: { display: "flex", alignItems: "center", gap: "8px", padding: "9px 12px", borderBottom: "1px solid rgba(255,255,255,0.06)", background: "rgba(0,0,0,0.2)" } }, [
h3("span", { key: "dot", style: { width: "7px", height: "7px", borderRadius: "50%", background: accent } }),
h3("span", { key: "tag", style: { fontFamily: MONO2, fontSize: "10.5px", fontWeight: 600, color: "#8a8a92" } }, isCreate ? t("cred.offerTag") : t("cred.answerTag")),
h3("button", { key: "copy", onClick: copyCred, style: { marginInlineStart: "auto", padding: "4px 9px", borderRadius: "6px", border: `1px solid ${copied ? "rgba(62,207,142,0.4)" : "rgba(255,255,255,0.1)"}`, background: copied ? "rgba(62,207,142,0.1)" : "rgba(255,255,255,0.04)", color: copied ? C_GREEN : "#b3b3ba", fontFamily: "inherit", fontSize: "11px", fontWeight: 600, cursor: "pointer", transition: "all .14s" } }, copied ? t("action.copied") : t("action.copy"))
]),
// The handshake code is sensitive — keep it blurred until the
// user deliberately reveals it, underscoring that it must be
// shared only over a channel they trust.
h3("div", { key: "codewrap", style: { position: "relative" } }, [
h3("div", { key: "code", className: "sb-sc", style: { fontFamily: MONO2, fontSize: "11px", lineHeight: 1.55, color: "#c9ccd8", wordBreak: "break-all", padding: "11px 12px", maxHeight: "72px", overflowY: "auto", filter: codeRevealed ? "none" : "blur(6px)", userSelect: codeRevealed ? "text" : "none", transition: "filter .2s" } }, credCode),
!codeRevealed && h3("button", { key: "reveal", onClick: () => setCodeRevealed(true), style: { position: "absolute", inset: 0, display: "flex", alignItems: "center", justifyContent: "center", gap: "8px", border: "none", background: "rgba(20,20,22,0.25)", color: "#cfcfd4", fontFamily: "inherit", fontSize: "12px", fontWeight: 600, cursor: "pointer" } }, [
fa("fa-eye", { key: "i", fontSize: "15px" }),
t("cred.reveal")
])
])
]);
const showQrButton = qrCodeUrl && h3("button", { key: "showqr", onClick: () => setQrModalOpen(true), style: { width: "100%", display: "flex", alignItems: "center", gap: "13px", padding: "15px 16px", borderRadius: "14px", border: `1px solid ${isCreate ? "rgba(240,137,42,0.3)" : "rgba(62,207,142,0.3)"}`, background: isCreate ? "rgba(240,137,42,0.06)" : "rgba(62,207,142,0.06)", color: "inherit", fontFamily: "inherit", cursor: "pointer", textAlign: "start", marginBottom: "14px" } }, [
h3("span", { key: "ic", style: { flex: "none", width: "42px", height: "42px", borderRadius: "12px", display: "grid", placeItems: "center", background: isCreate ? "rgba(240,137,42,0.12)" : "rgba(62,207,142,0.12)", border: `1px solid ${isCreate ? "rgba(240,137,42,0.28)" : "rgba(62,207,142,0.28)"}` } }, fa("fa-qrcode", { color: accent, fontSize: "18px" })),
h3("span", { key: "tx", style: { flex: 1 } }, [
h3("span", { key: "t", style: { display: "block", fontSize: "14.5px", fontWeight: 700, color: "#f4f4f6" } }, t("qr.showTitle")),
h3("span", { key: "s", style: { display: "block", fontSize: "12.5px", color: "#8a8a92", marginTop: "1px" } }, (qrFramesTotal || 0) > 1 ? t("qr.showSubtitleFrames", { frames: qrFramesTotal }) : t("qr.showSubtitle"))
]),
fa("fa-chevron-right", { color: "#6b6b73" })
]);
let inner;
if (showVerification) {
const verified = bothVerificationsConfirmed;
const cells = (verificationCode || "").split("").map((ch, i) => h3("div", { key: i, style: { flex: 1, maxWidth: "46px", aspectRatio: "0.82", display: "grid", placeItems: "center", borderRadius: "10px", border: "1px solid rgba(62,207,142,0.25)", background: "rgba(62,207,142,0.05)", fontFamily: MONO2, fontSize: "22px", fontWeight: 700, color: C_GREEN } }, ch));
inner = h3("div", { key: "verify", style: { animation: "sbUp .3s ease" } }, [
!verified && backButton("vback"),
h3("div", { key: "head", style: { display: "flex", alignItems: "center", gap: "11px", marginBottom: "8px" } }, [
h3("div", { key: "i", style: { width: "34px", height: "34px", flex: "none", borderRadius: "10px", display: "grid", placeItems: "center", background: "rgba(62,207,142,0.1)", border: "1px solid rgba(62,207,142,0.25)" } }, fa("fa-shield-alt", { color: C_GREEN })),
h3("h2", { key: "t", style: { margin: 0, fontSize: "21px", fontWeight: 800, letterSpacing: "-0.4px", color: "#f4f4f6" } }, t("verify.title"))
]),
h3("p", { key: "sub", style: { margin: "0 0 18px", fontSize: "13.5px", lineHeight: 1.55, color: "#8a8a92" } }, t("verify.desc")),
h3("div", { key: "cells", dir: "ltr", style: { display: "flex", gap: "6px", justifyContent: "center", marginBottom: "20px", flexWrap: "wrap" } }, cells),
verified ? h3("div", { key: "ok", style: { display: "flex", flexDirection: "column", alignItems: "center", textAlign: "center", padding: "24px 16px", borderRadius: "16px", border: "1px solid rgba(62,207,142,0.25)", background: "rgba(62,207,142,0.06)", animation: "sbUp .3s ease" } }, [
h3("div", { key: "i", style: { width: "54px", height: "54px", borderRadius: "16px", display: "grid", placeItems: "center", background: "rgba(62,207,142,0.14)", border: "1px solid rgba(62,207,142,0.35)", marginBottom: "14px" } }, fa("fa-check", { color: C_GREEN, fontSize: "24px" })),
h3("div", { key: "t", style: { fontSize: "18px", fontWeight: 800, color: "#f4f4f6" } }, t("verify.verified")),
h3("div", { key: "s", style: { fontSize: "13.5px", color: "#8a8a92", marginTop: "5px" } }, t("verify.bothConfirmed"))
]) : h3("div", { key: "form" }, [
h3("div", { key: "lbl", style: { fontSize: "12.5px", fontWeight: 600, color: "#9a9aa2", marginBottom: "8px" } }, t("verify.enterLabel")),
h3("input", { key: "in", dir: "ltr", value: sasInput, onChange: (e) => {
setSasInput(e.target.value.replace(/\D/g, "").slice(0, SAS_CODE_LENGTH));
if (sasError) setSasError("");
}, disabled: localVerificationConfirmed, autoFocus: true, autoComplete: "one-time-code", spellCheck: false, type: "text", inputMode: "numeric", pattern: "[0-9]*", maxLength: SAS_CODE_LENGTH, placeholder: verificationCode ? t("verify.placeholder") : t("verify.waiting"), style: { width: "100%", textAlign: "center", letterSpacing: "6px", borderRadius: "12px", border: `1px solid ${sasInput.length ? canConfirm || localVerificationConfirmed ? "rgba(62,207,142,0.5)" : "rgba(255,255,255,0.14)" : "rgba(255,255,255,0.08)"}`, background: "#141416", color: "#f4f4f6", fontFamily: MONO2, fontSize: "20px", fontWeight: 700, padding: "14px", outline: "none", marginBottom: sasError ? "8px" : "16px" } }),
sasError && h3("p", { key: "err", style: { color: "#e5727a", fontSize: "12.5px", margin: "0 0 16px" } }, sasError),
h3("div", { key: "status", style: { display: "flex", flexDirection: "column", gap: "8px", marginBottom: "16px" } }, [
h3("div", { key: "you", style: { display: "flex", alignItems: "center", justifyContent: "space-between", padding: "11px 14px", borderRadius: "11px", border: "1px solid rgba(255,255,255,0.06)", background: "#141416" } }, [
h3("span", { key: "l", style: { fontSize: "13px", color: "#cfcfd4", fontWeight: 600 } }, t("verify.yours")),
h3("span", { key: "v", style: { display: "inline-flex", alignItems: "center", gap: "6px", fontSize: "12.5px", fontWeight: 600, color: localVerificationConfirmed ? C_GREEN : "#7b7b83" } }, [fa(localVerificationConfirmed ? "fa-check-circle" : "fa-clock", { key: "i" }), localVerificationConfirmed ? t("verify.confirmed") : t("verify.pending")])
]),
h3("div", { key: "peer", style: { display: "flex", alignItems: "center", justifyContent: "space-between", padding: "11px 14px", borderRadius: "11px", border: "1px solid rgba(255,255,255,0.06)", background: "#141416" } }, [
h3("span", { key: "l", style: { fontSize: "13px", color: "#cfcfd4", fontWeight: 600 } }, t("verify.peer")),
h3("span", { key: "v", style: { display: "inline-flex", alignItems: "center", gap: "6px", fontSize: "12.5px", fontWeight: 600, color: remoteVerificationConfirmed ? C_GREEN : "#7b7b83" } }, [fa(remoteVerificationConfirmed ? "fa-check-circle" : "fa-clock", { key: "i" }), remoteVerificationConfirmed ? t("verify.confirmed") : t("verify.pending")])
])
]),
h3("div", { key: "btns", style: { display: "flex", gap: "10px" } }, [
h3("button", { key: "ok", onClick: handleSasConfirm, disabled: !canConfirm, style: { flex: 1, display: "flex", alignItems: "center", justifyContent: "center", gap: "8px", padding: "14px", borderRadius: "13px", border: "none", background: canConfirm ? C_GREEN : "rgba(255,255,255,0.05)", color: canConfirm ? "#08160e" : "#56565e", fontFamily: "inherit", fontSize: "14.5px", fontWeight: 700, cursor: canConfirm ? "pointer" : "not-allowed", boxShadow: canConfirm ? "0 8px 24px rgba(62,207,142,0.25)" : "none" } }, [fa(localVerificationConfirmed ? "fa-check-circle" : "fa-check", { key: "i" }), localVerificationConfirmed ? t("verify.confirmed") : t("verify.confirm")]),
h3("button", { key: "no", onClick: handleVerificationReject, style: { flex: "none", display: "flex", alignItems: "center", justifyContent: "center", gap: "7px", padding: "14px 16px", borderRadius: "13px", border: "1px solid rgba(229,114,122,0.3)", background: "transparent", color: "#e5727a", fontFamily: "inherit", fontSize: "13.5px", fontWeight: 600, cursor: "pointer" } }, [fa("fa-times", { key: "i" }), t("verify.mismatch")])
])
])
]);
} else if (isGenerating) {
const genSteps = [t("handshake.step1"), t("handshake.step2"), t("handshake.step3")];
inner = h3("div", { key: "gen", style: { animation: "sbUp .28s ease" } }, [
h3("div", { key: "head", style: { display: "flex", alignItems: "center", gap: "13px", marginBottom: "22px" } }, [
h3("div", { key: "sp", style: { width: "44px", height: "44px", flex: "none", display: "grid", placeItems: "center" } }, fa("fa-circle-notch", { color: C_ORANGE, fontSize: "32px", animation: "sbSpin 1s linear infinite" })),
h3("div", { key: "tx" }, [
h3("h2", { key: "t", style: { margin: 0, fontSize: "20px", fontWeight: 800, letterSpacing: "-0.4px", color: "#f4f4f6" } }, isCreate ? t("handshake.securingTitle") : t("handshake.answerTitle")),
h3("p", { key: "s", style: { margin: "3px 0 0", fontSize: "13px", color: "#8a8a92" } }, t("handshake.securingDesc"))
])
]),
h3(
"div",
{ key: "steps", style: { display: "flex", flexDirection: "column", borderRadius: "13px", border: "1px solid rgba(255,255,255,0.07)", background: "#141416", overflow: "hidden" } },
genSteps.map((label2, i) => {
const done = genProgress > i;
const active = genProgress === i;
return h3("div", { key: i, style: { display: "flex", alignItems: "center", gap: "12px", padding: "13px 15px", borderTop: i ? "1px solid rgba(255,255,255,0.05)" : "none", transition: "background .3s", background: done ? "rgba(62,207,142,0.04)" : "transparent" } }, [
h3(
"div",
{ key: "d", style: { flex: "none", width: "20px", height: "20px", borderRadius: "50%", display: "grid", placeItems: "center", background: done ? "rgba(62,207,142,0.12)" : active ? "rgba(240,137,42,0.12)" : "rgba(255,255,255,0.04)", border: `1px solid ${done ? "rgba(62,207,142,0.3)" : active ? "rgba(240,137,42,0.3)" : "rgba(255,255,255,0.1)"}`, transition: "all .3s" } },
done ? fa("fa-check", { color: C_GREEN, fontSize: "11px" }) : h3("span", { style: { width: "6px", height: "6px", borderRadius: "50%", background: active ? C_ORANGE : "#56565e", animation: active ? "sbBlink 1s ease-in-out infinite" : "none" } })
),
h3("span", { key: "l", style: { fontSize: "13.5px", color: done ? "#cfcfd4" : active ? "#e8e8eb" : "#6b6b73", transition: "color .3s" } }, label2)
]);
})
)
]);
} else if (isOfferCred || isAnswerCred) {
inner = h3("div", { key: "cred", style: { animation: "sbUp .3s ease" } }, [
backButton("cback"),
h3("h2", { key: "h", style: { margin: "0 0 6px", fontSize: "23px", fontWeight: 800, letterSpacing: "-0.5px", color: "#f4f4f6" } }, isCreate ? t("handshake.shareTitle") : t("handshake.sendAnswerTitle")),
h3("p", { key: "p", style: { margin: "0 0 18px", fontSize: "14px", lineHeight: 1.55, color: "#8a8a92" } }, isCreate ? t("handshake.shareDesc") : t("handshake.sendAnswerDesc")),
showQrButton,
credBlock,
isOfferCred && h3("div", { key: "offerextra", style: { marginTop: "4px" } }, [
h3("div", { key: "lbl", style: { fontSize: "12.5px", fontWeight: 600, color: "#9a9aa2", marginBottom: "8px" } }, t("handshake.thenReceive")),
h3(
"div",
{ key: "ta", style: { borderRadius: "12px", border: `1px solid ${hasAnswer ? "rgba(255,255,255,0.18)" : "rgba(255,255,255,0.07)"}`, background: "#141416", padding: "11px 14px", marginBottom: "10px" } },
h3("textarea", { dir: "ltr", value: answerInput, onChange: (e) => {
setAnswerInput(e.target.value);
if (e.target.value.trim().length > 0 && typeof markAnswerCreated === "function") markAnswerCreated();
}, rows: 2, placeholder: t("handshake.pasteAnswerPlaceholder"), style: { width: "100%", resize: "none", border: "none", outline: "none", background: "transparent", color: "#d7d7db", fontFamily: MONO2, fontSize: "12px", lineHeight: 1.55, minHeight: "44px" } })
),
h3("div", { key: "btns", style: { display: "flex", gap: "10px" } }, [
h3("button", { key: "scan", className: "sb-scan-btn", onClick: () => setShowQRScannerModal(true), style: { flex: "none", display: "inline-flex", alignItems: "center", justifyContent: "center", gap: "8px", padding: "14px 16px", borderRadius: "13px", border: "1px solid rgba(255,255,255,0.1)", background: "rgba(255,255,255,0.04)", color: "#cfcfd4", fontFamily: "inherit", fontSize: "14px", fontWeight: 700, cursor: "pointer" } }, [fa("fa-camera", { key: "i" }), t("action.scan")]),
h3("button", { key: "est", onClick: onConnect, disabled: !hasAnswer, style: { flex: 1, display: "flex", alignItems: "center", justifyContent: "center", gap: "9px", padding: "14px", borderRadius: "13px", border: "none", background: hasAnswer ? C_ORANGE : "rgba(255,255,255,0.05)", color: hasAnswer ? "#1a0f04" : "#56565e", fontFamily: "inherit", fontSize: "14.5px", fontWeight: 700, cursor: hasAnswer ? "pointer" : "not-allowed", boxShadow: hasAnswer ? "0 8px 24px rgba(240,137,42,0.28)" : "none" } }, t("handshake.establish"))
])
]),
isAnswerCred && h3("div", { key: "answerextra", style: { marginTop: "4px", display: "flex", alignItems: "center", gap: "10px", padding: "12px 14px", borderRadius: "12px", border: "1px solid rgba(62,207,142,0.18)", background: "rgba(62,207,142,0.05)" } }, [
fa("fa-circle-notch", { key: "i", color: C_GREEN, animation: "sbSpin 1.4s linear infinite" }),
h3("span", { key: "t", style: { fontSize: "13px", color: "#cfcfd4", fontWeight: 500 } }, t("handshake.answerSentNote"))
])
]);
} else if (isCreate) {
inner = h3("div", { key: "introC", style: { animation: "sbUp .28s ease" } }, [
h3("h2", { key: "h", style: { margin: "0 0 6px", fontSize: "23px", fontWeight: 800, letterSpacing: "-0.5px", color: "#f4f4f6" } }, t("intro.createTitle")),
h3("p", { key: "p", style: { margin: "0 0 22px", fontSize: "14px", lineHeight: 1.55, color: "#8a8a92" } }, t("intro.createDesc")),
h3("button", { key: "gen", className: "sb-gen-btn", onClick: () => {
requestNotificationPermissionOnInteraction();
if (webrtcManagerRef.current) handleCreateOffer();
}, style: { width: "100%", display: "flex", alignItems: "center", justifyContent: "center", gap: "9px", padding: "15px", borderRadius: "13px", border: "none", background: C_ORANGE, color: "#1a0f04", fontFamily: "inherit", fontSize: "15px", fontWeight: 700, cursor: "pointer", boxShadow: "0 8px 24px rgba(240,137,42,0.28)" } }, [fa("fa-bolt", { key: "i" }), t("intro.createCta")])
]);
} else {
inner = h3("div", { key: "introJ", style: { animation: "sbUp .28s ease" } }, [
h3("h2", { key: "h", style: { margin: "0 0 6px", fontSize: "23px", fontWeight: 800, letterSpacing: "-0.5px", color: "#f4f4f6" } }, t("intro.joinTitle")),
h3("p", { key: "p", style: { margin: "0 0 16px", fontSize: "14px", lineHeight: 1.55, color: "#8a8a92" } }, "Scan your peer's QR with your camera, or paste their invitation code."),
h3("button", { key: "scan", className: "sb-scan-btn", onClick: () => {
requestNotificationPermissionOnInteraction();
setShowQRScannerModal(true);
}, style: { width: "100%", display: "flex", alignItems: "center", gap: "13px", padding: "15px 16px", borderRadius: "14px", border: "1px solid rgba(62,207,142,0.3)", background: "rgba(62,207,142,0.06)", color: "inherit", fontFamily: "inherit", cursor: "pointer", textAlign: "start", marginBottom: "14px" } }, [
h3("span", { key: "ic", style: { flex: "none", width: "42px", height: "42px", borderRadius: "12px", display: "grid", placeItems: "center", background: "rgba(62,207,142,0.12)", border: "1px solid rgba(62,207,142,0.28)" } }, fa("fa-camera", { color: C_GREEN, fontSize: "18px" })),
h3("span", { key: "tx", style: { flex: 1 } }, [
h3("span", { key: "t", style: { display: "block", fontSize: "14.5px", fontWeight: 700, color: "#f4f4f6" } }, t("intro.scanTitle")),
h3("span", { key: "s", style: { display: "block", fontSize: "12.5px", color: "#8a8a92", marginTop: "1px" } }, t("intro.scanSubtitle"))
]),
fa("fa-chevron-right", { color: "#6b6b73" })
]),
h3("div", { key: "or", style: { display: "flex", alignItems: "center", gap: "12px", marginBottom: "14px" } }, [
h3("span", { key: "a", style: { flex: 1, height: "1px", background: "rgba(255,255,255,0.07)" } }),
h3("span", { key: "m", style: { fontSize: "11px", fontWeight: 600, color: "#56565e", textTransform: "uppercase", letterSpacing: "0.7px" } }, t("intro.orPasteCode")),
h3("span", { key: "b", style: { flex: 1, height: "1px", background: "rgba(255,255,255,0.07)" } })
]),
h3(
"div",
{ key: "ta", style: { borderRadius: "13px", border: `1px solid ${hasInvite ? "rgba(255,255,255,0.18)" : "rgba(255,255,255,0.07)"}`, background: "#141416", padding: "13px 15px", marginBottom: "12px" } },
h3("textarea", { dir: "ltr", value: offerInput, onChange: (e) => {
setOfferInput(e.target.value);
if (e.target.value.trim().length > 0 && typeof markAnswerCreated === "function") markAnswerCreated();
}, rows: 3, placeholder: t("intro.pastePlaceholder"), style: { width: "100%", resize: "none", border: "none", outline: "none", background: "transparent", color: "#d7d7db", fontFamily: MONO2, fontSize: "12.5px", lineHeight: 1.6, minHeight: "66px" } })
),
h3("button", { key: "connect", onClick: () => {
requestNotificationPermissionOnInteraction();
onCreateAnswer();
}, disabled: !hasInvite || connectionStatus === "connecting", style: { width: "100%", display: "inline-flex", alignItems: "center", justifyContent: "center", gap: "9px", padding: "14px", borderRadius: "13px", border: "none", background: hasInvite && connectionStatus !== "connecting" ? C_ORANGE : "rgba(255,255,255,0.05)", color: hasInvite && connectionStatus !== "connecting" ? "#1a0f04" : "#56565e", fontFamily: "inherit", fontSize: "15px", fontWeight: 700, cursor: hasInvite && connectionStatus !== "connecting" ? "pointer" : "not-allowed", boxShadow: hasInvite && connectionStatus !== "connecting" ? "0 8px 24px rgba(240,137,42,0.28)" : "none" } }, connectionStatus === "connecting" ? t("intro.connecting") : t("intro.connect"))
]);
}
const SB_DESKTOP_VERSION = "1.0.0";
const SB_DESKTOP_RELEASE = `https://github.com/SecureBitChat/securebit-desktop/releases/download/v${SB_DESKTOP_VERSION}`;
const DOWNLOADS = {
mac: { name: "macOS", format: ".dmg \xB7 Apple Silicon & Intel", icon: "fab fa-apple", url: `${SB_DESKTOP_RELEASE}/SecureBit.Chat_${SB_DESKTOP_VERSION}_x64.dmg` },
win: { name: "Windows", format: ".exe \xB7 64-bit installer", icon: "fab fa-windows", url: `${SB_DESKTOP_RELEASE}/SecureBit.Chat_${SB_DESKTOP_VERSION}_x64-setup.exe` },
linux: { name: "Linux", format: ".AppImage", icon: "fab fa-linux", url: `${SB_DESKTOP_RELEASE}/SecureBit.Chat_${SB_DESKTOP_VERSION}_amd64.AppImage` }
};
const detectOS = () => {
const ua = (navigator.userAgent || "") + " " + (navigator.platform || "");
if (/Mac|iPhone|iPad|iPod/i.test(ua) && !/Android/i.test(ua)) return "mac";
if (/Win/i.test(ua)) return "win";
if (/Linux/i.test(ua) && !/Android/i.test(ua)) return "linux";
return "win";
};
const detectedOS = detectOS();
const otherOS = ["mac", "win", "linux"].filter((k) => k !== detectedOS);
const dlLink = (url) => {
try {
window.open(url, "_blank", "noopener");
} catch (e) {
}
};
const platformsMenu = platformsOpen && h3("div", { key: "platmenu", className: "sb-platforms-menu", style: { position: "absolute", insetInlineStart: 0, bottom: "calc(100% + 10px)", width: "344px", maxWidth: "100%", borderRadius: "16px", border: "1px solid rgba(255,255,255,0.1)", background: "#161618", boxShadow: "0 24px 60px rgba(0,0,0,0.55)", overflow: "hidden", zIndex: 25, animation: "sbUp .2s ease" } }, [
h3("div", { key: "mh", style: { display: "flex", alignItems: "center", gap: "10px", padding: "14px 16px", borderBottom: "1px solid rgba(255,255,255,0.06)" } }, [
h3("div", { key: "t", style: { flex: 1, lineHeight: 1.2 } }, [
h3("div", { key: "a", style: { fontSize: "14px", fontWeight: 800, color: "#f4f4f6" } }, t("dl.title")),
h3("div", { key: "b", style: { fontSize: "11.5px", color: "#7b7b83" } }, t("dl.free"))
]),
h3("span", { key: "pill", style: { fontFamily: MONO2, fontSize: "10px", fontWeight: 600, color: C_GREEN, padding: "3px 8px", borderRadius: "6px", background: "rgba(62,207,142,0.1)", border: "1px solid rgba(62,207,142,0.22)" } }, t("chat.onWeb"))
]),
h3(
"div",
{ key: "rec", style: { padding: "12px 12px 6px" } },
h3("button", { key: "b", onClick: () => dlLink(DOWNLOADS[detectedOS].url), style: { width: "100%", display: "flex", alignItems: "center", gap: "12px", padding: "13px 14px", borderRadius: "12px", border: "1px solid rgba(240,137,42,0.4)", background: "rgba(240,137,42,0.08)", color: "inherit", fontFamily: "inherit", cursor: "pointer", textAlign: "start" } }, [
h3("span", { key: "ic", style: { flex: "none", display: "grid", placeItems: "center", width: "38px", height: "38px", borderRadius: "11px", background: "rgba(240,137,42,0.14)", border: "1px solid rgba(240,137,42,0.3)", color: C_ORANGE } }, h3("i", { className: DOWNLOADS[detectedOS].icon, style: { fontSize: "17px" } })),
h3("span", { key: "tx", style: { flex: 1, minWidth: 0 } }, [
h3("span", { key: "n", style: { display: "block", fontSize: "13.5px", fontWeight: 700, color: "#f4f4f6" } }, DOWNLOADS[detectedOS].name),
h3("span", { key: "f", style: { display: "block", fontSize: "11px", color: "#f0b072", marginTop: "1px" } }, `Recommended for this device \xB7 ${DOWNLOADS[detectedOS].format}`)
]),
fa("fa-download", { color: C_ORANGE })
])
),
h3(
"div",
{ key: "others", style: { padding: "0 12px 8px", display: "flex", flexDirection: "column", gap: "2px" } },
otherOS.map((k) => h3("button", { key: k, onClick: () => dlLink(DOWNLOADS[k].url), style: { width: "100%", display: "flex", alignItems: "center", gap: "12px", padding: "11px 14px", borderRadius: "11px", border: "none", background: "transparent", color: "inherit", fontFamily: "inherit", cursor: "pointer", textAlign: "start" } }, [
h3("span", { key: "ic", style: { flex: "none", display: "grid", placeItems: "center", width: "34px", height: "34px", borderRadius: "10px", background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.08)", color: "#cfcfd4" } }, h3("i", { className: DOWNLOADS[k].icon, style: { fontSize: "15px" } })),
h3("span", { key: "tx", style: { flex: 1, minWidth: 0 } }, [
h3("span", { key: "n", style: { display: "block", fontSize: "13px", fontWeight: 600, color: "#e8e8eb" } }, DOWNLOADS[k].name),
h3("span", { key: "f", style: { display: "block", fontSize: "11px", color: "#7b7b83", marginTop: "1px" } }, DOWNLOADS[k].format)
]),
fa("fa-download", { color: "#8a8a92" })
]))
),
h3("div", { key: "soon", style: { display: "flex", alignItems: "center", gap: "9px", padding: "12px 16px", borderTop: "1px solid rgba(255,255,255,0.06)", background: "rgba(255,255,255,0.015)" } }, [
fa("fa-clock", { key: "i", color: "#6b6b73" }),
h3("span", { key: "t", style: { fontSize: "11.5px", lineHeight: 1.45, color: "#7b7b83" } }, t("dl.soon"))
])
]);
const footer = h3("div", { key: "footer", className: "sb-conn-footer", style: { position: "relative", marginTop: "30px", paddingTop: "18px", borderTop: "1px solid rgba(255,255,255,0.06)", display: "flex", alignItems: "center", justifyContent: "space-between", gap: "12px", flexWrap: "wrap" } }, [
h3("button", { key: "dl", onClick: () => setPlatformsOpen((v) => !v), style: { display: "inline-flex", alignItems: "center", gap: "9px", paddingBlock: "8px", paddingInlineStart: "9px", paddingInlineEnd: "13px", borderRadius: "10px", border: `1px solid ${platformsOpen ? "rgba(240,137,42,0.4)" : "rgba(255,255,255,0.08)"}`, background: platformsOpen ? "rgba(240,137,42,0.06)" : "rgba(255,255,255,0.02)", color: "inherit", fontFamily: "inherit", cursor: "pointer", transition: "all .15s" } }, [
fa("fa-download", { key: "i", color: C_ORANGE }),
h3("span", { key: "t", style: { fontSize: "12.5px", fontWeight: 700, color: "#e8e8eb" } }, t("action.downloadDesktop")),
fa("fa-chevron-down", { key: "c", color: "#6b6b73", style: { fontSize: "11px", transform: platformsOpen ? "rotate(180deg)" : "rotate(0deg)", transition: "transform .2s" } })
]),
h3("button", { key: "settings", className: "sb-link", onClick: () => setShowIceSettings && setShowIceSettings(true), style: { display: "inline-flex", alignItems: "center", gap: "7px", background: "none", border: "none", color: "#8a8a92", fontFamily: "inherit", fontSize: "12.5px", fontWeight: 600, cursor: "pointer" } }, [fa("fa-sliders-h", { key: "i" }), t("action.advancedSettings")]),
platformsMenu
]);
const settingsOverlay = showIceSettings && typeof window !== "undefined" && window.IceServerSettings ? h3(window.IceServerSettings, {
key: "ice-settings",
isOpen: true,
embedded: true,
onClose: () => setShowIceSettings(false),
initial: {
useCustom: Array.isArray(customIceServers) && customIceServers.length > 0,
serversText: iceServersText,
privacyMode: relayOnlyMode ? "relay-only" : "standard",
persisted: iceSettingsPersisted
},
hasSaved: iceSettingsPersisted,
onApply: handleApplyIceSettings,
onForget: handleForgetIceSettings
}) : null;
const rightPanel = h3("div", { key: "right", style: compact ? { flex: 1, minWidth: 0, width: "100%", position: "relative", overflow: "hidden", display: "flex", flexDirection: "column", height: "100%" } : { flex: "0.95 1 460px", minWidth: "min(100%, 320px)", position: "relative", overflow: "hidden", display: "flex", flexDirection: "column", height: "100vh" } }, [
h3(
"div",
{ key: "scroll", className: "custom-scrollbar", style: { flex: 1, overflowY: "auto", display: "flex", flexDirection: "column", padding: "42px 44px" } },
h3("div", { style: { maxWidth: "430px", width: "100%", margin: "auto" } }, [
h3("div", { key: "kicker", style: { fontFamily: MONO2, fontSize: "11px", fontWeight: 600, color: "#6b6b73", textTransform: "uppercase", letterSpacing: "1px", marginBottom: "10px" } }, kicker),
segToggle,
inner,
footer
])
),
settingsOverlay
]);
const qrModal = qrModalOpen && qrCodeUrl && h3(
"div",
{ key: "qrmodal", onClick: () => setQrModalOpen(false), style: { position: "fixed", inset: 0, zIndex: 50, display: "flex", alignItems: "center", justifyContent: "center", padding: "32px", background: "rgba(6,6,8,0.82)", backdropFilter: "blur(10px)", animation: "sbUp .2s ease" } },
h3("div", { onClick: (e) => e.stopPropagation(), style: { width: "100%", maxWidth: "460px", borderRadius: "22px", border: "1px solid rgba(255,255,255,0.1)", background: "#111113", boxShadow: "0 30px 90px rgba(0,0,0,0.6)", overflow: "hidden" } }, [
h3("div", { key: "head", style: { display: "flex", alignItems: "center", gap: "11px", padding: "18px 20px", borderBottom: "1px solid rgba(255,255,255,0.06)" } }, [
h3("span", { key: "d", style: { width: "9px", height: "9px", borderRadius: "50%", background: accent } }),
h3("div", { key: "tx", style: { flex: 1, lineHeight: 1.2 } }, [
h3("div", { key: "t", style: { fontSize: "15.5px", fontWeight: 800, color: "#f4f4f6" } }, isCreate ? t("handshake.shareTitle") : t("handshake.sendAnswerTitle")),
h3("div", { key: "s", style: { fontSize: "12px", color: "#7b7b83" } }, `${isCreate ? "offer" : "answer"} \xB7 one-time`)
]),
h3("button", { key: "x", onClick: () => setQrModalOpen(false), style: { width: "32px", height: "32px", display: "grid", placeItems: "center", borderRadius: "9px", border: "none", background: "rgba(255,255,255,0.05)", color: "#9a9aa2", cursor: "pointer" } }, fa("fa-times"))
]),
h3("div", { key: "body", style: { padding: "22px 24px 24px" } }, [
h3(
"div",
{ key: "qr", style: { position: "relative", width: "100%", aspectRatio: "1", borderRadius: "18px", overflow: "hidden", background: "#fff", padding: "18px", display: "grid", placeItems: "center" } },
h3("img", { src: qrCodeUrl, alt: t("chatHdr.qrCode"), style: { width: "100%", height: "100%", objectFit: "contain", display: "block" } })
),
h3("div", { key: "ctrls", style: { display: "flex", flexDirection: "column", alignItems: "center", gap: "12px", marginTop: "18px" } }, [
(qrFramesTotal || 0) >= 1 && h3("div", { key: "frame", style: { display: "flex", alignItems: "center", gap: "9px" } }, [
h3("span", { key: "l", style: { fontFamily: MONO2, fontSize: "12px", fontWeight: 600, color: "#9a9aa2" } }, `Frame ${Math.max(1, qrFrameIndex || 1)} / ${qrFramesTotal || 1}`),
h3("div", { key: "dots", style: { display: "flex", gap: "5px" } }, Array.from({ length: qrFramesTotal || 1 }, (_, i) => h3("span", { key: i, style: { width: "7px", height: "7px", borderRadius: "50%", background: i + 1 === (qrFrameIndex || 1) ? accent : "rgba(255,255,255,0.14)", transition: "background .25s" } })))
]),
(qrFramesTotal || 0) > 1 && h3("div", { key: "nav", style: { display: "flex", alignItems: "center", gap: "6px" } }, [
h3("button", { key: "prev", onClick: prevQrFrame, style: { width: "40px", height: "36px", display: "grid", placeItems: "center", borderRadius: "10px", border: "1px solid rgba(255,255,255,0.1)", background: "rgba(255,255,255,0.04)", color: "#cfcfd4", cursor: "pointer" } }, fa("fa-chevron-left")),
h3("button", { key: "auto", onClick: toggleQrManualMode, style: { display: "inline-flex", alignItems: "center", gap: "7px", padding: "9px 18px", borderRadius: "10px", border: `1px solid ${qrManualMode ? "rgba(255,255,255,0.1)" : "rgba(240,137,42,0.45)"}`, background: qrManualMode ? "rgba(255,255,255,0.04)" : "rgba(240,137,42,0.08)", color: qrManualMode ? "#9a9aa2" : C_ORANGE, fontFamily: "inherit", fontSize: "13px", fontWeight: 600, cursor: "pointer" } }, qrManualMode ? "Manual" : "Auto"),
h3("button", { key: "next", onClick: nextQrFrame, style: { width: "40px", height: "36px", display: "grid", placeItems: "center", borderRadius: "10px", border: "1px solid rgba(255,255,255,0.1)", background: "rgba(255,255,255,0.04)", color: "#cfcfd4", cursor: "pointer" } }, fa("fa-chevron-right"))
]),
h3("p", { key: "hint", style: { margin: "2px 0 0", textAlign: "center", fontSize: "12px", lineHeight: 1.5, color: "#6b6b73" } }, (qrFramesTotal || 0) > 1 ? t("handshake.qrHintFrames", { frames: qrFramesTotal }) : t("handshake.qrHint"))
])
])
])
);
const hero = h3("div", { key: "hero", style: { display: "flex", flexWrap: "wrap", minHeight: "100vh", width: "100%", background: "#0f0f11", color: "#e8e8eb" } }, [leftPanel, rightPanel]);
const uniqueSection = atIntro && h3(UniqueFeatureSlider, { key: "unique-features-slider" });
const partnersSection = atIntro && h3(BecomePartner, { key: "become-partner" });
const roadmapSection = atIntro && h3(Roadmap, { key: "roadmap" });
const communitySection = atIntro && h3(CommunityCTA, { key: "community-cta" });
const keyframeStyle = h3("style", { key: "kf", dangerouslySetInnerHTML: {
__html: '@keyframes sbFlowR{0%{left:4%;opacity:0}12%{opacity:1}88%{opacity:1}100%{left:96%;opacity:0}}@keyframes sbFlowL{0%{left:96%;opacity:0}12%{opacity:1}88%{opacity:1}100%{left:4%;opacity:0}}@keyframes sbPulse{0%,100%{transform:translate(-50%,-50%) scale(1);opacity:.5}50%{transform:translate(-50%,-50%) scale(1.5);opacity:0}}@keyframes sbSpin{to{transform:rotate(360deg)}}@keyframes sbUp{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes sbNode{0%,100%{box-shadow:0 0 0 0 rgba(62,207,142,0)}50%{box-shadow:0 0 0 6px rgba(62,207,142,.06)}}@keyframes sbScan{0%{top:8%}100%{top:88%}}@keyframes sbBlink{0%,100%{opacity:1}50%{opacity:.35}}@keyframes sbTrav{0%{offset-distance:0%;opacity:0}15%{opacity:1}80%{opacity:1}100%{offset-distance:100%;opacity:0}}@keyframes sbRing1{0%,24%{r:5;opacity:0}26%{opacity:.8}34%{r:22;opacity:0}100%{r:22;opacity:0}}@keyframes sbRing2{0%,54%{r:5;opacity:0}56%{opacity:.8}64%{r:22;opacity:0}100%{r:22;opacity:0}}@keyframes sbIn1{0%,24%{opacity:0}27%{opacity:1}100%{opacity:1}}@keyframes sbIn2{0%,54%{opacity:0}57%{opacity:1}100%{opacity:1}}@keyframes sbRow0{0%,4%{opacity:0;transform:translateY(4px)}8%{opacity:1;transform:none}100%{opacity:1;transform:none}}@keyframes sbRow1{0%,25%{opacity:0;transform:translateY(4px)}29%{opacity:1;transform:none}100%{opacity:1;transform:none}}@keyframes sbRow2{0%,55%{opacity:0;transform:translateY(4px)}59%{opacity:1;transform:none}100%{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){.sb-start [style*="sbTrav"],.sb-start [style*="sbRing"]{animation:none!important;opacity:0!important}.sb-start [style*="sbIn1"],.sb-start [style*="sbIn2"],.sb-start [style*="sbRow0"],.sb-start [style*="sbRow1"],.sb-start [style*="sbRow2"]{animation:none!important;opacity:1!important;transform:none!important}}'
} });
if (compact) {
return h3("div", { className: "sb-start", style: { flex: 1, minHeight: 0, width: "100%", display: "flex", flexDirection: "column", background: "#0f0f11", color: "#e8e8eb" } }, [keyframeStyle, rightPanel, qrModal]);
}
return h3("div", { className: "sb-start", style: { width: "100%" } }, [keyframeStyle, hero, uniqueSection, partnersSection, roadmapSection, communitySection, qrModal]);
};
var createScrollToBottomFunction = (chatMessagesRef) => {
return () => {
if (chatMessagesRef && chatMessagesRef.current) {
const scrollAttempt = () => {
if (chatMessagesRef.current) {
chatMessagesRef.current.scrollTo({
top: chatMessagesRef.current.scrollHeight,
behavior: scrollBehavior()
});
}
};
scrollAttempt();
setTimeout(scrollAttempt, 50);
setTimeout(scrollAttempt, 150);
setTimeout(scrollAttempt, 300);
requestAnimationFrame(() => {
setTimeout(scrollAttempt, 100);
});
}
};
};
var runSecurityReport = async (webrtcManager) => {
let securityData = null;
try {
if (webrtcManager && window.EnhancedSecureCryptoUtils) {
securityData = await window.EnhancedSecureCryptoUtils.calculateSecurityLevel(webrtcManager);
}
} catch (e) {
}
if (!securityData) {
alert("Security verification in progress\u2026\nPlease wait for real-time cryptographic verification to complete.");
return;
}
const MONO2 = "'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace";
const esc = (s) => String(s).replace(/[&<>"]/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" })[c]);
const accent = securityData.color === "orange" ? "#f0892a" : securityData.color === "yellow" ? "#e3c84e" : securityData.color === "red" ? "#e5727a" : "#3ecf8e";
const accentRGB = securityData.color === "orange" ? "240,137,42" : securityData.color === "yellow" ? "227,200,78" : securityData.color === "red" ? "229,114,122" : "62,207,142";
const score = Math.max(0, Math.min(100, Math.round(securityData.score || 0)));
const circ = 2 * Math.PI * 56;
const dashArray = `${(circ * Math.min(1, score / 100)).toFixed(1)} ${circ.toFixed(1)}`;
const level = String(securityData.level || "SECURE").toUpperCase();
const isReal = securityData.isRealData !== false;
const entries = securityData.verificationResults ? Object.entries(securityData.verificationResults) : [];
const passedCount = Number.isFinite(securityData.passedChecks) ? securityData.passedChecks : entries.filter(([, r]) => r && r.passed).length;
const totalCount = Number.isFinite(securityData.totalChecks) ? securityData.totalChecks : entries.length;
const verifiedAt = new Date(securityData.timestamp || Date.now()).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", second: "2-digit", hour12: false });
const testTitle = (k) => {
const named = t(`secTest.${k}`);
return named === `secTest.${k}` ? pretty(k) : named;
};
const pretty = (k) => {
let s = String(k).replace(/^verify/i, "").replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2").trim();
s = s.replace(/\b(ecdh|ecdsa|aes|gcm|hmac|pfs|sas|mitm|asn|dtls|hkdf|spki|oid|p384)\b/gi, (m) => m.toUpperCase());
return s.charAt(0).toUpperCase() + s.slice(1);
};
const checkIcon = `<svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="#3ecf8e" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 13l4 4 10-11"/></svg>`;
const xIcon = `<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#e5727a" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6L6 18M6 6l12 12"/></svg>`;
const testsHTML = entries.map(([k, r], i) => {
const passed = !!(r && r.passed);
const raw = r && r.details || (passed ? t("sec.testPassed") : t("sec.testFailed"));
const looked = t(`secDetail.${raw}`);
const desc = looked === `secDetail.${raw}` ? raw : looked;
const bg = passed ? "#161618" : "#121214";
const border = passed ? "rgba(62,207,142,0.16)" : "rgba(229,114,122,0.18)";
const iconBg = passed ? "rgba(62,207,142,0.12)" : "rgba(229,114,122,0.1)";
const iconBorder = passed ? "rgba(62,207,142,0.26)" : "rgba(229,114,122,0.24)";
const titleColor = passed ? "#f4f4f6" : "#cfcfd4";
return `<div style="display:flex; align-items:flex-start; gap:13px; padding:16px 18px; border-radius:14px; background:${bg}; border:1px solid ${border}; animation:svIn .3s cubic-bezier(.2,.7,.3,1) both; animation-delay:${(i * 0.04).toFixed(2)}s;">
<span style="flex:none; width:34px; height:34px; border-radius:9px; display:grid; place-items:center; background:${iconBg}; border:1px solid ${iconBorder};">${passed ? checkIcon : xIcon}</span>
<div style="flex:1; min-width:0;">
<div style="font-size:14.5px; font-weight:700; letter-spacing:-0.2px; color:${titleColor}; margin-bottom:3px;">${esc(testTitle(k))}</div>
<div style="font-family:${MONO2}; font-size:11.5px; line-height:1.45; color:#8a8a92;">${esc(desc)}</div>
</div>
</div>`;
}).join("");
const modal = document.createElement("div");
modal.id = "sb-security-report";
modal.style.cssText = "position:fixed; inset:0; z-index:10000; display:flex; align-items:center; justify-content:center; padding:24px; background:rgba(8,8,10,0.62); backdrop-filter:blur(4px); -webkit-backdrop-filter:blur(4px); font-family:'Manrope',system-ui,-apple-system,sans-serif; overflow:auto;";
modal.innerHTML = `
<style>@keyframes svIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes svPulse{0%,100%{opacity:1}50%{opacity:.4}}</style>
<div style="position:relative; max-width:960px; width:100%; border-radius:20px; background:radial-gradient(1100px 640px at 50% -6%, rgba(${accentRGB},0.05), transparent 62%), #0f0f11; border:1px solid rgba(255,255,255,0.08); color:#e8e8eb; padding:30px; box-shadow:0 30px 70px rgba(0,0,0,0.55); animation:svIn .3s cubic-bezier(.2,.7,.3,1); max-height:calc(100vh - 48px); overflow:auto;">
<button class="sv-close" type="button" title="${t("chat.close")}" style="position:absolute; top:16px; inset-inline-end:16px; width:32px; height:32px; border-radius:9px; display:grid; place-items:center; border:1px solid rgba(255,255,255,0.08); background:rgba(255,255,255,0.02); color:#8a8a92; cursor:pointer; z-index:2;">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round" style="pointer-events:none;"><path d="M6 6l12 12M18 6L6 18"/></svg>
</button>
<div style="position:relative; overflow:hidden; border-radius:18px; background:#141416; border:1px solid rgba(255,255,255,0.07); padding:28px 30px; display:flex; align-items:center; gap:30px; flex-wrap:wrap; margin-bottom:20px;">
<div style="position:absolute; top:0; left:0; right:0; height:1px; background:linear-gradient(90deg, transparent, rgba(${accentRGB},0.6), transparent);"></div>
<div style="position:relative; flex:none; width:128px; height:128px;">
<svg width="128" height="128" viewBox="0 0 128 128" style="transform:rotate(-90deg);">
<circle cx="64" cy="64" r="56" fill="none" stroke="rgba(255,255,255,0.06)" stroke-width="9"/>
<circle cx="64" cy="64" r="56" fill="none" stroke="${accent}" stroke-width="9" stroke-linecap="round" stroke-dasharray="${dashArray}"/>
</svg>
<div style="position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center;">
<span style="font-size:30px; font-weight:800; letter-spacing:-1px; color:#f4f4f6; line-height:1;">${score}</span>
<span style="font-family:${MONO2}; font-size:10px; font-weight:600; color:#6b6b73; text-transform:uppercase; letter-spacing:1px; margin-top:4px;">/ 100 pts</span>
</div>
</div>
<div style="flex:1; min-width:240px;">
<div style="font-family:${MONO2}; font-size:11px; font-weight:600; color:#6b6b73; text-transform:uppercase; letter-spacing:1.6px; margin-bottom:10px;">${t("report.title")}</div>
<div style="display:flex; align-items:center; gap:12px; margin-bottom:14px; flex-wrap:wrap;">
<h2 style="margin:0; font-size:26px; font-weight:800; letter-spacing:-0.7px; color:#f4f4f6;">Security level: ${esc(level)}</h2>
<span style="display:inline-flex; align-items:center; gap:8px; padding:6px 12px; border-radius:9px; background:rgba(${accentRGB},0.12); border:1px solid rgba(${accentRGB},0.3); font-family:${MONO2}; font-size:11px; font-weight:700; color:${accent}; text-transform:uppercase; letter-spacing:0.6px;"><span style="width:7px; height:7px; border-radius:50%; background:${accent}; animation:svPulse 2s ease-in-out infinite;"></span>${t("report.active")}</span>
</div>
<div style="display:flex; gap:28px; flex-wrap:wrap;">
<div><div style="font-family:${MONO2}; font-size:10px; font-weight:600; color:#56565e; text-transform:uppercase; letter-spacing:1px; margin-bottom:4px;">${t("report.testsPassed")}</div><div style="font-size:15px; font-weight:700; color:#e8e8eb;"><span style="color:${accent};">${passedCount}</span> / ${totalCount}</div></div>
<div><div style="font-family:${MONO2}; font-size:10px; font-weight:600; color:#56565e; text-transform:uppercase; letter-spacing:1px; margin-bottom:4px;">${t("report.verifiedAt")}</div><div style="font-family:${MONO2}; font-size:15px; font-weight:600; color:#e8e8eb;">${esc(verifiedAt)}</div></div>
<div><div style="font-family:${MONO2}; font-size:10px; font-weight:600; color:#56565e; text-transform:uppercase; letter-spacing:1px; margin-bottom:4px;">${t("report.source")}</div><div style="font-size:15px; font-weight:600; color:#e8e8eb;">${isReal ? t("sec.realTests") : t("sec.simulatedData")}</div></div>
</div>
</div>
<button class="sv-rerun" type="button" style="flex:none; display:inline-flex; align-items:center; gap:9px; padding:12px 18px; border-radius:11px; border:1px solid rgba(255,255,255,0.1); background:rgba(255,255,255,0.025); color:#cfcfd4; font-family:'Manrope',sans-serif; font-size:14px; font-weight:700; cursor:pointer; transition:all .2s;">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="pointer-events:none;"><path d="M21 12a9 9 0 1 1-3-6.7L21 8"/><path d="M21 3v5h-5"/></svg>
Re-run
</button>
</div>
<div style="display:grid; grid-template-columns:repeat(auto-fit, minmax(248px, 1fr)); gap:12px;">${testsHTML}</div>
<div style="display:flex; align-items:center; gap:12px; margin-top:18px; padding:16px 20px; border-radius:14px; background:rgba(${accentRGB},0.06); border:1px solid rgba(${accentRGB},0.18);">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="${accent}" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" style="flex:none;"><path d="M12 3l8 4v5c0 4.5-3.2 7.8-8 9-4.8-1.2-8-4.5-8-9V7l8-4z"/><path d="M9.2 12.2l2 2 3.6-3.8"/></svg>
<span style="font-size:14px; font-weight:600; color:#e8e8eb;">${isReal ? t("sec.realTimeNote") : t("sec.simulatedWarning")}</span>
</div>
</div>`;
const onKey = (e) => {
if (e.key === "Escape") close();
};
const close = () => {
if (modal.parentNode) modal.remove();
document.removeEventListener("keydown", onKey);
};
modal.querySelector(".sv-close").addEventListener("click", close);
modal.addEventListener("click", (e) => {
if (e.target === modal) close();
});
document.addEventListener("keydown", onKey);
const rerun = modal.querySelector(".sv-rerun");
rerun.addEventListener("mouseenter", () => {
rerun.style.borderColor = "rgba(240,137,42,0.45)";
rerun.style.color = "#f0892a";
});
rerun.addEventListener("mouseleave", () => {
rerun.style.borderColor = "rgba(255,255,255,0.1)";
rerun.style.color = "#cfcfd4";
});
rerun.addEventListener("click", () => {
close();
runSecurityReport(webrtcManager);
});
document.body.appendChild(modal);
};
var SecureBitChatHeader = ({ status, onDisconnect, webrtcManager, title, isOffline, peerPresence, onRenameTitle }) => {
const MONO2 = "'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace";
const [showNetwork, setShowNetwork] = React.useState(false);
const [sec, setSec] = React.useState(null);
const [editingName, setEditingName] = React.useState(false);
const [nameDraft, setNameDraft] = React.useState("");
React.useEffect(() => {
let alive = true;
const fetchSec = async () => {
try {
if (!webrtcManager) return;
let data = null;
if (typeof webrtcManager.getRealSecurityLevel === "function") data = await webrtcManager.getRealSecurityLevel();
else if (typeof webrtcManager.calculateAndReportSecurityLevel === "function") data = await webrtcManager.calculateAndReportSecurityLevel();
else if (window.EnhancedSecureCryptoUtils) data = await window.EnhancedSecureCryptoUtils.calculateSecurityLevel(webrtcManager);
if (alive && data && data.isRealData !== false) setSec(data);
} catch (e) {
}
};
fetchSec();
const onCalc = (e) => {
if (alive && e.detail && e.detail.securityData) setSec(e.detail.securityData);
};
document.addEventListener("real-security-calculated", onCalc);
const iv = setInterval(fetchSec, 15e3);
return () => {
alive = false;
clearInterval(iv);
document.removeEventListener("real-security-calculated", onCalc);
};
}, [webrtcManager]);
const onlineConnected = status === "connected" || status === "verified";
const dropped = status === "disconnected" || status === "peer_disconnected";
const connected = onlineConnected && !isOffline;
const connDot = isOffline || dropped ? "#e5727a" : onlineConnected ? "#3ecf8e" : "#e3c84e";
const connLabel = isOffline ? t("chat.offline") : onlineConnected ? t("status.connected") : status === "peer_disconnected" ? t("status.peerDisconnected") : status === "disconnected" ? t("chat.disconnected") : t("status.connecting");
const connGlow = isOffline || dropped ? "0 0 0 3px rgba(229,114,122,0.16)" : onlineConnected ? "0 0 0 3px rgba(62,207,142,0.16)" : "0 0 0 3px rgba(227,200,78,0.16)";
const peerDot = onlineConnected && !isOffline ? PRESENCE_DOT[peerPresence] || "#3ecf8e" : connDot;
const peerPresenceWord = onlineConnected && !isOffline && peerPresence ? PRESENCE_WORD[peerPresence] || null : null;
const startRename = () => {
setNameDraft(title || "");
setEditingName(true);
};
const commitRename = () => {
if (typeof onRenameTitle === "function") onRenameTitle(nameDraft);
setEditingName(false);
};
const renameKey = (e) => {
if (e.key === "Enter") {
e.preventDefault();
commitRename();
} else if (e.key === "Escape") {
setEditingName(false);
}
};
const passed = sec && Number.isFinite(sec.passedChecks) ? sec.passedChecks : null;
const total = sec && Number.isFinite(sec.totalChecks) ? sec.totalChecks : null;
const secLevelLabel = (lvl) => {
if (!lvl) return lvl;
const named = t(`secLevel.${lvl}`);
return named === `secLevel.${lvl}` ? lvl : named;
};
const scoreLabel = passed != null && total ? passed + "/" + total : sec ? sec.score + "%" : "\u2014";
const accent = sec ? sec.color === "green" ? "#3ecf8e" : sec.color === "orange" ? "#f0892a" : sec.color === "yellow" ? "#e3c84e" : "#e5727a" : "#3ecf8e";
const secBtn = React.createElement("div", {
key: "sec",
title: t("sas.runVerification"),
onClick: () => runSecurityReport(webrtcManager),
className: "sb-secpill",
style: { display: "flex", alignItems: "center", gap: "9px", padding: "7px 13px", borderRadius: "9px", border: "1px solid " + (showNetwork ? "rgba(255,255,255,0.16)" : "rgba(255,255,255,0.07)"), background: showNetwork ? "rgba(255,255,255,0.05)" : "rgba(255,255,255,0.02)", cursor: "pointer", fontFamily: "inherit", transition: "all .15s" }
}, [
React.createElement("i", { key: "i", className: "fas fa-shield-halved", style: { color: accent, fontSize: "13px" } }),
React.createElement("span", { key: "l", className: "sb-sec-label", style: { fontSize: "13px", fontWeight: 600, color: "#e8e8eb" } }, sec ? secLevelLabel(sec.level) || t("chatHdr.secure") : t("chatHdr.secure")),
React.createElement("span", { key: "d", className: "sb-sec-div", style: { width: "1px", height: "13px", background: "rgba(255,255,255,0.12)" } }),
React.createElement("span", { key: "s", className: "sb-sec-score", style: { fontFamily: MONO2, fontSize: "11.5px", fontWeight: 500, color: "#8a8a92" } }, scoreLabel),
React.createElement("button", {
key: "c",
type: "button",
title: t("sec.panelTitle"),
onClick: (e) => {
e.stopPropagation();
setShowNetwork((v) => !v);
},
style: { background: "none", border: "none", padding: 0, margin: 0, cursor: "pointer", display: "grid", placeItems: "center" }
}, React.createElement("i", { className: "fas fa-chevron-down", style: { color: "#6b6b73", fontSize: "11px", transform: showNetwork ? "rotate(180deg)" : "rotate(0deg)", transition: "transform .2s" } }))
]);
const headerResponsiveCss = React.createElement("style", { key: "hdr-css", dangerouslySetInnerHTML: {
__html: (
// Encrypted call buttons — green hover per the design.
".sb-call-btn:not(.sb-call-off):hover{border-color:rgba(62,207,142,0.45) !important;color:#3ecf8e !important;background:rgba(62,207,142,0.07) !important;}@media (max-width:768px){.sb-chat-header{padding-inline-start:58px !important;gap:8px !important;}.sb-chat-header .sb-secpill{display:none !important;}.sb-chat-header .sb-conn-text{display:none !important;}.sb-chat-header .sb-conn{padding:9px !important;}.sb-chat-header .sb-hdr-sub{display:none !important;}.sb-chat-header .sb-disconnect{width:40px !important;height:40px !important;padding:0 !important;gap:0 !important;justify-content:center !important;border-radius:9px !important;color:#e5727a !important;border-color:rgba(229,114,122,0.28) !important;}}@media (max-width:600px){.sb-chips{flex-wrap:nowrap !important;justify-content:flex-start !important;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;}.sb-chips::-webkit-scrollbar{display:none;}.sb-chips>*{flex:0 0 auto !important;}.sb-chips .sb-chips-right{flex-wrap:nowrap !important;}.sb-chips .sb-chip{white-space:nowrap;}}@media (max-width:480px){.sb-chat-header{padding-inline-end:12px !important;}}"
)
} });
const header = React.createElement("header", {
// --sb-safe-top is the iOS status-bar strip the installed web view draws
// under (0 in a browser tab). It is added to BOTH the padding and the
// height so the 64px of header content is untouched and only the
// translucent bar grows upward to meet the top edge of the screen.
key: "hdr",
className: "sb-chat-header",
style: { flex: "none", display: "flex", alignItems: "center", justifyContent: "space-between", gap: "24px", padding: "var(--sb-safe-top, 0px) 20px var(--sb-bar-extra, 0px)", minHeight: "calc(var(--sb-bar-h, 64px) + var(--sb-safe-top, 0px) + var(--sb-bar-extra, 0px))", boxSizing: "border-box", borderBottom: "1px solid rgba(255,255,255,0.06)", background: "rgba(18,18,20,0.72)", backdropFilter: "blur(14px)", WebkitBackdropFilter: "blur(14px)" }
}, [
headerResponsiveCss,
// The SecureBit brand/logo lives in the left rail; this header identifies the
// ACTIVE conversation — avatar monogram + local label + connection status.
React.createElement("div", { key: "left", style: { display: "flex", alignItems: "center", gap: "12px", minWidth: 0 } }, [
React.createElement("div", { key: "avatar", style: { position: "relative", flex: "none", width: "36px", height: "36px", borderRadius: "10px", display: "grid", placeItems: "center", background: "rgba(255,255,255,0.05)", border: "1px solid rgba(255,255,255,0.09)", fontSize: "13px", fontWeight: 700, letterSpacing: "-0.3px", color: "#e8e8eb" } }, [
monoInitials(title || t("chatHdr.chat")),
React.createElement("span", { key: "dot", style: { position: "absolute", insetInlineEnd: "-2px", bottom: "-2px", width: "11px", height: "11px", borderRadius: "50%", background: peerDot, border: "2px solid #121214" } })
]),
editingName ? React.createElement("div", { key: "edit", style: { display: "flex", flexDirection: "column", gap: "4px", minWidth: 0 } }, [
React.createElement("div", { key: "row", style: { display: "flex", alignItems: "center", gap: "6px" } }, [
React.createElement("input", { key: "in", autoFocus: true, value: nameDraft, maxLength: 32, placeholder: t("chat.nameThis"), onChange: (e) => setNameDraft(e.target.value), onKeyDown: renameKey, onBlur: commitRename, style: { width: "210px", padding: "5px 10px", borderRadius: "8px", border: "1px solid rgba(240,137,42,0.55)", background: "#0f0f11", color: "#f4f4f6", fontFamily: "inherit", fontSize: "14px", fontWeight: 700, outline: "none" } }),
React.createElement("button", { key: "ok", onMouseDown: (e) => e.preventDefault(), onClick: commitRename, title: t("chatHdr.save"), style: { flex: "none", width: "28px", height: "28px", borderRadius: "8px", display: "grid", placeItems: "center", border: "none", background: "#f0892a", color: "#1a0f04", cursor: "pointer" } }, React.createElement("i", { className: "fas fa-check", style: { fontSize: "12px" } }))
]),
React.createElement("div", { key: "hint", style: { fontSize: "11px", color: "#56565e" } }, t("chat.localLabel"))
]) : React.createElement("div", { key: "txt", style: { lineHeight: 1.2, minWidth: 0 } }, [
React.createElement("div", { key: "r1", style: { display: "flex", alignItems: "center", gap: "7px" } }, [
React.createElement("span", { key: "n", style: { fontSize: "15px", fontWeight: 800, letterSpacing: "-0.3px", color: "#f4f4f6", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" } }, title || t("chat.secureChat")),
React.createElement("button", { key: "edit", className: "sb-rename-btn", onClick: startRename, title: t("chat.rename"), style: { flex: "none", width: "24px", height: "24px", borderRadius: "7px", display: "grid", placeItems: "center", border: "none", background: "transparent", color: "#56565e", cursor: "pointer" } }, React.createElement("i", { className: "fas fa-pen", style: { fontSize: "11px" } }))
]),
React.createElement("div", { key: "r2", className: "sb-hdr-sub", style: { fontSize: "11px", color: "#6b6b73", fontWeight: 500, whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" } }, isOffline ? t("chat.noNetwork") : status === "reconnecting" ? t("flow.restoring") : peerPresenceWord || (onlineConnected ? t("chatHdr.p2pSub") : status === "peer_disconnected" ? t("status.peerDisconnected") : status === "disconnected" ? t("chat.disconnected") : t("status.connecting")))
])
]),
secBtn,
React.createElement("div", { key: "right", className: "sb-hdr-right", style: { display: "flex", alignItems: "center", gap: "9px" } }, [
// Encrypted call buttons — enabled only once the session is
// connected AND SAS-verified (the manager enforces the same
// gate; this just reflects it). Media rides the verified
// DTLS-SRTP transport, so calls inherit the E2E encryption.
...(() => {
const callReady = connected && webrtcManager && webrtcManager.isVerified === true;
const startCall = (video) => {
if (!callReady || !webrtcManager) return;
try {
const p = webrtcManager.startCall(video);
if (p && p.catch) p.catch(() => {
});
} catch (_) {
}
};
const callBtnStyle = {
width: "40px",
height: "40px",
borderRadius: "9px",
display: "grid",
placeItems: "center",
border: "1px solid rgba(255,255,255,0.08)",
background: "rgba(255,255,255,0.02)",
color: callReady ? "#9a9aa2" : "#3f3f47",
cursor: callReady ? "pointer" : "not-allowed",
transition: "all .15s"
};
const PHONE_SVG = '<svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.8 19.8 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.12 4.18 2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92z"/></svg>';
const VIDEO_SVG = '<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M23 7l-7 5 7 5V7z"/><rect x="1" y="5" width="15" height="14" rx="2.5"/></svg>';
return [
React.createElement("button", { key: "call-audio", className: callReady ? "sb-call-btn" : "sb-call-btn sb-call-off", disabled: !callReady, onClick: () => startCall(false), title: callReady ? t("chat.startVoiceCall") : t("chat.verifyForCalls"), style: callBtnStyle, dangerouslySetInnerHTML: { __html: PHONE_SVG } }),
React.createElement("button", { key: "call-video", className: callReady ? "sb-call-btn" : "sb-call-btn sb-call-off", disabled: !callReady, onClick: () => startCall(true), title: callReady ? t("chat.startVideoCall") : t("chat.verifyForCalls"), style: callBtnStyle, dangerouslySetInnerHTML: { __html: VIDEO_SVG } })
];
})(),
React.createElement("div", { key: "conn", className: "sb-conn", style: { display: "flex", alignItems: "center", gap: "8px", padding: "8px 13px", borderRadius: "9px", border: "1px solid rgba(255,255,255,0.07)", background: "rgba(255,255,255,0.02)" } }, [
React.createElement("span", { key: "dot", style: { flex: "none", width: "7px", height: "7px", borderRadius: "50%", background: connDot, boxShadow: connGlow } }),
React.createElement("span", { key: "t", className: "sb-conn-text", style: { fontSize: "13px", fontWeight: 600, color: "#cfcfd4" } }, connLabel)
]),
React.createElement("button", { key: "dc", onClick: onDisconnect, className: "sb-disconnect", style: { display: "flex", alignItems: "center", gap: "7px", padding: "8px 14px", borderRadius: "9px", border: "1px solid rgba(255,255,255,0.08)", background: "transparent", color: "#9a9aa2", fontFamily: "inherit", fontSize: "13px", fontWeight: 600, cursor: "pointer", transition: "all .15s" } }, [
React.createElement("i", { key: "i", className: "fas fa-power-off", style: { fontSize: "12px" } }),
React.createElement("span", { key: "t", className: "sb-hide-sm" }, t("hdr.disconnect"))
])
])
]);
const netPanel = showNetwork && React.createElement("div", {
key: "net",
style: { flex: "none", padding: "13px 20px", borderBottom: "1px solid rgba(255,255,255,0.06)", background: "rgba(18,18,20,0.72)", backdropFilter: "blur(14px)", WebkitBackdropFilter: "blur(14px)" }
}, React.createElement(
"div",
{ style: { maxWidth: "1000px", margin: "0 auto", display: "grid", gridTemplateColumns: "repeat(auto-fit,minmax(140px,1fr))", gap: "14px", fontFamily: MONO2 } },
[
[t("sec.transport"), "WebRTC \xB7 DTLS"],
[t("sec.cipher"), "AES-256-GCM"],
[t("sec.keyExchange"), "ECDH P-384"],
[t("sec.security"), scoreLabel + (sec ? " \xB7 " + sec.score + "%" : "")]
].map(([k, v], i) => React.createElement("div", { key: "nf" + i }, [
React.createElement("div", { key: "k", style: { fontSize: "10px", color: "#6b6b73", textTransform: "uppercase", letterSpacing: "0.6px", marginBottom: "4px" } }, k),
React.createElement("div", { key: "v", style: { fontSize: "12.5px", color: i === 3 ? accent : "#cfcfd4", fontWeight: 500 } }, v)
]))
));
return React.createElement("div", { style: { flex: "none" } }, [header, netPanel]);
};
var EnhancedChatInterface = ({
title,
isOffline,
peerPresence,
onRenameTitle,
messages,
messageInput,
setMessageInput,
onSendMessage,
onSendVoice,
onDisconnect,
keyFingerprint,
isVerified,
chatMessagesRef,
scrollToBottom,
webrtcManager,
status,
pendingIncomingFiles = [],
onIncomingDecision,
// Secure chat extras
codeMode,
setCodeMode,
viewOnceMode,
setViewOnceMode,
viewOnceTtl,
setViewOnceTtl,
disappearTtl,
setDisappearTtl,
nowTick,
onUnsendMessage,
onMessageExpire
}) => {
const [showScrollButton, setShowScrollButton] = React.useState(false);
const [showFileTransfer, setShowFileTransfer] = React.useState(false);
const [fileSendMode, setFileSendMode] = React.useState(false);
const [showTimer, setShowTimer] = React.useState(false);
const [showOnce, setShowOnce] = React.useState(false);
const [showHandshake, setShowHandshake] = React.useState(false);
const [isRecording, setIsRecording] = React.useState(false);
const [isDesktop, setIsDesktop] = React.useState(() => typeof window !== "undefined" && !!window.matchMedia && window.matchMedia("(min-width:1024px)").matches);
React.useEffect(() => {
if (typeof window === "undefined" || !window.matchMedia) return;
const mq = window.matchMedia("(min-width:1024px)");
const onCh = () => setIsDesktop(mq.matches);
try {
mq.addEventListener("change", onCh);
} catch (_) {
mq.addListener(onCh);
}
return () => {
try {
mq.removeEventListener("change", onCh);
} catch (_) {
mq.removeListener(onCh);
}
};
}, []);
const taRef = React.useRef(null);
React.useEffect(() => {
const el = taRef.current;
if (!el || codeMode) return;
el.style.height = "auto";
el.style.height = Math.min(el.scrollHeight, 240) + "px";
}, [messageInput, codeMode]);
React.useEffect(() => {
if (pendingIncomingFiles.length > 0) {
setShowFileTransfer(true);
}
}, [pendingIncomingFiles.length]);
React.useEffect(() => {
if (chatMessagesRef.current && messages.length > 0) {
const { scrollTop, scrollHeight, clientHeight } = chatMessagesRef.current;
const isNearBottom = scrollHeight - scrollTop - clientHeight < 100;
if (isNearBottom) {
const smoothScroll = () => {
if (chatMessagesRef.current) {
chatMessagesRef.current.scrollTo({
top: chatMessagesRef.current.scrollHeight,
behavior: scrollBehavior()
});
}
};
smoothScroll();
setTimeout(smoothScroll, 50);
setTimeout(smoothScroll, 150);
}
}
}, [messages, chatMessagesRef]);
const handleScroll = () => {
if (chatMessagesRef.current) {
const { scrollTop, scrollHeight, clientHeight } = chatMessagesRef.current;
const isNearBottom = scrollHeight - scrollTop - clientHeight < 100;
setShowScrollButton(!isNearBottom);
}
};
const handleScrollToBottom = () => {
if (typeof scrollToBottom === "function") {
scrollToBottom();
setShowScrollButton(false);
} else if (chatMessagesRef.current) {
chatMessagesRef.current.scrollTo({ top: chatMessagesRef.current.scrollHeight, behavior: scrollBehavior() });
setShowScrollButton(false);
}
};
const handleKeyPress = (e) => {
if (e.key !== "Enter") return;
if (codeMode) {
if (e.metaKey || e.ctrlKey) {
e.preventDefault();
onSendMessage();
}
} else if (!e.shiftKey) {
e.preventDefault();
onSendMessage();
}
};
const isFileTransferReady = () => {
if (!webrtcManager) return false;
const connected = webrtcManager.isConnected ? webrtcManager.isConnected() : false;
const verified = webrtcManager.isVerified || false;
const hasDataChannel = webrtcManager.dataChannel && webrtcManager.dataChannel.readyState === "open";
return connected && verified && hasDataChannel;
};
const MONO2 = "'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace";
const fmtShort = (s) => {
if (!s) return "";
if (s >= 86400 && s % 86400 === 0) return s / 86400 + "d";
if (s >= 3600 && s % 3600 === 0) return s / 3600 + "h";
if (s >= 60) return Math.round(s / 60) + "m";
return s + "s";
};
const chipStyle = (active) => ({
display: "flex",
alignItems: "center",
gap: "6px",
padding: "7px 11px",
borderRadius: "8px",
border: "1px solid " + (active ? "rgba(255,255,255,0.18)" : "rgba(255,255,255,0.07)"),
background: active ? "rgba(255,255,255,0.06)" : "transparent",
color: active ? "#fff" : "#9a9aa2",
fontFamily: "inherit",
fontSize: "12.5px",
fontWeight: 600,
cursor: "pointer",
transition: "all .15s"
});
const optStyle = (sel) => ({
padding: "6px 12px",
borderRadius: "8px",
border: "1px solid " + (sel ? "rgba(255,255,255,0.22)" : "rgba(255,255,255,0.07)"),
background: sel ? "rgba(255,255,255,0.07)" : "transparent",
color: sel ? "#fff" : "#8a8a92",
fontFamily: MONO2,
fontSize: "12px",
fontWeight: 500,
cursor: "pointer",
transition: "all .14s"
});
const timerDefs = [
{ label: t("msg.off"), v: 0 },
{ label: "5s", v: 5 },
{ label: "30s", v: 30 },
{ label: "1m", v: 60 },
{ label: "1h", v: 3600 },
{ label: "24h", v: 86400 }
];
const onceDefs = [
{ label: t("msg.off"), v: 0 },
{ label: "5s", v: 5 },
{ label: "10s", v: 10 },
{ label: "30s", v: 30 },
{ label: "1m", v: 60 }
];
const onceSelected = viewOnceMode ? viewOnceTtl : 0;
const pickTimer = (v) => {
setDisappearTtl(v);
setShowTimer(false);
};
const pickOnce = (v) => {
if (v === 0) setViewOnceMode(false);
else {
setViewOnceTtl(v);
setViewOnceMode(true);
}
setShowOnce(false);
};
const hasText = !!(messageInput && messageInput.trim());
const canRecord = typeof onSendVoice === "function" && !isOffline && isFileTransferReady() && typeof navigator !== "undefined" && navigator.mediaDevices && typeof navigator.mediaDevices.getUserMedia === "function";
const fmtT = (ts) => {
try {
return new Date(ts).toLocaleTimeString("en-GB", { hour: "2-digit", minute: "2-digit", second: "2-digit" });
} catch (e) {
return "";
}
};
const systemMessages = messages.filter((m) => m.type === "system" && typeof m.message === "string" && m.message.trim());
const chatMessages = messages.filter((m) => m.type !== "system");
const handshakeCard = (isVerified || systemMessages.length > 0) && React.createElement("div", {
key: "handshake",
style: { border: "1px solid rgba(255,255,255,0.07)", borderRadius: "12px", background: "#161618", overflow: "hidden" }
}, [
React.createElement("button", {
key: "hs-btn",
onClick: () => setShowHandshake((v) => !v),
style: { width: "100%", display: "flex", alignItems: "center", gap: "13px", padding: "14px 16px", background: "transparent", border: "none", color: "inherit", cursor: "pointer", textAlign: "start", fontFamily: "inherit" }
}, [
React.createElement(
"div",
{ key: "ic", style: { flex: "none", width: "30px", height: "30px", display: "grid", placeItems: "center" } },
React.createElement("i", { className: "fas fa-check", style: { color: "#3ecf8e", fontSize: "16px" } })
),
React.createElement("div", { key: "tx", style: { flex: 1, minWidth: 0 } }, [
React.createElement("div", { key: "t1", style: { fontSize: "13.5px", fontWeight: 600, color: "#e8e8eb", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" } }, t("flow.channelEstablished")),
React.createElement("div", { key: "t2", style: { fontSize: "12px", color: "#7b7b83", marginTop: "1px", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" } }, t("sas.verified") + (systemMessages.length ? " \xB7 " + systemMessages.length + (systemMessages.length === 1 ? " event" : " events") : ""))
]),
React.createElement("i", { key: "chev", className: "fas fa-chevron-down", style: { flex: "none", color: "#6b6b73", fontSize: "13px", transform: showHandshake ? "rotate(180deg)" : "rotate(0deg)", transition: "transform .2s" } })
]),
showHandshake && React.createElement("div", { key: "hs-body", style: { paddingTop: "2px", paddingBottom: "14px", paddingInlineStart: "59px", paddingInlineEnd: "16px" } }, [
systemMessages.length > 0 && React.createElement(
"div",
{ key: "steps", className: "sb-scroll", style: { marginBottom: "12px", maxHeight: "220px", overflowY: "auto", paddingInlineEnd: "6px" } },
systemMessages.map((m, i) => React.createElement("div", { key: "s" + i, style: { display: "flex", gap: "11px", padding: "6px 0", borderTop: i === 0 ? "none" : "1px solid rgba(255,255,255,0.04)" } }, [
React.createElement("span", { key: "d", style: { flex: "none", width: "5px", height: "5px", borderRadius: "50%", background: "#3ecf8e", marginTop: "7px", opacity: 0.6 } }),
React.createElement("span", { key: "t", style: { flex: 1, fontSize: "12.5px", color: "#9a9aa2", lineHeight: 1.5, wordBreak: "break-word" } }, String(m.message || "").trim()),
React.createElement("span", { key: "tm", style: { flex: "none", fontFamily: MONO2, fontSize: "10.5px", color: "#56565e" } }, fmtT(m.timestamp))
]))
),
keyFingerprint && React.createElement("div", { key: "sn", style: { display: "flex", alignItems: "center", gap: "9px", padding: "10px 12px", borderRadius: "9px", background: "rgba(255,255,255,0.025)", border: "1px solid rgba(255,255,255,0.06)" } }, [
React.createElement("i", { key: "i", className: "fas fa-lock", style: { color: "#8a8a92", fontSize: "12px" } }),
React.createElement("span", { key: "l", style: { fontSize: "11.5px", color: "#8a8a92" } }, t("sas.safetyNumber")),
React.createElement("span", { key: "v", style: { fontFamily: MONO2, fontSize: "12px", color: "#cfcfd4", letterSpacing: "0.8px", fontWeight: 500, wordBreak: "break-all" } }, keyFingerprint)
])
])
]);
const emptyState = React.createElement(
"div",
{ key: "empty", style: { display: "flex", alignItems: "center", justifyContent: "center", flex: 1, minHeight: "40vh" } },
React.createElement("div", { style: { textAlign: "center", maxWidth: "420px" } }, [
React.createElement("img", { key: "ic", src: "/logo/securebit-mark.svg", alt: "SecureBit", style: { width: "60px", height: "60px", objectFit: "contain", display: "block", margin: "0 auto 16px" } }),
React.createElement("h3", { key: "t", style: { fontSize: "17px", fontWeight: 700, color: "#e8e8eb", margin: "0 0 6px" } }, t("flow.channelReady")),
React.createElement("p", { key: "p", style: { fontSize: "13px", color: "#7b7b83", margin: 0 } }, t("chat.e2eeNote"))
])
);
const messagesArea = React.createElement("main", {
key: "main",
ref: chatMessagesRef,
onScroll: handleScroll,
className: "sb-scroll",
style: { flex: 1, overflowY: "auto", padding: "20px 20px 22px" }
}, React.createElement(
"div",
{ style: { width: "100%", maxWidth: "1000px", margin: "0 auto", display: "flex", flexDirection: "column", gap: "16px", minHeight: "100%" } },
chatMessages.length === 0 ? [handshakeCard, emptyState] : [handshakeCard].concat(chatMessages.map((msg) => React.createElement(EnhancedChatMessage, {
key: msg.id,
message: msg.message,
type: msg.type,
timestamp: msg.timestamp,
mid: msg.mid,
status: msg.status,
viewOnce: msg.viewOnce,
viewOnceTtl: msg.viewOnceTtl,
expiresAt: msg.expiresAt,
expired: msg.expired,
nowTick,
canUnsend: typeof onUnsendMessage === "function",
onUnsend: onUnsendMessage,
onExpire: () => onMessageExpire && onMessageExpire(msg.id),
voice: msg.voice
})))
));
const timerRow = showTimer && React.createElement(
"div",
{ key: "timer-row", style: { display: "flex", flexWrap: "wrap", alignItems: "center", gap: "8px", padding: "10px 12px", marginBottom: "10px", borderRadius: "11px", border: "1px solid rgba(255,255,255,0.07)", background: "#161618" } },
[React.createElement("span", { key: "lbl", style: { fontSize: "12px", color: "#8a8a92", fontWeight: 600, marginInlineEnd: "4px" } }, t("chat.disappearAfter"))].concat(
timerDefs.map((d) => React.createElement("button", { key: "td" + d.v, onClick: () => pickTimer(d.v), style: optStyle(disappearTtl === d.v) }, d.label))
)
);
const onceRow = showOnce && React.createElement(
"div",
{ key: "once-row", style: { display: "flex", flexWrap: "wrap", alignItems: "center", gap: "8px", padding: "10px 12px", marginBottom: "10px", borderRadius: "11px", border: "1px solid rgba(255,255,255,0.07)", background: "#161618" } },
[React.createElement("span", { key: "lbl", style: { fontSize: "12px", color: "#8a8a92", fontWeight: 600, marginInlineEnd: "4px" } }, t("chat.visibleFor"))].concat(
onceDefs.map((d) => React.createElement("button", { key: "od" + d.v, onClick: () => pickOnce(d.v), style: optStyle(onceSelected === d.v) }, d.label))
)
);
const filePanel = showFileTransfer && React.createElement(
"div",
{ key: "file-panel", style: { marginBottom: "10px" } },
React.createElement(window.FileTransferComponent || (() => React.createElement("div", { style: { padding: "16px", textAlign: "center", color: "#e5727a" } }, "FileTransferComponent not loaded")), {
webrtcManager,
isConnected: isFileTransferReady(),
pendingIncomingFiles,
onIncomingDecision,
showDropzone: fileSendMode
})
);
const chipsRow = React.createElement("div", { key: "chips", className: "sb-chips", style: { display: "flex", alignItems: "center", justifyContent: "space-between", flexWrap: "wrap", gap: "8px", marginBottom: "10px" } }, [
React.createElement("button", { key: "files", onClick: () => {
if (showFileTransfer && fileSendMode) {
setShowFileTransfer(false);
setFileSendMode(false);
} else {
setShowFileTransfer(true);
setFileSendMode(true);
}
}, className: "sb-chip", style: chipStyle(showFileTransfer && fileSendMode) }, [
React.createElement("i", { key: "i", className: "fas fa-paperclip", style: { fontSize: "13px" } }),
showFileTransfer && fileSendMode ? t("chat.hideFiles") : t("chat.sendFiles")
]),
React.createElement("div", { key: "right", className: "sb-chips-right", style: { display: "flex", alignItems: "center", gap: "6px", flexWrap: "wrap" } }, [
React.createElement("button", { key: "code", onClick: () => setCodeMode((v) => !v), className: "sb-chip", style: chipStyle(codeMode) }, [
React.createElement("i", { key: "i", className: "fas fa-code", style: { fontSize: "13px" } }),
t("msg.code")
]),
React.createElement("button", { key: "once", onClick: () => {
setShowOnce((v) => !v);
setShowTimer(false);
}, className: "sb-chip", style: chipStyle(showOnce || viewOnceMode) }, [
React.createElement("i", { key: "i", className: "fas fa-eye-slash", style: { fontSize: "13px" } }),
viewOnceMode ? t("chat.viewOncePrefix") + fmtShort(viewOnceTtl) : t("chat.viewOnce")
]),
React.createElement("button", { key: "timer", onClick: () => {
setShowTimer((v) => !v);
setShowOnce(false);
}, className: "sb-chip", style: chipStyle(showTimer || disappearTtl > 0) }, [
React.createElement("i", { key: "i", className: "fas fa-stopwatch", style: { fontSize: "13px" } }),
disappearTtl > 0 ? t("chat.timerPrefix") + fmtShort(disappearTtl) : t("msg.timer")
])
])
]);
const codeStrip = codeMode && React.createElement("div", { key: "code-strip", style: { display: "flex", alignItems: "center", gap: "8px", padding: "8px 14px", border: "1px solid rgba(255,255,255,0.08)", borderBottom: "none", borderRadius: "14px 14px 0 0", background: "#161618" } }, [
React.createElement("i", { key: "i", className: "fas fa-code", style: { color: "#8a8a92", fontSize: "12px" } }),
React.createElement("span", { key: "s", style: { fontSize: "11.5px", fontWeight: 600, color: "#8a8a92" } }, t("chat.codeHint")),
React.createElement("button", { key: "c", onClick: () => setCodeMode(false), className: "sb-link", style: { marginInlineStart: "auto", background: "none", border: "none", color: "#6b6b73", cursor: "pointer", fontSize: "11.5px", fontFamily: "inherit", fontWeight: 600 } }, t("chat.close"))
]);
const sendBtn = React.createElement("button", {
key: "send",
onClick: onSendMessage,
disabled: !hasText,
title: t("chat.send"),
className: "sb-send",
style: { flex: "none", width: "44px", height: "44px", borderRadius: "11px", border: "none", display: "grid", placeItems: "center", cursor: hasText ? "pointer" : "default", background: hasText ? "#f0892a" : "rgba(255,255,255,0.05)", color: hasText ? "#1a0f04" : "#56565e", transition: "all .15s" }
}, React.createElement("i", { className: "fas fa-paper-plane sb-mirror-rtl", style: { fontSize: "15px" } }));
const micBtn = React.createElement("button", {
key: "mic",
onClick: () => setIsRecording(true),
title: t("chat.recordVoice"),
className: "sb-send",
style: { flex: "none", width: "44px", height: "44px", borderRadius: "50%", border: "none", display: "grid", placeItems: "center", cursor: "pointer", background: "#f0892a", color: "#1a0f04", boxShadow: "0 8px 22px rgba(240,137,42,0.3)", transition: "transform .15s cubic-bezier(.2,.7,.3,1)" }
}, React.createElement("svg", { width: 19, height: 19, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.9, strokeLinecap: "round", strokeLinejoin: "round" }, [
React.createElement("rect", { key: "a", x: 9, y: 3, width: 6, height: 11, rx: 3 }),
React.createElement("path", { key: "b", d: "M5 11a7 7 0 0 0 14 0" }),
React.createElement("path", { key: "c", d: "M12 18v3" })
]));
const trailingButtons = !canRecord ? [sendBtn] : isDesktop ? [micBtn, sendBtn] : hasText ? [sendBtn] : [micBtn];
const inputRow = React.createElement("div", {
key: "input",
style: { display: "flex", alignItems: "flex-end", gap: "11px", paddingBlock: "11px", paddingInlineStart: "16px", paddingInlineEnd: "11px", border: "1px solid " + (hasText ? "rgba(255,255,255,0.18)" : "rgba(255,255,255,0.08)"), background: "#161618", borderRadius: codeMode ? "0 0 14px 14px" : "14px", transition: "border .15s" }
}, [
React.createElement("div", { key: "ta-wrap", style: { flex: 1, minWidth: 0 } }, [
React.createElement("textarea", {
key: "ta",
value: messageInput,
ref: taRef,
onChange: (e) => setMessageInput(e.target.value),
onKeyDown: handleKeyPress,
rows: 1,
maxLength: 2e3,
placeholder: codeMode ? t("flow.pasteOrWrite") : t("chat.placeholder"),
className: "sb-textarea",
style: { width: "100%", minHeight: codeMode ? "120px" : "22px", maxHeight: "240px", resize: "none", border: "none", outline: "none", background: "transparent", color: "#e8e8eb", fontFamily: codeMode ? MONO2 : "inherit", fontSize: codeMode ? "13px" : "14.5px", lineHeight: 1.55, padding: "6px 0" }
}),
React.createElement("div", { key: "foot", style: { display: "flex", alignItems: "center", gap: "12px", marginTop: "3px" } }, [
React.createElement("span", { key: "enc", style: { display: "inline-flex", alignItems: "center", gap: "5px", fontSize: "11px", color: "#56565e" } }, [
React.createElement("i", { key: "i", className: "fas fa-lock", style: { color: "#3ecf8e", fontSize: "10px" } }),
t("chat.encryptedOnDevice")
]),
React.createElement("span", { key: "cnt", style: { fontFamily: MONO2, fontSize: "10.5px", color: "#56565e", marginInlineStart: "auto" } }, (messageInput ? messageInput.length : 0) + "/2000")
])
])
].concat(trailingButtons));
const recordingBar = React.createElement(
"div",
{ key: "recbar" },
React.createElement(VoiceRecorder, {
onCancel: () => setIsRecording(false),
onSend: (blob, dur, bars) => {
setIsRecording(false);
if (typeof onSendVoice === "function") onSendVoice(blob, dur, bars);
}
})
);
const composer = React.createElement(
"footer",
{ key: "composer", style: { flex: "none", padding: "12px 20px calc(18px + var(--sb-safe-bottom, env(safe-area-inset-bottom, 0px)))", background: "#0f0f11", borderTop: "1px solid rgba(255,255,255,0.05)" } },
React.createElement(
"div",
{ style: { maxWidth: "1000px", margin: "0 auto" } },
isRecording ? [recordingBar] : [timerRow, onceRow, filePanel, chipsRow, codeStrip, inputRow]
)
);
const scrollBtn = showScrollButton && React.createElement("button", {
key: "scrollbtn",
onClick: handleScrollToBottom,
style: { position: "fixed", insetInlineEnd: "24px", bottom: "150px", width: "44px", height: "44px", borderRadius: "50%", border: "1px solid rgba(255,255,255,0.1)", background: "#26262b", color: "#cfcfd4", display: "grid", placeItems: "center", cursor: "pointer", zIndex: 50, boxShadow: "0 6px 20px rgba(0,0,0,0.4)" }
}, React.createElement("i", { className: "fas fa-arrow-down", style: { fontSize: "15px" } }));
const chatHeader = React.createElement(SecureBitChatHeader, {
key: "chat-header",
status,
onDisconnect,
webrtcManager,
title,
isOffline,
peerPresence,
onRenameTitle
});
const callOverlay = window.CallUIComponent && React.createElement(window.CallUIComponent, {
key: "call-overlay",
webrtcManager,
peerTitle: title
});
return React.createElement("div", {
className: "chat-container",
style: { position: "relative", display: "flex", flexDirection: "column", height: "100vh", background: "#0f0f11", color: "#e8e8eb" }
}, [chatHeader, messagesArea, scrollBtn, composer, callOverlay]);
};
var buildSessionMessage = (message, type, opts = {}) => ({
message,
type,
id: Date.now() + Math.random(),
timestamp: typeof opts.timestamp === "number" ? opts.timestamp : Date.now(),
mid: opts.mid,
status: opts.status,
viewOnce: opts.viewOnce === true,
viewOnceTtl: typeof opts.viewOnceTtl === "number" ? opts.viewOnceTtl : 15,
expiresAt: typeof opts.expiresAt === "number" ? opts.expiresAt : void 0,
// Encrypted voice note descriptor: { url, dur, bars, transfer, fileId }.
voice: opts.voice || void 0,
fileId: opts.fileId || void 0
});
var SB_SVG = {
chevL: '<svg class="sb-mirror-rtl" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 6l-6 6 6 6"/></svg>',
chevR: '<svg class="sb-mirror-rtl" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 6l6 6-6 6"/></svg>',
plus: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round"><path d="M12 5v14M5 12h14"/></svg>',
users: '<svg width="19" height="19" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M16 19v-1.5a3.5 3.5 0 0 0-3.5-3.5h-5A3.5 3.5 0 0 0 4 17.5V19"/><circle cx="10" cy="8" r="3.2"/><path d="M20 19v-1.5a3.5 3.5 0 0 0-2.6-3.4"/><path d="M15.5 5.3a3.2 3.2 0 0 1 0 5.4"/></svg>',
burger: '<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7h16M4 12h16M4 17h16"/></svg>'
};
var SessionsSidebar = ({ chats, groups = [], collapsed, drawerOpen, onToggleCollapse, onSelect, onSelectGroup, onNewChat, onNewGroup, onRename, onCloseDrawer, myStatus, onSetStatus }) => {
const h3 = React.createElement;
const [editingId, setEditingId] = React.useState(null);
const [draft, setDraft] = React.useState("");
const [presenceOpen, setPresenceOpen] = React.useState(false);
const scrimRef = React.useRef(null);
const panelRef = React.useRef(null);
const animRef = React.useRef(null);
const dragRef = React.useRef(null);
const offsetRef = React.useRef(0);
const openRef = React.useRef(false);
const clickGuardRef = React.useRef(false);
const [drawerMounted, setDrawerMounted] = React.useState(!!drawerOpen);
const AXIS_LOCK = 10;
const FLICK = 220;
const drawerWidth = () => panelRef.current && panelRef.current.offsetWidth || 292;
const paintDrawer = (x) => {
offsetRef.current = x;
const w = drawerWidth();
const progress = Math.min(1, Math.max(0, 1 + x / w));
if (panelRef.current) panelRef.current.style.transform = "translate3d(" + (x * DIR).toFixed(2) + "px,0,0)";
if (scrimRef.current) {
scrimRef.current.style.opacity = progress.toFixed(3);
const blur = "blur(" + (5 * progress).toFixed(2) + "px)";
scrimRef.current.style.backdropFilter = blur;
scrimRef.current.style.webkitBackdropFilter = blur;
}
};
const settleDrawer = (to, velocity) => {
if (animRef.current) animRef.current.stop();
animRef.current = spring({
from: offsetRef.current,
to,
velocity,
// Overshoot has to be earned. A drawer that was flicked carries
// momentum and should land with a little bounce; one that was
// opened by tapping the burger has none, and wobbling would be
// the interface talking to itself.
damping: Math.abs(velocity) > 60 ? SPRING.drawer.damping : SPRING.move.damping,
response: SPRING.drawer.response,
restDelta: 0.5,
restSpeed: 8,
onUpdate: paintDrawer,
onComplete: () => {
paintDrawer(to);
animRef.current = null;
if (to !== 0) setDrawerMounted(false);
}
});
};
React.useLayoutEffect(() => {
if (drawerOpen && !drawerMounted) {
setDrawerMounted(true);
return;
}
if (!drawerMounted) return;
if (drawerOpen === openRef.current) return;
const w = drawerWidth();
if (drawerOpen && !animRef.current && !dragRef.current) {
paintDrawer(-w);
}
openRef.current = drawerOpen;
settleDrawer(drawerOpen ? 0 : -w, animRef.current ? animRef.current.velocity : 0);
}, [drawerOpen, drawerMounted]);
React.useEffect(() => () => {
if (animRef.current) animRef.current.stop();
}, []);
const drawerDown = (e) => {
if (e.pointerType === "mouse" && e.button !== 0) return;
if (dragRef.current) return;
clickGuardRef.current = false;
dragRef.current = {
id: e.pointerId,
x0: e.clientX,
y0: e.clientY,
// Where they grabbed is where it stays. Re-centring the panel
// under the finger breaks the illusion on the first frame.
base: offsetRef.current,
axis: null,
vel: velocityTracker()
};
dragRef.current.vel.add(e.clientX * DIR, e.timeStamp || performance.now());
};
const drawerMove = (e) => {
const d = dragRef.current;
if (!d || e.pointerId !== d.id) return;
const dx = e.clientX - d.x0;
const dy = e.clientY - d.y0;
if (!d.axis) {
if (Math.abs(dx) < AXIS_LOCK && Math.abs(dy) < AXIS_LOCK) return;
if (Math.abs(dy) >= Math.abs(dx)) {
dragRef.current = null;
return;
}
d.axis = "x";
if (animRef.current) {
d.base = offsetRef.current;
d.x0 = e.clientX;
animRef.current.stop();
animRef.current = null;
}
try {
e.currentTarget.setPointerCapture(d.id);
} catch (_) {
}
}
d.vel.add(e.clientX * DIR, e.timeStamp || performance.now());
const w = drawerWidth();
let x = d.base + (e.clientX - d.x0) * DIR;
if (x > 0) x = rubberband(x, w);
else if (x < -w) x = -w + rubberband(x + w, w);
paintDrawer(x);
};
const drawerUp = (e) => {
const d = dragRef.current;
if (!d || e.pointerId !== void 0 && e.pointerId !== d.id) return;
dragRef.current = null;
if (d.axis !== "x") return;
clickGuardRef.current = true;
const w = drawerWidth();
const v = d.vel.get(e.timeStamp || performance.now());
const open = snapTarget(offsetRef.current, v, [-w, 0], { flick: FLICK }) === 0;
openRef.current = open;
settleDrawer(open ? 0 : -w, v);
if (!open) onCloseDrawer();
};
const drawerScrimClick = () => {
if (clickGuardRef.current) {
clickGuardRef.current = false;
return;
}
onCloseDrawer();
};
const startEdit = (c) => (e) => {
e.stopPropagation();
setEditingId(c.id);
setDraft(c.name);
};
const commitEdit = () => {
if (editingId) {
onRename(editingId, draft);
setEditingId(null);
}
};
const editKey = (e) => {
if (e.key === "Enter") {
e.preventDefault();
commitEdit();
} else if (e.key === "Escape") {
setEditingId(null);
}
};
const renameInput = (extra = {}) => h3("input", {
autoFocus: true,
value: draft,
onChange: (e) => setDraft(e.target.value),
onKeyDown: editKey,
onBlur: commitEdit,
onClick: (e) => e.stopPropagation(),
style: Object.assign({ width: "100%", background: "rgba(255,255,255,0.06)", border: "1px solid rgba(240,137,42,0.5)", borderRadius: "6px", color: "#f4f4f6", fontFamily: "inherit", fontSize: "14px", fontWeight: 700, padding: "2px 6px", outline: "none" }, extra)
});
const icon = (svg3, style) => h3("span", { style: Object.assign({ display: "grid", placeItems: "center" }, style || {}), dangerouslySetInnerHTML: { __html: svg3 } });
const avatar = (c, size, ring) => h3("div", {
style: { position: "relative", flex: "none", width: size + "px", height: size + "px", borderRadius: (size >= 44 ? 12 : 11) + "px", display: "grid", placeItems: "center", background: c.active ? "rgba(255,255,255,0.06)" : "rgba(255,255,255,0.035)", border: "1px solid rgba(255,255,255," + (c.active ? "0.14" : "0.07") + ")", fontSize: "13px", fontWeight: 700, letterSpacing: "-0.3px", color: c.active ? "#f4f4f6" : "#9a9aa2" }
}, [c.mono, h3("span", { key: "dot", style: { position: "absolute", insetInlineEnd: "-2px", bottom: "-2px", width: "11px", height: "11px", borderRadius: "50%", background: c.dot, border: "2px solid " + ring } })]);
const expandedRow = (c) => h3("div", {
key: c.id,
onClick: () => onSelect(c.id),
style: { position: "relative", display: "flex", alignItems: "center", gap: "12px", padding: "11px 12px", marginBottom: "4px", borderRadius: "11px", background: c.active ? "#161618" : "transparent", border: "1px solid " + (c.active ? "rgba(255,255,255,0.08)" : "transparent"), cursor: "pointer" }
}, [
c.active && h3("span", { key: "bar", style: { position: "absolute", insetInlineStart: 0, top: "12px", bottom: "12px", width: "3px", borderStartEndRadius: "3px", borderEndEndRadius: "3px", background: "#f0892a" } }),
avatar(c, 38, c.active ? "#161618" : "#0c0c0e"),
h3("div", { key: "body", style: { flex: 1, minWidth: 0 } }, [
h3("div", { key: "top", style: { display: "flex", alignItems: "center", gap: "7px" } }, [
editingId === c.id ? renameInput() : h3("span", {
key: "name",
onDoubleClick: startEdit(c),
title: t("chat.renameHint"),
style: { flex: 1, minWidth: 0, fontSize: "14px", fontWeight: c.active ? 700 : 600, letterSpacing: "-0.2px", color: c.active ? "#f4f4f6" : "#cfcfd4", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }
}, c.name),
c.unread && editingId !== c.id && h3("span", { key: "u", style: { flex: "none", minWidth: "18px", height: "18px", padding: "0 5px", borderRadius: "9px", display: "grid", placeItems: "center", background: "#f0892a", color: "#1a0f04", fontFamily: "'JetBrains Mono',monospace", fontSize: "10px", fontWeight: 700 } }, c.unread)
]),
h3("div", { key: "prev", style: { fontSize: "12px", color: c.active ? "#8a8a92" : "#6b6b73", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" } }, c.preview)
])
]);
const dockItem = (c) => h3("div", { key: c.id, style: { position: "relative" } }, [
c.active && h3("span", { key: "bar", style: { position: "absolute", insetInlineStart: "-13px", top: "9px", bottom: "9px", width: "3px", borderStartEndRadius: "3px", borderEndEndRadius: "3px", background: "#f0892a" } }),
h3("div", {
key: "tile",
onClick: () => onSelect(c.id),
title: c.name,
style: { position: "relative", width: "44px", height: "44px", borderRadius: "12px", display: "grid", placeItems: "center", cursor: "pointer", background: c.active ? "rgba(255,255,255,0.06)" : "rgba(255,255,255,0.03)", border: "1px solid rgba(255,255,255," + (c.active ? "0.14" : "0.07") + ")", fontSize: "13px", fontWeight: 700, letterSpacing: "-0.3px", color: c.active ? "#f4f4f6" : "#9a9aa2" }
}, [
c.mono,
h3("span", { key: "dot", style: { position: "absolute", insetInlineEnd: "-2px", bottom: "-2px", width: "11px", height: "11px", borderRadius: "50%", background: c.dot, border: "2.5px solid #0c0c0e" } }),
c.unread && h3("span", { key: "u", style: { position: "absolute", insetInlineStart: "-5px", top: "-5px", minWidth: "17px", height: "17px", padding: "0 4px", borderRadius: "9px", display: "grid", placeItems: "center", background: "#f0892a", color: "#1a0f04", fontFamily: "'JetBrains Mono',monospace", fontSize: "9.5px", fontWeight: 700, border: "2px solid #0c0c0e" } }, c.unread)
])
]);
const brandMark = (size) => h3(
"div",
{ style: { width: size + "px", height: size + "px", flex: "none", display: "grid", placeItems: "center" } },
h3("img", { src: "/logo/securebit-mark.svg", alt: "SecureBit", style: { width: "100%", height: "100%", objectFit: "contain", display: "block" } })
);
const collapseBtn = (svg3, title) => h3("button", { className: "sb-collapse-btn", onClick: onToggleCollapse, title, style: { width: "30px", height: "30px", borderRadius: "8px", display: "grid", placeItems: "center", border: "1px solid rgba(255,255,255,0.07)", background: "transparent", color: "#8a8a92", cursor: "pointer" }, dangerouslySetInnerHTML: { __html: svg3 } });
const myMeta = MY_STATUS_OPTIONS.find((o) => o.key === myStatus) || MY_STATUS_OPTIONS[0];
const PRES_SVG = {
user: '<svg width="19" height="19" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M18 20v-1.5a4 4 0 0 0-4-4h-4a4 4 0 0 0-4 4V20"/><circle cx="12" cy="8" r="3.6"/></svg>',
check: '<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#f0892a" stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round"><path d="M5 13l4 4 10-11"/></svg>',
chevUp: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#6b6b73" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg>',
lock: '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#3ecf8e" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M7 11V7a5 5 0 0 1 10 0v4"/><rect x="4.5" y="11" width="15" height="9" rx="2.2"/></svg>'
};
const presenceMenu = (pos) => presenceOpen ? h3("div", {
key: "pmenu",
style: Object.assign({ position: "absolute", zIndex: 30, borderRadius: "14px", background: "#161618", border: "1px solid rgba(255,255,255,0.1)", boxShadow: "0 16px 40px rgba(0,0,0,0.55)", padding: "6px" }, pos)
}, [
h3("div", { key: "h", style: { padding: "9px 10px 7px", fontFamily: "'JetBrains Mono',monospace", fontSize: "10px", fontWeight: 600, color: "#56565e", textTransform: "uppercase", letterSpacing: "1.2px" } }, t("chat.setStatus")),
...MY_STATUS_OPTIONS.map((o) => h3("button", {
key: o.key,
onClick: () => {
onSetStatus(o.key);
setPresenceOpen(false);
},
style: { width: "100%", display: "flex", alignItems: "center", gap: "11px", padding: "9px 10px", borderRadius: "9px", border: "none", background: "transparent", cursor: "pointer", textAlign: "start" }
}, [
h3("span", { key: "d", style: { flex: "none", width: "10px", height: "10px", borderRadius: "50%", background: o.dot } }),
h3("span", { key: "t", style: { flex: 1, minWidth: 0 } }, [
h3("span", { key: "w", style: { display: "block", fontSize: "13.5px", fontWeight: 600, color: "#e8e8eb" } }, o.word),
h3("span", { key: "de", style: { display: "block", fontSize: "11.5px", color: "#6b6b73" } }, o.desc)
]),
o.key === myStatus && h3("span", { key: "c", style: { flex: "none", display: "grid", placeItems: "center" }, dangerouslySetInnerHTML: { __html: PRES_SVG.check } })
])),
h3("div", { key: "note", style: { display: "flex", alignItems: "flex-start", gap: "8px", margin: "6px 6px 4px", padding: "9px 10px", borderRadius: "9px", background: "rgba(62,207,142,0.06)", border: "1px solid rgba(62,207,142,0.16)" } }, [
h3("span", { key: "i", style: { flex: "none", marginTop: "1px", display: "grid" }, dangerouslySetInnerHTML: { __html: PRES_SVG.lock } }),
h3("span", { key: "t", style: { fontSize: "11px", lineHeight: 1.45, color: "#8a8a92" } }, t("chat.peersOnly"))
])
]) : null;
const presencePanelExpanded = h3("div", { key: "you", style: { flex: "none", position: "relative", marginTop: "10px", borderTop: "1px solid rgba(255,255,255,0.06)", padding: "10px 12px 12px" } }, [
presenceMenu({ left: "12px", right: "12px", bottom: "64px" }),
h3("button", { key: "btn", onClick: () => setPresenceOpen((v) => !v), style: { width: "100%", display: "flex", alignItems: "center", gap: "11px", padding: "7px 8px", borderRadius: "11px", border: "1px solid rgba(255,255,255,0.06)", background: "rgba(255,255,255,0.02)", cursor: "pointer" } }, [
h3("div", { key: "av", style: { position: "relative", flex: "none", width: "36px", height: "36px", borderRadius: "10px", display: "grid", placeItems: "center", background: "rgba(240,137,42,0.12)", border: "1px solid rgba(240,137,42,0.24)", color: "#f0892a" } }, [
h3("span", { key: "i", style: { display: "grid" }, dangerouslySetInnerHTML: { __html: PRES_SVG.user } }),
h3("span", { key: "dot", style: { position: "absolute", insetInlineEnd: "-2px", bottom: "-2px", width: "11px", height: "11px", borderRadius: "50%", background: myMeta.dot, border: "2px solid #0c0c0e" } })
]),
h3("div", { key: "tx", style: { flex: 1, minWidth: 0, textAlign: "start" } }, [
h3("div", { key: "y", style: { fontSize: "13.5px", fontWeight: 700, color: "#f4f4f6" } }, t("chatHdr.you")),
h3("div", { key: "w", style: { fontSize: "12px", color: "#8a8a92" } }, myMeta.word)
]),
h3("span", { key: "ch", style: { display: "grid", placeItems: "center" }, dangerouslySetInnerHTML: { __html: PRES_SVG.chevUp } })
])
]);
const presencePanelCollapsed = h3("div", { key: "you", style: { flex: "none", position: "relative", display: "flex", flexDirection: "column", alignItems: "center", padding: "0 0 13px" } }, [
presenceMenu({ insetInlineStart: "60px", bottom: "8px", width: "248px" }),
h3("button", { key: "btn", onClick: () => setPresenceOpen((v) => !v), title: t("chat.yourStatusPrefix") + myMeta.word, style: { position: "relative", width: "44px", height: "44px", borderRadius: "12px", display: "grid", placeItems: "center", cursor: "pointer", background: "rgba(240,137,42,0.12)", border: "1px solid rgba(240,137,42,0.24)", color: "#f0892a" } }, [
h3("span", { key: "i", style: { display: "grid" }, dangerouslySetInnerHTML: { __html: PRES_SVG.user } }),
h3("span", { key: "dot", style: { position: "absolute", insetInlineEnd: "-2px", bottom: "-2px", width: "12px", height: "12px", borderRadius: "50%", background: myMeta.dot, border: "2.5px solid #0c0c0e" } })
])
]);
const expandedInner = [
h3("div", { key: "head", style: { flex: "none", display: "flex", alignItems: "center", justifyContent: "space-between", paddingBlock: 0, paddingInlineStart: "16px", paddingInlineEnd: "12px", height: "var(--sb-bar-h, 64px)", borderBottom: "1px solid rgba(255,255,255,0.06)" } }, [
h3("div", { key: "brand", style: { display: "flex", alignItems: "center", gap: "10px" } }, [brandMark(30), h3("span", { key: "t", style: { fontSize: "15px", fontWeight: 800, letterSpacing: "-0.3px", color: "#f4f4f6" } }, "SecureBit")]),
collapseBtn(SB_SVG.chevL, t("chat.collapse"))
]),
h3("div", { key: "label", style: { flex: "none", display: "flex", alignItems: "center", justifyContent: "space-between", padding: "16px 16px 9px" } }, [
h3("span", { key: "l", style: { fontFamily: "'JetBrains Mono',monospace", fontSize: "10px", fontWeight: 600, color: "#56565e", textTransform: "uppercase", letterSpacing: "1.3px" } }, t("chatHdr.chats")),
h3("span", { key: "c", style: { fontFamily: "'JetBrains Mono',monospace", fontSize: "10px", fontWeight: 600, color: "#6b6b73" } }, String(chats.length))
]),
h3("div", { key: "list", className: "msc-scroll", style: { flex: 1, overflowY: "auto", padding: "0 10px" } }, [
...chats.map(expandedRow),
h3("div", { key: "gh", style: { marginTop: "14px", padding: "0 2px 6px", display: "flex", alignItems: "baseline", justifyContent: "space-between" } }, [
h3("span", { key: "l", style: { fontFamily: "'JetBrains Mono',monospace", fontSize: "10px", fontWeight: 600, color: "#56565e", textTransform: "uppercase", letterSpacing: "1.3px" } }, t("chat.groupChats")),
h3("button", {
key: "add",
onClick: onNewGroup,
title: t("chat.newGroup"),
style: { border: "none", background: "transparent", color: "#f0892a", cursor: "pointer", fontFamily: "'JetBrains Mono',monospace", fontSize: "10px", fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.9px", padding: 0 }
}, t("chatHdr.newChat"))
]),
...groups.length === 0 ? [h3("div", { key: "gph", onClick: onNewGroup, title: t("chat.createGroup"), style: { display: "flex", alignItems: "center", gap: "12px", padding: "11px 12px", borderRadius: "11px", background: "transparent", border: "1px dashed rgba(255,255,255,0.09)", cursor: "pointer" } }, [
h3("div", { key: "i", style: { flex: "none", width: "38px", height: "38px", borderRadius: "11px", display: "grid", placeItems: "center", background: "rgba(255,255,255,0.025)", border: "1px solid rgba(255,255,255,0.06)", color: "#56565e" }, dangerouslySetInnerHTML: { __html: SB_SVG.users } }),
h3("div", { key: "b", style: { flex: 1, minWidth: 0 } }, [
h3("div", { key: "t", style: { fontSize: "14px", fontWeight: 600, color: "#8a8a92" } }, t("chat.newGroup")),
h3("div", { key: "s", style: { fontSize: "11.5px", color: "#56565e" } }, t("chat.meshHint"))
])
])] : groups.map((g) => h3("div", {
key: g.id,
onClick: () => onSelectGroup(g.id),
style: { position: "relative", display: "flex", alignItems: "center", gap: "12px", padding: "11px 12px", marginBottom: "4px", borderRadius: "11px", background: g.active ? "#161618" : "transparent", border: "1px solid " + (g.active ? "rgba(255,255,255,0.08)" : "transparent"), cursor: "pointer" }
}, [
g.active && h3("span", { key: "bar", style: { position: "absolute", insetInlineStart: 0, top: "12px", bottom: "12px", width: "3px", borderStartEndRadius: "3px", borderEndEndRadius: "3px", background: "#f0892a" } }),
avatar(g, 38, g.active ? "#161618" : "#0c0c0e"),
h3("div", { key: "body", style: { flex: 1, minWidth: 0 } }, [
h3("div", { key: "top", style: { display: "flex", alignItems: "center", gap: "7px" } }, [
h3("span", { key: "n", style: { flex: 1, minWidth: 0, fontSize: "14px", fontWeight: g.active ? 700 : 600, letterSpacing: "-0.2px", color: g.active ? "#f4f4f6" : "#cfcfd4", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" } }, g.name),
g.unread && h3("span", { key: "u", style: { flex: "none", minWidth: "18px", height: "18px", padding: "0 5px", borderRadius: "9px", display: "grid", placeItems: "center", background: "#f0892a", color: "#1a0f04", fontFamily: "'JetBrains Mono',monospace", fontSize: "10px", fontWeight: 700 } }, g.unread)
]),
h3("div", { key: "prev", style: { fontSize: "12px", color: g.active ? "#8a8a92" : "#6b6b73", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" } }, g.preview)
])
]))
]),
h3("div", { key: "new", style: { flex: "none", padding: "12px" } }, h3("button", {
onClick: onNewChat,
style: { width: "100%", display: "inline-flex", alignItems: "center", justifyContent: "center", gap: "9px", padding: "12px", borderRadius: "11px", border: "none", background: "#f0892a", color: "#1a0f04", fontFamily: "inherit", fontSize: "14px", fontWeight: 700, cursor: "pointer", boxShadow: "0 8px 24px rgba(240,137,42,0.28)" }
}, [icon(SB_SVG.plus, { key: "p" }), t("chat.newChat")])),
presencePanelExpanded
];
const collapsedInner = [
h3("div", { key: "head", style: { flex: "none", display: "flex", flexDirection: "column", alignItems: "center", gap: "10px", padding: "13px 0", width: "100%", borderBottom: "1px solid rgba(255,255,255,0.06)" } }, [brandMark(32), collapseBtn(SB_SVG.chevR, t("chatHdr.expand"))]),
h3("div", { key: "list", className: "msc-scroll", style: { flex: 1, overflowY: "auto", display: "flex", flexDirection: "column", alignItems: "center", gap: "10px", padding: "14px 0", width: "100%" } }, [
...chats.map(dockItem),
h3("div", { key: "sep", style: { width: "30px", height: "1px", background: "rgba(255,255,255,0.07)", margin: "2px 0" } }),
...groups.map((g) => h3("div", { key: g.id, style: { position: "relative" } }, [
g.active && h3("span", { key: "bar", style: { position: "absolute", insetInlineStart: "-13px", top: "9px", bottom: "9px", width: "3px", borderStartEndRadius: "3px", borderEndEndRadius: "3px", background: "#f0892a" } }),
h3("div", {
key: "tile",
onClick: () => onSelectGroup(g.id),
title: g.name + " \u2014 " + g.headerSub,
style: { position: "relative", width: "44px", height: "44px", borderRadius: "12px", display: "grid", placeItems: "center", cursor: "pointer", background: g.active ? "rgba(255,255,255,0.06)" : "rgba(255,255,255,0.03)", border: "1px solid rgba(255,255,255," + (g.active ? "0.14" : "0.07") + ")", fontSize: "13px", fontWeight: 700, letterSpacing: "-0.3px", color: g.active ? "#f4f4f6" : "#9a9aa2" }
}, [
g.mono,
h3("span", { key: "dot", style: { position: "absolute", insetInlineEnd: "-2px", bottom: "-2px", width: "11px", height: "11px", borderRadius: "50%", background: g.dot, border: "2.5px solid #0c0c0e" } }),
g.unread && h3("span", { key: "u", style: { position: "absolute", insetInlineStart: "-5px", top: "-5px", minWidth: "17px", height: "17px", padding: "0 4px", borderRadius: "9px", display: "grid", placeItems: "center", background: "#f0892a", color: "#1a0f04", fontFamily: "'JetBrains Mono',monospace", fontSize: "9.5px", fontWeight: 700, border: "2px solid #0c0c0e" } }, g.unread)
])
])),
h3("div", { key: "gph", onClick: onNewGroup, title: t("chat.newGroup"), style: { position: "relative", width: "44px", height: "44px", borderRadius: "12px", display: "grid", placeItems: "center", cursor: "pointer", background: "transparent", border: "1px dashed rgba(255,255,255,0.1)", color: "#56565e" }, dangerouslySetInnerHTML: { __html: SB_SVG.users } })
]),
h3("div", { key: "new", style: { flex: "none", padding: "13px 0" } }, h3("button", {
onClick: onNewChat,
title: t("chat.newChat"),
style: { width: "44px", height: "44px", borderRadius: "12px", display: "grid", placeItems: "center", border: "none", background: "#f0892a", color: "#1a0f04", cursor: "pointer", boxShadow: "0 8px 24px rgba(240,137,42,0.28)" },
dangerouslySetInnerHTML: { __html: SB_SVG.plus }
})),
presencePanelCollapsed
];
const railWidth = collapsed ? "72px" : "292px";
const railStyle = { flex: "none", width: railWidth, display: "flex", flexDirection: "column", alignItems: collapsed ? "center" : "stretch", paddingTop: "var(--sb-safe-top, 0px)", background: "#0c0c0e", borderInlineEnd: "1px solid rgba(255,255,255,0.06)" };
const inner = collapsed ? collapsedInner : expandedInner;
return h3(React.Fragment, null, [
// Responsive behaviour (inline styles can't express media queries).
h3("style", { key: "css", dangerouslySetInnerHTML: { __html: "@media (max-width:1023px){.sb-rail{display:none !important;}.sb-burger{display:grid !important;}}@media (min-width:1024px){.sb-drawer-overlay{display:none !important;}}.sb-mobile-drawer .sb-collapse-btn{display:none !important;}html,body{background:#0f0f11 !important;overscroll-behavior:none;}.sb-app-shell{height:var(--sb-vh,100dvh) !important;min-height:0 !important;overflow:hidden;}.sb-chat-header{position:sticky;top:0;z-index:20;}.sb-app-col{height:100% !important;min-height:0 !important;}.chat-container{height:100% !important;min-height:0 !important;}.sb-scroll{min-height:0 !important;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;}@media (max-width:768px){textarea,input,select{font-size:16px !important;}}@media (max-width:768px){.sb-rename-btn{display:none !important;}}" } }),
// Desktop rail
h3("aside", { key: "rail", className: "sb-rail", style: railStyle }, inner),
// Mobile drawer overlay. `touch-action: pan-y` hands vertical
// scrolling back to the browser and keeps the horizontal axis for
// us, so the chat list still scrolls with the drawer open.
h3("div", {
key: "drawer",
className: "sb-drawer-overlay",
ref: scrimRef,
onClick: drawerScrimClick,
onPointerDown: drawerDown,
onPointerMove: drawerMove,
onPointerUp: drawerUp,
onPointerCancel: drawerUp,
style: { position: "fixed", inset: 0, zIndex: 60, background: "rgba(6,6,8,0.6)", backdropFilter: "blur(0px)", WebkitBackdropFilter: "blur(0px)", opacity: 0, display: drawerMounted ? "block" : "none", touchAction: "pan-y", willChange: "opacity" }
}, h3("aside", { className: "sb-mobile-drawer", ref: panelRef, onClick: (e) => e.stopPropagation(), style: { position: "absolute", insetInlineStart: 0, top: 0, bottom: 0, width: "min(292px, 86vw)", display: "flex", flexDirection: "column", paddingTop: "var(--sb-safe-top, 0px)", background: "#0c0c0e", borderInlineEnd: "1px solid rgba(255,255,255,0.06)", boxShadow: "0 0 60px rgba(0,0,0,0.6)", touchAction: "pan-y", willChange: "transform" } }, [
// Explicit close button — the drawer's own header only has a
// "collapse" chevron (a desktop-rail action), so on mobile there was
// no obvious way to dismiss it. This X closes the drawer reliably.
h3("button", { key: "x", onClick: onCloseDrawer, title: t("chat.closeMenu"), "aria-label": t("chat.closeMenu"), style: { position: "absolute", top: "calc(15px + var(--sb-safe-top, 0px))", insetInlineEnd: "13px", zIndex: 2, width: "34px", height: "34px", borderRadius: "9px", display: "grid", placeItems: "center", border: "1px solid rgba(255,255,255,0.1)", background: "rgba(255,255,255,0.05)", color: "#cfcfd4", cursor: "pointer" } }, h3("i", { className: "fas fa-xmark", style: { fontSize: "16px" } })),
expandedInner
]))
]);
};
var EnhancedSecureP2PChat = () => {
const [sessionsState, dispatch] = React.useReducer(sessionsReducer, void 0, createInitialState);
const activeSessionId = sessionsState.activeSessionId;
const activeIdRef = React.useRef(null);
activeIdRef.current = activeSessionId;
const active = activeSessionId ? sessionsState.sessions[activeSessionId] : null;
const EMPTY_ARR = React.useRef([]).current;
const managersRef = React.useRef(/* @__PURE__ */ new Map());
const integrationsRef = React.useRef(/* @__PURE__ */ new Map());
const queuesRef = React.useRef(/* @__PURE__ */ new Map());
const statusRef = React.useRef(/* @__PURE__ */ new Map());
const [groupsState, groupsDispatch] = React.useReducer(groupsReducer, void 0, createInitialGroupState);
const groupRuntimesRef = React.useRef(/* @__PURE__ */ new Map());
const activeGroupId = groupsState.activeGroupId;
const activeGroup = activeGroupId ? groupsState.groups[activeGroupId] : null;
const activeGroupIdRef = React.useRef(null);
activeGroupIdRef.current = activeGroupId;
const [groupInput, setGroupInput] = React.useState("");
const [showCreateGroup, setShowCreateGroup] = React.useState(false);
const [showGroupCode, setShowGroupCode] = React.useState(false);
const [pendingInvite, setPendingInvite] = React.useState(null);
const [groupError, setGroupError] = React.useState(null);
const [showAddMembers, setShowAddMembers] = React.useState(false);
const groupScrollRef = React.useRef(null);
const [groupCallState, setGroupCallState] = React.useState({});
const [groupCallMediaState, setGroupCallMediaState] = React.useState({});
const groupCallMediaRef = React.useRef(/* @__PURE__ */ new Map());
const [dismissedCalls, setDismissedCalls] = React.useState({});
const announcedCallsRef = React.useRef(/* @__PURE__ */ new Set());
const meshLinksRef = React.useRef(/* @__PURE__ */ new Map());
const lastUnreachableRef = React.useRef(/* @__PURE__ */ new Map());
const sendGroupFrame = React.useMemo(() => createGroupSender({
// A group frame leaves over whichever kind of link carries that member:
// an ordinary 1:1 chat, or a connection the group dialled itself.
getManager: (sessionId) => managersRef.current.get(sessionId) || meshLinksRef.current.get(sessionId)?.manager || null
}), []);
const buildGroupMessage = (body, type, extra = {}) => ({
id: Date.now() + Math.random(),
message: body,
type,
timestamp: Date.now(),
...extra
});
const groupEmitter = React.useCallback((gid) => (event, payload = {}) => {
switch (event) {
case "phase":
groupsDispatch({ type: GROUP_ACTIONS.SET_PHASE, id: gid, phase: payload.phase });
break;
case "members":
groupsDispatch({ type: GROUP_ACTIONS.SET_MEMBERS, id: gid, members: payload.members, epoch: payload.epoch });
syncGroupCallMediaRef.current(gid, null);
break;
case "roster":
groupsDispatch({ type: GROUP_ACTIONS.RENAME, id: gid, name: payload.name });
break;
case "sas":
groupsDispatch({ type: GROUP_ACTIONS.SET_SAS, id: gid, code: payload.code });
groupsDispatch({ type: GROUP_ACTIONS.SET_ACTIVE_GROUP, id: gid });
setShowGroupCode(true);
break;
case "confirmed":
groupsDispatch({ type: GROUP_ACTIONS.CONFIRM_SAS, id: gid });
break;
case "call":
setGroupCallState((current) => ({ ...current, [gid]: payload.call }));
syncGroupCallMediaRef.current(gid, payload.call);
if (payload.call && !payload.call.joined && gid !== activeGroupIdRef.current) {
const token = `${gid}:${payload.call.callId}`;
if (!announcedCallsRef.current.has(token)) {
announcedCallsRef.current.add(token);
groupsDispatch({ type: GROUP_ACTIONS.INCREMENT_UNREAD, id: gid });
}
}
break;
case "message":
groupsDispatch({
type: GROUP_ACTIONS.ADD_MESSAGE,
id: gid,
message: buildGroupMessage(payload.body, "received", {
senderName: payload.name,
senderFp: payload.fp,
timestamp: payload.ts,
relayed: payload.relayed === true
})
});
if (gid !== activeGroupIdRef.current) {
groupsDispatch({ type: GROUP_ACTIONS.INCREMENT_UNREAD, id: gid });
}
break;
case "ended":
destroyGroupRef.current(gid, { announce: false });
break;
case "add_failed":
groupsDispatch({
type: GROUP_ACTIONS.ADD_MESSAGE,
id: gid,
message: buildGroupMessage(t("err.nobodyAccepted"), "system")
});
break;
case "left":
groupsDispatch({
type: GROUP_ACTIONS.ADD_MESSAGE,
id: gid,
message: buildGroupMessage(`${payload.name} left the group.`, "system")
});
break;
case "inconsistency":
groupsDispatch({
type: GROUP_ACTIONS.ADD_MESSAGE,
id: gid,
message: buildGroupMessage(
`${payload.name} sent conflicting messages to different members. That message was discarded.`,
"system"
)
});
break;
case "error":
groupsDispatch({ type: GROUP_ACTIONS.SET_ERROR, id: gid, error: payload.error });
break;
default:
break;
}
}, []);
const handleGroupFrame = React.useCallback((sessionId, frame) => {
const runtime = groupRuntimesRef.current.get(frame.gid);
if (!runtime) {
if (groupFrameType(frame) === GROUP_FRAMES.INVITE) {
let invite = null;
try {
invite = decodeEnvelope(frame);
} catch (_) {
return;
}
setPendingInvite((current) => current || {
gid: invite.gid,
name: String(invite.name || "Group").slice(0, GROUP_LIMITS.MAX_NAME_BYTES),
frame: invite,
sessionId
});
}
return;
}
runtime.handleFrame(sessionId, frame).catch((error) => {
const reason = error?.code || (error?.message ? `frame_rejected: ${String(error.message).slice(0, 120)}` : "frame_rejected");
groupsDispatch({ type: GROUP_ACTIONS.SET_ERROR, id: frame.gid, error: reason });
});
}, []);
const handleGroupFrameRef = React.useRef(handleGroupFrame);
handleGroupFrameRef.current = handleGroupFrame;
const syncGroupLinks = React.useCallback((sessionId, connected) => {
for (const runtime of groupRuntimesRef.current.values()) {
try {
runtime.setSessionState(sessionId, connected);
} catch (_) {
}
}
}, []);
const syncGroupLinksRef = React.useRef(syncGroupLinks);
syncGroupLinksRef.current = syncGroupLinks;
const dispatchActive = React.useCallback((build) => {
const id = activeIdRef.current;
if (!id) return;
dispatch(build(id));
}, []);
const messages = active ? active.messages : EMPTY_ARR;
const setMessages = React.useCallback((updaterOrArr) => {
const id = activeIdRef.current;
if (!id) return;
if (typeof updaterOrArr === "function") dispatch({ type: SESSION_ACTIONS.SET_MESSAGES, id, updater: updaterOrArr });
else dispatch({ type: SESSION_ACTIONS.SET_MESSAGES, id, messages: updaterOrArr });
}, []);
const connectionStatus = active ? active.status : "disconnected";
const setConnectionStatus = React.useCallback((status) => dispatchActive((id) => ({ type: SESSION_ACTIONS.SET_STATUS, id, status })), [dispatchActive]);
const keyFingerprint = active ? active.keyFingerprint : "";
const setKeyFingerprint = React.useCallback((fingerprint) => dispatchActive((id) => ({ type: SESSION_ACTIONS.SET_FINGERPRINT, id, fingerprint })), [dispatchActive]);
const verificationCode = active ? active.verificationCode : "";
const setVerificationCode = React.useCallback((code) => dispatchActive((id) => ({ type: SESSION_ACTIONS.SET_VERIFICATION, id, code })), [dispatchActive]);
const isVerified = active ? active.sas.isVerified : false;
const setIsVerified = React.useCallback((v) => dispatchActive((id) => ({ type: SESSION_ACTIONS.SET_SAS, id, sas: { isVerified: !!v } })), [dispatchActive]);
const localVerificationConfirmed = active ? active.sas.localConfirmed : false;
const setLocalVerificationConfirmed = React.useCallback((v) => dispatchActive((id) => ({ type: SESSION_ACTIONS.SET_SAS, id, sas: { localConfirmed: !!v } })), [dispatchActive]);
const remoteVerificationConfirmed = active ? active.sas.remoteConfirmed : false;
const setRemoteVerificationConfirmed = React.useCallback((v) => dispatchActive((id) => ({ type: SESSION_ACTIONS.SET_SAS, id, sas: { remoteConfirmed: !!v } })), [dispatchActive]);
const bothVerificationsConfirmed = active ? active.sas.bothConfirmed : false;
const setBothVerificationsConfirmed = React.useCallback((v) => dispatchActive((id) => ({ type: SESSION_ACTIONS.SET_SAS, id, sas: { bothConfirmed: !!v } })), [dispatchActive]);
const pendingIncomingFiles = active ? active.pendingIncomingFiles : EMPTY_ARR;
const setPendingIncomingFiles = React.useCallback((updaterOrArr) => {
const id = activeIdRef.current;
if (!id) return;
if (typeof updaterOrArr === "function") dispatch({ type: SESSION_ACTIONS.SET_PENDING_FILES, id, updater: updaterOrArr });
else dispatch({ type: SESSION_ACTIONS.SET_PENDING_FILES, id, files: updaterOrArr });
}, []);
const setupField = (name, fallback) => active ? active.setup[name] : fallback;
const setSetupField = (name) => React.useCallback((value) => dispatchActive((id) => ({ type: SESSION_ACTIONS.PATCH_SETUP, id, patch: { [name]: value } })), [dispatchActive]);
const offerData = setupField("offerData", "");
const setOfferData = setSetupField("offerData");
const answerData = setupField("answerData", "");
const setAnswerData = setSetupField("answerData");
const offerInput = setupField("offerInput", "");
const setOfferInput = setSetupField("offerInput");
const answerInput = setupField("answerInput", "");
const setAnswerInput = setSetupField("answerInput");
const showOfferStep = setupField("showOfferStep", false);
const setShowOfferStep = setSetupField("showOfferStep");
const showAnswerStep = setupField("showAnswerStep", false);
const setShowAnswerStep = setSetupField("showAnswerStep");
const showVerification = setupField("showVerification", false);
const setShowVerification = setSetupField("showVerification");
const showQRCode = setupField("showQRCode", false);
const setShowQRCode = setSetupField("showQRCode");
const qrCodeUrl = setupField("qrCodeUrl", "");
const setQrCodeUrl = setSetupField("qrCodeUrl");
const isGeneratingKeys = setupField("isGeneratingKeys", false);
const setIsGeneratingKeys = setSetupField("isGeneratingKeys");
const webrtcManagerRef = React.useMemo(() => ({
get current() {
return managersRef.current.get(activeIdRef.current) || null;
},
set current(v) {
const id = activeIdRef.current;
if (!id) return;
if (v) managersRef.current.set(id, v);
else managersRef.current.delete(id);
}
}), []);
const notificationIntegrationRef = React.useMemo(() => ({
get current() {
return integrationsRef.current.get(activeIdRef.current) || null;
},
set current(v) {
const id = activeIdRef.current;
if (!id) return;
if (v) integrationsRef.current.set(id, v);
else integrationsRef.current.delete(id);
}
}), []);
const [myStatus, setMyStatusState] = React.useState(() => {
try {
return localStorage.getItem("securebit_my_status") || "available";
} catch {
return "available";
}
});
const myStatusRef = React.useRef(myStatus);
myStatusRef.current = myStatus;
const wirePresence = (s) => s === "invisible" ? "offline" : s;
const sendPresenceTo = React.useCallback((mgr, s) => {
if (!mgr || typeof mgr.sendMessage !== "function") return;
try {
if (mgr.isConnected && mgr.isConnected()) {
const p = mgr.sendMessage(JSON.stringify({ type: "presence", status: wirePresence(s) }));
if (p && typeof p.catch === "function") p.catch(() => {
});
}
} catch (_) {
}
}, []);
const setMyStatus = React.useCallback((key) => {
setMyStatusState(key);
try {
localStorage.setItem("securebit_my_status", key);
} catch {
}
for (const mgr of managersRef.current.values()) sendPresenceTo(mgr, key);
}, [sendPresenceTo]);
const [codeMode, setCodeMode] = React.useState(false);
const [viewOnceMode, setViewOnceMode] = React.useState(false);
const [viewOnceTtl, setViewOnceTtl] = React.useState(15);
const [disappearTtl, setDisappearTtl] = React.useState(0);
const [nowTick, setNowTick] = React.useState(() => Date.now());
const [isOffline, setIsOffline] = React.useState(typeof navigator !== "undefined" && navigator.onLine === false);
const offlineRef = React.useRef(isOffline);
React.useEffect(() => {
offlineRef.current = isOffline;
}, [isOffline]);
React.useEffect(() => {
const goOffline = () => setIsOffline(true);
const goOnline = () => setIsOffline(false);
const resync = () => {
if (document.visibilityState !== "visible") return;
setIsOffline(navigator.onLine === false);
};
window.addEventListener("offline", goOffline);
window.addEventListener("online", goOnline);
document.addEventListener("visibilitychange", resync);
return () => {
window.removeEventListener("offline", goOffline);
window.removeEventListener("online", goOnline);
document.removeEventListener("visibilitychange", resync);
};
}, []);
React.useEffect(() => {
const vv = typeof window !== "undefined" ? window.visualViewport : null;
const root = document.documentElement;
let lastH = -1, lastInset = "";
const applyHeight = () => {
const h3 = Math.round(vv ? vv.height : window.innerHeight || 0);
if (h3 && h3 !== lastH) {
lastH = h3;
root.style.setProperty("--sb-vh", h3 + "px");
}
};
const applyInset = () => {
const covered = !!vv && window.innerHeight - vv.height > 120;
const v = covered ? "0px" : "env(safe-area-inset-bottom, 0px)";
if (v !== lastInset) {
lastInset = v;
root.style.setProperty("--sb-safe-bottom", v);
}
};
const apply = () => {
applyHeight();
applyInset();
};
apply();
if (vv) vv.addEventListener("resize", apply);
window.addEventListener("resize", apply);
window.addEventListener("orientationchange", apply);
return () => {
if (vv) vv.removeEventListener("resize", apply);
window.removeEventListener("resize", apply);
window.removeEventListener("orientationchange", apply);
};
}, []);
const [relayOnlyMode, setRelayOnlyMode] = React.useState(() => {
try {
return localStorage.getItem("securebit_relay_only_mode") === "true";
} catch {
return false;
}
});
const [customIceServers, setCustomIceServers] = React.useState(null);
const [iceServersText, setIceServersText] = React.useState("");
const [iceSettingsPersisted, setIceSettingsPersisted] = React.useState(false);
const [showIceSettings, setShowIceSettings] = React.useState(false);
React.useEffect(() => {
let cancelled = false;
loadIceSettings().then((saved) => {
if (cancelled || !saved) return;
if (Array.isArray(saved.servers) && saved.servers.length > 0) {
setCustomIceServers(saved.servers);
setIceServersText(JSON.stringify(saved.servers, null, 2));
}
if (saved.privacyMode === "relay-only") {
setRelayOnlyMode(true);
}
setIceSettingsPersisted(true);
}).catch(() => {
});
return () => {
cancelled = true;
};
}, []);
React.useEffect(() => {
const open = () => setShowIceSettings(true);
window.addEventListener("securebit:open-network-settings", open);
return () => window.removeEventListener("securebit:open-network-settings", open);
}, []);
const handleApplyIceSettings = React.useCallback((next, persist) => {
const servers = next.useCustom && Array.isArray(next.servers) ? next.servers : null;
setCustomIceServers(servers && servers.length ? servers : null);
setIceServersText(next.serversText || "");
setRelayOnlyMode(next.privacyMode === "relay-only");
setShowIceSettings(false);
if (persist) {
setIceSettingsPersisted(true);
saveIceSettings({ servers: servers || [], privacyMode: next.privacyMode }).catch(() => {
});
} else if (iceSettingsPersisted) {
setIceSettingsPersisted(false);
clearIceSettings().catch(() => {
});
}
}, [iceSettingsPersisted]);
const handleForgetIceSettings = React.useCallback(async () => {
await clearIceSettings().catch(() => {
});
setIceSettingsPersisted(false);
setCustomIceServers(null);
setIceServersText("");
}, []);
const [messageInput, setMessageInput] = React.useState("");
const [showQRScanner, setShowQRScanner] = React.useState(false);
const [showQRScannerModal, setShowQRScannerModal] = React.useState(false);
const [securityLevel, setSecurityLevel] = React.useState(null);
const [sessionTimeLeft, setSessionTimeLeft] = React.useState(0);
const [pendingSession, setPendingSession] = React.useState(null);
const [connectionState, setConnectionState] = React.useState({
status: "disconnected",
hasActiveAnswer: false,
answerCreatedAt: null,
isUserInitiatedDisconnect: false
});
const updateConnectionState = (newState, options = {}) => {
const { preserveAnswer = false, isUserAction = false } = options;
setConnectionState((prev) => ({
...prev,
...newState,
isUserInitiatedDisconnect: isUserAction,
hasActiveAnswer: preserveAnswer ? prev.hasActiveAnswer : false,
answerCreatedAt: preserveAnswer ? prev.answerCreatedAt : null
}));
};
const shouldPreserveAnswerData = () => {
const hasAnswerData = !!answerData || answerInput && typeof answerInput === "string" && answerInput.trim().length > 0;
const hasAnswerQR = qrCodeUrl && typeof qrCodeUrl === "string" && qrCodeUrl.trim().length > 0;
const shouldPreserve = connectionState.hasActiveAnswer && !connectionState.isUserInitiatedDisconnect || hasAnswerData && !connectionState.isUserInitiatedDisconnect || hasAnswerQR && !connectionState.isUserInitiatedDisconnect;
return shouldPreserve;
};
const markAnswerCreated = () => {
updateConnectionState({
hasActiveAnswer: true,
answerCreatedAt: Date.now()
});
};
React.useEffect(() => {
return installDebugWindowHooks({
targetWindow: window,
webrtcManagerRef,
onClearData: handleClearData
});
}, []);
const addMessageWithAutoScroll = React.useCallback((message, type, opts = {}) => {
const newId = Date.now() + Math.random();
const newMessage = {
message,
type,
id: newId,
timestamp: typeof opts.timestamp === "number" ? opts.timestamp : Date.now(),
mid: opts.mid,
status: opts.status,
// WhatsApp-style: sending | sent | delivered | failed
viewOnce: opts.viewOnce === true,
viewOnceTtl: typeof opts.viewOnceTtl === "number" ? opts.viewOnceTtl : 15,
expiresAt: typeof opts.expiresAt === "number" ? opts.expiresAt : void 0,
voice: opts.voice || void 0,
fileId: opts.fileId || void 0
};
setMessages((prev) => {
const updated = [...prev, newMessage];
setTimeout(() => {
if (chatMessagesRef?.current) {
const container = chatMessagesRef.current;
try {
const { scrollTop, scrollHeight, clientHeight } = container;
const isNearBottom = scrollHeight - scrollTop - clientHeight < 100;
if (isNearBottom || prev.length === 0) {
requestAnimationFrame(() => {
if (container && container.scrollTo) {
container.scrollTo({
top: container.scrollHeight,
behavior: scrollBehavior()
});
}
});
}
} catch (error) {
console.warn("Scroll error:", error);
container.scrollTop = container.scrollHeight;
}
}
}, 50);
return updated;
});
return newId;
}, []);
const updateMessageStatus = React.useCallback((mid, status) => {
if (!mid) return;
setMessages((prev) => prev.map((m) => String(m.mid) === String(mid) && m.type === "sent" ? { ...m, status } : m));
}, []);
const patchMessageById = React.useCallback((messageId, patch) => {
if (messageId == null) return;
setMessages((prev) => prev.map((m) => String(m.id) === String(messageId) ? { ...m, ...typeof patch === "function" ? patch(m) : patch } : m));
}, []);
const patchMessageByFileId = React.useCallback((fileId, patch) => {
if (!fileId) return;
setMessages((prev) => prev.map((m) => m.fileId && String(m.fileId) === String(fileId) ? { ...m, ...typeof patch === "function" ? patch(m) : patch } : m));
}, []);
const flushSessionQueue = React.useCallback((id) => {
const q = queuesRef.current.get(id);
if (!q) return;
const mgr = managersRef.current.get(id);
const out = q.outgoing;
q.outgoing = [];
const deferred = [];
for (const item of out) {
if (!mgr || mgr.isConnected?.() !== true) {
deferred.push(item);
continue;
}
try {
const send = mgr.sendMessage?.(item.outText, item.meta);
if (send && typeof send.then === "function") {
send.then(() => dispatch({ type: SESSION_ACTIONS.UPDATE_MESSAGE_STATUS, id, mid: item.mid, status: "delivered" })).catch(() => dispatch({ type: SESSION_ACTIONS.UPDATE_MESSAGE_STATUS, id, mid: item.mid, status: "failed" }));
}
} catch (_) {
deferred.push(item);
}
}
if (deferred.length) q.outgoing = deferred.concat(q.outgoing);
const inc = q.incoming;
q.incoming = [];
if (inc.length > 0) {
dispatch({ type: SESSION_ACTIONS.ADD_MESSAGE, id, message: buildSessionMessage(
`Connection restored \u2014 ${inc.length} message${inc.length === 1 ? "" : "s"} received while you were offline.`,
"notice"
) });
}
const viewing = id === activeIdRef.current && (typeof document === "undefined" || document.visibilityState === "visible");
for (const item of inc) {
dispatch({ type: SESSION_ACTIONS.ADD_MESSAGE, id, message: buildSessionMessage(item.message, item.type, item.opts) });
if (item.opts && item.opts.mid && item.type === "received") {
if (viewing) {
try {
mgr?.sendDeliveryReceipt?.(item.opts.mid);
} catch (_) {
}
} else if (q.pendingReadAcks) q.pendingReadAcks.push(item.opts.mid);
}
}
}, []);
const flushOfflineQueues = React.useCallback(() => {
for (const id of queuesRef.current.keys()) flushSessionQueue(id);
}, [flushSessionQueue]);
React.useEffect(() => {
if (isOffline) return;
flushOfflineQueues();
}, [isOffline, flushOfflineQueues]);
React.useEffect(() => {
const timer = setInterval(() => {
for (const [id, q] of queuesRef.current.entries()) {
if (!q.outgoing.length && !q.incoming.length) continue;
const mgr = managersRef.current.get(id);
if (mgr?.isConnected?.() !== true) continue;
if (mgr?.isReconnecting?.() === true) continue;
flushSessionQueue(id);
}
}, 2e3);
return () => clearInterval(timer);
}, [flushSessionQueue]);
const updateSecurityLevel = React.useCallback(async () => {
if (window.isUpdatingSecurity) {
return;
}
window.isUpdatingSecurity = true;
try {
if (webrtcManagerRef.current) {
setSecurityLevel({
level: "MAXIMUM",
score: 100,
color: "green",
details: t("sec.allEnabled"),
passedChecks: 10,
totalChecks: 10,
isRealData: true
});
if (window.DEBUG_MODE) {
const currentLevel = webrtcManagerRef.current.ecdhKeyPair && webrtcManagerRef.current.ecdsaKeyPair ? await webrtcManagerRef.current.calculateSecurityLevel() : {
level: "MAXIMUM",
score: 100,
sessionType: "premium",
passedChecks: 10,
totalChecks: 10
};
}
}
} catch (error) {
console.error("Failed to update security level:", error);
setSecurityLevel({
level: "ERROR",
score: 0,
color: "red",
details: t("sas.verificationFailed")
});
} finally {
setTimeout(() => {
window.isUpdatingSecurity = false;
}, 2e3);
}
}, []);
const chatMessagesRef = React.useRef(null);
const scrollToBottom = createScrollToBottomFunction(chatMessagesRef);
React.useEffect(() => {
try {
localStorage.setItem("securebit_relay_only_mode", String(relayOnlyMode));
} catch {
}
if (webrtcManagerRef.current?._config?.webrtc) {
webrtcManagerRef.current._setRelayOnlyMode(relayOnlyMode);
}
}, [relayOnlyMode]);
React.useEffect(() => {
if (messages.length > 0 && chatMessagesRef.current) {
scrollToBottom();
setTimeout(scrollToBottom, 50);
setTimeout(scrollToBottom, 150);
}
}, [messages]);
const anyExpiring = sessionsState.order.some((id) => (sessionsState.sessions[id]?.messages || []).some((m) => typeof m.expiresAt === "number"));
const sessionsStateRef = React.useRef(sessionsState);
sessionsStateRef.current = sessionsState;
React.useEffect(() => {
if (!anyExpiring) return;
const expireFn = (prev) => {
const now = Date.now();
let changed = false;
const next = prev.map((m) => {
if (typeof m.expiresAt === "number" && m.expiresAt <= now && !m.expired) {
changed = true;
return { ...m, expired: true, message: "", expiresAt: void 0 };
}
return m;
});
return changed ? next : prev;
};
const interval = setInterval(() => {
const now = Date.now();
setNowTick(now);
const st = sessionsStateRef.current;
for (const id of st.order) {
const msgs = st.sessions[id]?.messages || [];
if (msgs.some((m) => typeof m.expiresAt === "number" && m.expiresAt <= now && !m.expired)) {
dispatch({ type: SESSION_ACTIONS.SET_MESSAGES, id, updater: expireFn });
}
}
}, 1e3);
return () => clearInterval(interval);
}, [anyExpiring]);
const createSession = (opts = {}) => {
const role = opts.role || "offer";
const entry = createSessionEntry({ role });
const id = entry.id;
dispatch({ type: SESSION_ACTIONS.CREATE_SESSION, entry, activate: opts.activate !== false });
queuesRef.current.set(id, { incoming: [], outgoing: [], pendingReadAcks: [] });
const setMessages2 = (u) => {
if (typeof u === "function") dispatch({ type: SESSION_ACTIONS.SET_MESSAGES, id, updater: u });
else dispatch({ type: SESSION_ACTIONS.SET_MESSAGES, id, messages: u });
};
const addMessageWithAutoScroll2 = (message, type, opts2 = {}) => {
dispatch({ type: SESSION_ACTIONS.ADD_MESSAGE, id, message: buildSessionMessage(message, type, opts2) });
if (type === "received" && id !== activeIdRef.current) {
dispatch({ type: SESSION_ACTIONS.INCREMENT_UNREAD, id });
}
};
const updateMessageStatus2 = (mid, status) => {
if (mid) dispatch({ type: SESSION_ACTIONS.UPDATE_MESSAGE_STATUS, id, mid, status });
};
const patchMessageById2 = (messageId, patch) => {
if (messageId != null) dispatch({ type: SESSION_ACTIONS.PATCH_MESSAGE, id, messageId, patch });
};
const patchMessageByFileId2 = (fileId, patch) => {
if (fileId) dispatch({ type: SESSION_ACTIONS.PATCH_MESSAGE, id, fileId, patch });
};
const setConnectionStatus2 = (status) => dispatch({ type: SESSION_ACTIONS.SET_STATUS, id, status });
const setKeyFingerprint2 = (fingerprint) => dispatch({ type: SESSION_ACTIONS.SET_FINGERPRINT, id, fingerprint });
const setVerificationCode2 = (code) => dispatch({ type: SESSION_ACTIONS.SET_VERIFICATION, id, code });
const setIsVerified2 = (v) => dispatch({ type: SESSION_ACTIONS.SET_SAS, id, sas: { isVerified: !!v } });
const setLocalVerificationConfirmed2 = (v) => dispatch({ type: SESSION_ACTIONS.SET_SAS, id, sas: { localConfirmed: !!v } });
const setRemoteVerificationConfirmed2 = (v) => dispatch({ type: SESSION_ACTIONS.SET_SAS, id, sas: { remoteConfirmed: !!v } });
const setBothVerificationsConfirmed2 = (v) => dispatch({ type: SESSION_ACTIONS.SET_SAS, id, sas: { bothConfirmed: !!v } });
const setShowVerification2 = (v) => dispatch({ type: SESSION_ACTIONS.PATCH_SETUP, id, patch: { showVerification: !!v } });
const setShowOfferStep2 = (v) => dispatch({ type: SESSION_ACTIONS.PATCH_SETUP, id, patch: { showOfferStep: !!v } });
const setShowAnswerStep2 = (v) => dispatch({ type: SESSION_ACTIONS.PATCH_SETUP, id, patch: { showAnswerStep: !!v } });
const setShowQRCode2 = (v) => dispatch({ type: SESSION_ACTIONS.PATCH_SETUP, id, patch: { showQRCode: !!v } });
const setQrCodeUrl2 = (v) => dispatch({ type: SESSION_ACTIONS.PATCH_SETUP, id, patch: { qrCodeUrl: v } });
const setOfferData2 = (v) => dispatch({ type: SESSION_ACTIONS.PATCH_SETUP, id, patch: { offerData: v } });
const setAnswerData2 = (v) => dispatch({ type: SESSION_ACTIONS.PATCH_SETUP, id, patch: { answerData: v } });
const setOfferInput2 = (v) => dispatch({ type: SESSION_ACTIONS.PATCH_SETUP, id, patch: { offerInput: v } });
const setAnswerInput2 = (v) => dispatch({ type: SESSION_ACTIONS.PATCH_SETUP, id, patch: { answerInput: v } });
const setPendingIncomingFiles2 = (u) => {
if (typeof u === "function") dispatch({ type: SESSION_ACTIONS.SET_PENDING_FILES, id, updater: u });
else dispatch({ type: SESSION_ACTIONS.SET_PENDING_FILES, id, files: u });
};
const sessionQueues = () => queuesRef.current.get(id) || { incoming: [], outgoing: [] };
const handleMessage = (message, type, meta) => {
if (typeof message === "string" && message.trim().startsWith("{")) {
try {
const parsedMessage = JSON.parse(message);
if (parsedMessage.type === "presence") {
const st = parsedMessage.data && parsedMessage.data.status || parsedMessage.status;
if (st) dispatch({ type: SESSION_ACTIONS.SET_PEER_PRESENCE, id, presence: st });
return;
}
if (isGroupFrame(parsedMessage)) {
handleGroupFrameRef.current(id, parsedMessage);
return;
}
const blockedTypes = [
"file_transfer_start",
"file_transfer_response",
"file_chunk",
"chunk_confirmation",
"file_transfer_complete",
"file_transfer_error",
"heartbeat",
"verification",
"verification_response",
"verification_confirmed",
"verification_both_confirmed",
"peer_disconnect",
"key_rotation_signal",
"key_rotation_ready",
"security_upgrade",
"message_delete",
"message_receipt"
];
if (parsedMessage.type && blockedTypes.includes(parsedMessage.type)) {
console.log(`Blocked system/file message from chat: ${parsedMessage.type}`);
return;
}
if (parsedMessage.type === "message" && typeof parsedMessage.data === "string") {
message = parsedMessage.data;
if (parsedMessage.meta && typeof parsedMessage.meta === "object") meta = parsedMessage.meta;
}
} catch (parseError) {
}
}
const opts2 = {};
if (meta && typeof meta === "object") {
if (typeof meta.mid === "string") opts2.mid = meta.mid;
if (meta.once === true) {
opts2.viewOnce = true;
opts2.viewOnceTtl = Number.isFinite(meta.onceTtl) ? meta.onceTtl : 15;
}
if (Number.isFinite(meta.ttl) && meta.ttl > 0) {
opts2.expiresAt = Date.now() + meta.ttl * 1e3;
}
if (Number.isFinite(meta.ts)) opts2.timestamp = meta.ts;
}
if (offlineRef.current && type === "received") {
sessionQueues().incoming.push({ message, type, opts: opts2 });
return;
}
addMessageWithAutoScroll2(message, type, opts2);
if (opts2.mid && type === "received") {
const beingViewed = id === activeIdRef.current && (typeof document === "undefined" || document.visibilityState === "visible");
if (beingViewed) {
try {
manager?.sendDeliveryReceipt?.(opts2.mid);
} catch (_) {
}
} else {
const q = sessionQueues();
if (q.pendingReadAcks) q.pendingReadAcks.push(opts2.mid);
}
}
};
const handleStatusChange = (status) => {
const prevStatus = statusRef.current.get(id);
statusRef.current.set(id, status);
setConnectionStatus2(status);
syncGroupLinksRef.current(id, status === "connected" || status === "verified");
if (status === "reconnecting") return;
if (status === "connected" && prevStatus === "reconnecting") {
flushSessionQueue(id);
}
if (status === "recovery_failed") {
setConnectionStatus2("disconnected");
if (id === activeIdRef.current) {
document.dispatchEvent(new CustomEvent("peer-disconnect"));
document.dispatchEvent(new CustomEvent("disconnected"));
}
setTimeout(() => {
if (sessionCarriesGroupMemberRef.current(id)) return;
destroySession(id);
}, 2500);
return;
}
if (status === "connected") {
document.dispatchEvent(new CustomEvent("new-connection"));
if (!window.isUpdatingSecurity) {
updateSecurityLevel().catch(console.error);
}
} else if (status === "verifying") {
setShowVerification2(true);
if (!window.isUpdatingSecurity) {
updateSecurityLevel().catch(console.error);
}
} else if (status === "verified") {
setIsVerified2(true);
setShowVerification2(false);
setBothVerificationsConfirmed2(true);
setConnectionStatus2("connected");
setTimeout(() => {
setIsVerified2(true);
}, 0);
try {
const s = myStatusRef.current === "invisible" ? "offline" : myStatusRef.current;
setTimeout(() => {
try {
const p = manager.sendMessage?.(JSON.stringify({ type: "presence", status: s }));
if (p && typeof p.catch === "function") p.catch(() => {
});
} catch (_) {
}
}, 400);
} catch (_) {
}
if (!window.isUpdatingSecurity) {
updateSecurityLevel().catch(console.error);
}
} else if (status === "connecting") {
if (!window.isUpdatingSecurity) {
updateSecurityLevel().catch(console.error);
}
} else if (status === "disconnected") {
setConnectionStatus2("disconnected");
setIsVerified2(false);
setShowVerification2(false);
setLocalVerificationConfirmed2(false);
setRemoteVerificationConfirmed2(false);
setBothVerificationsConfirmed2(false);
if (id === activeIdRef.current) document.dispatchEvent(new CustomEvent("disconnected"));
} else if (status === "peer_disconnected") {
if (id === activeIdRef.current) {
setSessionTimeLeft(0);
document.dispatchEvent(new CustomEvent("peer-disconnect"));
}
setConnectionStatus2("peer_disconnected");
setIsVerified2(false);
setShowVerification2(false);
setLocalVerificationConfirmed2(false);
setRemoteVerificationConfirmed2(false);
setBothVerificationsConfirmed2(false);
setTimeout(() => {
if (sessionCarriesGroupMemberRef.current(id)) return;
destroySession(id);
}, 2500);
}
};
const handleKeyExchange = (fingerprint) => {
if (fingerprint === "") {
setKeyFingerprint2("");
} else {
setKeyFingerprint2(fingerprint);
}
};
const handleVerificationRequired = (code) => {
if (code === "") {
setVerificationCode2("");
setShowVerification2(false);
} else {
setVerificationCode2(code);
setShowVerification2(true);
}
};
const handleVerificationStateChange = (state) => {
setLocalVerificationConfirmed2(state.localConfirmed);
setRemoteVerificationConfirmed2(state.remoteConfirmed);
setBothVerificationsConfirmed2(state.bothConfirmed);
};
const handleAnswerError = (errorType, errorMessage) => {
if (errorType === "replay_attack") {
setSessionTimeLeft(0);
setPendingSession(null);
addMessageWithAutoScroll2("\u{1F4A1} Data is outdated. Please create a new invitation or use a current response code.", "system");
if (typeof console.clear === "function") {
console.clear();
}
} else if (errorType === "security_violation") {
setSessionTimeLeft(0);
setPendingSession(null);
addMessageWithAutoScroll2(` Security breach: ${errorMessage}`, "system");
if (typeof console.clear === "function") {
console.clear();
}
}
};
if (typeof console.clear === "function") {
console.clear();
}
const manager = new EnhancedSecureWebRTCManager(
handleMessage,
handleStatusChange,
handleKeyExchange,
handleVerificationRequired,
handleAnswerError,
handleVerificationStateChange,
{
webrtc: {
relayOnly: relayOnlyMode,
// Priority: user's custom servers > operator override > built-in defaults.
iceServers: Array.isArray(customIceServers) && customIceServers.length ? customIceServers : Array.isArray(window.SECUREBIT_ICE_SERVERS) ? window.SECUREBIT_ICE_SERVERS : void 0
}
}
);
managersRef.current.set(id, manager);
manager.onMessageDelete = (mid) => {
if (!mid) return;
setMessages2((prev) => prev.filter((m) => String(m.mid) !== String(mid)));
};
manager.onMessageDelivered = (mid) => {
updateMessageStatus2(mid, "read");
};
if (typeof Notification !== "undefined" && Notification && Notification.permission === "granted" && window.NotificationIntegration && !integrationsRef.current.get(id)) {
try {
const integration = new window.NotificationIntegration(manager);
integration.init().then(() => {
integrationsRef.current.set(id, integration);
}).catch((error) => {
});
} catch (error) {
}
}
handleMessage(" SecureBit.chat Enhanced Security Edition v5.6.0 - ECDH + DTLS + SAS initialized. Ready to establish a secure connection with ECDH key exchange, DTLS fingerprint verification, and SAS authentication to prevent MITM attacks.", "system");
manager.setFileTransferCallbacks(
// Progress callback — drives the voice-note upload/download ring.
(progress) => {
if (progress && progress.isVoice) {
const pct = Math.max(0, Math.min(100, progress.progress || 0));
const applyPct = (m) => {
if (!m.voice) return {};
if (progress.direction === "up" && pct >= 100) {
return { voice: { ...m.voice, transfer: null } };
}
return { voice: { ...m.voice, transfer: { dir: progress.direction, pct } } };
};
if (progress.direction === "up" && progress.uiId != null) patchMessageById2(progress.uiId, applyPct);
else if (progress.fileId) patchMessageByFileId2(progress.fileId, applyPct);
return;
}
console.log("File progress:", progress);
},
// File received callback. Voice notes play inline (never touch disk);
// ordinary files still auto-save.
(fileData) => {
const isVoice = !!fileData.isVoice || typeof fileData.mimeType === "string" && fileData.mimeType.startsWith("audio/");
if (isVoice) {
fileData.getObjectURL().then((url) => {
patchMessageByFileId2(fileData.fileId, (m) => ({ voice: { ...m.voice || {}, url, transfer: null } }));
}).catch((e) => {
console.error("Voice decode failed:", e);
patchMessageByFileId2(fileData.fileId, (m) => ({ voice: { ...m.voice || {}, transfer: null, error: true } }));
});
return;
}
const sizeMb = Math.max(1, Math.round((fileData.fileSize || 0) / (1024 * 1024)));
const saveToDisk = async () => {
const url = await fileData.getObjectURL();
const a = document.createElement("a");
a.href = url;
a.download = fileData.fileName || "file";
document.body.appendChild(a);
a.click();
a.remove();
setTimeout(() => fileData.revokeObjectURL(url), 15e3);
};
saveToDisk().then(() => {
addMessageWithAutoScroll2(`File received & saved: ${fileData.fileName} (${sizeMb} MB)`, "system");
}).catch((e) => {
console.error("Auto-save failed:", e);
addMessageWithAutoScroll2(`File received: ${fileData.fileName} (${sizeMb} MB). Open the file panel to download it.`, "system");
});
},
// Error callback
(error) => {
console.error("File transfer error:", error);
if (error.includes(t("err.notReady"))) {
addMessageWithAutoScroll2(` File transfer error: connection not ready. Try again later.`, "system");
} else if (error.includes(t("err.fileTooLarge"))) {
addMessageWithAutoScroll2(` File is too big. Maximum size: 100 MB`, "system");
} else {
addMessageWithAutoScroll2(` File transfer error: ${error}`, "system");
}
},
// Incoming file request callback. Voice notes are auto-accepted and
// rendered inline (a receiving bubble appears immediately and tracks
// the download ring); ordinary files still require explicit consent.
(fileRequest) => {
if (fileRequest && fileRequest.isVoice) {
const v = fileRequest.voice || {};
addMessageWithAutoScroll2("", "received", {
voice: {
dur: Number.isFinite(v.dur) ? v.dur : 0,
bars: Array.isArray(v.bars) ? v.bars : null,
transfer: { dir: "down", pct: 0 },
url: null
},
fileId: fileRequest.fileId
});
try {
manager.acceptIncomingFile(fileRequest.fileId);
} catch (_) {
}
return;
}
setPendingIncomingFiles2((prev) => {
if (prev.some((f) => f.fileId === fileRequest.fileId)) return prev;
return [...prev, fileRequest];
});
}
);
return id;
};
const createSessionRef = React.useRef(createSession);
createSessionRef.current = createSession;
const destroyingRef = React.useRef(/* @__PURE__ */ new Set());
const sessionCarriesGroupMember = React.useCallback((id) => {
for (const runtime of groupRuntimesRef.current.values()) {
if (runtime.sessionToFp && runtime.sessionToFp.has(id)) return true;
}
return false;
}, []);
const sessionCarriesGroupMemberRef = React.useRef(sessionCarriesGroupMember);
sessionCarriesGroupMemberRef.current = sessionCarriesGroupMember;
const destroySession = React.useCallback((id) => {
if (!id || destroyingRef.current.has(id)) return;
destroyingRef.current.add(id);
try {
const mgr = managersRef.current.get(id);
if (mgr) {
try {
mgr.disconnect();
} catch (_) {
}
managersRef.current.delete(id);
}
const integ = integrationsRef.current.get(id);
if (integ) {
try {
integ.cleanup?.();
} catch (_) {
}
integrationsRef.current.delete(id);
}
queuesRef.current.delete(id);
statusRef.current.delete(id);
dispatch({ type: SESSION_ACTIONS.REMOVE_SESSION, id });
} finally {
destroyingRef.current.delete(id);
}
}, []);
React.useEffect(() => {
if (sessionsState.order.length === 0) createSessionRef.current({ role: "offer" });
}, [sessionsState.order.length]);
const [sidebarCollapsed, setSidebarCollapsed] = React.useState(() => {
try {
return localStorage.getItem("securebit_sidebar_collapsed") === "true";
} catch {
return false;
}
});
React.useEffect(() => {
try {
localStorage.setItem("securebit_sidebar_collapsed", String(sidebarCollapsed));
} catch {
}
}, [sidebarCollapsed]);
const [sidebarDrawerOpen, setSidebarDrawerOpen] = React.useState(false);
const handleSelectSession = React.useCallback((id) => {
dispatch({ type: SESSION_ACTIONS.SET_ACTIVE, id });
dispatch({ type: SESSION_ACTIONS.CLEAR_UNREAD, id });
setSidebarDrawerOpen(false);
}, []);
const handleNewChat = React.useCallback(() => {
groupsDispatch({ type: GROUP_ACTIONS.SET_ACTIVE_GROUP, id: null });
createSessionRef.current({ role: "offer" });
setSidebarDrawerOpen(false);
}, []);
const handleRenameSession = React.useCallback((id, label2) => {
dispatch({ type: SESSION_ACTIONS.RENAME, id, label: label2 });
}, []);
const closeMeshLink = React.useCallback((sessionId) => {
const entry = meshLinksRef.current.get(sessionId);
if (!entry) return;
meshLinksRef.current.delete(sessionId);
try {
entry.manager.disconnect();
} catch (_) {
}
}, []);
const closeMeshLinkRef = React.useRef(closeMeshLink);
closeMeshLinkRef.current = closeMeshLink;
const buildMeshLink = React.useCallback((gid, fp) => {
const sessionId = "mesh:" + Array.from(crypto.getRandomValues(new Uint8Array(8))).map((b) => b.toString(16).padStart(2, "0")).join("");
const entry = { manager: null, gid, fp, sessionId };
const onMessage = (message) => {
if (typeof message !== "string" || !message.trim().startsWith("{")) return;
let parsed;
try {
parsed = JSON.parse(message);
} catch (_) {
return;
}
if (isGroupFrame(parsed)) handleGroupFrameRef.current(sessionId, parsed);
};
const onStatusChange = (status) => {
const dead = status === "disconnected" || status === "failed" || status === "peer_disconnected" || status === "recovery_failed";
syncGroupLinksRef.current(sessionId, !dead && entry.manager?.isVerified === true);
if (status === "recovery_failed" || status === "failed") {
const runtime = groupRuntimesRef.current.get(gid);
try {
runtime?.unbindSession(fp);
} catch (_) {
}
closeMeshLinkRef.current(sessionId);
}
};
const onVerificationRequired = (code) => {
if (!code || !entry.manager) return;
try {
entry.manager.markGroupLinkVerified(`group:${gid}`);
} catch (_) {
closeMeshLinkRef.current(sessionId);
syncGroupLinksRef.current(sessionId, false);
}
};
const manager = new EnhancedSecureWebRTCManager(
onMessage,
onStatusChange,
() => {
},
// key exchange: no fingerprint UI to update
onVerificationRequired,
() => {
},
// answer errors surface as a failed dial
() => {
},
// no verification UI to keep in step
{
// A mesh link has no window of its own, so it must not
// announce itself to the application: its lifecycle events
// would reset the header and the connection banner belonging
// to whichever chat the user is actually looking at.
emitGlobalEvents: false,
webrtc: {
relayOnly: relayOnlyMode,
iceServers: Array.isArray(customIceServers) && customIceServers.length ? customIceServers : Array.isArray(window.SECUREBIT_ICE_SERVERS) ? window.SECUREBIT_ICE_SERVERS : void 0
}
}
);
entry.manager = manager;
meshLinksRef.current.set(sessionId, entry);
return entry;
}, [relayOnlyMode, customIceServers]);
const buildMeshLinkRef = React.useRef(buildMeshLink);
buildMeshLinkRef.current = buildMeshLink;
const makeMeshAdapter = React.useCallback((gid) => ({
createOffer: async (fp) => {
const entry = buildMeshLinkRef.current(gid, fp);
try {
const offer = await entry.manager.createSecureOffer();
if (!offer || typeof offer.sbq2 !== "string") {
throw new Error("mesh dial needs a compact descriptor");
}
return { sessionId: entry.sessionId, descriptor: offer.sbq2 };
} catch (error) {
closeMeshLinkRef.current(entry.sessionId);
throw error;
}
},
createAnswer: async (fp, descriptor) => {
const entry = buildMeshLinkRef.current(gid, fp);
try {
const answer = await entry.manager.createSecureAnswer({ t: "offer", sbq2: descriptor });
if (!answer || typeof answer.sbq2 !== "string") {
throw new Error("mesh answer needs a compact descriptor");
}
return { sessionId: entry.sessionId, descriptor: answer.sbq2 };
} catch (error) {
closeMeshLinkRef.current(entry.sessionId);
throw error;
}
},
acceptAnswer: async (sessionId, descriptor) => {
const entry = meshLinksRef.current.get(sessionId);
if (!entry) throw new Error("that mesh dial is no longer open");
await entry.manager.handleSecureAnswer({ t: "answer", sbq2: descriptor });
},
close: (sessionId) => closeMeshLinkRef.current(sessionId),
/**
* The key fingerprint of a pairwise session, for link probes.
*
* Both endpoints of a session derive the same value from the shared
* secret and nobody else can, which is exactly what makes it usable as
* proof that a probe was written for THIS link. Only a verified session
* has one worth anything.
*/
linkFingerprint: (sessionId) => {
const manager = managersRef.current.get(sessionId) || meshLinksRef.current.get(sessionId)?.manager || null;
if (!manager || manager.isVerified !== true) return "";
return typeof manager.keyFingerprint === "string" ? manager.keyFingerprint : "";
}
}), []);
React.useEffect(() => {
for (const [gid, runtime] of groupRuntimesRef.current) {
const group = groupsState.groups[gid];
if (!group || group.phase !== GROUP_PHASE.READY || !group.sasConfirmed) continue;
for (const sid of sessionsState.order) {
const session = sessionsState.sessions[sid];
if (!session || !session.sas.isVerified) continue;
runtime.probeSession(sid).catch(() => {
});
}
}
}, [groupsState, sessionsState]);
const groupCandidates = React.useMemo(
() => sessionsState.order.map((id) => sessionsState.sessions[id]).filter((s) => s && s.sas && s.sas.isVerified).map((s) => ({ id: s.id, name: s.peerLabel, mono: monoInitials(s.peerLabel) })),
[sessionsState]
);
const handleSelectGroup = React.useCallback((gid) => {
groupsDispatch({ type: GROUP_ACTIONS.SET_ACTIVE_GROUP, id: gid });
groupsDispatch({ type: GROUP_ACTIONS.CLEAR_UNREAD, id: gid });
setSidebarDrawerOpen(false);
}, []);
const handleCreateGroup = React.useCallback(async ({ name, sessionIds }) => {
setShowCreateGroup(false);
const gid = GroupSession.newId();
const runtime = new GroupSession({
groupId: gid,
name,
isAdmin: true,
subtle: crypto.subtle,
send: sendGroupFrame,
emit: groupEmitter(gid),
mesh: makeMeshAdapter(gid)
});
groupRuntimesRef.current.set(gid, runtime);
try {
await runtime.init();
groupsDispatch({
type: GROUP_ACTIONS.CREATE_GROUP,
entry: createGroupEntry({
id: gid,
name,
selfFp: runtime.selfFp,
adminFp: runtime.selfFp,
isAdmin: true,
members: runtime._memberSnapshot()
})
});
await runtime.invite(sessionIds.map((sid) => ({
sessionId: sid,
name: sessionsState.sessions[sid]?.peerLabel || "Member"
})));
} catch (error) {
groupRuntimesRef.current.delete(gid);
try {
runtime.destroy();
} catch (_) {
}
groupsDispatch({ type: GROUP_ACTIONS.REMOVE_GROUP, id: gid });
setGroupError(error?.code === "invitations_could_not_be_sent" ? t("err.inviteNotConnectedRetry") : `The group could not be created (${error?.code || "unknown error"}).`);
}
}, [sendGroupFrame, groupEmitter, sessionsState]);
const handleAcceptInvite = React.useCallback(async () => {
const invite = pendingInvite;
if (!invite) return;
setPendingInvite(null);
const runtime = new GroupSession({
groupId: invite.gid,
name: invite.name,
isAdmin: false,
subtle: crypto.subtle,
send: sendGroupFrame,
emit: groupEmitter(invite.gid),
mesh: makeMeshAdapter(invite.gid)
});
groupRuntimesRef.current.set(invite.gid, runtime);
try {
await runtime.init();
groupsDispatch({
type: GROUP_ACTIONS.CREATE_GROUP,
entry: createGroupEntry({ id: invite.gid, name: invite.name, selfFp: runtime.selfFp })
});
await runtime.acceptInvite(invite.sessionId, invite.frame);
} catch (error) {
groupRuntimesRef.current.delete(invite.gid);
try {
runtime.destroy();
} catch (_) {
}
groupsDispatch({ type: GROUP_ACTIONS.SET_ERROR, id: invite.gid, error: error?.code || "join_failed" });
}
}, [pendingInvite, sendGroupFrame, groupEmitter]);
const handleConfirmGroupSas = React.useCallback(() => {
const gid = activeGroupIdRef.current;
const runtime = gid && groupRuntimesRef.current.get(gid);
if (!runtime) return;
try {
runtime.confirmSas();
setShowGroupCode(false);
} catch (error) {
groupsDispatch({ type: GROUP_ACTIONS.SET_ERROR, id: gid, error: error?.code || "confirm_failed" });
}
}, []);
const destroyGroup = React.useCallback((gid, { announce = true } = {}) => {
const runtime = groupRuntimesRef.current.get(gid);
const media = groupCallMediaRef.current.get(gid);
if (media) {
groupCallMediaRef.current.delete(gid);
media.leave().catch(() => {
});
}
setGroupCallState((current) => {
const next = { ...current };
delete next[gid];
return next;
});
setGroupCallMediaState((current) => {
const next = { ...current };
delete next[gid];
return next;
});
groupRuntimesRef.current.delete(gid);
lastUnreachableRef.current.delete(gid);
groupsDispatch({ type: GROUP_ACTIONS.REMOVE_GROUP, id: gid });
setShowGroupCode(false);
if (runtime) {
const done = announce ? Promise.resolve().then(() => runtime.leave()).catch(() => {
}) : Promise.resolve();
done.then(() => {
try {
runtime.destroy();
} catch (_) {
}
});
}
}, []);
const destroyGroupRef = React.useRef(destroyGroup);
destroyGroupRef.current = destroyGroup;
const handleSendGroupMessage = React.useCallback(async (text) => {
const gid = activeGroupIdRef.current;
const runtime = gid && groupRuntimesRef.current.get(gid);
if (!runtime) return;
const body = String(text || "").trim();
if (!body) return;
setGroupInput("");
try {
const { unreachable } = await runtime.sendText(body);
groupsDispatch({
type: GROUP_ACTIONS.ADD_MESSAGE,
id: gid,
message: buildGroupMessage(body, "sent")
});
const signature = unreachable.map((m) => m.fp).sort().join(",");
if (signature !== (lastUnreachableRef.current.get(gid) || "")) {
lastUnreachableRef.current.set(gid, signature);
if (unreachable.length > 0) {
const names = unreachable.map((m) => m.name);
const who = names.length === 1 ? `${names[0]} is` : `${names.slice(0, -1).join(", ")} and ${names[names.length - 1]} are`;
groupsDispatch({
type: GROUP_ACTIONS.ADD_MESSAGE,
id: gid,
message: buildGroupMessage(
`${who} offline and will not receive messages until they reconnect.`,
"system"
)
});
}
}
} catch (error) {
groupsDispatch({
type: GROUP_ACTIONS.ADD_MESSAGE,
id: gid,
message: buildGroupMessage(`Could not send: ${error?.message || "unknown error"}`, "system")
});
}
}, []);
const addCandidates = React.useMemo(() => {
if (!activeGroup) return [];
const taken = new Set(activeGroup.members.map((m) => m.sessionId).filter(Boolean));
return groupCandidates.filter((c) => !taken.has(c.id));
}, [activeGroup, groupCandidates]);
const handleAddMembers = React.useCallback(async (sessionIds) => {
setShowAddMembers(false);
const gid = activeGroupIdRef.current;
const runtime = gid && groupRuntimesRef.current.get(gid);
if (!runtime) return;
try {
await runtime.addMembers(sessionIds.map((sid) => ({
sessionId: sid,
name: sessionsState.sessions[sid]?.peerLabel || "Member"
})));
} catch (error) {
setGroupError(error?.code === "invitations_could_not_be_sent" ? t("err.inviteNotConnected") : error?.code === "too_many_members" ? `A group is limited to ${GROUP_LIMITS.MAX_MEMBERS} members.` : `Could not invite (${error?.code || "unknown error"}).`);
}
}, [sessionsState]);
const handleRemoveGroupMember = React.useCallback(async (fp) => {
const gid = activeGroupIdRef.current;
const runtime = gid && groupRuntimesRef.current.get(gid);
if (!runtime) return;
try {
await runtime.removeMember(fp);
} catch (error) {
groupsDispatch({ type: GROUP_ACTIONS.SET_ERROR, id: gid, error: error?.code || "remove_failed" });
}
}, []);
const syncGroupCallMedia = React.useCallback((gid, callOrNull) => {
const media = groupCallMediaRef.current.get(gid);
if (!media) return;
const runtime = groupRuntimesRef.current.get(gid);
const call = callOrNull !== null ? callOrNull : runtime?.getCallSnapshot?.() || null;
if (!call || !call.joined || call.callId !== media.callId) {
groupCallMediaRef.current.delete(gid);
media.leave().catch(() => {
});
setGroupCallMediaState((current) => {
const next = { ...current };
delete next[gid];
return next;
});
return;
}
media.setPeers(call.participants);
}, []);
const syncGroupCallMediaRef = React.useRef(syncGroupCallMedia);
syncGroupCallMediaRef.current = syncGroupCallMedia;
const openGroupCallMedia = React.useCallback(async (gid, call) => {
const existing = groupCallMediaRef.current.get(gid);
if (existing && existing.callId === call.callId) {
existing.setPeers(call.participants);
return existing;
}
if (existing) {
groupCallMediaRef.current.delete(gid);
await existing.leave().catch(() => {
});
}
const media = new GroupCallMedia({
getManager: (sessionId) => managersRef.current.get(sessionId) || meshLinksRef.current.get(sessionId)?.manager || null,
onChange: (snapshot) => {
setGroupCallMediaState((current) => ({ ...current, [gid]: snapshot }));
}
});
groupCallMediaRef.current.set(gid, media);
await media.join({
callId: call.callId,
selfFp: groupsState.groups[gid]?.selfFp || groupRuntimesRef.current.get(gid)?.selfFp || "",
withVideo: call.withVideo,
peers: []
// legs are connected after the announcement
});
return media;
}, [groupsState]);
const handleStartGroupCall = React.useCallback(async (withVideo) => {
const gid = activeGroupIdRef.current;
const runtime = gid && groupRuntimesRef.current.get(gid);
if (!runtime) return;
try {
await runtime.startCall({
withVideo,
prepare: (call) => openGroupCallMedia(gid, call)
});
} catch (error) {
const media = groupCallMediaRef.current.get(gid);
if (media) {
groupCallMediaRef.current.delete(gid);
media.leave().catch(() => {
});
}
const code = error?.code || "media_failed";
groupsDispatch({
type: GROUP_ACTIONS.ADD_MESSAGE,
id: gid,
message: buildGroupMessage(
code === "call_in_progress" ? t("groupCall.err.call_in_progress") : code === "not_ready" ? t("groupCall.err.not_ready") : t(`groupCall.err.${mediaErrorCode(error)}`),
"system"
)
});
}
}, [openGroupCallMedia]);
const handleJoinGroupCall = React.useCallback(async () => {
const gid = activeGroupIdRef.current;
const runtime = gid && groupRuntimesRef.current.get(gid);
const call = runtime?.getCallSnapshot?.();
if (!runtime || !call) return;
try {
const media = await openGroupCallMedia(gid, { ...call, joined: true });
await runtime.joinCall();
media.setPeers(runtime.getCallSnapshot()?.participants || []);
} catch (error) {
const media = groupCallMediaRef.current.get(gid);
if (media) {
groupCallMediaRef.current.delete(gid);
media.leave().catch(() => {
});
}
groupsDispatch({
type: GROUP_ACTIONS.ADD_MESSAGE,
id: gid,
message: buildGroupMessage(t(`groupCall.err.${mediaErrorCode(error)}`), "system")
});
}
}, [openGroupCallMedia]);
const handleDismissGroupCall = React.useCallback(() => {
const gid = activeGroupIdRef.current;
const call = gid && groupRuntimesRef.current.get(gid)?.getCallSnapshot?.();
if (!call) return;
setDismissedCalls((current) => ({ ...current, [gid]: call.callId }));
}, []);
const handleLeaveGroupCall = React.useCallback(async () => {
const gid = activeGroupIdRef.current;
if (!gid) return;
const media = groupCallMediaRef.current.get(gid);
if (media) {
groupCallMediaRef.current.delete(gid);
setGroupCallMediaState((current) => {
const next = { ...current };
delete next[gid];
return next;
});
await media.leave().catch(() => {
});
}
try {
await groupRuntimesRef.current.get(gid)?.leaveCall();
} catch (_) {
}
}, []);
const activeGroupMedia = React.useCallback(() => activeGroupIdRef.current ? groupCallMediaRef.current.get(activeGroupIdRef.current) : null, []);
const handleGroupCallMic = React.useCallback(() => {
activeGroupMedia()?.toggleMic();
}, [activeGroupMedia]);
const handleGroupCallCamera = React.useCallback(() => {
activeGroupMedia()?.toggleCamera();
}, [activeGroupMedia]);
const handleGroupCallFlip = React.useCallback(() => {
activeGroupMedia()?.flipCamera();
}, [activeGroupMedia]);
React.useEffect(() => {
if (!activeGroupId) return;
groupsDispatch({ type: GROUP_ACTIONS.CLEAR_UNREAD, id: activeGroupId });
}, [activeGroupId]);
React.useEffect(() => {
const el = groupScrollRef.current;
if (el) el.scrollTop = el.scrollHeight;
}, [activeGroup && activeGroup.messages.length]);
React.useEffect(() => () => {
for (const media of groupCallMediaRef.current.values()) {
media.leave().catch(() => {
});
}
groupCallMediaRef.current.clear();
for (const runtime of groupRuntimesRef.current.values()) {
try {
runtime.destroy();
} catch (_) {
}
}
groupRuntimesRef.current.clear();
for (const sessionId of [...meshLinksRef.current.keys()]) {
closeMeshLinkRef.current(sessionId);
}
}, []);
const flushReadAcks = React.useCallback((id) => {
if (!id) return;
const q = queuesRef.current.get(id);
const mgr = managersRef.current.get(id);
if (!q || !mgr || !q.pendingReadAcks || q.pendingReadAcks.length === 0) return;
const acks = q.pendingReadAcks;
q.pendingReadAcks = [];
for (const mid of acks) {
try {
mgr.sendDeliveryReceipt?.(mid);
} catch (_) {
}
}
}, []);
React.useEffect(() => {
if (!activeSessionId) return;
dispatch({ type: SESSION_ACTIONS.CLEAR_UNREAD, id: activeSessionId });
if (typeof document === "undefined" || document.visibilityState === "visible") flushReadAcks(activeSessionId);
}, [activeSessionId, flushReadAcks]);
const didInitRef = React.useRef(false);
React.useEffect(() => {
if (didInitRef.current) return;
didInitRef.current = true;
let isTabSwitching = false;
let tabSwitchTimeout = null;
const handleBeforeUnload = (event) => {
if (event.type === "beforeunload" && !isTabSwitching) {
for (const mgr of managersRef.current.values()) {
try {
if (mgr.isConnected && mgr.isConnected()) {
try {
mgr.sendSystemMessage({ type: "peer_disconnect", reason: "user_disconnect", timestamp: Date.now() });
} catch (_) {
}
setTimeout(() => {
try {
mgr.disconnect();
} catch (_) {
}
}, 100);
} else {
mgr.disconnect();
}
} catch (_) {
}
}
} else if (isTabSwitching) {
event.preventDefault();
event.returnValue = "";
}
};
const handleVisibilityChange = () => {
if (document.visibilityState === "hidden") {
isTabSwitching = true;
if (tabSwitchTimeout) clearTimeout(tabSwitchTimeout);
tabSwitchTimeout = setTimeout(() => {
isTabSwitching = false;
}, 5e3);
} else if (document.visibilityState === "visible") {
isTabSwitching = false;
if (tabSwitchTimeout) {
clearTimeout(tabSwitchTimeout);
tabSwitchTimeout = null;
}
flushReadAcks(activeIdRef.current);
}
};
window.addEventListener("beforeunload", handleBeforeUnload);
document.addEventListener("visibilitychange", handleVisibilityChange);
return () => {
window.removeEventListener("beforeunload", handleBeforeUnload);
document.removeEventListener("visibilitychange", handleVisibilityChange);
if (tabSwitchTimeout) {
clearTimeout(tabSwitchTimeout);
tabSwitchTimeout = null;
}
for (const mgr of managersRef.current.values()) {
try {
mgr.disconnect();
} catch (_) {
}
}
managersRef.current.clear();
for (const integ of integrationsRef.current.values()) {
try {
integ.cleanup?.();
} catch (_) {
}
}
integrationsRef.current.clear();
queuesRef.current.clear();
statusRef.current.clear();
};
}, []);
const compressOfferData = (offerData2) => {
try {
const offer = typeof offerData2 === "string" ? JSON.parse(offerData2) : offerData2;
const minimalOffer = {
type: offer.type,
version: offer.version,
timestamp: offer.timestamp,
sessionId: offer.sessionId,
connectionId: offer.connectionId,
verificationCode: offer.verificationCode,
salt: offer.salt,
// Use only key fingerprints instead of full keys
keyFingerprints: offer.keyFingerprints,
// Add a reference to get full data
fullDataAvailable: true,
compressionLevel: "minimal"
};
return JSON.stringify(minimalOffer);
} catch (error) {
console.error("Error compressing offer data:", error);
return offerData2;
}
};
const createTemplateOffer = (offer) => {
const templateOffer = {
type: "enhanced_secure_offer_template",
version: "4.0",
sessionId: offer.sessionId,
connectionId: offer.connectionId,
verificationCode: offer.verificationCode,
timestamp: offer.timestamp,
// Avoid bulky fields (SDP, raw keys); keep only fingerprints and essentials
keyFingerprints: offer.keyFingerprints,
// Keep concise auth hints (omit large nonces)
authChallenge: offer?.authChallenge?.challenge,
// Optionally include a compact capability hint if small
capabilities: Array.isArray(offer.capabilities) && offer.capabilities.length <= 5 ? offer.capabilities : void 0
};
return templateOffer;
};
const MAX_QR_LEN = 800;
const BIN_MAX_QR_LEN = 400;
const [qrFramesTotal, setQrFramesTotal] = React.useState(0);
const [qrFrameIndex, setQrFrameIndex] = React.useState(0);
const [qrManualMode, setQrManualMode] = React.useState(false);
const qrAnimationRef = React.useRef({ timer: null, chunks: [], idx: 0, active: false });
React.useEffect(() => () => {
try {
if (qrAnimationRef.current && qrAnimationRef.current.timer) {
clearInterval(qrAnimationRef.current.timer);
qrAnimationRef.current.timer = null;
}
} catch {
}
}, [activeSessionId]);
const stopQrAnimation = () => {
try {
if (qrAnimationRef.current.timer) {
clearInterval(qrAnimationRef.current.timer);
}
} catch {
}
qrAnimationRef.current = { timer: null, chunks: [], idx: 0, active: false };
setQrFrameIndex(0);
setQrFramesTotal(0);
setQrManualMode(false);
};
const renderCurrent = async () => {
const { chunks, idx } = qrAnimationRef.current || {};
if (!chunks || !chunks.length) return;
const current = chunks[idx % chunks.length];
try {
const isDesktop = typeof window !== "undefined" && (window.innerWidth || 0) >= 1024;
const QR_SIZE = isDesktop ? 720 : 512;
const url = await (window.generateQRCode ? window.generateQRCode(current, { errorCorrectionLevel: "M", margin: 2, size: QR_SIZE }) : Promise.resolve(""));
if (url) setQrCodeUrl(url);
} catch (e) {
console.warn("Animated QR render error (current):", e);
}
setQrFrameIndex((qrAnimationRef.current?.idx || 0) % (qrAnimationRef.current?.chunks?.length || 1) + 1);
};
const renderAndAdvance = async () => {
await renderCurrent();
const len = qrAnimationRef.current?.chunks?.length || 0;
if (len > 0) {
const nextIdx = ((qrAnimationRef.current?.idx || 0) + 1) % len;
qrAnimationRef.current.idx = nextIdx;
setQrFrameIndex(nextIdx + 1);
}
};
const toggleQrManualMode = () => {
const newManualMode = !qrManualMode;
setQrManualMode(newManualMode);
if (newManualMode) {
if (qrAnimationRef.current.timer) {
clearInterval(qrAnimationRef.current.timer);
qrAnimationRef.current.timer = null;
}
console.log("QR Manual mode enabled - auto-scroll stopped");
} else {
if (qrAnimationRef.current.chunks.length > 1) {
const intervalMs = 3e3;
qrAnimationRef.current.active = true;
clearInterval(qrAnimationRef.current.timer);
qrAnimationRef.current.timer = setInterval(renderAndAdvance, intervalMs);
}
console.log("QR Manual mode disabled - auto-scroll resumed");
}
};
const nextQrFrame = async () => {
console.log("\u{1F3AE} nextQrFrame called, qrFramesTotal:", qrFramesTotal, "qrAnimationRef.current:", qrAnimationRef.current);
if (qrAnimationRef.current.chunks.length > 1) {
const nextIdx = (qrAnimationRef.current.idx + 1) % qrAnimationRef.current.chunks.length;
qrAnimationRef.current.idx = nextIdx;
setQrFrameIndex(nextIdx + 1);
console.log("\u{1F3AE} Next frame index:", nextIdx + 1);
try {
clearInterval(qrAnimationRef.current.timer);
} catch {
}
qrAnimationRef.current.timer = null;
await renderCurrent();
if (!qrManualMode && qrAnimationRef.current.chunks.length > 1) {
const intervalMs = 3e3;
qrAnimationRef.current.active = true;
qrAnimationRef.current.timer = setInterval(renderAndAdvance, intervalMs);
} else {
qrAnimationRef.current.active = false;
}
} else {
console.log("\u{1F3AE} No multiple frames to navigate");
}
};
const prevQrFrame = async () => {
console.log("\u{1F3AE} prevQrFrame called, qrFramesTotal:", qrFramesTotal, "qrAnimationRef.current:", qrAnimationRef.current);
if (qrAnimationRef.current.chunks.length > 1) {
const prevIdx = (qrAnimationRef.current.idx - 1 + qrAnimationRef.current.chunks.length) % qrAnimationRef.current.chunks.length;
qrAnimationRef.current.idx = prevIdx;
setQrFrameIndex(prevIdx + 1);
console.log("\u{1F3AE} Previous frame index:", prevIdx + 1);
try {
clearInterval(qrAnimationRef.current.timer);
} catch {
}
qrAnimationRef.current.timer = null;
await renderCurrent();
if (!qrManualMode && qrAnimationRef.current.chunks.length > 1) {
const intervalMs = 3e3;
qrAnimationRef.current.active = true;
qrAnimationRef.current.timer = setInterval(renderAndAdvance, intervalMs);
} else {
qrAnimationRef.current.active = false;
}
} else {
console.log("\u{1F3AE} No multiple frames to navigate");
}
};
const qrChunksBufferRef = React.useRef({ id: null, total: 0, seen: /* @__PURE__ */ new Set(), items: [] });
const generateQRCode = async (data) => {
try {
const originalSize = typeof data === "string" ? data.length : JSON.stringify(data).length;
const isDesktop = typeof window !== "undefined" && (window.innerWidth || 0) >= 1024;
const QR_SIZE = isDesktop ? 720 : 512;
if (typeof window.generateBinaryQRCodeFromObject === "function") {
try {
const obj = typeof data === "string" ? JSON.parse(data) : data;
const qrDataUrl = await window.generateBinaryQRCodeFromObject(obj, { errorCorrectionLevel: "M", size: QR_SIZE, margin: 2 });
if (qrDataUrl) {
try {
if (qrAnimationRef.current && qrAnimationRef.current.timer) {
clearInterval(qrAnimationRef.current.timer);
}
} catch {
}
qrAnimationRef.current = { timer: null, chunks: [], idx: 0, active: false };
setQrFrameIndex(0);
setQrFramesTotal(0);
setQrManualMode(false);
setQrCodeUrl(qrDataUrl);
setQrFramesTotal(1);
setQrFrameIndex(1);
return;
}
} catch (e) {
console.warn("Binary QR generation failed, falling back to compressed:", e?.message || e);
}
}
if (typeof window.generateCompressedQRCode === "function") {
try {
const payload2 = typeof data === "string" ? data : JSON.stringify(data);
const qrDataUrl = await window.generateCompressedQRCode(payload2, { errorCorrectionLevel: "M", size: QR_SIZE, margin: 2 });
if (qrDataUrl) {
try {
if (qrAnimationRef.current && qrAnimationRef.current.timer) {
clearInterval(qrAnimationRef.current.timer);
}
} catch {
}
qrAnimationRef.current = { timer: null, chunks: [], idx: 0, active: false };
setQrFrameIndex(0);
setQrFramesTotal(0);
setQrManualMode(false);
setQrCodeUrl(qrDataUrl);
setQrFramesTotal(1);
setQrFrameIndex(1);
return;
}
} catch (e) {
console.warn("Compressed QR generation failed, falling back to plain:", e?.message || e);
}
}
const payload = typeof data === "string" ? data : JSON.stringify(data);
if (payload.length <= MAX_QR_LEN) {
if (!window.generateQRCode) throw new Error("QR code generator unavailable");
try {
if (qrAnimationRef.current && qrAnimationRef.current.timer) {
clearInterval(qrAnimationRef.current.timer);
}
} catch {
}
qrAnimationRef.current = { timer: null, chunks: [], idx: 0, active: false };
setQrFrameIndex(0);
setQrFramesTotal(0);
setQrManualMode(false);
const qrDataUrl = await window.generateQRCode(payload, { errorCorrectionLevel: "M", size: QR_SIZE, margin: 2 });
setQrCodeUrl(qrDataUrl);
setQrFramesTotal(1);
setQrFrameIndex(1);
return;
}
try {
if (qrAnimationRef.current && qrAnimationRef.current.timer) {
clearInterval(qrAnimationRef.current.timer);
}
} catch {
}
qrAnimationRef.current = { timer: null, chunks: [], idx: 0, active: false };
setQrFrameIndex(0);
setQrFramesTotal(0);
setQrManualMode(false);
const id = `raw_${Date.now()}_${Math.random().toString(36).slice(2)}`;
const TARGET_CHUNKS = 10;
const FRAME_MAX = Math.max(200, Math.floor(payload.length / TARGET_CHUNKS));
const total = Math.ceil(payload.length / FRAME_MAX);
const rawChunks = [];
for (let i = 0; i < total; i++) {
const seq = i + 1;
const part = payload.slice(i * FRAME_MAX, (i + 1) * FRAME_MAX);
rawChunks.push(JSON.stringify({ hdr: { v: 1, id, seq, total, rt: "raw" }, body: part }));
}
if (!window.generateQRCode) throw new Error("QR code generator unavailable");
if (rawChunks.length === 1) {
const url = await window.generateQRCode(rawChunks[0], { errorCorrectionLevel: "M", margin: 2, size: QR_SIZE });
setQrCodeUrl(url);
setQrFramesTotal(1);
setQrFrameIndex(1);
return;
}
qrAnimationRef.current.chunks = rawChunks;
qrAnimationRef.current.idx = 0;
qrAnimationRef.current.active = true;
setQrFramesTotal(rawChunks.length);
setQrFrameIndex(1);
const EC_OPTS = { errorCorrectionLevel: "M", margin: 2, size: QR_SIZE };
await renderNext();
if (!qrManualMode) {
const intervalMs = 4e3;
qrAnimationRef.current.active = true;
qrAnimationRef.current.timer = setInterval(renderAndAdvance, intervalMs);
}
return;
} catch (error) {
console.error("QR code generation failed:", error);
setMessages((prev) => [...prev, {
message: ` QR code generation failed: ${error.message}`,
type: "error"
}]);
}
};
const reconstructFromTemplate = (templateData) => {
const fullOffer = {
type: "enhanced_secure_offer",
version: templateData.version,
timestamp: templateData.timestamp,
sessionId: templateData.sessionId,
connectionId: templateData.connectionId,
verificationCode: templateData.verificationCode,
salt: templateData.salt,
sdp: templateData.sdp,
keyFingerprints: templateData.keyFingerprints,
capabilities: templateData.capabilities,
// Reconstruct ECDH key object
ecdhPublicKey: {
keyType: "ECDH",
keyData: templateData.ecdhKeyData,
timestamp: templateData.timestamp - 1e3,
// Approximate
version: templateData.version,
signature: templateData.ecdhSignature
},
// Reconstruct ECDSA key object
ecdsaPublicKey: {
keyType: "ECDSA",
keyData: templateData.ecdsaKeyData,
timestamp: templateData.timestamp - 999,
// Approximate
version: templateData.version,
signature: templateData.ecdsaSignature
},
// Reconstruct auth challenge
authChallenge: {
challenge: templateData.authChallenge,
timestamp: templateData.timestamp,
nonce: templateData.authNonce,
version: templateData.version
},
// Generate security level (can be recalculated)
securityLevel: {
level: "CRITICAL",
score: 20,
color: "red",
verificationResults: {
encryption: { passed: false, details: "Encryption not working", points: 0 },
keyExchange: { passed: true, details: "Simple key exchange verified", points: 15 },
messageIntegrity: { passed: false, details: "Message integrity failed", points: 0 },
rateLimiting: { passed: true, details: "Rate limiting active", points: 5 },
ecdsa: { passed: false, details: "Enhanced session required - feature not available", points: 0 },
metadataProtection: { passed: false, details: "Enhanced session required - feature not available", points: 0 },
pfs: { passed: false, details: "Enhanced session required - feature not available", points: 0 },
nestedEncryption: { passed: false, details: "Enhanced session required - feature not available", points: 0 },
packetPadding: { passed: false, details: "Enhanced session required - feature not available", points: 0 },
advancedFeatures: { passed: false, details: "Premium session required - feature not available", points: 0 }
},
timestamp: templateData.timestamp,
details: "Real verification: 20/100 security checks passed (2/4 available)",
isRealData: true,
passedChecks: 2,
totalChecks: 4,
sessionType: "demo",
maxPossibleScore: 50
}
};
return fullOffer;
};
const handleQRScan = async (scannedData) => {
try {
console.log("QR Code scanned:", scannedData.substring(0, 100) + "...");
console.log("Current buffer state:", qrChunksBufferRef.current);
if (scannedData.startsWith("SB2:") || scannedData.charCodeAt(0) === 2) {
qrChunksBufferRef.current = { id: null, total: 0, seen: /* @__PURE__ */ new Set(), items: [] };
if (showOfferStep) {
setAnswerInput(scannedData);
} else {
setOfferInput(scannedData);
}
setMessages((prev) => [...prev, {
message: t("flow.invitationCaptured"),
type: "success"
}]);
setShowQRScannerModal(false);
return Promise.resolve(true);
}
if (scannedData.startsWith("SB1:bin:") || qrChunksBufferRef.current && qrChunksBufferRef.current.id) {
console.log("Binary chunk detected:", scannedData.substring(0, 50) + "...");
if (!qrChunksBufferRef.current.id) {
console.log("Initializing buffer for binary chunks");
qrChunksBufferRef.current = {
id: `bin_${Date.now()}`,
// SB1 payloads are split into exactly four
// frames by the generator above. SBQ2 never
// reaches here — it is one frame and is
// handled at the top of this function.
total: 4,
seen: /* @__PURE__ */ new Set(),
items: [],
lastUpdateMs: Date.now()
};
}
const chunkHash = scannedData.substring(0, 50);
if (qrChunksBufferRef.current.seen.has(chunkHash)) {
console.log(`Chunk already scanned, ignoring...`);
return Promise.resolve(false);
}
qrChunksBufferRef.current.seen.add(chunkHash);
qrChunksBufferRef.current.items.push(scannedData);
qrChunksBufferRef.current.lastUpdateMs = Date.now();
try {
const uniqueCount = qrChunksBufferRef.current.seen.size;
document.dispatchEvent(new CustomEvent("qr-scan-progress", {
detail: {
id: qrChunksBufferRef.current.id,
seq: uniqueCount,
total: qrChunksBufferRef.current.total
}
}));
setQrFramesTotal(qrChunksBufferRef.current.total);
setQrFrameIndex(uniqueCount);
} catch {
}
const isComplete = qrChunksBufferRef.current.seen.size >= qrChunksBufferRef.current.total;
console.log(`Chunks collected: ${qrChunksBufferRef.current.seen.size}/${qrChunksBufferRef.current.total}, complete: ${isComplete}`);
if (!isComplete) {
console.log(`Scanned chunk ${qrChunksBufferRef.current.seen.size}/${qrChunksBufferRef.current.total}, waiting for more...`);
return Promise.resolve(false);
}
try {
const fullBinaryData = qrChunksBufferRef.current.items.join("");
if (showOfferStep) {
setAnswerInput(fullBinaryData);
} else {
setOfferInput(fullBinaryData);
}
setMessages((prev) => [...prev, {
message: "All binary chunks captured. Payload reconstructed.",
type: "success"
}]);
qrChunksBufferRef.current = { id: null, total: 0, seen: /* @__PURE__ */ new Set(), items: [] };
setShowQRScannerModal(false);
return Promise.resolve(true);
} catch (e) {
console.warn("Binary chunks reconstruction failed:", e);
return Promise.resolve(false);
}
}
if (scannedData.length > 100 && !scannedData.startsWith("{") && !scannedData.startsWith("[")) {
console.log("Detected potential binary chunk (long non-JSON string):", scannedData.substring(0, 50) + "...");
if (!qrChunksBufferRef.current.id) {
console.log("Initializing buffer for potential binary chunks");
qrChunksBufferRef.current = {
id: `bin_${Date.now()}`,
// SB1 payloads are split into exactly four
// frames by the generator above. SBQ2 never
// reaches here — it is one frame and is
// handled at the top of this function.
total: 4,
seen: /* @__PURE__ */ new Set(),
items: [],
lastUpdateMs: Date.now()
};
}
const chunkHash = scannedData.substring(0, 50);
if (qrChunksBufferRef.current.seen.has(chunkHash)) {
console.log(`Chunk already scanned, ignoring...`);
return Promise.resolve(false);
}
qrChunksBufferRef.current.seen.add(chunkHash);
qrChunksBufferRef.current.items.push(scannedData);
qrChunksBufferRef.current.lastUpdateMs = Date.now();
try {
const uniqueCount = qrChunksBufferRef.current.seen.size;
document.dispatchEvent(new CustomEvent("qr-scan-progress", {
detail: {
id: qrChunksBufferRef.current.id,
seq: uniqueCount,
total: qrChunksBufferRef.current.total
}
}));
setQrFramesTotal(qrChunksBufferRef.current.total);
setQrFrameIndex(uniqueCount);
} catch {
}
const isComplete = qrChunksBufferRef.current.seen.size >= qrChunksBufferRef.current.total;
console.log(`Chunks collected: ${qrChunksBufferRef.current.seen.size}/${qrChunksBufferRef.current.total}, complete: ${isComplete}`);
if (!isComplete) {
console.log(`Scanned chunk ${qrChunksBufferRef.current.seen.size}/${qrChunksBufferRef.current.total}, waiting for more...`);
return Promise.resolve(false);
}
try {
const fullBinaryData = qrChunksBufferRef.current.items.join("");
if (showOfferStep) {
setAnswerInput(fullBinaryData);
} else {
setOfferInput(fullBinaryData);
}
setMessages((prev) => [...prev, {
message: "All binary chunks captured. Payload reconstructed.",
type: "success"
}]);
qrChunksBufferRef.current = { id: null, total: 0, seen: /* @__PURE__ */ new Set(), items: [] };
setShowQRScannerModal(false);
return Promise.resolve(true);
} catch (e) {
console.warn("Binary chunks reconstruction failed:", e);
return Promise.resolve(false);
}
}
let parsedData;
if (typeof window.decodeAnyPayload === "function") {
const any = window.decodeAnyPayload(scannedData);
if (typeof any === "string") {
parsedData = JSON.parse(any);
} else {
parsedData = any;
}
} else {
const maybeDecompressed = typeof window.decompressIfNeeded === "function" ? window.decompressIfNeeded(scannedData) : scannedData;
parsedData = JSON.parse(maybeDecompressed);
}
console.log("Decoded data:", parsedData);
if (parsedData.hdr && parsedData.body) {
const { hdr } = parsedData;
if (!qrChunksBufferRef.current.id || qrChunksBufferRef.current.id !== hdr.id) {
qrChunksBufferRef.current = { id: hdr.id, total: hdr.total || 1, seen: /* @__PURE__ */ new Set(), items: [], lastUpdateMs: Date.now() };
try {
document.dispatchEvent(new CustomEvent("qr-scan-progress", { detail: { id: hdr.id, seq: 0, total: hdr.total || 1 } }));
} catch {
}
}
if (!qrChunksBufferRef.current.seen.has(hdr.seq)) {
qrChunksBufferRef.current.seen.add(hdr.seq);
qrChunksBufferRef.current.items.push(scannedData);
qrChunksBufferRef.current.lastUpdateMs = Date.now();
}
try {
const uniqueCount = qrChunksBufferRef.current.seen.size;
document.dispatchEvent(new CustomEvent("qr-scan-progress", { detail: { id: hdr.id, seq: uniqueCount, total: qrChunksBufferRef.current.total || hdr.total || 0 } }));
} catch {
}
const isComplete = qrChunksBufferRef.current.seen.size >= (qrChunksBufferRef.current.total || 1);
if (!isComplete) {
return Promise.resolve(false);
}
if (hdr.rt === "raw") {
try {
const parts = qrChunksBufferRef.current.items.map((s) => JSON.parse(s)).sort((a, b) => (a.hdr.seq || 0) - (b.hdr.seq || 0)).map((p) => p.body || "");
const fullText = parts.join("");
const payloadObj = JSON.parse(fullText);
if (showOfferStep) {
setAnswerInput(JSON.stringify(payloadObj, null, 2));
} else {
setOfferInput(JSON.stringify(payloadObj, null, 2));
}
setMessages((prev) => [...prev, { message: "All frames captured. RAW payload reconstructed.", type: "success" }]);
try {
document.dispatchEvent(new CustomEvent("qr-scan-complete", { detail: { id: hdr.id } }));
} catch {
}
qrChunksBufferRef.current = { id: null, total: 0, seen: /* @__PURE__ */ new Set(), items: [] };
setShowQRScannerModal(false);
return Promise.resolve(true);
} catch (e) {
console.warn("RAW multi-frame reconstruction failed:", e);
return Promise.resolve(false);
}
} else if (hdr.rt === "bin") {
try {
const parts = qrChunksBufferRef.current.items.map((s) => JSON.parse(s)).sort((a, b) => (a.hdr.seq || 0) - (b.hdr.seq || 0)).map((p) => p.body || "");
const fullText = parts.join("");
let payloadObj;
if (typeof window.decodeAnyPayload === "function") {
const any = window.decodeAnyPayload(fullText);
payloadObj = typeof any === "string" ? JSON.parse(any) : any;
} else {
payloadObj = JSON.parse(fullText);
}
if (showOfferStep) {
setAnswerInput(JSON.stringify(payloadObj, null, 2));
} else {
setOfferInput(JSON.stringify(payloadObj, null, 2));
}
setMessages((prev) => [...prev, { message: "All frames captured. BIN payload reconstructed.", type: "success" }]);
try {
document.dispatchEvent(new CustomEvent("qr-scan-complete", { detail: { id: hdr.id } }));
} catch {
}
qrChunksBufferRef.current = { id: null, total: 0, seen: /* @__PURE__ */ new Set(), items: [] };
setShowQRScannerModal(false);
return Promise.resolve(true);
} catch (e) {
console.warn("BIN multi-frame reconstruction failed:", e);
return Promise.resolve(false);
}
} else if (window.receiveAndProcess) {
try {
const results = await window.receiveAndProcess(qrChunksBufferRef.current.items);
if (results.length > 0) {
const { payloadObj } = results[0];
if (showOfferStep) {
setAnswerInput(JSON.stringify(payloadObj, null, 2));
} else {
setOfferInput(JSON.stringify(payloadObj, null, 2));
}
setMessages((prev) => [...prev, { message: "All frames captured. COSE payload reconstructed.", type: "success" }]);
try {
document.dispatchEvent(new CustomEvent("qr-scan-complete", { detail: { id: hdr.id } }));
} catch {
}
qrChunksBufferRef.current = { id: null, total: 0, seen: /* @__PURE__ */ new Set(), items: [] };
setShowQRScannerModal(false);
return Promise.resolve(true);
}
} catch (e) {
console.warn("COSE multi-chunk processing failed:", e);
}
return Promise.resolve(false);
} else {
return Promise.resolve(false);
}
}
if (parsedData.type === "enhanced_secure_offer_template") {
console.log("QR scan: Template-based offer detected, reconstructing...");
const fullOffer = reconstructFromTemplate(parsedData);
if (showOfferStep) {
setAnswerInput(JSON.stringify(fullOffer, null, 2));
console.log("\u{1F4F1} Template data populated to answerInput (waiting for response mode)");
} else {
setOfferInput(JSON.stringify(fullOffer, null, 2));
console.log("\u{1F4F1} Template data populated to offerInput (paste invitation mode)");
}
setMessages((prev) => [...prev, {
message: "\u{1F4F1} QR code scanned successfully! Full offer reconstructed from template.",
type: "success"
}]);
setShowQRScannerModal(false);
return true;
} else if (parsedData.type === "secure_offer_reference") {
setMessages((prev) => [...prev, {
message: t("err.retiredQr"),
type: "error"
}]);
return false;
} else {
if (!parsedData.sdp && parsedData.type === "enhanced_secure_offer") {
setMessages((prev) => [...prev, {
message: t("err.compressedQrNote"),
type: "warning"
}]);
}
if (showOfferStep) {
console.log("QR scan: Populating answerInput with:", parsedData);
setAnswerInput(JSON.stringify(parsedData, null, 2));
} else {
console.log("QR scan: Populating offerInput with:", parsedData);
setOfferInput(JSON.stringify(parsedData, null, 2));
}
setMessages((prev) => [...prev, {
message: "\u{1F4F1} QR code scanned successfully!",
type: "success"
}]);
setShowQRScannerModal(false);
return true;
}
} catch (error) {
if (showOfferStep) {
setAnswerInput(scannedData);
} else {
setOfferInput(scannedData);
}
setMessages((prev) => [...prev, {
message: "\u{1F4F1} QR code scanned successfully!",
type: "success"
}]);
setShowQRScannerModal(false);
return true;
}
};
const handleCreateOffer = async () => {
try {
setIsGeneratingKeys(true);
setOfferData("");
setShowOfferStep(false);
setShowQRCode(false);
setQrCodeUrl("");
const offer = await webrtcManagerRef.current.createSecureOffer();
setOfferData(offer);
setShowOfferStep(true);
const offerString = typeof offer === "object" ? JSON.stringify(offer) : offer;
try {
if (typeof window.encodeBinaryToPrefixed === "function") {
const bin = window.encodeBinaryToPrefixed(offerString);
const TARGET_CHUNKS = 4;
let total = TARGET_CHUNKS;
let FRAME_MAX = Math.max(200, Math.ceil(bin.length / TARGET_CHUNKS));
if (FRAME_MAX <= 0) FRAME_MAX = 200;
if (bin.length <= FRAME_MAX) {
total = 1;
FRAME_MAX = bin.length;
} else {
FRAME_MAX = Math.ceil(bin.length / TARGET_CHUNKS);
total = TARGET_CHUNKS;
}
const id = `bin_${Date.now()}_${Math.random().toString(36).slice(2)}`;
const chunks = [];
for (let i = 0; i < total; i++) {
const seq = i + 1;
const part = bin.slice(i * FRAME_MAX, (i + 1) * FRAME_MAX);
chunks.push(part);
}
const isDesktop = typeof window !== "undefined" && (window.innerWidth || 0) >= 1024;
const QR_SIZE = isDesktop ? 720 : 512;
if (window.generateQRCode && chunks.length > 0) {
const firstUrl = await window.generateQRCode(chunks[0], { errorCorrectionLevel: "M", size: QR_SIZE, margin: 2 });
if (firstUrl) setQrCodeUrl(firstUrl);
}
try {
if (qrAnimationRef.current && qrAnimationRef.current.timer) {
clearInterval(qrAnimationRef.current.timer);
}
} catch {
}
qrAnimationRef.current = { timer: null, chunks, idx: 0, active: true };
setQrFramesTotal(chunks.length);
setQrFrameIndex(1);
setQrManualMode(false);
const intervalMs = 3e3;
qrAnimationRef.current.timer = setInterval(renderAndAdvance, intervalMs);
try {
setShowQRCode(true);
} catch {
}
} else {
await generateQRCode(offer);
try {
setShowQRCode(true);
} catch {
}
}
} catch (e) {
console.warn("Offer QR generation failed:", e);
}
const existingMessages = messages.filter(
(m) => m.type === "system" && (m.message.includes(t("flow.invitationCreated")) || m.message.includes(t("flow.sendEncryptedCode")))
);
if (existingMessages.length === 0) {
setMessages((prev) => [...prev, {
message: t("flow.invitationCreatedBang"),
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
setMessages((prev) => [...prev, {
message: t("flow.sendInvitation"),
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
}
if (!window.isUpdatingSecurity) {
updateSecurityLevel().catch(console.error);
}
} catch (error) {
setMessages((prev) => [...prev, {
message: `Error creating invitation: ${error.message}`,
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
} finally {
setIsGeneratingKeys(false);
}
};
const handleCreateAnswer = async () => {
try {
if (!offerInput.trim()) {
setMessages((prev) => [...prev, {
message: t("err.needInvitation"),
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
return;
}
try {
setMessages((prev) => [...prev, {
message: t("flow.processingInvitation"),
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
let offer;
try {
if (typeof window.decodeAnyPayload === "function") {
const any = window.decodeAnyPayload(offerInput.trim());
offer = typeof any === "string" ? JSON.parse(any) : any;
} else {
const rawText = typeof window.decompressIfNeeded === "function" ? window.decompressIfNeeded(offerInput.trim()) : offerInput.trim();
offer = JSON.parse(rawText);
}
} catch (parseError) {
throw new Error(`Invalid invitation format: ${parseError.message}`);
}
if (!offer || typeof offer !== "object") {
throw new Error("The invitation must be an object");
}
const isValidOfferType = offer.t === "offer" || offer.type === "enhanced_secure_offer";
if (!isValidOfferType) {
throw new Error("Invalid invitation type. Expected offer or enhanced_secure_offer");
}
const answer = await webrtcManagerRef.current.createSecureAnswer(offer);
setAnswerData(answer);
setShowAnswerStep(true);
const answerString = typeof answer === "object" ? JSON.stringify(answer) : answer;
try {
if (typeof window.encodeBinaryToPrefixed === "function") {
const bin = window.encodeBinaryToPrefixed(answerString);
const TARGET_CHUNKS = 4;
let total = TARGET_CHUNKS;
let FRAME_MAX = Math.max(200, Math.ceil(bin.length / TARGET_CHUNKS));
if (FRAME_MAX <= 0) FRAME_MAX = 200;
if (bin.length <= FRAME_MAX) {
total = 1;
FRAME_MAX = bin.length;
} else {
FRAME_MAX = Math.ceil(bin.length / TARGET_CHUNKS);
total = TARGET_CHUNKS;
}
const id = `ans_${Date.now()}_${Math.random().toString(36).slice(2)}`;
const chunks = [];
for (let i = 0; i < total; i++) {
const seq = i + 1;
const part = bin.slice(i * FRAME_MAX, (i + 1) * FRAME_MAX);
chunks.push(part);
}
const isDesktop = typeof window !== "undefined" && (window.innerWidth || 0) >= 1024;
const QR_SIZE = isDesktop ? 720 : 512;
if (window.generateQRCode && chunks.length > 0) {
const firstUrl = await window.generateQRCode(chunks[0], { errorCorrectionLevel: "M", size: QR_SIZE, margin: 2 });
if (firstUrl) setQrCodeUrl(firstUrl);
}
try {
if (qrAnimationRef.current && qrAnimationRef.current.timer) {
clearInterval(qrAnimationRef.current.timer);
}
} catch {
}
qrAnimationRef.current = { timer: null, chunks, idx: 0, active: true };
setQrFramesTotal(chunks.length);
setQrFrameIndex(1);
setQrManualMode(false);
const intervalMs = 3e3;
qrAnimationRef.current.timer = setInterval(renderAndAdvance, intervalMs);
try {
setShowQRCode(true);
} catch {
}
} else {
await generateQRCode(answer);
try {
setShowQRCode(true);
} catch {
}
}
} catch (e) {
console.warn("Answer QR generation failed:", e);
}
if (typeof markAnswerCreated === "function") {
markAnswerCreated();
}
const existingResponseMessages = messages.filter(
(m) => m.type === "system" && (m.message.includes(t("flow.responseCreated")) || m.message.includes(t("flow.sendTheResponse")))
);
if (existingResponseMessages.length === 0) {
setMessages((prev) => [...prev, {
message: t("flow.responseCreatedBang"),
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
setMessages((prev) => [...prev, {
message: t("flow.sendResponse"),
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
}
if (!window.isUpdatingSecurity) {
updateSecurityLevel().catch(console.error);
}
} catch (error) {
console.error("Error in handleCreateAnswer:", error);
setMessages((prev) => [...prev, {
message: `Error processing the invitation: ${error.message}`,
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
}
} catch (error) {
console.error("Error in handleCreateAnswer:", error);
setMessages((prev) => [...prev, {
message: `Invitation processing error: ${error.message}`,
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
}
};
const handleConnect = async () => {
try {
if (!answerInput.trim()) {
setMessages((prev) => [...prev, {
message: t("err.needResponse"),
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
return;
}
try {
setMessages((prev) => [...prev, {
message: t("flow.processingResponse"),
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
let answer;
try {
if (typeof window.decodeAnyPayload === "function") {
const anyAnswer = window.decodeAnyPayload(answerInput.trim());
answer = typeof anyAnswer === "string" ? JSON.parse(anyAnswer) : anyAnswer;
} else {
const rawText = typeof window.decompressIfNeeded === "function" ? window.decompressIfNeeded(answerInput.trim()) : answerInput.trim();
answer = JSON.parse(rawText);
}
} catch (parseError) {
throw new Error(`Invalid response format: ${parseError.message}`);
}
if (!answer || typeof answer !== "object") {
throw new Error("The response must be an object");
}
const answerType = answer.t || answer.type;
if (!answerType || answerType !== "answer" && answerType !== "enhanced_secure_answer") {
throw new Error("Invalid response type. Expected answer or enhanced_secure_answer");
}
await webrtcManagerRef.current.handleSecureAnswer(answer);
if (pendingSession) {
setPendingSession(null);
setMessages((prev) => [...prev, {
message: `All security features enabled by default`,
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
}
setMessages((prev) => [...prev, {
message: t("flow.finalizing"),
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
if (!window.isUpdatingSecurity) {
updateSecurityLevel().catch(console.error);
}
} catch (error) {
console.error("Error in handleConnect inner try:", error);
let errorMessage = t("err.setupError");
if (error.message.includes("CRITICAL SECURITY FAILURE")) {
if (error.message.includes("ECDH public key structure")) {
errorMessage = t("err.responseNoKey");
} else if (error.message.includes("ECDSA public key structure")) {
errorMessage = t("err.responseNoSignKey");
} else {
errorMessage = t("err.securityValidation");
}
} else if (error.message.includes("too old") || error.message.includes("replay")) {
errorMessage = t("err.responseOutdated");
} else if (error.message.includes("MITM") || error.message.includes("signature")) {
errorMessage = t("err.securityBreach");
} else if (error.message.includes("Invalid") || error.message.includes("format")) {
errorMessage = t("err.responseFormat");
} else {
errorMessage = ` ${error.message}`;
}
setMessages((prev) => [...prev, {
message: errorMessage,
type: "system",
id: Date.now(),
timestamp: Date.now(),
showRetryButton: true
}]);
if (!error.message.includes("too old") && !error.message.includes("replay")) {
setPendingSession(null);
setSessionTimeLeft(0);
}
setConnectionStatus("failed");
}
} catch (error) {
console.error("Error in handleConnect outer try:", error);
let errorMessage = t("err.setupError");
if (error.message.includes("CRITICAL SECURITY FAILURE")) {
if (error.message.includes("ECDH public key structure")) {
errorMessage = t("err.responseNoKey");
} else if (error.message.includes("ECDSA public key structure")) {
errorMessage = t("err.responseNoSignKey");
} else {
errorMessage = t("err.securityValidation");
}
} else if (error.message.includes("too old") || error.message.includes("replay")) {
errorMessage = t("err.responseOutdated");
} else if (error.message.includes("MITM") || error.message.includes("signature")) {
errorMessage = t("err.securityBreach");
} else if (error.message.includes("Invalid") || error.message.includes("format")) {
errorMessage = t("err.responseFormat");
} else {
errorMessage = `${error.message}`;
}
setMessages((prev) => [...prev, {
message: errorMessage,
type: "system",
id: Date.now(),
timestamp: Date.now(),
showRetryButton: true
}]);
if (!error.message.includes("too old") && !error.message.includes("replay")) {
setPendingSession(null);
setSessionTimeLeft(0);
}
setConnectionStatus("failed");
}
};
const handleVerifyConnection = async (userCode, isValid = true) => {
if (isValid) {
webrtcManagerRef.current.confirmVerification(userCode);
setLocalVerificationConfirmed(true);
try {
if (window.NotificationIntegration && webrtcManagerRef.current && !notificationIntegrationRef.current) {
const integration = new window.NotificationIntegration(webrtcManagerRef.current);
await integration.init();
notificationIntegrationRef.current = integration;
const status = integration.getStatus();
if (status.permission === "granted") {
setMessages((prev) => [...prev, {
message: "\u2713 Notifications enabled - you will receive alerts when the tab is inactive",
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
} else {
setMessages((prev) => [...prev, {
message: "\u2139 Notifications disabled - you can enable them using the button on the main page",
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
}
} else if (notificationIntegrationRef.current) {
} else {
}
} catch (error) {
console.warn("Failed to initialize notifications:", error);
}
} else {
setMessages((prev) => [...prev, {
message: " Verification rejected. The connection is unsafe! Session reset..",
type: "system",
id: Date.now(),
timestamp: Date.now()
}]);
setLocalVerificationConfirmed(false);
setRemoteVerificationConfirmed(false);
setBothVerificationsConfirmed(false);
setShowVerification(false);
setVerificationCode("");
setConnectionStatus("disconnected");
setOfferData("");
setAnswerData("");
setOfferInput("");
setAnswerInput("");
setShowOfferStep(false);
setShowAnswerStep(false);
setKeyFingerprint("");
setSecurityLevel(null);
setIsVerified(false);
setMessages([]);
setSessionTimeLeft(0);
setPendingSession(null);
document.dispatchEvent(new CustomEvent("disconnected"));
handleDisconnect();
}
};
const handleSendMessage = async () => {
if (!messageInput.trim()) {
return;
}
if (!webrtcManagerRef.current) {
return;
}
const baseTextEarly = messageInput.trim();
const midEarly = `m_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
const mgr = webrtcManagerRef.current;
const channelUsable = mgr?.isConnected?.() === true && mgr?.isReconnecting?.() !== true;
if (!channelUsable && mgr?.isConnected) {
const outTextOff = codeMode ? "```\n" + baseTextEarly + "\n```" : baseTextEarly;
const tsOff = Date.now();
const metaOff = { mid: midEarly, ts: tsOff };
if (viewOnceMode) {
metaOff.once = true;
metaOff.onceTtl = viewOnceTtl;
}
if (disappearTtl > 0) metaOff.ttl = disappearTtl;
const echoOpts = { mid: midEarly, status: "sent", timestamp: tsOff };
if (disappearTtl > 0) echoOpts.expiresAt = tsOff + disappearTtl * 1e3;
addMessageWithAutoScroll(outTextOff, "sent", echoOpts);
const q = queuesRef.current.get(activeIdRef.current);
if (q) q.outgoing.push({ outText: outTextOff, meta: metaOff, mid: midEarly });
setMessageInput("");
if (codeMode) setCodeMode(false);
if (viewOnceMode) setViewOnceMode(false);
return;
}
if (!channelUsable) {
addMessageWithAutoScroll(t("chat.notSentReason"), "system");
return;
}
try {
const baseText = baseTextEarly;
const outText = codeMode ? "```\n" + baseText + "\n```" : baseText;
const mid = midEarly;
const meta = { mid, ts: Date.now() };
if (viewOnceMode) {
meta.once = true;
meta.onceTtl = viewOnceTtl;
}
if (disappearTtl > 0) meta.ttl = disappearTtl;
const localOpts = { mid, status: "sending" };
if (disappearTtl > 0) localOpts.expiresAt = Date.now() + disappearTtl * 1e3;
addMessageWithAutoScroll(outText, "sent", localOpts);
try {
await webrtcManagerRef.current.sendMessage(outText, meta);
updateMessageStatus(mid, "delivered");
} catch (sendErr) {
updateMessageStatus(mid, "failed");
throw sendErr;
}
setMessageInput("");
if (codeMode) setCodeMode(false);
if (viewOnceMode) setViewOnceMode(false);
} catch (error) {
const msg = String(error?.message || error);
if (!/queued for sending|Data channel not ready/i.test(msg)) {
addMessageWithAutoScroll(`Sending error: ${msg}`, "system");
}
}
};
const handleSendVoice = async (blob, dur, bars) => {
if (!blob || !webrtcManagerRef.current) return;
const rawType = String(blob.type || "").toLowerCase();
let mime = "audio/wav";
if (rawType.startsWith("audio/webm")) mime = "audio/webm";
else if (rawType.startsWith("audio/mp4") || rawType.startsWith("audio/x-m4a")) mime = "audio/mp4";
else if (rawType.startsWith("audio/ogg")) mime = "audio/ogg";
const ext = mime === "audio/mp4" ? "m4a" : mime === "audio/ogg" ? "ogg" : mime === "audio/webm" ? "webm" : "wav";
const file = new File([blob], `voice-message.${ext}`, { type: mime });
let localUrl = null;
try {
localUrl = URL.createObjectURL(blob);
} catch (_) {
}
const reconnecting = webrtcManagerRef.current?.isReconnecting?.() === true;
const notReady = reconnecting || webrtcManagerRef.current?.isConnected?.() !== true;
if (notReady) {
if (localUrl) {
try {
URL.revokeObjectURL(localUrl);
} catch (_) {
}
}
addMessageWithAutoScroll(
reconnecting ? t("err.voiceRestoring") : t("err.voiceNeedsConnection"),
"system"
);
return;
}
const voiceMeta = {
dur: Math.max(1, Math.round(dur || 0)),
bars: Array.isArray(bars) ? bars.map((n) => Math.round(n * 1e3) / 1e3) : []
};
const localId = addMessageWithAutoScroll("", "sent", {
voice: { dur: voiceMeta.dur, bars: voiceMeta.bars, url: localUrl, transfer: { dir: "up", pct: 0 } }
});
try {
await webrtcManagerRef.current.sendFile(file, { voice: voiceMeta, uiId: localId });
patchMessageById(localId, (m) => ({ voice: { ...m.voice || {}, transfer: null } }));
} catch (err) {
patchMessageById(localId, (m) => ({ voice: { ...m.voice || {}, transfer: null, error: true } }));
const msg = String(err?.message || err);
if (!/queued for sending|Data channel not ready/i.test(msg)) {
addMessageWithAutoScroll(`Voice message failed: ${msg}`, "system");
}
}
};
const handleUnsendMessage = React.useCallback((mid) => {
if (!mid) return;
setMessages((prev) => prev.filter((m) => String(m.mid) !== String(mid)));
try {
webrtcManagerRef.current?.sendMessageDelete?.(String(mid));
} catch (_) {
}
}, []);
const handleMessageExpire = React.useCallback((id) => {
setMessages((prev) => prev.map((m) => m.id === id ? { ...m, expired: true, message: "", expiresAt: void 0 } : m));
}, []);
const handleClearData = () => {
setOfferData("");
setAnswerData("");
setOfferInput("");
setAnswerInput("");
setShowOfferStep(false);
setIsGeneratingKeys(false);
if (!shouldPreserveAnswerData()) {
setShowAnswerStep(false);
}
setShowVerification(false);
setShowQRCode(false);
setShowQRScanner(false);
setShowQRScannerModal(false);
qrChunksBufferRef.current = { id: null, total: 0, seen: /* @__PURE__ */ new Set(), items: [] };
if (!shouldPreserveAnswerData()) {
setQrCodeUrl("");
}
setVerificationCode("");
setIsVerified(false);
setKeyFingerprint("");
setSecurityLevel(null);
setConnectionStatus("disconnected");
setMessages([]);
setMessageInput("");
setLocalVerificationConfirmed(false);
setRemoteVerificationConfirmed(false);
setBothVerificationsConfirmed(false);
if (typeof console.clear === "function") {
console.clear();
}
setSessionTimeLeft(0);
setPendingSession(null);
document.dispatchEvent(new CustomEvent("peer-disconnect"));
};
const handleIncomingDecision = React.useCallback(async (fileId, accepted) => {
try {
if (accepted) {
await webrtcManagerRef.current?.acceptIncomingFile(fileId);
} else {
await webrtcManagerRef.current?.rejectIncomingFile(fileId);
}
} finally {
setPendingIncomingFiles((prev) => prev.filter((f) => f.fileId !== fileId));
}
}, []);
const handleDisconnect = () => {
try {
const id = activeIdRef.current;
setSessionTimeLeft(0);
document.dispatchEvent(new CustomEvent("peer-disconnect"));
document.dispatchEvent(new CustomEvent("disconnected"));
document.dispatchEvent(new CustomEvent("session-cleanup", {
detail: { timestamp: Date.now(), reason: "manual_disconnect" }
}));
destroySession(id);
if (typeof console.clear === "function") console.clear();
} catch (error) {
console.error("Error during disconnect:", error);
}
};
const handleSessionActivated = (session) => {
let message;
if (session.type === "demo") {
message = ` Demo session activated for 6 minutes. You can create invitations!`;
} else {
message = ` All security features enabled by default. You can create invitations!`;
}
addMessageWithAutoScroll(message, "system");
};
const prevConnStatusRef = React.useRef(connectionStatus);
React.useEffect(() => {
const resumed = prevConnStatusRef.current === "reconnecting";
prevConnStatusRef.current = connectionStatus;
if (connectionStatus === "connected" && isVerified && !resumed) {
addMessageWithAutoScroll(" Secure connection successfully established and verified! You can now communicate safely with full protection against MITM attacks and Perfect Forward Secrecy..", "system");
}
}, [connectionStatus, isVerified]);
const previewMode = React.useMemo(() => {
try {
return new URLSearchParams(window.location.search).get("preview") === "chat";
} catch {
return false;
}
}, []);
const isConnectedAndVerified = (connectionStatus === "connected" || connectionStatus === "verified" || connectionStatus === "reconnecting") && isVerified;
React.useEffect(() => {
document.body.classList.toggle("sb-in-chat", isConnectedAndVerified || previewMode);
return () => document.body.classList.remove("sb-in-chat");
}, [isConnectedAndVerified, previewMode]);
React.useEffect(() => {
if (isConnectedAndVerified && pendingSession && connectionStatus !== "failed") {
setPendingSession(null);
setSessionTimeLeft(0);
addMessageWithAutoScroll(" All security features enabled by default", "system");
}
}, [isConnectedAndVerified, pendingSession, connectionStatus]);
React.useEffect(() => {
if (showQRScannerModal && window.Html5Qrcode) {
const html5Qrcode = new window.Html5Qrcode("qr-reader");
const config = {
fps: 10
// Убираем qrbox чтобы использовать всю область
};
let isScanning = true;
html5Qrcode.start(
{ facingMode: "environment" },
// Use back camera
config,
(decodedText, decodedResult) => {
if (!isScanning) {
console.log("Scanner stopped, ignoring scan");
return;
}
console.log("QR Code scanned:", decodedText);
console.log("Current buffer state:", qrChunksBufferRef.current);
handleQRScan(decodedText).then((success) => {
console.log("QR scan result:", success);
if (success) {
console.log("Closing scanner and modal");
isScanning = false;
try {
console.log("Stopping scanner...");
html5Qrcode.stop().then(() => {
console.log("Scanner stopped, clearing...");
html5Qrcode.clear();
setShowQRScannerModal(false);
}).catch((err) => {
console.log("Error stopping scanner:", err);
try {
html5Qrcode.clear();
} catch (clearErr) {
console.log("Error clearing scanner:", clearErr);
}
setShowQRScannerModal(false);
});
} catch (err) {
console.log("Error in scanner cleanup:", err);
setShowQRScannerModal(false);
}
} else {
console.log("Continuing to scan for more chunks...");
}
}).catch((error) => {
console.error("QR scan processing error:", error);
});
},
(error) => {
if (isScanning) {
console.log("QR scan error (ignored):", error);
}
}
).catch((err) => {
console.error("QR Scanner start error:", err);
setShowQRScannerModal(false);
});
return () => {
isScanning = false;
try {
html5Qrcode.stop().then(() => {
html5Qrcode.clear();
}).catch((err) => {
console.log("Scanner already stopped or error stopping:", err);
try {
html5Qrcode.clear();
} catch (clearErr) {
console.log("Error clearing scanner in cleanup:", clearErr);
}
});
} catch (err) {
console.log("Error in cleanup:", err);
try {
html5Qrcode.clear();
} catch (clearErr) {
console.log("Error clearing scanner in cleanup:", clearErr);
}
}
};
}
}, [showQRScannerModal]);
const sessionChats = decorateSessions(sessionsState);
const groupChats = decorateGroups(groupsState);
const showSidebar = sessionsState.order.length > 1 || groupsState.order.length > 0 || sessionsState.order.some((id) => {
const s = sessionsState.sessions[id];
return s && s.sas && s.sas.isVerified;
});
if (previewMode) {
const previewMessages = [
{ message: "Preview mode \u2014 no connection is open.", type: "system", id: 1, timestamp: Date.now() - 3e5 },
{ message: "This renders the real chat components so the layout can be checked without a handshake.", type: "received", id: 2, timestamp: Date.now() - 24e4 },
{ message: "Header pinned, list scrolls, composer sits above the keyboard.", type: "sent", id: 3, timestamp: Date.now() - 18e4 },
...Array.from({ length: 30 }, (_, i) => ({
message: "Filler message " + (i + 1) + " \u2014 enough content to make the list scroll.",
type: i % 2 ? "sent" : "received",
id: 10 + i,
timestamp: Date.now() - (30 - i) * 5e3
}))
];
const noop = () => {
};
return React.createElement("div", {
className: "minimal-bg sb-app-shell",
style: { display: "flex", flexDirection: "row", height: "100vh", width: "100%", overflow: "hidden" }
}, [
React.createElement(SessionsSidebar, {
key: "sidebar",
chats: [{ id: "preview", label: "Preview peer", unread: 0, active: true, verified: true }],
collapsed: sidebarCollapsed,
drawerOpen: sidebarDrawerOpen,
onToggleCollapse: () => setSidebarCollapsed((v) => !v),
onSelect: noop,
onNewChat: noop,
onRename: noop,
onCloseDrawer: () => setSidebarDrawerOpen(false),
myStatus,
onSetStatus: setMyStatus
}),
React.createElement("button", {
key: "burger",
className: "sb-burger",
onClick: () => setSidebarDrawerOpen(true),
style: { display: "none", position: "fixed", top: "calc(13px + var(--sb-safe-top, 0px))", insetInlineStart: "13px", zIndex: 55, width: "38px", height: "38px", borderRadius: "10px", placeItems: "center", border: "1px solid rgba(255,255,255,0.1)", background: "rgba(18,18,20,0.9)", color: "#cfcfd4", cursor: "pointer" },
dangerouslySetInnerHTML: { __html: SB_SVG.burger }
}),
React.createElement("div", {
key: "col",
className: "minimal-bg sb-app-col",
style: { flex: 1, minWidth: 0, height: "100vh", overflow: "hidden", display: "flex", flexDirection: "column" }
}, React.createElement(
"main",
{ key: "main" },
React.createElement(EnhancedChatInterface, {
title: "Preview peer",
isOffline: false,
peerPresence: "available",
onRenameTitle: noop,
messages: previewMessages,
messageInput,
setMessageInput,
onSendMessage: noop,
onSendVoice: noop,
onDisconnect: noop,
keyFingerprint: "preview",
isVerified: true,
chatMessagesRef,
scrollToBottom: noop,
webrtcManager: null,
status: "connected",
pendingIncomingFiles: [],
onIncomingDecision: noop,
codeMode,
setCodeMode,
viewOnceMode,
setViewOnceMode,
viewOnceTtl,
setViewOnceTtl,
disappearTtl,
setDisappearTtl,
nowTick,
onUnsendMessage: noop,
onMessageExpire: noop
})
))
]);
}
return React.createElement("div", {
className: showSidebar ? "minimal-bg sb-app-shell" : "minimal-bg",
// With the rail visible the app is a fixed-height shell (rail + column
// fill the viewport, design-style). Otherwise it's the scrollable landing.
// flexDirection:'row' is explicit — the .minimal-bg class forces
// flex-direction:column, which would otherwise stack the rail ABOVE the chat.
// height:100vh is the fallback; .sb-app-shell upgrades it to 100dvh on
// mobile so the shell fits under the browser toolbar (header stays put).
style: showSidebar ? { display: "flex", flexDirection: "row", height: "100vh", width: "100%", overflow: "hidden" } : { minHeight: "100vh" }
}, [
showSidebar && React.createElement(SessionsSidebar, {
key: "sessions-sidebar",
chats: sessionChats,
groups: groupChats,
collapsed: sidebarCollapsed,
drawerOpen: sidebarDrawerOpen,
onToggleCollapse: () => setSidebarCollapsed((v) => !v),
// Picking a 1:1 chat drops the group out of the foreground, and
// vice versa — one conversation is on screen at a time.
onSelect: (id) => {
groupsDispatch({ type: GROUP_ACTIONS.SET_ACTIVE_GROUP, id: null });
handleSelectSession(id);
},
onSelectGroup: handleSelectGroup,
onNewChat: handleNewChat,
onNewGroup: () => {
setShowCreateGroup(true);
setSidebarDrawerOpen(false);
},
onRename: handleRenameSession,
onCloseDrawer: () => setSidebarDrawerOpen(false),
myStatus,
onSetStatus: setMyStatus
}),
// ---- Group dialogs ----
showCreateGroup && React.createElement(CreateGroupModal, {
key: "create-group",
candidates: groupCandidates,
relayOnly: relayOnlyMode,
onCreate: handleCreateGroup,
onCancel: () => setShowCreateGroup(false)
}),
pendingInvite && React.createElement(GroupInviteModal, {
key: "group-invite",
invite: {
name: pendingInvite.name,
fromLabel: sessionsState.sessions[pendingInvite.sessionId]?.peerLabel || "A verified contact"
},
onAccept: handleAcceptInvite,
onDecline: () => setPendingInvite(null)
}),
groupError && React.createElement(GroupErrorModal, {
key: "group-error",
message: groupError,
onDismiss: () => setGroupError(null)
}),
showAddMembers && activeGroup && React.createElement(AddMembersModal, {
key: "add-members",
candidates: addCandidates,
remaining: Math.max(0, GROUP_LIMITS.MAX_MEMBERS - activeGroup.members.length),
onAdd: handleAddMembers,
onCancel: () => setShowAddMembers(false)
}),
showGroupCode && activeGroup && React.createElement(GroupSasModal, {
key: "group-sas",
group: activeGroup,
onConfirm: handleConfirmGroupSas,
onCancel: () => {
if (activeGroup.phase === GROUP_PHASE.READY) setShowGroupCode(false);
else destroyGroup(activeGroup.id);
}
}),
// Mobile-only hamburger that opens the drawer (hidden on desktop via CSS).
showSidebar && React.createElement("button", {
key: "sb-burger",
className: "sb-burger",
onClick: () => setSidebarDrawerOpen(true),
style: { display: "none", position: "fixed", top: "calc(13px + var(--sb-safe-top, 0px))", insetInlineStart: "13px", zIndex: 55, width: "38px", height: "38px", borderRadius: "10px", placeItems: "center", border: "1px solid rgba(255,255,255,0.1)", background: "rgba(18,18,20,0.9)", color: "#cfcfd4", cursor: "pointer" },
dangerouslySetInnerHTML: { __html: SB_SVG.burger }
}),
React.createElement("div", {
key: "app-column",
className: showSidebar ? "minimal-bg sb-app-col" : "minimal-bg min-h-screen",
style: showSidebar ? { flex: 1, minWidth: 0, height: "100vh", overflow: "hidden", display: "flex", flexDirection: "column" } : {}
}, [
// Advanced network settings now render inside the connection
// screen's right panel (see EnhancedConnectionSetup), matching
// the design's slide-up-within-the-right-column behavior.
// The verified chat renders its own in-chat header (SecureBit Chat
// design); the shared header is shown only on the landing/setup view.
!isConnectedAndVerified && !showSidebar && window.EnhancedMinimalHeader && React.createElement(window.EnhancedMinimalHeader, {
key: "header",
status: connectionStatus,
fingerprint: keyFingerprint,
verificationCode,
onDisconnect: handleDisconnect,
isConnected: isConnectedAndVerified,
securityLevel,
// sessionManager removed - all features enabled by default
webrtcManager: webrtcManagerRef.current
}),
// Offered, never forced: the visitor's language decides what this
// bar says, and only a click on it changes the URL. Landing only,
// for the same reason as the switcher — following it navigates.
!isConnectedAndVerified && !showSidebar && React.createElement(LanguageSuggestion, { key: "lang-suggest" }),
// A group takes the whole column when it is the active conversation.
// It renders its own header and composer, so none of the 1:1 chrome
// (which is bound to a single webrtcManager) applies.
activeGroup && React.createElement("main", {
key: "group-main",
style: { flex: 1, minHeight: 0, display: "flex", flexDirection: "column" }
}, React.createElement(GroupChatView, {
group: activeGroup,
input: groupInput,
setInput: setGroupInput,
onSend: handleSendGroupMessage,
onLeave: () => destroyGroup(activeGroup.id),
onRemoveMember: handleRemoveGroupMember,
onAddMembers: () => setShowAddMembers(true),
isAdmin: activeGroup.isAdmin,
scrollRef: groupScrollRef,
onStartCall: handleStartGroupCall,
callActive: !!groupCallState[activeGroup.id],
// The overlay renders nothing when there is no call, and a
// dismissed ring is treated as no call for this device only —
// the call itself carries on for whoever is in it.
callOverlay: (() => {
const call = groupCallState[activeGroup.id] || null;
if (!call) return null;
if (!call.joined && dismissedCalls[activeGroup.id] === call.callId) return null;
const media = groupCallMediaState[activeGroup.id] || null;
return React.createElement(GroupCallUI, {
key: "group-call",
call,
media,
groupName: activeGroup.name,
localStream: groupCallMediaRef.current.get(activeGroup.id)?.getLocalStream() || null,
getRemoteStream: (fp) => groupCallMediaRef.current.get(activeGroup.id)?.getRemoteStream(fp) || null,
onJoin: handleJoinGroupCall,
onDismiss: handleDismissGroupCall,
onLeave: handleLeaveGroupCall,
onToggleMic: handleGroupCallMic,
onToggleCamera: handleGroupCallCamera,
onFlipCamera: handleGroupCallFlip
});
})()
})),
!activeGroup && React.createElement(
"main",
{
key: "main"
},
/* @__PURE__ */ (() => {
return isConnectedAndVerified;
})() ? (() => {
return React.createElement(EnhancedChatInterface, {
title: active ? active.peerLabel : "",
isOffline,
peerPresence: active ? active.peerPresence : null,
onRenameTitle: (label2) => {
if (activeSessionId) dispatch({ type: SESSION_ACTIONS.RENAME, id: activeSessionId, label: label2 });
},
messages,
messageInput,
setMessageInput,
onSendMessage: handleSendMessage,
onSendVoice: handleSendVoice,
onDisconnect: handleDisconnect,
keyFingerprint,
isVerified,
chatMessagesRef,
scrollToBottom,
webrtcManager: webrtcManagerRef.current,
status: connectionStatus,
pendingIncomingFiles,
onIncomingDecision: handleIncomingDecision,
// Secure chat extras
codeMode,
setCodeMode,
viewOnceMode,
setViewOnceMode,
viewOnceTtl,
setViewOnceTtl,
disappearTtl,
setDisappearTtl,
nowTick,
onUnsendMessage: handleUnsendMessage,
onMessageExpire: handleMessageExpire
});
})() : React.createElement(EnhancedConnectionSetup, {
onCreateOffer: handleCreateOffer,
onCreateAnswer: handleCreateAnswer,
onConnect: handleConnect,
onClearData: handleClearData,
onVerifyConnection: handleVerifyConnection,
connectionStatus,
offerData,
answerData,
offerInput,
setOfferInput,
answerInput,
setAnswerInput,
showOfferStep,
showAnswerStep,
verificationCode,
showVerification,
showQRCode,
qrCodeUrl,
showQRScanner,
setShowQRCode,
setShowQRScanner,
setShowQRScannerModal,
messages,
localVerificationConfirmed,
remoteVerificationConfirmed,
bothVerificationsConfirmed,
// QR control props
qrFramesTotal,
qrFrameIndex,
qrManualMode,
toggleQrManualMode,
nextQrFrame,
prevQrFrame,
// PAKE passwords removed - using SAS verification instead
markAnswerCreated,
notificationIntegrationRef,
isGeneratingKeys,
setIsGeneratingKeys,
handleCreateOffer,
relayOnlyMode,
setRelayOnlyMode,
webrtcManagerRef,
showIceSettings,
setShowIceSettings,
iceServersText,
iceSettingsPersisted,
customIceServers,
handleApplyIceSettings,
handleForgetIceSettings,
// Render only the create/connect card inside the chat column
// (an additional session), instead of the full landing.
compact: showSidebar
})
),
// QR Scanner Modal — camera scan (design import: "Start Secure" / Camera scan modal)
showQRScannerModal && (() => {
const closeScanner = () => {
setShowQRScannerModal(false);
qrChunksBufferRef.current = { id: null, total: 0, seen: /* @__PURE__ */ new Set(), items: [] };
};
const buf = qrChunksBufferRef.current;
const hasParts = !!(buf && buf.id && buf.total > 1);
const framesText = hasParts ? `Scanning frames\u2026 ${buf.seen.size} / ${buf.total}` : t("qr.scanning");
const corner = (k, st) => React.createElement("span", {
key: k,
style: Object.assign({ position: "absolute", width: "34px", height: "34px", zIndex: 3 }, st)
});
return React.createElement("div", {
key: "qr-scanner-modal",
onClick: closeScanner,
style: { position: "fixed", inset: 0, zIndex: 50, display: "flex", alignItems: "center", justifyContent: "center", padding: "32px", background: "rgba(6,6,8,0.82)", backdropFilter: "blur(10px)", WebkitBackdropFilter: "blur(10px)", animation: "sbUp .2s ease" }
}, [
React.createElement("div", {
key: "scanner-container",
onClick: (e) => e.stopPropagation(),
style: { width: "100%", maxWidth: "420px", borderRadius: "22px", border: "1px solid rgba(255,255,255,0.1)", background: "#111113", boxShadow: "0 30px 90px rgba(0,0,0,0.6)", overflow: "hidden" }
}, [
// Header
React.createElement("div", {
key: "scanner-header",
style: { display: "flex", alignItems: "center", gap: "11px", padding: "18px 20px", borderBottom: "1px solid rgba(255,255,255,0.06)" }
}, [
React.createElement("span", {
key: "scanner-icon",
style: { display: "flex" },
dangerouslySetInnerHTML: { __html: '<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#3ecf8e" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M2 8.5V6.5A2.5 2.5 0 0 1 4.5 4h2M17.5 4h2A2.5 2.5 0 0 1 22 6.5v2M22 15.5v2a2.5 2.5 0 0 1-2.5 2.5h-2M6.5 20h-2A2.5 2.5 0 0 1 2 17.5v-2"/><circle cx="12" cy="12" r="3.2"/></svg>' }
}),
React.createElement("div", {
key: "scanner-titles",
style: { flex: 1, lineHeight: 1.2 }
}, [
React.createElement("div", {
key: "scanner-title",
style: { fontSize: "15.5px", fontWeight: 800, color: "#f4f4f6" }
}, t("qr.title")),
React.createElement("div", {
key: "scanner-hint",
style: { fontSize: "12px", color: "#7b7b83" }
}, t("qr.subtitle"))
]),
React.createElement("button", {
key: "close-btn",
onClick: closeScanner,
style: { width: "32px", height: "32px", display: "grid", placeItems: "center", borderRadius: "9px", border: "none", background: "rgba(255,255,255,0.05)", color: "#9a9aa2", cursor: "pointer" }
}, React.createElement("i", { className: "fas fa-times" }))
]),
// Body
React.createElement("div", {
key: "scanner-body",
style: { padding: "22px 24px 24px" }
}, [
React.createElement("div", {
key: "viewfinder",
style: { position: "relative", aspectRatio: "1", borderRadius: "18px", overflow: "hidden", background: "#000", border: "1px solid rgba(255,255,255,0.1)" }
}, [
React.createElement("div", {
key: "vf-bg",
style: { position: "absolute", inset: 0, background: "radial-gradient(circle at 50% 45%, #1a1a1f, #000)" }
}),
// Camera video is injected here by Html5Qrcode
React.createElement("div", {
key: "qr-reader",
id: "qr-reader",
style: { position: "absolute", inset: 0, zIndex: 1 }
}),
corner("c-tl", { top: "18px", insetInlineStart: "18px", borderTop: "2.5px solid #3ecf8e", borderInlineStart: "2.5px solid #3ecf8e", borderRadius: "8px 0 0 0" }),
corner("c-tr", { top: "18px", insetInlineEnd: "18px", borderTop: "2.5px solid #3ecf8e", borderInlineEnd: "2.5px solid #3ecf8e", borderRadius: "0 8px 0 0" }),
corner("c-bl", { bottom: "18px", insetInlineStart: "18px", borderBottom: "2.5px solid #3ecf8e", borderInlineStart: "2.5px solid #3ecf8e", borderRadius: "0 0 0 8px" }),
corner("c-br", { bottom: "18px", insetInlineEnd: "18px", borderBottom: "2.5px solid #3ecf8e", borderInlineEnd: "2.5px solid #3ecf8e", borderRadius: "0 0 8px 0" }),
React.createElement("span", {
key: "scan-line",
style: { position: "absolute", left: "18px", right: "18px", height: "2.5px", zIndex: 2, background: "linear-gradient(90deg, transparent, #3ecf8e, transparent)", boxShadow: "0 0 16px #3ecf8e", animation: "sbScan 1.5s ease-in-out infinite alternate" }
}),
React.createElement("div", {
key: "scan-status",
style: { position: "absolute", bottom: 0, left: 0, right: 0, zIndex: 3, display: "flex", alignItems: "center", justifyContent: "center", gap: "8px", padding: "14px", background: "linear-gradient(transparent, rgba(0,0,0,0.6))" }
}, [
React.createElement("span", {
key: "spinner",
style: { display: "flex", animation: "sbSpin 1.4s linear infinite" },
dangerouslySetInnerHTML: { __html: '<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#3ecf8e" stroke-width="2" stroke-linecap="round"><path d="M21 12a9 9 0 1 1-6.2-8.6"/></svg>' }
}),
React.createElement("span", {
key: "scan-frames",
style: { fontSize: "12.5px", fontWeight: 600, color: "#cfcfd4" }
}, framesText)
])
]),
React.createElement("p", {
key: "scanner-note",
style: { margin: "16px 0 0", textAlign: "center", fontSize: "12px", lineHeight: 1.5, color: "#6b6b73" }
}, t("qr.hint"))
])
])
]);
})()
])
// end app-column
]);
};
var UpdateCheckerWrapper = ({ children }) => {
if (typeof window !== "undefined" && window.UpdateChecker) {
return React.createElement(window.UpdateChecker, {
debug: false
}, children);
}
return children;
};
function initializeApp() {
if (window.EnhancedSecureCryptoUtils && window.EnhancedSecureWebRTCManager) {
const AppWithUpdateChecker = React.createElement(
UpdateCheckerWrapper,
null,
React.createElement(EnhancedSecureP2PChat)
);
ReactDOM.render(AppWithUpdateChecker, document.getElementById("root"));
} else {
console.error("\u041C\u043E\u0434\u0443\u043B\u0438 \u043D\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u044B:", {
hasCrypto: !!window.EnhancedSecureCryptoUtils,
hasWebRTC: !!window.EnhancedSecureWebRTCManager
});
}
}
if (typeof window !== "undefined") {
window.addEventListener("unhandledrejection", (event) => {
console.error("Unhandled promise rejection:", event.reason);
event.preventDefault();
});
window.addEventListener("error", (event) => {
console.error("Global error:", event.error);
event.preventDefault();
});
if (!window.initializeApp) {
window.initializeApp = initializeApp;
}
}
if (window.EnhancedSecureCryptoUtils && window.EnhancedSecureWebRTCManager) {
const UpdateCheckerWrapper2 = ({ children }) => {
if (typeof window !== "undefined" && window.UpdateChecker) {
return React.createElement(window.UpdateChecker, {
debug: false
}, children);
}
return children;
};
const AppWithUpdateChecker = React.createElement(
UpdateCheckerWrapper2,
null,
React.createElement(EnhancedSecureP2PChat)
);
ReactDOM.render(AppWithUpdateChecker, document.getElementById("root"));
} else {
ReactDOM.render(React.createElement(EnhancedSecureP2PChat), document.getElementById("root"));
}
//# sourceMappingURL=app.js.map