telegram-crawler/data/web/blogfork.telegram.org/mtproto/TL-tl.html
2023-01-05 18:02:43 +00:00

311 lines
22 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html class="">
<head>
<meta charset="utf-8">
<title>TL schema for serialization of TL schemas</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta property="description" content="If necessary, a TL schema can be serialized in binary form. Here, this serialization format is defined by a TL schema (usually…">
<meta property="og:title" content="TL schema for serialization of TL schemas">
<meta property="og:image" content="">
<meta property="og:description" content="If necessary, a TL schema can be serialized in binary form. Here, this serialization format is defined by a TL schema (usually…">
<link rel="icon" type="image/svg+xml" href="/img/website_icon.svg?4">
<link rel="apple-touch-icon" sizes="180x180" href="/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicon-16x16.png">
<link rel="alternate icon" href="/img/favicon.ico" type="image/x-icon" />
<link href="/css/bootstrap.min.css?3" rel="stylesheet">
<link href="/css/telegram.css?234" rel="stylesheet" media="screen">
<style>
</style>
</head>
<body class="preload">
<div class="dev_page_wrap">
<div class="dev_page_head navbar navbar-static-top navbar-tg">
<div class="navbar-inner">
<div class="container clearfix">
<ul class="nav navbar-nav navbar-right hidden-xs"><li class="navbar-twitter"><a href="https://twitter.com/telegram" target="_blank" data-track="Follow/Twitter" onclick="trackDlClick(this, event)"><i class="icon icon-twitter"></i><span> Twitter</span></a></li></ul>
<ul class="nav navbar-nav">
<li><a href="//telegram.org/">Home</a></li>
<li class="hidden-xs"><a href="//telegram.org/faq">FAQ</a></li>
<li class="hidden-xs"><a href="//telegram.org/apps">Apps</a></li>
<li class=""><a href="/api">API</a></li>
<li class="active"><a href="/mtproto">Protocol</a></li>
<li class=""><a href="/schema">Schema</a></li>
</ul>
</div>
</div>
</div>
<div class="container clearfix">
<div class="dev_page">
<div id="dev_page_content_wrap" class=" ">
<div class="dev_page_bread_crumbs"><ul class="breadcrumb clearfix"><li><a href="/mtproto" >Mobile Protocol</a></li><i class="icon icon-breadcrumb-divider"></i><li><a href="/mtproto/TL-tl" >TL schema for serialization of TL schemas</a></li></ul></div>
<h1 id="dev_page_title">TL schema for serialization of TL schemas</h1>
<div id="dev_page_content"><p>If necessary, a <a href="TL">TL</a> schema can be serialized in binary form. Here, this serialization format is defined by a TL schema (usually stored in the file <code>tl.tl</code>). This can be useful, for example, to make it possible to write a parser one time for converting a TL schema from text form (stored in the file <code>something.tl</code>) to binary form (stored in the file <code>something.tlo</code>). All other programs (for example, auto-generators of TL-(de)serializers for various programming languages) only need to know how to read <code>.tlo</code> files, which only requires generating an automatic deserializer according to the schema presented below.</p>
<p>First, a fragment of the file <code>common.tl</code> with certain required built-in types:</p>
<pre><code>/////
//
// Common Types (source file common.tl, only necessary definitions included)
//
/////
// Built-in types
int ? = Int;
long ? = Long;
double ? = Double;
string ? = String;
// Boolean emulation
boolFalse = Bool;
boolTrue = Bool;
// Vector
vector {t:Type} # [t] = Vector t;
tuple {t:Type} {n:#} [t] = Tuple t n;
vectorTotal {t:Type} total_count:int vector:%(Vector t) = VectorTotal t;
Empty False;
true = True;</code></pre>
<p>Next, properly, comes <code>tl.tl</code> itself. Note that the declaration for a fairly complex data type required only twenty lines in TL. This demonstrates the expressiveness and compactness of the TL language.</p>
<pre><code>/////
//
// Serialized binary TL-schema in TL format, source file tl.tl
//
/////
tls.schema_v2 version:int date:int types_num:# types:types_num*[tls.Type]
constructor_num:# constructors:constructor_num*[tls.Combinator]
functions_num:# functions:functions_num*[tls.Combinator] = tls.Schema;
tls.type name:int id:string constructors_num:int flags:int arity:int params_type:long = tls.Type;
tls.combinator name:int id:string type_name:int left:tls.CombinatorLeft right:tls.CombinatorRight = tls.Combinator;
tls.combinatorLeftBuiltin = tls.CombinatorLeft;
tls.combinatorLeft args_num:# args:args_num*[tls.Arg] = tls.CombinatorLeft;
tls.combinatorRight value:tls.TypeExpr = tls.CombinatorRight;
tls.arg id:string flags:# var_num:flags.1?int exist_var_num:flags.2?int exist_var_bit:flags.2?int type:tls.TypeExpr = tls.Arg;
tls.exprType _:tls.TypeExpr = tls.Expr;
tls.exprNat _:tls.NatExpr = tls.Expr;
tls.natConst value:int = tls.NatExpr;
tls.natVar dif:int var_num:int = tls.NatExpr;
tls.typeVar var_num:int flags:int = tls.TypeExpr;
tls.array multiplicity:tls.NatExpr args_num:# args:args_num*[tls.Arg] = tls.TypeExpr;
tls.typeExpr name:int flags:int children_num:# children:children_num*[tls.Expr] = tls.TypeExpr;</code></pre>
<h2><a class="anchor" href="#remarks" id="remarks" name="remarks"><i class="anchor-icon"></i></a>Remarks</h2>
<p>Schema serialization (version 2) always begins with the index number of the <code>tls.schema_v2</code> constructor for <code>tls.Schema</code>.
Because the CRC32 of the string</p>
<pre><code>tls.schema_v2 version:int date:int types_num:# types:types_num*[ tls.Type ] constructor_num:# constructors:constructor_num*[ tls.Combinator ] functions_num:# functions:functions_num*[ tls.Combinator ] = tls.Schema</code></pre>
<p>is 0x3a2f9be2, this constant is in fact the magic number for tlo files in the current version's format.
If the format is extended in the future (for example, if TL's additional features are supported), then a <code>tls.schema_v3</code> constructor with a different number will appear.</p>
<h2><a class="anchor" href="#example" id="example" name="example"><i class="anchor-icon"></i></a>Example</h2>
<p>If one adds declarations for the used built-in types (like <code>int ? = Int;</code>) from the file <code>common.tl</code> before <code>tl.tl</code> and serialize the resulting schema, the following binary data is obtained (<code>tl.tlo</code>):</p>
<div class="richcode">
<p><strong>0000</strong>: 3a2f9be2 00000000 51fec698 00000015 12eb4386 70659eff 00002301 00000000<br>
<strong>0020</strong>: 00000000 00000000 00000000 00000000 12eb4386 250be282 6f6f4204 0000006c<br>
<strong>0040</strong>: 00000002 02000010 00000000 00000000 00000000 12eb4386 2210c154 756f4406<br>
<strong>0060</strong>: 00656c62 00000001 02000000 00000000 00000000 00000000 12eb4386 00000000<br>
<strong>0080</strong>: 6c614605 00006573 00000000 00000401 00000000 00000000 00000000 12eb4386<br>
<strong>00a0</strong>: a8509bda 746e4903 00000001 02000001 00000000 00000000 00000000 12eb4386<br>
<strong>00c0</strong>: 22076cba 6e6f4c04 00000067 00000001 02000001 00000000 00000000 00000000<br>
<strong>00e0</strong>: 12eb4386 b5286e24 72745306 00676e69 00000001 02000001 00000000 00000000<br>
<strong>0100</strong>: 00000000 12eb4386 3fedd339 75725404 00000065 00000001 02000000 00000000<br>
<strong>0120</strong>: 00000000 00000000 12eb4386 9770768a 70755405 0000656c 00000001 02000000<br>
<strong>0140</strong>: 00000002 00000002 00000000 12eb4386 2cecf817 70795404 00000065 00000000<br>
<strong>0160</strong>: 00000000 00000000 00000000 00000000 12eb4386 1cb5c415 63655606 00726f74<br>
<strong>0180</strong>: 00000001 02000008 00000001 00000000 00000000 12eb4386 10133f47 6365560b<br>
<strong>01a0</strong>: 54726f74 6c61746f 00000001 02000000 00000001 00000000 00000000 12eb4386<br>
<strong>01c0</strong>: 29dfe61b 736c7407 6772412e 00000001 02000000 00000000 00000000 00000000<br>
<strong>01e0</strong>: 12eb4386 5c0a1ed5 736c740e 6d6f432e 616e6962 00726f74 00000001 02000000<br>
<strong>0200</strong>: 00000000 00000000 00000000 12eb4386 8133d9ba 736c7412 6d6f432e 616e6962<br>
<strong>0220</strong>: 4c726f74 00746665 00000002 02000010 00000000 00000000 00000000 12eb4386<br>
<strong>0240</strong>: 2c064372 736c7413 6d6f432e 616e6962 52726f74 74686769 00000001 02000000<br>
<strong>0260</strong>: 00000000 00000000 00000000 12eb4386 307d41a0 736c7408 7078452e 00000072<br>
<strong>0280</strong>: 00000002 02000010 00000000 00000000 00000000 12eb4386 c2635441 736c740b<br>
<strong>02a0</strong>: 74614e2e 72707845 00000002 02000010 00000000 00000000 00000000 12eb4386<br>
<strong>02c0</strong>: 3a2f9be2 736c740a 6863532e 00616d65 00000001 02000000 00000000 00000000<br>
<strong>02e0</strong>: 00000000 12eb4386 12eb4386 736c7408 7079542e 00000065 00000001 02000000<br>
<strong>0300</strong>: 00000000 00000000 00000000 12eb4386 193fd378 736c740c 7079542e 70784565<br>
<strong>0320</strong>: 00000072 00000003 02000010 00000000 00000000 00000000 00000018 5c0a1ed5<br>
<strong>0340</strong>: bc799737 6f6f6209 6c61466c 00006573 250be282 4c12c6d9 00000000 2c064372<br>
<strong>0360</strong>: c1863d08 250be282 00000000 00000000 5c0a1ed5 997275b5 6f6f6208 7572546c<br>
<strong>0380</strong>: 00000065 250be282 4c12c6d9 00000000 2c064372 c1863d08 250be282 00000000<br>
<strong>03a0</strong>: 00000000 5c0a1ed5 2210c154 756f6406 00656c62 2210c154 cd211f63 2c064372<br>
<strong>03c0</strong>: c1863d08 2210c154 00000000 00000000 5c0a1ed5 a8509bda 746e6903 a8509bda<br>
<strong>03e0</strong>: cd211f63 2c064372 c1863d08 a8509bda 00000000 00000000 5c0a1ed5 22076cba<br>
<strong>0400</strong>: 6e6f6c04 00000067 22076cba cd211f63 2c064372 c1863d08 22076cba 00000000<br>
<strong>0420</strong>: 00000000 5c0a1ed5 b5286e24 72747306 00676e69 b5286e24 cd211f63 2c064372<br>
<strong>0440</strong>: c1863d08 b5286e24 00000000 00000000 5c0a1ed5 3fedd339 75727404 00000065<br>
<strong>0460</strong>: 3fedd339 4c12c6d9 00000000 2c064372 c1863d08 3fedd339 00000000 00000000<br>
<strong>0480</strong>: 5c0a1ed5 9770768a 70757405 0000656c 9770768a 4c12c6d9 00000003 29dfe61b<br>
<strong>04a0</strong>: 00007401 00020005 00000000 c1863d08 2cecf817 00000000 00000000 29dfe61b<br>
<strong>04c0</strong>: 00006e01 00020005 00000001 c1863d08 70659eff 00000000 00000000 29dfe61b<br>
<strong>04e0</strong>: 00000000 00000000 d9fb20de 4e8a14f0 00000000 00000001 00000001 29dfe61b<br>
<strong>0500</strong>: 00000000 00000000 0142ceae 00000000 00000000 2c064372 c1863d08 9770768a<br>
<strong>0520</strong>: 00000000 00000002 ecc9da78 0142ceae 00000000 00000000 dcb49bd8 4e8a14f0<br>
<strong>0540</strong>: 00000000 00000001 5c0a1ed5 1cb5c415 63657606 00726f74 1cb5c415 4c12c6d9<br>
<strong>0560</strong>: 00000003 29dfe61b 00007401 00020005 00000000 c1863d08 2cecf817 00000000<br>
<strong>0580</strong>: 00000000 29dfe61b 00000000 00000004 00000001 c1863d08 70659eff 00000000<br>
<strong>05a0</strong>: 00000000 29dfe61b 00000000 00000000 d9fb20de 4e8a14f0 00000000 00000001<br>
<strong>05c0</strong>: 00000001 29dfe61b 00000000 00000000 0142ceae 00000000 00000000 2c064372<br>
<strong>05e0</strong>: c1863d08 1cb5c415 00000000 00000001 ecc9da78 0142ceae 00000000 00000000<br>
<strong>0600</strong>: 5c0a1ed5 10133f47 6365760b 54726f74 6c61746f 10133f47 4c12c6d9 00000003<br>
<strong>0620</strong>: 29dfe61b 00007401 00020005 00000000 c1863d08 2cecf817 00000000 00000000<br>
<strong>0640</strong>: 29dfe61b 746f740b 635f6c61 746e756f 00000000 c1863d08 a8509bda 00000001<br>
<strong>0660</strong>: 00000000 29dfe61b 63657606 00726f74 00000000 c1863d08 1cb5c415 00000001<br>
<strong>0680</strong>: 00000001 ecc9da78 0142ceae 00000000 00000000 2c064372 c1863d08 10133f47<br>
<strong>06a0</strong>: 00000000 00000001 ecc9da78 0142ceae 00000000 00000000 5c0a1ed5 29dfe61b<br>
<strong>06c0</strong>: 736c7407 6772612e 29dfe61b 4c12c6d9 00000006 29dfe61b 00646902 00000000<br>
<strong>06e0</strong>: c1863d08 b5286e24 00000001 00000000 29dfe61b 616c6605 00007367 00000004<br>
<strong>0700</strong>: 00000000 c1863d08 70659eff 00000000 00000000 29dfe61b 72617607 6d756e5f<br>
<strong>0720</strong>: 00000002 00000000 00000001 c1863d08 a8509bda 00000001 00000000 29dfe61b<br>
<strong>0740</strong>: 6978650d 765f7473 6e5f7261 00006d75 00000002 00000000 00000002 c1863d08<br>
<strong>0760</strong>: a8509bda 00000001 00000000 29dfe61b 6978650d 765f7473 625f7261 00007469<br>
<strong>0780</strong>: 00000002 00000000 00000002 c1863d08 a8509bda 00000001 00000000 29dfe61b<br>
<strong>07a0</strong>: 70797404 00000065 00000000 c1863d08 193fd378 00000000 00000000 2c064372<br>
<strong>07c0</strong>: c1863d08 29dfe61b 00000000 00000000 5c0a1ed5 5c0a1ed5 736c740e 6d6f632e<br>
<strong>07e0</strong>: 616e6962 00726f74 5c0a1ed5 4c12c6d9 00000005 29dfe61b 6d616e04 00000065<br>
<strong>0800</strong>: 00000000 c1863d08 a8509bda 00000001 00000000 29dfe61b 00646902 00000000<br>
<strong>0820</strong>: c1863d08 b5286e24 00000001 00000000 29dfe61b 70797409 616e5f65 0000656d<br>
<strong>0840</strong>: 00000000 c1863d08 a8509bda 00000001 00000000 29dfe61b 66656c04 00000074<br>
<strong>0860</strong>: 00000000 c1863d08 8133d9ba 00000000 00000000 29dfe61b 67697205 00007468<br>
<strong>0880</strong>: 00000000 c1863d08 2c064372 00000000 00000000 2c064372 c1863d08 5c0a1ed5<br>
<strong>08a0</strong>: 00000000 00000000 5c0a1ed5 cd211f63 736c7419 6d6f632e 616e6962 4c726f74<br>
<strong>08c0</strong>: 42746665 746c6975 00006e69 8133d9ba 4c12c6d9 00000000 2c064372 c1863d08<br>
<strong>08e0</strong>: 8133d9ba 00000000 00000000 5c0a1ed5 4c12c6d9 736c7412 6d6f632e 616e6962<br>
<strong>0900</strong>: 4c726f74 00746665 8133d9ba 4c12c6d9 00000002 29dfe61b 67726108 756e5f73<br>
<strong>0920</strong>: 0000006d 00000004 00000000 c1863d08 70659eff 00000000 00000000 29dfe61b<br>
<strong>0940</strong>: 67726104 00000073 00000000 d9fb20de 4e8a14f0 00000000 00000000 00000001<br>
<strong>0960</strong>: 29dfe61b 00000000 00000000 c1863d08 29dfe61b 00000000 00000000 2c064372<br>
<strong>0980</strong>: c1863d08 8133d9ba 00000000 00000000 5c0a1ed5 2c064372 736c7413 6d6f632e<br>
<strong>09a0</strong>: 616e6962 52726f74 74686769 2c064372 4c12c6d9 00000001 29dfe61b 6c617605<br>
<strong>09c0</strong>: 00006575 00000000 c1863d08 193fd378 00000000 00000000 2c064372 c1863d08<br>
<strong>09e0</strong>: 2c064372 00000000 00000000 5c0a1ed5 ecc9da78 736c740c 7078652e 70795472<br>
<strong>0a00</strong>: 00000065 307d41a0 4c12c6d9 00000001 29dfe61b 00000000 00000000 c1863d08<br>
<strong>0a20</strong>: 193fd378 00000000 00000000 2c064372 c1863d08 307d41a0 00000000 00000000<br>
<strong>0a40</strong>: 5c0a1ed5 dcb49bd8 736c740b 7078652e 74614e72 307d41a0 4c12c6d9 00000001<br>
<strong>0a60</strong>: 29dfe61b 00000000 00000000 c1863d08 c2635441 00000000 00000000 2c064372<br>
<strong>0a80</strong>: c1863d08 307d41a0 00000000 00000000 5c0a1ed5 8ce940b1 736c740c 74616e2e<br>
<strong>0aa0</strong>: 736e6f43 00000074 c2635441 4c12c6d9 00000001 29dfe61b 6c617605 00006575<br>
<strong>0ac0</strong>: 00000000 c1863d08 a8509bda 00000001 00000000 2c064372 c1863d08 c2635441<br>
<strong>0ae0</strong>: 00000000 00000000 5c0a1ed5 4e8a14f0 736c740a 74616e2e 00726156 c2635441<br>
<strong>0b00</strong>: 4c12c6d9 00000002 29dfe61b 66696403 00000000 c1863d08 a8509bda 00000001<br>
<strong>0b20</strong>: 00000000 29dfe61b 72617607 6d756e5f 00000000 c1863d08 a8509bda 00000001<br>
<strong>0b40</strong>: 00000000 2c064372 c1863d08 c2635441 00000000 00000000 5c0a1ed5 3a2f9be2<br>
<strong>0b60</strong>: 736c740d 6863732e 5f616d65 00003276 3a2f9be2 4c12c6d9 00000008 29dfe61b<br>
<strong>0b80</strong>: 72657607 6e6f6973 00000000 c1863d08 a8509bda 00000001 00000000 29dfe61b<br>
<strong>0ba0</strong>: 74616404 00000065 00000000 c1863d08 a8509bda 00000001 00000000 29dfe61b<br>
<strong>0bc0</strong>: 70797409 6e5f7365 00006d75 00000004 00000000 c1863d08 70659eff 00000000<br>
<strong>0be0</strong>: 00000000 29dfe61b 70797405 00007365 00000000 d9fb20de 4e8a14f0 00000000<br>
<strong>0c00</strong>: 00000000 00000001 29dfe61b 00000000 00000000 c1863d08 12eb4386 00000000<br>
<strong>0c20</strong>: 00000000 29dfe61b 6e6f630f 75727473 726f7463 6d756e5f 00000004 00000001<br>
<strong>0c40</strong>: c1863d08 70659eff 00000000 00000000 29dfe61b 6e6f630c 75727473 726f7463<br>
<strong>0c60</strong>: 00000073 00000000 d9fb20de 4e8a14f0 00000000 00000001 00000001 29dfe61b<br>
<strong>0c80</strong>: 00000000 00000000 c1863d08 5c0a1ed5 00000000 00000000 29dfe61b 6e75660d<br>
<strong>0ca0</strong>: 6f697463 6e5f736e 00006d75 00000004 00000002 c1863d08 70659eff 00000000<br>
<strong>0cc0</strong>: 00000000 29dfe61b 6e756609 6f697463 0000736e 00000000 d9fb20de 4e8a14f0<br>
<strong>0ce0</strong>: 00000000 00000002 00000001 29dfe61b 00000000 00000000 c1863d08 5c0a1ed5<br>
<strong>0d00</strong>: 00000000 00000000 2c064372 c1863d08 3a2f9be2 00000000 00000000 5c0a1ed5<br>
<strong>0d20</strong>: 12eb4386 736c7408 7079742e 00000065 12eb4386 4c12c6d9 00000006 29dfe61b<br>
<strong>0d40</strong>: 6d616e04 00000065 00000000 c1863d08 a8509bda 00000001 00000000 29dfe61b<br>
<strong>0d60</strong>: 00646902 00000000 c1863d08 b5286e24 00000001 00000000 29dfe61b 6e6f6310<br>
<strong>0d80</strong>: 75727473 726f7463 756e5f73 0000006d 00000000 c1863d08 a8509bda 00000001<br>
<strong>0da0</strong>: 00000000 29dfe61b 616c6605 00007367 00000000 c1863d08 a8509bda 00000001<br>
<strong>0dc0</strong>: 00000000 29dfe61b 69726105 00007974 00000000 c1863d08 a8509bda 00000001<br>
<strong>0de0</strong>: 00000000 29dfe61b 7261700b 5f736d61 65707974 00000000 c1863d08 22076cba<br>
<strong>0e00</strong>: 00000001 00000000 2c064372 c1863d08 12eb4386 00000000 00000000 5c0a1ed5<br>
<strong>0e20</strong>: 0142ceae 736c740b 7079742e 72615665 193fd378 4c12c6d9 00000002 29dfe61b<br>
<strong>0e40</strong>: 72617607 6d756e5f 00000000 c1863d08 a8509bda 00000001 00000000 29dfe61b<br>
<strong>0e60</strong>: 616c6605 00007367 00000000 c1863d08 a8509bda 00000001 00000000 2c064372<br>
<strong>0e80</strong>: c1863d08 193fd378 00000000 00000000 5c0a1ed5 d9fb20de 736c7409 7272612e<br>
<strong>0ea0</strong>: 00007961 193fd378 4c12c6d9 00000003 29dfe61b 6c756d0c 6c706974 74696369<br>
<strong>0ec0</strong>: 00000079 00000000 c1863d08 c2635441 00000000 00000000 29dfe61b 67726108<br>
<strong>0ee0</strong>: 756e5f73 0000006d 00000004 00000000 c1863d08 70659eff 00000000 00000000<br>
<strong>0f00</strong>: 29dfe61b 67726104 00000073 00000000 d9fb20de 4e8a14f0 00000000 00000000<br>
<strong>0f20</strong>: 00000001 29dfe61b 00000000 00000000 c1863d08 29dfe61b 00000000 00000000<br>
<strong>0f40</strong>: 2c064372 c1863d08 193fd378 00000000 00000000 5c0a1ed5 c1863d08 736c740c<br>
<strong>0f60</strong>: 7079742e 70784565 00000072 193fd378 4c12c6d9 00000004 29dfe61b 6d616e04<br>
<strong>0f80</strong>: 00000065 00000000 c1863d08 a8509bda 00000001 00000000 29dfe61b 616c6605<br>
<strong>0fa0</strong>: 00007367 00000000 c1863d08 a8509bda 00000001 00000000 29dfe61b 6968630c<br>
<strong>0fc0</strong>: 6572646c 756e5f6e 0000006d 00000004 00000000 c1863d08 70659eff 00000000<br>
<strong>0fe0</strong>: 00000000 29dfe61b 69686308 6572646c 0000006e 00000000 d9fb20de 4e8a14f0<br>
<strong>1000</strong>: 00000000 00000000 00000001 29dfe61b 00000000 00000000 c1863d08 307d41a0<br>
<strong>1020</strong>: 00000000 00000000 2c064372 c1863d08 193fd378 00000000 00000000 00000000 </p>
</div></div>
</div>
</div>
</div>
<div class="footer_wrap">
<div class="footer_columns_wrap footer_desktop">
<div class="footer_column footer_column_telegram">
<h5>Telegram</h5>
<div class="footer_telegram_description"></div>
Telegram is a cloud-based mobile and desktop messaging app with a focus on security and speed.
</div>
<div class="footer_column">
<h5><a href="//telegram.org/faq">About</a></h5>
<ul>
<li><a href="//telegram.org/faq">FAQ</a></li>
<li><a href="//telegram.org/privacy">Privacy</a></li>
<li><a href="//telegram.org/press">Press</a></li>
</ul>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/apps#mobile-apps">Mobile Apps</a></h5>
<ul>
<li><a href="//telegram.org/dl/ios">iPhone/iPad</a></li>
<li><a href="//telegram.org/android">Android</a></li>
<li><a href="//telegram.org/dl/web">Mobile Web</a></li>
</ul>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/apps#desktop-apps">Desktop Apps</a></h5>
<ul>
<li><a href="//desktop.telegram.org/">PC/Mac/Linux</a></li>
<li><a href="//macos.telegram.org/">macOS</a></li>
<li><a href="//telegram.org/dl/web">Web-browser</a></li>
</ul>
</div>
<div class="footer_column footer_column_platform">
<h5><a href="/">Platform</a></h5>
<ul>
<li><a href="/api">API</a></li>
<li><a href="//translations.telegram.org/">Translations</a></li>
<li><a href="//instantview.telegram.org/">Instant View</a></li>
</ul>
</div>
</div>
<div class="footer_columns_wrap footer_mobile">
<div class="footer_column">
<h5><a href="//telegram.org/faq">About</a></h5>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/blog">Blog</a></h5>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/apps">Apps</a></h5>
</div>
<div class="footer_column">
<h5><a href="/">Platform</a></h5>
</div>
<div class="footer_column">
<h5><a href="https://twitter.com/telegram" target="_blank" data-track="Follow/Twitter" onclick="trackDlClick(this, event)">Twitter</a></h5>
</div>
</div>
</div>
</div>
<script src="/js/main.js?47"></script>
<script>backToTopInit("Go up");
removePreloadInit();
</script>
</body>
</html>